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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(基于单片机的多功能电子钟设计Proteus仿真程序Word文档格式.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

基于单片机的多功能电子钟设计Proteus仿真程序Word文档格式.docx

1、 /定义累加器的最高和最低位。sbit ACC0=ACC0;bit flagalarm,flagseta,flagset; /分别定义闹钟响标志位,闹钟设置标志位,/和时间设置标志位.uchar kmenunum,s,m,h; /功能键被按次数的计数器.char second,minute,hour,year,month,day,week;uchar inittime7=0x00,0x00,0x16,0x01,0x05,0x07,0x11; /初始化后设置为:/11年5月1日星期日,16点0分0秒, /从左往右的数据依次是,秒,分,时,日,月,星期,年。uchar code t1= 20 -

2、; /液晶固定显示部分。uchar code t2= :uchar code t3=CLOCK ALARM:/各函数声明.void delay(uint z); /毫秒级延时函数。void di(); /蜂鸣器发声函数。void writecom(uchar com); /液晶写命令函数。void writedata(uchar dat); /液晶写数据函数。void writetime(uchar add,char dat); /液晶刷新时分秒。void writenyr(uchar add,char dat); /液晶刷新日期。void writeweek(char week); /液晶星

3、期几显示函数。void keyscan(); /键盘扫描函数。void dswritebyte(uchar d);/往DS1302写入一个字节。 uchar dsreadbyte(); /从DS1302读出一个字节。void dswrite(uchar add, uchar dat); /向DS1302的指定地址写入一个字节。uchar dsread(uchar add); /从DS1302的指定地址读出一个字节.void init1302time(uchar *pClock); /DS1302时间初始化函数.void init(); /初始化函数。ds18b20_delay(uchar xu

4、s); /延时xusvoid write_onechar(uchar dat); /向18B20写一字节uchar read_onechar(); /从18B20读一字节uint read_wendu(); /DS18B20读温度void wendu_desplay(uint dat); /温度值送液晶显示函数 void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;yy-);ds18b20_delay(uchar xus)while(xus-);/*ds18b20*/void ds18b20_init() /DS18B20初始化uchar x=0

5、;DQ=1;ds18b20_delay(8);DQ=0;ds18b20_delay(80);ds18b20_delay(14);x=DQ;ds18b20_delay(20);void write_onechar(uchar dat) /写一字节uchar i;for(i=8;ii-)if(dat&0x01=0x01)elseds18b20_delay(5);ds18b20_delay(1);dat=1;uchar read_onechar() /读一字节uchar value=0,i;valueif(DQ=1)value|=0x80;value&=0x7f;ds18b20_delay(4);r

6、eturn value;uint read_wendu() /DS18B20读温度uchar a=0,b=0;uint wen=0x0000;ds18b20_init(); /初始化write_onechar(0xcc); / 跳过读序号列号的操作write_onechar(0x44); / 启动温度转换ds18b20_delay(150); /跳过读序号列号的操作write_onechar(0xbe); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度b=read_onechar(); /读取温度值低位a=read_onechar(); /读取温度值高位wen=a;wen=(wen8)

7、|b;return wen;void wendu_desplay(uint dat) /温度转换后送显示float temp;unsigned char temp_shi,temp_ge,temp_shu;temp=dat*0.625; /dat*0.0625*10temp_shi=temp/100; /取十位 temp除不用定义类型temp_ge =(uint)temp)%100/10; /取个位 temp求模要定义类型,为16位,故定义uinttemp_shu=(uint)temp)%100%10; /取小数writecom(0x80+0x40+10); /送显示writedata(0x3

8、0+temp_shi);writedata(0x30+temp_ge);writedata(0x2e);writedata(0x30+temp_shu);writedata(0xdf); /温度符号writedata(0x43);void di()beep=0;delay(100);beep=1;void writecom(uchar com)lcden=0;lcdrw=0;lcdrs=0;lcddata=com;delay(3);lcden=1;void writedata(uchar dat)lcdrs=1;lcddata=dat;void writetime(uchar add,char

9、 dat) /液晶刷新时分秒。 /0为时的开始位置,3为分,6为秒。char shi,ge;shi=dat/10;ge=dat%10;writecom(0x80+0x40+add);writedata(0x30+shi);writedata(0x30+ge);void writenyr(uchar add,char dat) /液晶刷新日期。 /2为年,5为月,8为日。writecom(0x80+add);void writeweek(char week) /液晶星期几显示函数。writecom(0x80+12);switch(week)case 1: writedata(M);delay(5

10、);writedata(ONbreak;case 2:TUEcase 3:WDcase 4:Hcase 5:FRIcase 6:SAcase 7:void keyscan() /键盘扫描函数。if(flagalarm=1) /如果闹钟在响,任意键停止闹钟响。if(kmenu=0)|(kup=0)|(kdown=0)|(kalarm=0)delay(4);while(!(kmenu&kup&kdown&kalarm);di();flagalarm=0; /清除闹钟标志。 if(kmenu=0) /检测功能键。if(kmenu=0)kmenunum+; /记录功能键按下次数。if(flagseta

11、=1) / 检测是否在进行闹钟设置。if(kmenunum=4) kmenunum=1; /因为进行闹钟设置时,只调节/时分秒,所以,kmenunum 只能等于1,2,3。flagset=1; /设置标志位,表示在进行各种时间设置。kmenu);switch(kmenunum) /定位光标闪烁点。 writecom(0x80+0x40+7); /秒闪烁。writecom(0x0f); /开光标闪烁。 writecom(0x80+0x40+4); /分闪烁。 writecom(0x80+0x40+1); /时闪烁。 writecom(0x80+12); /星期闪烁. writecom(0x80+

12、9); /日闪烁. writecom(0x80+6); /月闪烁. writecom(0x80+3); /年闪烁.case 8: kmenunum=0;writecom(0x0c); /取消光标闪烁。flagset=0; /取消时间调节标志。dswrite(0x8e,0x00); /*允许写操作*/dswrite(0x80,second/10*16+second%10); /退出时间设置功能时,往DS1302dswrite(0x82,minute/10*16+minute%10); /中保存所有时间变量的值。dswrite(0x84,hour/10*16+hour%10);dswrite(0x

13、8a,week/10*16+week%10);dswrite(0x86,day/10*16+day%10);dswrite(0x88,month/10*16+month%10);dswrite(0x8c,year/10*16+year%10);dswrite(0x8e,0x80); /*禁止写操作*/if(kmenunum!=0) /只有当功能键按下时,才检测增大,减小键.if(kup=0)delay(2);kup); /根据功能键被按下的次数,调节相应数值。 second+;if(second=60)second=0;writetime(7,second);writecom(0x80+0x4

14、0+7); /因为,上面送液晶显示 /一次,光标后移一位,所以要将光标复位. minute+;if(minute=60)minute=0;writetime(4,minute);writecom(0x80+0x40+4); hour+;if(hour=24)hour=0;writetime(1,hour);writecom(0x80+0x40+1); week+;if(week=8)week=1;writeweek(week); day+;if(day=32)day=1;writenyr(9,day);writecom(0x80+9); month+;if(month=13)month=1;w

15、ritenyr(6,month);writecom(0x80+6); year+;if(year=100)year=0;writenyr(3,year);writecom(0x80+3);if(kdown=0)kdown); /根据功能键被按次数调节相应数值. second-;if(second=-1)second=59; minute-;if(minute=-1)minute=59; hour-;if(hour=-1)hour=23; week-;if(week=0)week=7; day-;if(day=0)day=31; month-;if(month=0)month=12; year-

16、;if(year=-1)year=99;if(kalarm=0) /检测闹钟调节键是否按下,此条if语句与 if(kmenunum!=0) /在同一个层次。if(kalarm=0)flagseta=flagseta;kalarm);if(flagseta=0) /此时,退出闹钟设置,保存各相关数值。 /清除时间设置标志,在if(kalarm=0)这个if语句writecom(0x80+0x40);/中,不用flagset=1这条语句来设置/flagset标志位,因为,如果进行了闹钟时间的设置/,就会执行前面if(kmenunum=0)语句中的flagset=1这条语句。 /清除液晶上的“Ri”闹钟调节标志。/writedata(/*for(i=0;i i-)dsdata = ACC0;dsclk = 1; /为什么这里时钟先为1后为0,因为dsclk初始化为0,而,每次循环最后,都将其置0,这样就形成一个从0开始的上升沿,恰好满足ds1302写数据在上升沿,但是,时钟必须从0开始的要求.dsclk = 0;ACC = ACC 1; uchar dsreadbyte() /从DS1302读出一个

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2