




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 62453-1:2025 RLV EN Field device tool (FDT) interface specification - Part 1: Overview and guidance
- 重庆简介教学课件
- 河南省天一联考2026届高三年级开学联考物理试卷(含答案解析)
- 重庆文理学院老师课件
- 暑假预习:磁场对通电导线的作用力 -2025人教版新高二物理暑假专项提升
- 人教版八年级物理上册 第五章《透镜及其应用》单元测试卷及答案
- 人教版八年级物理上册 第三章《物态变化》单元检测卷(带答案)
- 重庆培训母婴知识课件
- 建筑施工-安全培训课件-安全奖励效果分析
- 区镇智慧社区解决方案
- 2024年注册安全工程师考试(初级)安全生产法律法规试题及答案
- 2025初一新生入学教育大会校长讲话
- 监控安全知识培训课件
- 仓库盘点流程与库存管理技巧
- 护理法律风险防范
- 内科主治医师消化内科学考试题库真题及答案
- 5-1 安全协议概述(1)-安全协议内涵
- 校长在全体教师大会上的讲话:尺在言中界在人心度于行中-三尺讲台上的教育修为
- 2025广西公需科目培训考试答案(90分)一区两地一园一通道建设人工智能时代的机遇与挑战
- 中学营养餐管理办法
- 地质勘查人员职业技能鉴定经典试题含答案
评论
0/150
提交评论