ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:18.27KB ,
资源ID:6828814      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6828814.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DS1302数字时钟设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DS1302数字时钟设计.docx

1、DS1302数字时钟设计DS1302数字时钟设计本次万年历设计基于AT89C52单片机微控器、DS1302时钟芯片、DS18b20温度传感器、1602液晶,仅用4个按键实现调时、定时功能。下面介绍本次设计仿真操作过程:S1命名为“调时”;S2命名为“+”;S3命名为“-”;S3命名为“闹钟”功能实现:仿真开始后,液晶屏显示2012/03/24 6 20:25:00 26C 并开始走。(注:6表示周六,由于为特殊字符,1602液晶暂不支持显示,故用C代替)。调时功能:按一下S1进入调时间模式,秒清零,同时分位闪烁约两下,提示按下S2或S3时,调节分,根据需要按S2或S3调到所需的分钟时刻,再按一

2、下S1,时位闪烁约两下,提示按下S2或S3时,调节时,根据需要按S2或S3调到所需的小时时刻,再按一下S1,周位闪烁约两下,提示按下S2或S3时,调节周,根据需要按S2或S3调到所需的周时刻,再按一下S1,日位闪烁约两下,提示按下S2或S3时,调节日,根据需要按S2或S3调到所需的日时刻,再按一下S1,月位闪烁约两下,提示按下S2或S3时,调节月,根据需要按S2或S3调到所需的月时刻,再按一下S1,年位闪烁约两下,提示按下S2或S3时,调节年,根据需要按S2或S3调到所需的年时刻(注:程序设定年范围为2000-2050),再按一下S1会看到,时间会按照设定好的新时间走下去定时功能:按一下S4进

3、入定时模式,显示的时间停止,(DS1302仍在工作,只不过其时间没有显示出来),同上,再按S1和S2或S3进行定时时间的设定,设定好后,再按一下S4(表示确认设定的时间),时间会按原来的时间走,当到达设定的时间后,LED灯闪烁,再按一下S4,LED灯停止闪烁,时间会照常进行。按DS18B20的上升、下降箭头,来调节温度,液晶上会动态的显示出来;注:本次设计虽然经过反复调试,但仍有不尽人意之处,例如:误操作考虑的比较少等,但只要大家按照上面的严格操作,就可以实现调时、定时功能,谢谢大家。附:源程序:#include reg52.h#include #define uint unsigned in

4、t#define uchar unsigned charsbit dq=P22;sbit sclk=P10;sbit io=P11;sbit rst=P12;sbit bee=P23;sbit dula=P26;sbit wela=P27;sbit key1=P30;/S1sbit key2=P31;/S2sbit key3=P32;/S3sbit key4=P33;/S4sbit lcden=P34;sbit rs=P35;sbit rd=P37;sbit ACC_0=ACC0;sbit ACC_7=ACC7;uchar temp;uchar code table0=0123456789;u

5、char code table1=20/:;char flag,flag1,flag2,num,miao,fen,shi,zhou,ri,yue,nian,dfen,dshi;uchar code time=0x12,0x03,0x24,0x06,0x20,0x25,0x00;void write_com(uchar);void write_date(uchar);void write_byte(uchar);void write_ds1302(uchar,uchar);uchar read_ds1302(uchar);void init();void display_time();void

6、read_time();void tiaoshi();void delay(uint);void init_b20();void delay_us (uint);uchar read_byte();void write_byte_b20(uchar);uchar read_temp();void main() init(); init_b20(); while(1) temp=read_temp(); tiaoshi(); read_time(); display_time(); if(dshi=shi)&(dfen=fen) while(flag1=2) bee=bee; tiaoshi()

7、; read_time(); display_time(); delay(100); bee=1; char zhuan_date1(char aa) uchar bb; bb=16*(aa/10)+aa%10; return bb;void write_xintime() write_ds1302(0x8e,0x00); write_ds1302(0x8c,zhuan_date1(nian); /年 write_ds1302(0x88,zhuan_date1(yue); /月 write_ds1302(0x86,zhuan_date1(ri); /日 write_ds1302(0x8A,zh

8、uan_date1(zhou); /星期 write_ds1302(0x84,zhuan_date1(shi); /时 write_ds1302(0x82,zhuan_date1(fen); /分 write_ds1302(0x80,zhuan_date1(miao); /秒 write_ds1302(0x8e,0x80); void tiaoshi() if(key1=0) if(key1=0) while(!key1) write_com(0x0c); flag=1;/进入调时模式下,时间不再走的标志 flag2=1;/调时间键按下的标志,防止误操作,+、-引起时间变化 num+; /if

9、(num=8) /num=0; switch(num) case 1: miao=0; write_com(0x80+0x47); write_com(0x0d);/秒清零显示分的位置闪烁 delay(1200); break; case 2: write_com(0x80+0x44); write_com(0x0d);/时的位置闪烁 delay(1200); break; case 3: write_com(0x80+0x0e); write_com(0x0d);/周的位置闪烁 delay(1200); break; case 4: write_com(0x80+0x0b); write_c

10、om(0x0d); delay(1200);/日的位置闪烁 break; case 5: write_com(0x80+0x08); write_com(0x0d); delay(1200);/月的位置闪烁 break; case 6: write_com(0x80+0x05); write_com(0x0d); delay(1200);/年的位置闪烁 break; case 7: flag=0; num=0; write_xintime(); break;/将调好的新时间写入1302 /flag清零标志可以从1302中读时间 if(key2=0)&(flag2=1) if(key2=0)&(

11、flag2=1) while(!key2) write_com(0x0c); flag=1; switch(num) case 1: miao=0; fen+; if(fen=60) fen=0; break; case 2: shi+; if(shi=24) shi=0; break; case 3: zhou+; if(zhou=8) zhou=1; break; case 4: ri+; if(ri=32) ri=1; break; case 5: yue+; if(yue=13) yue=1; break; case 6: nian+; if(nian=51) nian=0; brea

12、k; if(key3=0)&(flag2=1) if(key3=0)&(flag2=1) while(!key3) write_com(0x0c); flag=1; switch(num) case 1: fen-; if(fen=-1) fen=59; break; case 2: shi-; if(shi=-1) shi=23; break; case 3: zhou-; if(zhou=0) zhou=7; break; case 4: ri-; if(ri=0) ri=31; break; case 5: yue-; if(yue=0) yue=12; break; case 6: n

13、ian-; if(nian=-1) nian=50; break; if(key4=0) if(key4=0) while(!key4) write_com(0x0c); flag1+;/闹钟键按下次数的简单计数 if(flag1=1) flag=1;/按一次闹钟键,进入设置闹钟模式,标志不在从1302中读时间 if(flag1=2) flag=0;/按闹钟键两次,闹钟时间设定确认,同时时钟照原来的时间走 dshi=shi; dfen=fen; if(flag1=3) flag1=0; num=0; void display_time() write_com(0x80+0x4a); write

14、_date(table0miao%10); write_com(0x80+0x49); write_date(table0miao/10); write_com(0x80+0x47); write_date(table0fen%10); write_com(0x80+0x46); write_date(table0fen/10); write_com(0x80+0x44); write_date(table0shi%10); write_com(0x80+0x43); write_date(table0shi/10); write_com(0x80+0x0b); write_date(tabl

15、e0ri%10); write_com(0x80+0x0a); write_date(table0ri/10); write_com(0x80+0x08); write_date(table0yue%10); write_com(0x80+0x07); write_date(table0yue/10); write_com(0x80+0x0e); write_date(table0zhou); write_com(0x80+0x05); write_date(table0nian%10); write_com(0x80+0x04); write_date(table0nian/10); wri

16、te_com(0x80+0x4e); write_date(table0temp%10); write_com(0x80+0x4d); write_date(table0temp/10);char zhuan_date(char aa) uchar bb; bb=10*(aa/16)+aa%16; return bb;void read_time() if(flag=0) miao=zhuan_date(read_ds1302(0x81); /秒寄存器 fen=zhuan_date(read_ds1302(0x83); /分 shi=zhuan_date(read_ds1302(0x85);

17、/时 zhou=zhuan_date(read_ds1302(0x8b); /星期 ri=zhuan_date(read_ds1302(0x87); /日 yue=zhuan_date(read_ds1302(0x89); /月 nian=zhuan_date(read_ds1302(0x8d); /年 void init() uchar i; dshi=-1; dfen=-1; dula=0; wela=0; rd=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);/1602初始化 w

18、rite_com(0x82); for(i=0;i0;i-) ACC=ACC1; ACC_7=io; sclk=1; sclk=0; sclk=1; _nop_(); rst=0; return(ACC);void write_ds1302(uchar add,uchar dat) rst=0; _nop_(); sclk=0; _nop_(); rst=1; write_byte(add); _nop_(); write_byte(dat); sclk=1;/置高释放总线 _nop_(); rst=0;void write_byte(uchar dat) uchar i; ACC=dat;

19、for(i=8;i0;i-) io=ACC_0; sclk=1; sclk=0; ACC=ACC1; void write_com(uchar com) rs=0; P0=com; delay(1); lcden=1; delay(1); lcden=0;void write_date(uchar date) rs=1; P0=date; delay(1); lcden=1; delay(1); lcden=0; delay(1); uchar read_temp() uchar a,b; init_b20(); write_byte_b20(0xcc); write_byte_b20(0x4

20、4); delay_us(300); init_b20(); write_byte_b20(0xcc); write_byte_b20(0xbe); a=read_byte(); b=read_byte(); b4; return b;void write_byte_b20(uchar date) uchar i; for(i=0;i=1; delay_us(4);uchar read_byte() uchar i,value=0; for(i=0;i=1; dq=1; if(dq=1) value=value|0x80; delay_us(4); return value;void delay (uint z)/z毫秒延时函数 uint x,y; for (x=z;x0;x-) for(y=110;y0;y-);void delay_us (uint z)/z微秒延时函数 while(z-);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1