DS1302单片机智能闹钟.docx

上传人:rrsccc 文档编号:9866050 上传时间:2021-03-31 格式:DOCX 页数:30 大小:23.45KB
返回 下载 相关 举报
DS1302单片机智能闹钟.docx_第1页
第1页 / 共30页
DS1302单片机智能闹钟.docx_第2页
第2页 / 共30页
DS1302单片机智能闹钟.docx_第3页
第3页 / 共30页
DS1302单片机智能闹钟.docx_第4页
第4页 / 共30页
DS1302单片机智能闹钟.docx_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《DS1302单片机智能闹钟.docx》由会员分享,可在线阅读,更多相关《DS1302单片机智能闹钟.docx(30页珍藏版)》请在三一文库上搜索。

1、DS1302单片机智能闹钟/*/ /头文件#include#include /*/ /灯与蜂鸣器定义sbit led_b = P27;sbit led_r = P14;sbit led_g1 = P13;sbit led_g2 = P12;sbit led_g3 = P10;sbit led_g4 = P11;sbit beep = P31;/*/ /温度传感器定义sbit DQ = P3 0;/ds18B20/*/ /键盘引脚定义sbit KEY_1 = P23; /左上sbit KEY_2 = P24; /左下sbit KEY_3 = P26; /右上sbit KEY_4 = P25; /

2、右下sbit KEY_I = P32; /常0/*/ /引脚定义sbit SID = P21; /数据sbit SCLK = P22; /时钟/*/ /定义DS1302时钟接口sbit clock_clk = P3 5;/ds1302_clk(时钟线)sbit clock_dat = P3 4;/ds1302_dat(数据线)sbit clock_Rst = P3 3;/ds1302_Rst(复位线)/*/ /定义累加器A中的各位sbit a0 = ACC 0;sbit a1 = ACC 1;sbit a2 = ACC 2;sbit a3 = ACC 3;sbit a4 = ACC 4;sbi

3、t a5 = ACC 5;sbit a6 = ACC 6;sbit a7 = ACC 7;/*/ /定义全局变量unsigned char yy,mo,dd,xq,hh,mm,ss;/定义时间映射全局变量(专用寄存器)bit w = 0; /调时标志位static unsigned char menu = 0;/定义静态小时更新用数据变量static unsigned char keys = 0;/定义静态小时更新用数据变量static unsigned char timecount = 0;/定义静态软件计数器变量/*/ void DelayM(unsigned int a)/延时函数1MS

4、/次unsigned char i;while( -a != 0)for(i = 0; i /i 从0加到125,CPU大概就耗时1毫秒/*/ /函数声明void lcm_w_word(unsigned char *str) ; /写字符例:lcm_w_word(您好!);void lcm_w_test(bit start,unsigned char ddata); /(0,指令)(1,数据)void lcm_w_byte(unsigned char bbyte); /写一个字节给lcmvoid delaynms(unsigned int di); /延时void lcm_init(void)

5、; /lcm初始化void lcm_clr(void); /清屏void days (viod) /公历节日数据库lcm_w_test(0,0x80);lcm_w_word(Dis Set);lcm_w_test(0,0x98);/ -|-|if ( mo = 0x01 & dd = 0x01 ) lcm_w_word(Happy New Year!); /1月if ( mo = 0x01 & dd = 0x28 ) lcm_w_word( 世界麻风日); if ( mo = 0x02 & dd = 0x02 ) lcm_w_word( 世界湿地日); /2月if ( mo = 0x02 &

6、dd = 0x13 ) lcm_w_word( 明天情人节了); if ( mo = 0x02 & dd = 0x14 ) lcm_w_word( 今天是情人节); if ( mo = 0x03 & dd = 0x01 ) lcm_w_word( 国际海豹日); /3月if ( mo = 0x03 & dd = 0x03 ) lcm_w_word( 全国爱耳日); if ( mo = 0x03 & dd = 0x08 ) lcm_w_word( 3.8妇女节); if ( mo = 0x03 & dd = 0x12 ) lcm_w_word( 植树节); if ( mo = 0x03 & dd

7、 = 0x14 ) lcm_w_word( 国际警察日); if ( mo = 0x03 & dd = 0x15 ) lcm_w_word( 消费者权益日); if ( mo = 0x03 & dd = 0x17 ) lcm_w_word( 国际航海日); if ( mo = 0x03 & dd = 0x21 ) lcm_w_word( 世界森林日); if ( mo = 0x03 & dd = 0x22 ) lcm_w_word( 世界水日); if ( mo = 0x03 & dd = 0x23 ) lcm_w_word( 世界气象日); if ( mo = 0x03 & dd = 0x2

8、4 ) lcm_w_word(世界防治结核病日); if ( mo = 0x04 & dd = 0x01 ) lcm_w_word(愚人节小心上当); /4 if ( mo = 0x04 & dd = 0x07 ) lcm_w_word( 世界卫生日); if ( mo = 0x04 & dd = 0x08 ) lcm_w_word( 复活节); if ( mo = 0x04 & dd = 0x13 ) lcm_w_word( 黑色星期五); if ( mo = 0x05 & dd = 0x01 ) lcm_w_word( 劳动节放假); /5 if ( mo = 0x05 & dd = 0x

9、04 ) lcm_w_word( 青年节); if ( mo = 0x05 & dd = 0x08 ) lcm_w_word( 世界红十字日); if ( mo = 0x05 & dd = 0x12 ) lcm_w_word( 国际护士节); if ( mo = 0x05 & dd = 0x05 ) lcm_w_word(近日注意母亲节); if ( mo = 0x05 & dd = 0x15 ) lcm_w_word( 国际家庭日); if ( mo = 0x05 & dd = 0x31 ) lcm_w_word( 世界无烟日); if ( mo = 0x06 & dd = 0x01 ) l

10、cm_w_word( 国际儿童节); /6 if ( mo = 0x06 & dd = 0x05 ) lcm_w_word( 世界环境日); if ( mo = 0x06 & dd = 0x26 ) lcm_w_word( 国际禁毒日); if ( mo = 0x06 & dd = 0x06 ) lcm_w_word( 全国爱眼日); if ( mo = 0x06 & dd = 0x13 ) lcm_w_word(近日注意父亲节); if ( mo = 0x06 & dd = 0x15 ) lcm_w_word(近日注意父亲节); if ( mo = 0x07 & dd = 0x01 ) lc

11、m_w_word(香港回归记念日); /7 if ( mo = 0x07 & dd = 0x07 ) lcm_w_word(抗日战争记念日); if ( mo = 0x07 & dd = 0x11 ) lcm_w_word( 世界人口日); if ( mo = 0x08 & dd = 0x01 ) lcm_w_word( 八一建军节); /8 if ( mo = 0x08 & dd = 0x08 ) lcm_w_word( 中国男子节); if ( mo = 0x08 & dd = 0x15 ) lcm_w_word(抗战胜利记念日); if ( mo = 0x09 & dd = 0x10 )

12、 lcm_w_word( 中国教师节); /9 if ( mo = 0x09 & dd = 0x18 ) lcm_w_word(九一八事变记念); if ( mo = 0x09 & dd = 0x20 ) lcm_w_word( 国际爱牙日); if ( mo = 0x09 & dd = 0x27 ) lcm_w_word( 世界旅游日); if ( mo = 0x10 & dd = 0x01 ) lcm_w_word( 中国国庆节); /10 if ( mo = 0x10 & dd = 0x04 ) lcm_w_word( 世界动物日); if ( mo = 0x10 & dd = 0x24

13、 ) lcm_w_word( 联合国日); if ( mo = 0x10 & dd = 0x12 ) lcm_w_word(明天国际教师节); if ( mo = 0x10 & dd = 0x13 ) lcm_w_word( 国际教师节); if ( mo = 0x11 & dd = 0x10 ) lcm_w_word( 世界青年节); /11if ( mo = 0x11 & dd = 0x17 ) lcm_w_word( 世界学生节); if ( mo = 0x12 & dd = 0x01 ) lcm_w_word( 世界艾滋病日); /12if ( mo = 0x12 & dd = 0x2

14、3 ) lcm_w_word( 明晚平安夜); if ( mo = 0x12 & dd = 0x24 ) lcm_w_word( 今晚平安夜); if ( mo = 0x12 & dd = 0x25 ) lcm_w_word( 圣诞快乐); if ( mo = 0x12 & dd = 0x31 ) lcm_w_word( 明日新年); elseif ( hh = 0x04 & hh if ( hh = 0x06 & hh if ( hh = 0x08 & hh if ( hh = 0x12) lcm_w_word(_中午); if ( hh = 0x13 & hh if ( hh = 0x18

15、 & hh if ( hh = 0x22 & hh if ( hh = 0x00 & hh /*/ /初始化LCMvoid lcm_init(void) delaynms(100); /启动等待,等LCM讲入工作状态lcm_w_test(0,0x30); /8 位介面,基本指令集lcm_w_test(0,0x0c); /显示打开,光标关,反白关lcm_w_test(0,0x01); /清屏,将DDRAM的地址计数器归零delaynms(100); /启动等待,等LCM讲入工作状态/* /写指令或数据(0,指令)(1,数据)void lcm_w_test(bit start, unsigned

16、char ddata) unsigned char start_data,Hdata,Ldata;if(start=0)start_data=0xf8; /0:写指令elsestart_data=0xfa; /1:写数据Hdata=ddata&0xf0; /取高四位Ldata=(ddata0;i-)DQ = 0; / 给脉冲信号dat=1;DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;Delay(4);return(dat);/* /void WriteOneChar(unsigned char dat)/写一个字节unsigned char i=0;for (i=8; i0;

17、 i-)DQ = 0;DQ = dat&0x01;Delay(5);DQ = 1;dat=1;/* /unsigned int ReadTemperature(void)/读取温度unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度

18、寄存器a=ReadOneChar(); /读低8位b=ReadOneChar(); /读高8位t=b;tt=t|a;tt=t*0.0625;t= tt*10+0.5; /放大10倍输出并四舍五入return(t);/*/ /声明void lcm_w_ss(void);void lcm_w_mm(void);void lcm_w_hh(void);void lcm_w_dd(void);void lcm_w_mo(void);void lcm_w_yy(void);void lcm_w_xq(void);unsigned char clock_in(void);void clock_out(un

19、signed char dd);void Init_1302(void);unsigned char read_clock(unsigned char ord);void read_clockS(void);void Set_time(unsigned char sel);void write_clock(unsigned char ord, unsigned char dd);void updata (void);/*/ /常用时钟数据读取void read_clockS(void)ss = read_clock(0x81);/读取秒数据mm = read_clock(0x83);/读取分钟

20、数据hh = read_clock(0x85);/小时dd = read_clock(0x87);/日mo = read_clock(0x89);/月xq = read_clock(0x8b);/星期yy = read_clock(0x8d);/年/*/ /调时用加1程序void Set_time(unsigned char sel) /根据选择调整的相应项目加1并写入DS1302signed char address,item;signed char max,mini;lcm_w_test(0,0x9a);lcm_w_word(调整);/if(sel=6) lcm_w_word(秒钟);ad

21、dress=0x80; max=0;mini=0; /秒7if(sel=5) lcm_w_word(分钟);address=0x82; max=59;mini=0; /分钟6if(sel=4) lcm_w_word(小时);address=0x84; max=23;mini=0; /小时5if(sel=3) lcm_w_word(星期);address=0x8a; max=7;mini=1; /星期4if(sel=2) lcm_w_word(日期);address=0x86; max=31;mini=1; /日3if(sel=1) lcm_w_word(月份);address=0x88; ma

22、x=12;mini=1; /月2if(sel=0) lcm_w_word(年份);address=0x8c; max=99; mini=0; /年1/读取1302某地址上的数值转换成10进制赋给itemitem=(read_clock(address+1)/16)*10 + (read_clock(address+1)%16;if(KEY_2 = 0)item+;/数加1if(KEY_4 = 0)item-;/数减1if(itemmax) item=mini;/查看数值有效范围if(itemwrite_clock(0x8e,0x00);/允许写操作write_clock(address,(it

23、em/10)*16+item%10);/转换成16进制写入1302write_clock(0x8e,0x80);/写保护,禁止写操作updata (); /刷新数据lcm_w_mm();/刷新分/*/ /设置1302的初始时间void Init_1302(void)/(2007年1月1日00时00分00秒星期一)write_clock(0x8e,0x00);/允许写操作write_clock(0x8c,0x07);/年write_clock(0x8a,0x01);/星期write_clock(0x88,0x01);/月write_clock(0x86,0x01);/日write_clock(0

24、x84,0x00);/小时write_clock(0x82,0x00);/分钟write_clock(0x80,0x00);/秒write_clock(0x90,0xa5);/充电write_clock(0x8e,0x80);/禁止写操作/*/ /DS1302写数据(底层协议)void write_clock(unsigned char ord, unsigned char dd)clock_clk=0;clock_Rst=0;clock_Rst=1;clock_out(ord);clock_out(dd);clock_Rst=0;clock_clk=1;/*/ /1302驱动程序(底层协议)

25、void clock_out(unsigned char dd)ACC=dd;clock_dat=a0; clock_clk=1; clock_clk=0;clock_dat=a1; clock_clk=1; clock_clk=0;clock_dat=a2; clock_clk=1; clock_clk=0;clock_dat=a3; clock_clk=1; clock_clk=0;clock_dat=a4; clock_clk=1; clock_clk=0;clock_dat=a5; clock_clk=1; clock_clk=0;clock_dat=a6; clock_clk=1;

26、clock_clk=0;clock_dat=a7; clock_clk=1; clock_clk=0;/*/ /DS1302写入字节(底层协议)unsigned char clock_in(void)clock_dat=1;a0=clock_dat;clock_clk=1; clock_clk=0; a1=clock_dat;clock_clk=1; clock_clk=0; a2=clock_dat;clock_clk=1; clock_clk=0; a3=clock_dat;clock_clk=1; clock_clk=0; a4=clock_dat;clock_clk=1; clock_

27、clk=0; a5=clock_dat;clock_clk=1; clock_clk=0; a6=clock_dat;clock_clk=1; clock_clk=0; a7=clock_dat;return(ACC);/*/ /DS1302读数据(底层协议)unsigned char read_clock(unsigned char ord)unsigned char dd=0;clock_clk=0;clock_Rst=0;clock_Rst=1;clock_out(ord);dd=clock_in();clock_Rst=0;clock_clk=1;return(dd);/*/ /向LC

28、M中填写年数据void lcm_w_yy(void)/if(read_clock(0x8d) != yy)yy = read_clock(0x8d);lcm_w_test(0,0x83);lcm_w_word(20);lcm_w_test(0,0x84);lcm_w_test(1,(yy/16)+0x30);lcm_w_test(1,yy%16+0x30); /*/ /向LCM中填写月数据void lcm_w_mo(void)/if(read_clock(0x89) != mo)mo = read_clock(0x89);lcm_w_test(0,0x90);if(mo/16 != 0)lcm

29、_w_test(1,(mo/16)+0x30); /十位消隐elselcm_w_test(1,0x20);/同上lcm_w_test(1,mo%16+0x30);lcm_w_test(0,0x91);lcm_w_word(月); /*/ /星期处理并送入LCM的指定区域void lcm_w_xq(void)unsigned char sel;/if(read_clock(0x8b) != xq)xq = read_clock(0x8b);sel = (read_clock(0x8b)%16; /字节低4位的BCD码放入sellcm_w_test(0,0x97);/写入指定区域(97H 第二行第

30、8个字)if(sel=7) lcm_w_word(日); /if(sel=6) lcm_w_word(六); /if(sel=5) lcm_w_word(五); /if(sel=4) lcm_w_word(四); /if(sel=3) lcm_w_test(1,0xc8);lcm_w_test(1,0xfd); /此指令等于lcm_w_word(三); 因为“三”的内码失效。if(sel=2) lcm_w_word(二); /if(sel=1) lcm_w_word(一); /星期一lcm_w_test(0,0x95);lcm_w_word(星期);/*/ /向LCM中填写日数据void lc

31、m_w_dd(void)/ if(read_clock(0x87) != dd)dd = read_clock(0x87);lcm_w_test(0,0x92);if(dd/16 != 0)lcm_w_test(1,(dd/16)+0x30); /十位消隐elselcm_w_test(1,0x20);/同上lcm_w_test(1,dd%16+0x30);lcm_w_test(0,0x93);lcm_w_word(日); /*/ /向LCM中填写小时数据void lcm_w_hh(void)if(read_clock(0x85) != hh)hh = read_clock(0x85);if (

32、hh 0x07 & hh beep = 0; led_r = 0;DelayM(100);beep = 1; led_r = 1;lcm_w_test(0,0x88);lcm_w_test(1,(hh/16)+0x30);lcm_w_test(1,hh%16+0x30); /*/ /向LCM中填写分钟数据void lcm_w_mm(void)if(read_clock(0x83) != mm)mm = read_clock(0x83);if( w = 0)days(); /节日显示updata (); /刷新数据lcm_w_test(0,0x89);lcm_w_test(1,0x3a); /:

33、lcm_w_test(1,(mm/16)+0x30);lcm_w_test(1,mm%16+0x30);lcm_w_test(1,0x2e); /./*/ /刷新数据void updata (void)lcm_w_hh();/刷新小时lcm_w_dd();/刷新日lcm_w_xq();/更新星期值lcm_w_mo();/刷新月lcm_w_yy();/刷新年/*/ /向LCM中填写秒数据void lcm_w_ss(void)unsigned int i=0;unsigned char a=0,b=0,c=0;if(read_clock(0x81) != ss) /判断是否需要更新ss = rea

34、d_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_test(0,0x8d); /温度在LCM上的写入位置i=ReadTemperature();/读温度并送显a=i/100;lcm_w_test(1,a+0x30); /显示温度十位b=i/10-a*10;lcm_w_test(1,b+0x30); /个位lcm_w_test(1,0x2

35、e); /.c=i-a*100-b*10;lcm_w_test(1,c+0x30); /小位1位lcm_w_word(); /度C /*/ /-主程序-/main() unsigned char e=0;KEY_I = 0;KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;/初始键盘yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; /各数据刷新beep = 0;DelayM(900);beep = 1;lcm_init();/初始化液晶显示器lcm_clr();/清屏lcm_w_word( 12864LcdClock Hello ! from http:/ /显示等留3秒/lcm_w_test(0,0x80);/lcm_w_word(Dis Set);while(1)if (w = 0) /正常走时lcm_w_ss();/刷新秒else /启动调时/-if (KEY_3 = 0) / 设置时间DelayM(20); /去抖led_g3 = 0;led_r = 1;if(KEY_3 = 0 & w = 1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1