1、基于单片机的智能数字闹钟程序代码
main.c
#include
2、ned 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 v
3、oid 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 unsig
4、ned 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_cloc
5、k(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
6、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) {addre
7、ss=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=
8、mini;//查看数值有效范围
if(item 9、d 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) {
unsigne 10、d 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("年");
}
/********************************************************************* 11、/
//向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); 12、
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);
s 13、el = (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 14、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中填写 日 15、 数据
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 16、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 /* 17、 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中填写 分钟 数据
v 18、oid 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, 19、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 20、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();
21、 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();//读温度并送显
/ 22、 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+ 23、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();//刷新 月
24、
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(""); 25、
}
/*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;
hzk 26、dis2(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+0x 27、30;
hzkdis2(str);
lcdwc(0x89+FIRST_ADDR);
hzkdis(":");
str[0]=(mm/16)+0x30;
str[1]= mm%16+0x30;
hzkdis2(str);
lcdwc(0x81+FIRST_ADDR);
}
/*------------------------------------------------
------------------------------------------------*/
/*
//不同按键实现不同功能
void go 28、ngneng(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.设置时间");
29、
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(); rea 30、d_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: brea 31、k;
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() 32、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) 33、// 键值为11取消初始化,返回程序主界面;
{
lcdreset();cxjmlib();
} break;
tt8: gn10=gotkey();
if (gn10!=16) goto tt8 ;
gn10=gotkey();
if (gn10==16) goto tt8 ;
break;
}
default: goto tt1;
}
34、
}
*/
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 35、);
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 36、 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()
{
37、 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; 38、
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]= 39、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) {hzk 40、dis("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");} //
41、 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);
42、 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(" ");
}
/ 43、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: lcdw 44、c(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)
{
45、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)
46、 { 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) && 47、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 ( 48、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 = 49、~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;
50、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






