资源描述
基于单片机的智能数字闹钟程序代码
main.c
#include <reg51.h>
#include <intrins.h>
#include <yf.h>
unsigned char clock_data[4];
sbit speaker = P2^4;// 蜂鸣器
sbit bell = P2^2; //铃响
bit bell_on=0;
bit key_ok=0;
unsigned char bell_time=0x20;
uchar week_clock_set;
#define FIRST_ADDR 0
//定义全局变量
unsigned char yy,mo,dd,xq,hh,mm,ss;// 定义时间映射全局变量(专用寄存器)
uchar j;
/****************************************************************************/
//函数声明
extern unsigned char read_clock(unsigned char ord);
extern void lcdwc(unsigned char cmdcode);
extern void hzkdis(unsigned char code *s);
extern void hzkdis2(unsigned char *s);
extern char Read_One_Byte(unsigned char addr);
extern void Write_One_Byte(unsigned char addr,unsigned char thedata);
void lcm_w_ss(void);
extern void lcdreset(void);
extern void Init_DS18B20(void);
extern char gotkey();
extern void Init_1302(void);
extern unsigned int ReadTemperature(void);
extern void write_clock(unsigned char ord, unsigned char dd);
extern void disp_hz(uchar x,uchar *c_str,uchar w);
extern void delay(unsigned int t);
void new_time(void);
void read_clockss(x);
//void lcm_w_temp(void) ;
void read_clockS(void)
{
ss = read_clock(0x81);//读取秒数据
mm = read_clock(0x83);//读取分钟数据
hh = read_clock(0x85);//小时
dd = read_clock(0x87);//日
mo = read_clock(0x89);//月
xq = read_clock(0x8b);//星期
yy = read_clock(0x8d);//年
}
/*void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302
signed char address,item;
signed char max,mini;
if(sel==7) {address=0x80; max=0;mini=0;} //秒
if(sel==6) {address=0x82; max=59;mini=0;} //分钟
if(sel==5) {address=0x84; max=23;mini=0;} //小时
if(sel==3) {address=0x86; max=31;mini=1;} //日
if(sel==2) {address=0x88; max=12;mini=1;} //月
if(sel==1) {address=0x8c; max=99; mini=0;} //年
if(sel==4) {address=0x8a; max=7;mini=1;} //星期
//读取1302某地址上的数值转换成10进制赋给item
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(KEY_Y == 0){
item++;//数加 1
}
if(KEY_N== 0){
item--;//数减 1
}
if(item>max) item=mini;//查看数值有效范围
if(item<mini) item=max;
write_clock(0x8e,0x00);//允许写操作
write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
write_clock(0x8e,0x80);//写保护,禁止写操作
// updata (); //刷新数据
// lcm_w_mm();//刷新 分
}
*/
void DelayM(unsigned int a){//延时函数 1MS/次
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
} //i 从0加到125,CPU大概就耗时1毫秒
}
/*****************************************************************************/
//向LCM中填写 年 数据
void lcm_w_yy(void)
{ // if (read_clock(0x8d) != yy) {
unsigned char str[2];
str[2]=0;
yy = read_clock(0x8d);
lcdwc(0x83+FIRST_ADDR);
hzkdis("20");
lcdwc(0x84+FIRST_ADDR);
str[0]=(yy/16+0x30);
str[1]=(yy%16+0x30);
hzkdis2(str);
hzkdis2("年");
}
/*****************************************************************************/
//向LCM中填写 月 数据
void lcm_w_mo(void){
// if(read_clock(0x89) != mo){
unsigned char str[2];
str[2]=0;
// lcm_w_test(0,0x90);
lcdwc(0x90+FIRST_ADDR) ;
if(mo/16 != 0){
str[0]=mo/16+0x30;
} //十位消隐
else{str[0]=0x20 ;}//同上
str[1]=mo%16+0x30;
hzkdis2(str);
lcdwc(0x91+FIRST_ADDR);
hzkdis("月");
}
/*****************************************************************************/
//星期处理并送入LCM的指定区域
void lcm_w_xq(void){
unsigned char sel;
unsigned char str[2];
str[2]=0;
//if(read_clock(0x8b) != xq){
//xq = read_clock(0x8b);
sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel
lcdwc(0x97+FIRST_ADDR);//写入指定区域(97H 第二行第8个字)
if(sel==7) {hzkdis("日");} //
if(sel==6) {hzkdis("六");} //
if(sel==5) {hzkdis("五");} //
if(sel==4) {hzkdis("四");} //
if(sel==3) {str[0]=0xc8;str[1]=0xfd;hzkdis2(str)/*lcm_w_test(1,0xc8);lcm_w_test(1,0xfd)*/;} //此指令等于lcm_w_word("三"); 因为“三”的内码失效。
if(sel==2) {hzkdis("二");} //
if(sel==1) {hzkdis("一");} //星期一
lcdwc(0x95+FIRST_ADDR);
hzkdis("星期") ;
//}
}
/*****************************************************************************/
//向LCM中填写 日 数据
void lcm_w_dd(void){
unsigned char str[2] ;
str[2]=0;
// if(read_clock(0x87) != dd){
dd = read_clock(0x87);
lcdwc(0x92+FIRST_ADDR);
if(dd/16 != 0){str[0]=(dd/16)+0x30;} //十位消隐
else{str[0]=0x20;}//同上
str[1]=dd%16+0x30;
hzkdis2(str);
lcdwc(0x93+FIRST_ADDR);
hzkdis("日");
} //}
/*****************************************************************************/
//向LCM中填写 小时 数据
void lcm_w_hh(void){
unsigned char str[2] ;
str[2]=0;
if(read_clock(0x85) != hh){
//hh = read_clock(0x85);
if (hh > 0x07 && hh < 0x22 /*&& w == 0*/){
// beep = 0; led_r = 0;
DelayM(100);
// beep = 1; led_r = 1;
}
}
lcdwc(0x88+FIRST_ADDR);
str[0]=hh/16+0x30;
str[1]=hh%16+0x30;
hzkdis2(str);
} //}
/*****************************************************************************/
//向LCM中填写 分钟 数据
void lcm_w_mm(void){
unsigned char str[2];
str[2]=0;
if(read_clock(0x83) != mm){
mm = read_clock(0x83);
/*if( w == 0){
days(); //节日显示
updata (); //刷新数据
}*/
}
/* lcm_w_test(0,0x89);
lcm_w_test(1,0x3a); //":"
lcm_w_test(1,(mm/16)+0x30);
lcm_w_test(1,mm%16+0x30);
lcm_w_test(1,0x2e); //"."*/
lcdwc(0x89+FIRST_ADDR);
hzkdis(":");
str[0]=(mm/16)+0x30;
str[1]= mm%16+0x30;
hzkdis2(str);
hzkdis(":");
}
/*****************************************************************************/
//向LCM中填写 秒 数据
void lcm_w_ss(void)
{
unsigned char str[2] ;
str[2]=0;
// if(read_clock(0x81) != ss)
//判断是否需要更新
/*ss = read_clock(0x81); //更新数据
lcm_w_test(0,0x8b); //秒值在LCM上的写入位置
lcm_w_test(1,(ss/16)+0x30); //写十位
lcm_w_test(1,ss%16+0x30); //写个位
led_b = ~led_b; //背光闪烁
lcm_w_mm();//刷新 分
*/
//lcm_w_mm();
ss=read_clock(0x81);
lcdwc(0x8b+FIRST_ADDR);
str[0]=ss/16+0x30;
str[1]=ss%16+0x30;
hzkdis2(str);
}
lcm_w_temp(void)
{
//unsigned char str1[4];
uchar str[2];
unsigned int i=0;
unsigned char a=0,b=0,c=0;
uchar temp=28;
i=ReadTemperature();//读温度并送显
/* a=i/100;
str1[3]=a+0x30;
str1[2]=0x2e;
str1[1]=(i/10-a*10)+0x30;
str1[0]=(i-a*100-b*10)+0x30;
//lcm_w_test(1,c+0x30); //小位1位
//lcm_w_word("℃"); //度C
// str1[0]=(i/100)%10+0x30;
// str1[1]=((i%100)/10)+0x30;
// str1[2]=(i%10)+0x30;*/
str[0]=temp/10+0x30;
str[1]=temp%10+0x30;
lcdwc(0x8e+FIRST_ADDR);
hzkdis2(str);
lcdwc(0x8f+FIRST_ADDR);
hzkdis("℃");
}
/*****************************************************************************/
//刷新数据
void updata (void)
{
lcm_w_hh();//刷新 小时
lcm_w_dd();//刷新 日
lcm_w_xq();//更新星期值
lcm_w_mo();//刷新 月
lcm_w_yy();//刷新 年
lcm_w_mm();
lcm_w_ss();
lcm_w_temp();
}
//初始化界面
void restlib()
{
lcdwc(0x80+FIRST_ADDR);
hzkdis("校园打铃系统");
lcdwc(0x90+FIRST_ADDR);
hzkdis("初始化...");
lcdwc(0x88+FIRST_ADDR);
hzkdis("姚辉虎");
lcdwc(0x98+FIRST_ADDR);
hzkdis("");
}
/*void rj1lib()
{ unsigned char str[2];
lcdwc(0x80+FIRST_ADDR);
str[0]=yy/10+0x30;
str[1]=yy%10+0x30;
hzkdis("20");
hzkdis2(str);
hzkdis("年");
lcdwc(0x90+FIRST_ADDR) ;
if(mo/16 != 0){
str[0]=mo/16+0x30;
} //十位消隐
else{str[0]=0x20 ;}//同上
str[1]=mo%16+0x30;
hzkdis2(str);
lcdwc(0x91+FIRST_ADDR);
hzkdis("月");
lcdwc(0x92+FIRST_ADDR);
if(dd/16 != 0){str[0]=(dd/16)+0x30;} //十位消隐
else{str[0]=0x20;}//同上
str[1]=dd%16+0x30;
hzkdis2(str);
lcdwc(0x93+FIRST_ADDR);
hzkdis("日");
lcdwc(0x88+FIRST_ADDR);
str[0]=hh/16+0x30;
str[1]=hh%16+0x30;
hzkdis2(str);
lcdwc(0x89+FIRST_ADDR);
hzkdis(":");
str[0]=(mm/16)+0x30;
str[1]= mm%16+0x30;
hzkdis2(str);
lcdwc(0x81+FIRST_ADDR);
}
/*------------------------------------------------
------------------------------------------------*/
/*
//不同按键实现不同功能
void gongneng(int gotkeys)
{
int gn,gn10,gn0 ;
gn=gotkeys;
switch(gn)
{
case 0: DelayM(2000);gn0=gotkey();if(gn0==0){ lcdreset();restlib();Init_DS18B20();Init_1302();DelayM(3000); cxjmlib();}break; //长按系统初始化;
case 10: lcdreset();
lcdwc(0x80+FIRST_ADDR); hzkdis("1.设置时间");
lcdwc(0x90+FIRST_ADDR); hzkdis("2.设置闹时");
lcdwc(0x88+FIRST_ADDR); hzkdis("3.系统初始化");
lcdwc(0x79+FIRST_ADDR); hzkdis("");
tt:gn10=gotkey(); //
if (gn10!=16) goto tt;
tt1:gn10=gotkey(); //
if (gn10==16) goto tt;
switch(gn10)
{
case 1:
{
lcdreset(); read_clockS(); rj1lib();
tt2: gn10=gotkey();
if (gn10!=16) goto tt2;
tt3: gn10=gotkey();
if (gn10==16) goto tt2;
switch(gn10)
{
case 0: break;
case 1: break;
case 2: break;
case 3: break;
case 4: break;
case 5: break;
case 6: break;
case 7: break;
case 8: break;
case 9: break;
default:goto tt3;
}
break;
}
case 2: lcdreset();read_clockS();naozhonglib();
tt4: gn10=gotkey();
if (gn10!=16) goto tt4 ;
gn10=gotkey();
if (gn10==16) goto tt4;
break;
case 3: lcdreset();rj3lib();
tt6: gn10=gotkey();
if (gn10!=16) goto tt6;
gn10=gotkey();
if (gn10==16) goto tt6;
if(gn10==10) //键值为10就初始化系统
{
lcdreset();restlib();Init_DS18B20();Init_1302();DelayM(3000); cxjmlib();
}
if(gn10==11) // 键值为11取消初始化,返回程序主界面;
{
lcdreset();cxjmlib();
} break;
tt8: gn10=gotkey();
if (gn10!=16) goto tt8 ;
gn10=gotkey();
if (gn10==16) goto tt8 ;
break;
}
default: goto tt1;
}
}
*/
void read_clockss(x)
{
hh=Read_One_Byte(x*4+0x20);
mm=Read_One_Byte(x*4+0x21);
ss=Read_One_Byte(x*4+0x22);
week_clock_set=Read_One_Byte(x*4+0x23);
}
void Write_clockss(x)
{
Write_One_Byte(x*4+0x20,hh);
Write_One_Byte(x*4+0x21,mm);
Write_One_Byte(x*4+0x22,ss);
Write_One_Byte(x*4+0x23,week_clock_set);
}
/* bit cmp_clock() //每分钟检测一次
{
unsigned char a1;
for (a1=0;a1<32;a1++)
{
read_clockss(a1); //acc0 = a1*4+0x20 ...acc1 ...acc2 ...acc3
if ((hh==clock_data[0]) && (mm==clock_data[1])) { return 1; }
}
return 0;
}*/
//unsigned char yy,mo,dd,xq,hh,mm,ss;// 定义时间映射全局变量(专用寄存器)
void clr_xs()
{
lcdwc(0x80+FIRST_ADDR); hzkdis(" ");
lcdwc(0x90+FIRST_ADDR); hzkdis(" ");
lcdwc(0x88+FIRST_ADDR); hzkdis(" ");
lcdwc(0x98+FIRST_ADDR); hzkdis(" ");
}
void disp_set_clock()
{
unsigned char sel;
uchar str[2];
str[2]=0;
lcdwc(0x91+FIRST_ADDR);
str[0]=yy/16+0x30;
str[1]=yy%16+0x30;
hzkdis2(str);
hzkdis2("年");
str[0]=mo/16+0x30;
str[1]=mo%16+0x30;
hzkdis2(str);
hzkdis2("月");
str[0]=dd/16+0x30;
str[1]=dd%16+0x30;
hzkdis2(str);
hzkdis2("日");
lcdwc(0x89+FIRST_ADDR);
str[0]=hh/16+0x30;
str[1]=hh%16+0x30;
hzkdis2(str);
hzkdis2("时");
str[0]=mm/16+0x30;
str[1]=mm%16+0x30;
hzkdis2(str);
hzkdis2("分");
str[0]=ss/16+0x30;
str[1]=ss%16+0x30;
hzkdis2(str);
hzkdis2("秒");
// lcdwc(0x98+FIRST_ADDR);
sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel
lcdwc(0x9c+FIRST_ADDR);//写入指定区域(97H 第二行第8个字)
if(sel==7) {hzkdis("07");} //
if(sel==6) {hzkdis("06");} //
if(sel==5) {hzkdis("05");} //
if(sel==4) {hzkdis("04");} //
if(sel==3) {hzkdis("03");} //
if(sel==2) {hzkdis("02");} //
if(sel==1) {hzkdis("01");} //星期一
lcdwc(0x9a+FIRST_ADDR);
hzkdis("星期") ;
}
void disp_clock_set()
{
uchar str[2];
str[2]=0;
lcdwc(0x89+FIRST_ADDR);
str[0]=hh/16+0x30;
str[1]=hh%16+0x30;
hzkdis2(str);
hzkdis2("时");
str[0]=mm/16+0x30;
str[1]=mm%16+0x30;
hzkdis2(str);
hzkdis2("分");
/* str[0]=ss/16+0x30;
str[1]=ss%16+0x30;
hzkdis2(str);
hzkdis2("秒"); */
// week_clock_set
// lcdwc(0x98+FIRST_ADDR);
// hzkdis2(" ");
}
/*bit set_xs_1_flicker(uchar x,bit y) //修改数据标志
{
uchar a,str[2];
str[1]=0x1e;
bit flicker=0;
key_ok=1;
while (gotkey()!=16) {}
xs_fl0: while(1)
{ for (a=0;a<20;a++) //
{
delay(500);
if (gotkey()!=16) goto xs_fl1;
key_ok=0;
}
xs_fl1: lcdwc(x+FIRST_ADDR);
if (flicker) { hzkdis2("_"); }
else { str[0]=0x31; str[1]=0x1e; hzkdis2(str); }
flicker = ~flicker;
a=gotkey();
if ( (a<10) && (key_ok==0)){key_ok=1; y=a*16+(y%16); goto xs_lf2;}
if (a==0x0b) return(y);
if(a==10)return(y);
if(a==13)
{
lcdwc(x+FIRST_ADDR);
str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str);
return(y);
}
if(a==14) goto xs_lf2;
}
} */
uchar set_xs_flicker(uchar x,y) //修改数据标志
{
uchar a,str[2];
bit flicker=0;
key_ok=1;
while (gotkey()!=16) {}
xs_fl0: while(1)
{ for (a=0;a<20;a++)
{
delay(500);
if (gotkey()!=16) goto xs_fl1;
key_ok=0;
}
xs_fl1: lcdwc(x+FIRST_ADDR);
if (flicker) { hzkdis2("_"); }
else { str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str); }
flicker = ~flicker;
a=gotkey();
if ( (a<10) && (key_ok==0)){key_ok=1; y=a*16+(y%16); goto xs_lf2;}
if (a==0x0b) return(y);
if(a==10)return(y);
if(a==13)
{
lcdwc(x+FIRST_ADDR);
str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str);
return(y);
}
if(a==14) goto xs_lf2;
}
xs_lf2: while(1)
{ for (a=0;a<20;a++)
{
delay(500);
if (gotkey()!=16) goto xs_fl3;
key_ok=0;
}
xs_fl3:
lcdwc(x+FIRST_ADDR);
if (flicker)
{
str[0]=y/16+0x30;
str[1]=0x5f;
hzkdis2(str);
}
else { str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str); }
flicker = ~flicker;
a=gotkey();
if ( (a<10) && (key_ok==0))
{
key_ok=1;
y=(y/16)*16+a;
lcdwc(x+FIRST_ADDR);
str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str);
return(y);
}
if (a==0x0b) return(y);
if(a==10) return(y);
if(a==13) goto xs_fl0;
if(a==14)
{
lcdwc(x+FIRST_ADDR);
str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str);
return(y);
}
}
}
void xs_pls()
{
clr_xs();
lcdwc(0x91+FIRST_ADDR); hzkdis("设置已经保存");
delay(10000);
}
void set_clock()
{
while(1)
{
l
展开阅读全文