毕业设计基于单片机的智能数字闹钟程序代码_第1页
毕业设计基于单片机的智能数字闹钟程序代码_第2页
毕业设计基于单片机的智能数字闹钟程序代码_第3页
毕业设计基于单片机的智能数字闹钟程序代码_第4页
毕业设计基于单片机的智能数字闹钟程序代码_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、辉虎的毕业设计-基于单片机的智能数字闹钟程序代码程序代码 main.c#include <reg51.h>#include <intrins.h>#include <yf.h>  unsigned char clock_data4;sbit speaker  = P24;/  蜂鸣器sbit bell = P22;   /铃响bit bell_on=0;bit key_ok=0;unsigned char bell_time=0x20;uchar week_clock_set;#defin

2、e 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(

3、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,

4、 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);/小时

5、0;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;

6、60;    /秒  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; &

7、#160;  /月  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

8、)   item+;/数加 1      if(KEY_N= 0)   item-;/数减 1     if(item>max) item=mini;/查看数值有效围     if(item<mini) item=max;             write_clock(0x8e,0x00);/允许写操作 

9、 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)     

10、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 str2;   

11、60; str2=0;  yy = read_clock(0x8d);  lcdwc(0x83+FIRST_ADDR);  hzkdis("20");        lcdwc(0x84+FIRST_ADDR);  str0=(yy/16+0x30);  str1=(yy%16+0x30);        hzkdis2(str

12、);  hzkdis2("年");  /*/向LCM中填写 月 数据void lcm_w_mo(void)/ if(read_clock(0x89) != mo)   unsigned char str2; str2=0; / lcm_w_test(0,0x90);  lcdwc(0x90+FIRST_ADDR) ;   if(mo/16 != 0)   str0=mo/16+0x30;

13、    /十位消隐   elsestr0=0x20 ;/同上    str1=mo%16+0x30;   hzkdis2(str);     lcdwc(0x91+FIRST_ADDR);          hzkdis("月"); /*/星期处理并送入LCM的指定区域void lcm_w

14、_xq(void) unsigned char sel; unsigned char str2; str2=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("日");  

15、;  /   if(sel=6)  hzkdis("六");    /   if(sel=5)  hzkdis("五");    /   if(sel=4)  hzkdis("四");    /   if(sel=3)  str0=0xc8;str1=0xfd;hzkdis2(str)/*lcm_w_test(1,0x

16、c8);lcm_w_test(1,0xfd)*/; /此指令等于lcm_w_word("三"); 因为“三”的码失效。   if(sel=2)  hzkdis("二");    /   if(sel=1)  hzkdis("一");    /星期一  lcdwc(0x95+FIRST_ADDR); hzkdis("星期") ; /*/向LCM中填写 日 数据

17、void lcm_w_dd(void)      unsigned char str2   ; str2=0;/ if(read_clock(0x87) != dd)  dd = read_clock(0x87);     lcdwc(0x92+FIRST_ADDR);    if(dd/16 != 0)str0=(dd/16)+0x30; /十位消隐   elses

18、tr0=0x20;/同上   str1=dd%16+0x30;          hzkdis2(str);   lcdwc(0x93+FIRST_ADDR);  hzkdis("日");       /*/向LCM中填写 小时 数据void lcm_w_hh(void)    unsigned char s

19、tr2 ; str2=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; 

20、60;       lcdwc(0x88+FIRST_ADDR);  str0=hh/16+0x30;  str1=hh%16+0x30;  hzkdis2(str); /*/向LCM中填写 分钟 数据void lcm_w_mm(void)    unsigned char   str2; str2=0; if(read_clock(0x83) != mm)  

21、60; mm = read_clock(0x83);  /*if( w = 0)       days();    /节日显示   updata (); /刷新数据  */     /* lcm_w_test(0,0x89);  lcm_w_test(1,0x3a);   /":"

22、0;lcm_w_test(1,(mm/16)+0x30); lcm_w_test(1,mm%16+0x30); lcm_w_test(1,0x2e);  /"."*/ lcdwc(0x89+FIRST_ADDR); hzkdis(":"); str0=(mm/16)+0x30; str1= mm%16+0x30; hzkdis2(str); hzkdis(":");  /*/向LCM中填写 秒 数据void lcm_

23、w_ss(void) unsigned char str2 ; str2=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);&#

24、160;/写个位  led_b = led_b;    /背光闪烁  lcm_w_mm();/刷新 分      */     /lcm_w_mm();     ss=read_clock(0x81);  lcdwc(0x8b+FIRST_ADDR);  str0=ss/16+0x30;  str1=ss%16+0x30;

25、60; hzkdis2(str);lcm_w_temp(void)     /unsigned char  str14;   uchar str2;   unsigned int i=0;     unsigned char a=0,b=0,c=0;  uchar temp=28;   i=ReadTemperature();/读温度并送显 /* a=i/100; str13=a+0x3

26、0; str12=0x2e; str11=(i/10-a*10)+0x30; str10=(i-a*100-b*10)+0x30; /lcm_w_test(1,c+0x30); /小位1位   /lcm_w_word(""); /度C/ str10=(i/100)%10+0x30; / str11=(i%100)/10)+0x30;/ str12=(i%10)+0x30;*/   str0=temp/10+0x30;  str

27、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();/刷新 月

28、0; lcm_w_yy();/刷新 年        lcm_w_mm();  lcm_w_ss();  lcm_w_temp(); /初始化界面void restlib()   lcdwc(0x80+FIRST_ADDR);   hzkdis("校园打铃系统");   lcdwc(0x90+FIRST_ADDR);   hzkdis("初始化."

29、);   lcdwc(0x88+FIRST_ADDR);   hzkdis("辉虎");   lcdwc(0x98+FIRST_ADDR);   hzkdis("");/*void  rj1lib() unsigned char str2; lcdwc(0x80+FIRST_ADDR);    str0=yy/10+0x30; str1=yy%10+0x30; hzkdis("20&qu

30、ot;); hzkdis2(str); hzkdis("年");    lcdwc(0x90+FIRST_ADDR) ; if(mo/16 != 0) str0=mo/16+0x30;  /十位消隐 elsestr0=0x20 ;/同上  str1=mo%16+0x30; hzkdis2(str);   lcdwc(0x91+FIRST_ADDR); hzkdis("月"); 

31、   lcdwc(0x92+FIRST_ADDR); if(dd/16 != 0)str0=(dd/16)+0x30; /十位消隐 elsestr0=0x20;/同上 str1=dd%16+0x30;  hzkdis2(str); lcdwc(0x93+FIRST_ADDR); hzkdis("日"); lcdwc(0x88+FIRST_ADDR);    str0=hh/16+0x30; str1=hh%16+0x30;&#

32、160;hzkdis2(str); lcdwc(0x89+FIRST_ADDR); hzkdis(":"); str0=(mm/16)+0x30; str1= mm%16+0x30; hzkdis2(str);    lcdwc(0x81+FIRST_ADDR);  /*-*/  /* /不同按键实现不同功能 void gongneng(int gotkeys)   int gn,gn10,gn0 ;

33、60;  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(0x

34、80+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!=1

35、6) goto tt;tt1:gn10=gotkey();   / if (gn10=16) goto tt;   switch(gn10)  case 1:           lcdreset();  read_clockS(); rj1lib();tt2:    gn10=gotkey();    &#

36、160;   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:  br

37、eak; case 4:  break; case 5:  break; case 6:  break; case 7:  break; case 8:  break; case 9:  break; default:goto tt3;       break;        case 2:   lcdres

38、et();read_clockS();naozhonglib();tt4:    gn10=gotkey();        if (gn10!=16) goto tt4 ;    gn10=gotkey();        if (gn10=16) goto tt4;       

39、60;          break; case 3:   lcdreset();rj3lib();               tt6:    gn10=gotkey();        if (gn10!=

40、16) goto tt6;    gn10=gotkey();        if (gn10=16) goto tt6;            if(gn10=10)   /键值为10就初始化系统           lcdreset()

41、;restlib();Init_DS18B20();Init_1302();DelayM(3000); cxjmlib();            if(gn10=11)  / 键值为11取消初始化,返回程序主界面;             lcdreset();cxjmlib();         

42、; break;tt8:    gn10=gotkey();        if (gn10!=16) goto tt8 ;    gn10=gotkey();        if (gn10=16) goto tt8            

43、0;         break;    default: goto tt1;                                   &

44、#160;                   */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

45、) 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);  &

46、#160;/acc0 = a1*4+0x20  .acc1 .acc2 .acc3  if (hh=clock_data0) && (mm=clock_data1)  return 1;   return 0;*/unsigned char yy,mo,dd,xq,hh,mm,ss;/  定义时间映射全局变量(专用寄存器)void clr_xs()    lcdwc(0x80+FIRST_ADDR); hzkdis("");  &

47、#160;    lcdwc(0x90+FIRST_ADDR); hzkdis("");    lcdwc(0x88+FIRST_ADDR); hzkdis("");     lcdwc(0x98+FIRST_ADDR); hzkdis(""); void disp_set_clock()        unsigned char sel

48、;     uchar str2;     str2=0;     lcdwc(0x91+FIRST_ADDR);      str0=yy/16+0x30;     str1=yy%16+0x30;     hzkdis2(str);    

49、60; hzkdis2("年");     str0=mo/16+0x30;     str1=mo%16+0x30;     hzkdis2(str);      hzkdis2("月");     str0=dd/16+0x30;    

50、0;str1=dd%16+0x30;     hzkdis2(str);      hzkdis2("日");          lcdwc(0x89+FIRST_ADDR);      str0=hh/16+0x30;     str1=hh%16+0x30

51、;     hzkdis2(str);      hzkdis2("时");     str0=mm/16+0x30;     str1=mm%16+0x30;     hzkdis2(str);      hzkdis2("分");

52、60;    str0=ss/16+0x30;     str1=ss%16+0x30;     hzkdis2(str);      hzkdis2("秒");   /  lcdwc(0x98+FIRST_ADDR);         &

53、#160;                            sel = (read_clock(0x8b)%16; /字节低4位的BCD码放入sel               

54、60;    lcdwc(0x9c+FIRST_ADDR);/写入指定区域(97H 第二行第8个字)                 if(sel=7)  hzkdis("07");    /              

55、     if(sel=6)  hzkdis("06");    /                   if(sel=5)  hzkdis("05");    /         

56、0;         if(sel=4)  hzkdis("04");    /                   if(sel=3)  hzkdis("03");   /      &#

57、160;            if(sel=2)  hzkdis("02");    /                   if(sel=1)  hzkdis("01");    /星期一

58、0;                  lcdwc(0x9a+FIRST_ADDR);                 hzkdis("星期") ;   void disp_clock_set()  

59、   uchar str2;     str2=0;     lcdwc(0x89+FIRST_ADDR);      str0=hh/16+0x30;     str1=hh%16+0x30;     hzkdis2(str);      hzkd

60、is2("时");     str0=mm/16+0x30;     str1=mm%16+0x30;     hzkdis2(str);      hzkdis2("分");/*     str0=ss/16+0x30;     str1=ss%1

61、6+0x30;     hzkdis2(str);      hzkdis2("秒");  */         / week_clock_set   /  lcdwc(0x98+FIRST_ADDR);    /  hzkdis2(" &

62、quot;);     /*bit set_xs_1_flicker(uchar x,bit y)   /修改数据标志       uchar a,str2;  str1=0x1e;  bit flicker=0;  key_ok=1;  while (gotkey()!=16) xs_fl0: while(1)   for 

63、(a=0;a<20;a+)    /       delay(500);         if (gotkey()!=16) goto xs_fl1;     key_ok=0;   xs_fl1:  lcdwc(x+FIRST_ADDR);    if (fli

64、cker) hzkdis2("_");    else str0=0x31; str1=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 (

65、a=0x0b) return(y);   if(a=10)return(y);   if(a=13)          lcdwc(x+FIRST_ADDR);     str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str);     return(y);    &

66、#160; if(a=14) goto xs_lf2;                */uchar set_xs_flicker(uchar x,y)   /修改数据标志       uchar a,str2;  bit flicker=0;  key_ok=1;  while (got

67、key()!=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+FIR

68、ST_ADDR);    if (flicker) hzkdis2("_");    else str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str);    flicker = flicker;   a=gotkey();   if ( (a<10) && (key_ok=0)key_ok=1; y=a*16+(y%16); go

69、to xs_lf2;      if (a=0x0b) return(y);   if(a=10)return(y);   if(a=13)          lcdwc(x+FIRST_ADDR);     str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str); 

70、0;   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; 

71、60;   key_ok=0;   xs_fl3:    lcdwc(x+FIRST_ADDR);    if (flicker)         str0=y/16+0x30;    str1=0x5f;    hzkdis2(str);    &

72、#160; else str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str);    flicker = flicker;   a=gotkey();   if ( (a<10) && (key_ok=0)        key_ok=1;    y=(y/16)*16+a; 

73、60;      lcdwc(x+FIRST_ADDR);     str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str);    return(y);      if (a=0x0b) return(y);   if(a=10) return(y);   if(a=13) 

74、goto xs_fl0;         if(a=14)           lcdwc(x+FIRST_ADDR);     str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str);     return(y);    &

75、#160;      void xs_pls()                     clr_xs(); lcdwc(0x91+FIRST_ADDR); hzkdis("设置已经保存"); delay(10000);void set_clock()   &

76、#160; while(1)       lcdreset();    / read_clockS();     clr_xs();     lcdwc(0x82+FIRST_ADDR); hzkdis("时间设置");     disp_set_clock();set_cl1:  

77、60;yy=set_xs_flicker(0x91,yy);        if(gotkey()=11) read_clockS();return;        if(gotkey()=10)  new_time();xs_pls(); return;     set_cl2:   mo=set_xs_flicker(0x93,mo);

78、0;    if(gotkey()=11) read_clockS();return;     if(gotkey()=10) new_time(); xs_pls(); return;     if(gotkey()=13) goto set_cl1;set_cl3:   dd=set_xs_flicker(0x95,dd);     

79、if(gotkey()=11) read_clockS();return;     if(gotkey()=10) new_time();xs_pls(); return;     if(gotkey()=13) goto set_cl2;set_cl4:   hh=set_xs_flicker(0x89,hh);     if(gotkey()=11) read_clockS

80、();return;     if(gotkey()=10) new_time();xs_pls(); return;     if(gotkey()=13) goto set_cl3;set_cl5:   mm=set_xs_flicker(0x8b,mm);     if(gotkey()=11) read_clockS();return;   

81、0; if(gotkey()=10) new_time();xs_pls(); return;     if(gotkey()=13) goto set_cl4;set_cl6:   ss=set_xs_flicker(0x8d,ss);     if(gotkey()=11) read_clockS();return;     if(gotkey()=10) new

82、_time();xs_pls(); return;     if(gotkey()=13) goto set_cl5;set_cl7:            xq=set_xs_flicker(0x9c,xq);     if(gotkey()=11) read_clockS();return;     if(gotk

83、ey()=10) new_time();xs_pls(); return;     if(gotkey()=13) goto set_cl6 ;     goto set_cl7;  clock_set(uchar x)       /设置闹钟 uchar str2; str2=0;clkset1: if (x=0) x=1;   if (x>32)

84、x=1;        while(1)          lcdreset();     read_clockss(x);    /改为要修改的闹钟     clr_xs();     lcdwc(0x82+FIRST_ADDR); hz

85、kdis("闹钟设置");     lcdwc(0x87+FIRST_ADDR);      str0=x/10+0x30;      str1=x%10+0x30;     hzkdis2(str);          disp_clock_set();&#

86、160;    delay(100);     hh=set_xs_flicker(0x89,hh);     if(gotkey()=11) read_clockS();return;     if(gotkey()=10) Write_clockss(x);xs_pls(); return;     if(gotkey()=

87、13)  Write_clockss(x);x=x-1; goto clkset1;     if(gotkey()=14)  Write_clockss(x);x=x+1; goto clkset1;     mm=set_xs_flicker(0x8b,mm);set1:    if(gotkey()=11) read_clockS();return;     if(got

88、key()=10) Write_clockss(x);xs_pls(); return;     if(gotkey()=13) Write_clockss(x);  x=x-1;goto clkset1;     if(gotkey()=14)  Write_clockss(x); x=x+1; goto clkset1;     goto set1;/*  

89、60;  ss=set_xs_flicker(0x8d,ss);set2:    if(gotkey()=11) read_clockS();return;     if(gotkey()=10) Write_clockss(x);xs_pls(); return;     if(gotkey()=13)  Write_clockss(x); x=x-1;goto clkset1;     if(gotkey()=14) Write_clockss(x);  x=x+1;goto clkset1;     goto set2;*/  /*-*/*/*/ main()   uchar i;      lcdreset();   Init_DS18B20(); 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论