




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
带温度的LCD1602电子时钟设计实验 信息科学与工程学院 专业:信息管理与信息系统1班 姓名: 姓名: 带温度的LCD1602电子时钟设计一、实验目的 学习利用AT89C52进行任务设计,练习使用52单片机内部的 定时器进行计时。学习ds1302时钟芯片和ds18b20温度传感器的使用。学习用模块化编程进行较长程序的编写。二、实验要求 (1)利用lcd1602液晶显示屏作为显示模块,用AT89C52进行控制,用ds18b02测量显示即时温度,温度报警,用ds1302时钟芯片为单片机提供时间数据。具有定时功能。(2)要求时间和定时时间可调,并且在闹铃报时的时候可以用按键进行关闭。并且可以用按键关闭打开定时功能。(3)利用keil uVision4编译软件进行编译。(4)完成实验要求,写出实验报告。三、软件环境 Proteus仿真软件,keil uVision4编译软件四、工作现象本时钟具有显示年月日时分秒星期、温度和温度报警的功能。实验用时钟芯片ds1302来提供秒、分、时、星期、日期、月份和年份的数据,显示部分采用液晶显示模块lcd1602,右上方显示星期,左下角显示温度,右下角显示闹铃的开关状态。用温度传感器ds18b20来测量温度。另外,闹铃用D1(LED-RED)来报时,用D2(LED-RED)做温度报警发声器,闹钟开启用D3来显示。具体各部分功能及操作下面将做介绍:ds1302给单片机at89c52提供年、月、日、时、分、秒、星期,ds18b20采集温度的数据,经单片机的处理送到液晶显示屏lcd1602上显示,实验设置的报警温度为30*c,由于程序有点长,已达到52单片机内存的极限,所以没加调整报警温度的功能,并且在修正时间的过程中只能加,不能减。现在开始介绍具体的操作步骤:key1为调整时间和日期的按键,按下key1键,lcd1602上的光标按时分星期日月年的顺序进行移动,光标所到处按key3键可以调整相应的数据信息。Key2键是闹钟调整键,本实验只提供了设置时间来调整闹钟,不设计年月日和星期,按下key2键,光标在时分之间切换,光标所到处按key3调整相应数据。Key3键用来开关闹钟,当闹铃开启时,lcd1602的右下角会出现“ON”的字样,同时发光二极管D3点亮当闹铃关闭时,lcd1602右下角则出现“OF”的字样。Key4来关闭正在报时的闹钟,即闹钟响是按key4可关闭闹铃。五、实验电路图 六、程序流程图开始初始化LCD及DS1302进入调节模式判断设置按键是否按下将时间/日期写入DS1302读取DS1302中的时间、日期显示时间、日期主程序流程图图定时闪烁S2按下定分闪烁S2按下S3按下时调节S3按下分调节定时数据写入LCD1602调分数据写入LCD1602进入主程序调时数据写入LCD1602S2按下定时流程图年调节S3按下S3按下年数据写入Ds1302月数据写入Ds1302日数据写入Ds1302星期数据写入Ds1302进入主程序S1按下日调节月调节星期调节年闪烁S1按下月闪烁S1按下日闪烁S1按下时闪烁S1按下分闪烁S1按下星期闪烁S3按下时调节S3按下分调节时数据写入Ds1302分数据写入Ds1302S3按下S3按下S1按下时间调节流程图七、程序代码:sbit rs=P20;sbit rw=P21;sbit e=P22;void lcdxcom(uchar com);void lcdinit();void lcdxshuju(uchar dat);void lcdx_time(uchar add,uchar date);void lcdx_day(uchar add,uchar date);#endif液晶lcd1602的.c函数:#include#includelcd1602.h#includedelay.h#includeds1302.hvoid lcdxcom(uchar com) e=0; rs=0; rw=0; P0=com; lcddelay(10);/500us e=1; lcddelay(20); e=0;void lcdinit()lcddelay(300);lcdxcom(0x38);lcddelay(100);lcdxcom(0x38);lcddelay(100);lcdxcom(0x38);lcdxcom(0x38);lcdxcom(0x08);lcdxcom(0x01);1、delay延时函数的.h函数:#ifndef _DELAY_H_#define _DELAY_H_#define uint unsigned int #define uchar unsigned charvoid lcddelay(uint z);void ds18b20delay(uint t);void msdelay(uint z);#endifDelay函数的.c函数:#includedelay.h void lcddelay(uint t) uint j,x; for(x=t;x0;x-) for(j=19;j0;j-);void ds18b20delay(uint t) while(t-);void msdelay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);2、液晶lcd1602的.h函数:#ifndef _LCD1602_H_#define _LCD1602_H_#include#define uint unsigned int #define uchar unsigned charstatic unsigned char shi,fen.miao,day;static unsigned char yue,week,nian;static uchar m,f,s,t,y,n,x;static uchar dshi=0,dfen=0,dmiao=0;static uchar b=0;sbit sck=P10;sbit io=P11;sbit rst=P12;sbit key1=P34;sbit key2=P35;sbit key3=P36;sbit key4=P37;sbit key5=P33;sbit p=P15;sbit a=P13;void pd(void);void zhuan(void);void wr_ds1302byte(uchar dat);void wr_ds1302(uchar add,uchar dat);uchar r_ds1302(uchar add);void setds1302(void);void ds1302r_time(void);uchar panduan(uchar yue,uint nian);void keyscan(void);void setbeep(void);void naozhong(void);void ockey(void);#endif时钟芯片ds1302的.c函数:#includeds1302.h#include#includedelay.h#includelcd1602.huchar timedata=10,6,12,31,23,59,50;/年周月日时分秒uchar xiedizhi=0x8c,0x8a,0x88,0x86,0x84,0x82,0x80;/写地址数组uchar dudizhi=0x8d,0x8b,0x89,0x87,0x85,0x83,0x81;/读地址数组lcdxcom(0x06);lcdxcom(0x0c);void lcdxshuju(uchar dat) e=0; rs=0; rs=1; rw=0; P0=dat; lcddelay(10); e=1; lcddelay(20); e=0; void lcdx_time(uchar add,uchar date)/写时分秒函数uchar shi,ge;shi=date/10;ge=date%10;lcdxcom(0x80+0x40+add);/设置显示位置lcdxshuju(0x30+shi);/送去液晶显示十位lcdxshuju(0x30+ge);/显示各位lcdxcom(0x0c);/设置开始显示,不显示光标 void lcdx_day(uchar add,uchar date)/写时分秒函数uchar shi,ge;shi=date/10;ge=date%10;lcdxcom(0x80+add);/设置显示位置lcdxshuju(0x30+shi);/送去液晶显示十位lcdxshuju(0x30+ge);/显示各位lcdxcom(0x0c);/设置开始显示,不显示光标3、时钟芯片ds1302的.h函数:#ifndef _DS1302_H_#define _DS1302_H_#include#define uint unsigned int #define uchar unsigned char value=1; sck=0; if(io) value=value|0x80; sck=1; rst=0; _nop_(); sck=0; _nop_(); sck=1; io=1; return value; void setds1302(void)uchar i,j;for(i=0;i8;i+) j=timedatai/10; timedatai=timedatai%10; timedatai=timedatai+j*16; wr_ds1302(0x8e,0x00);/去除写保护 for(i=0;i7;i+) wr_ds1302(xiedizhii,timedatai); wr_ds1302(0x8e,0x00);/加除写保护 lcdxcom(0xc0+14); lcdxshuju(table30); lcdxshuju(table32);void ds1302r_time(void) uchar i; for(i=0;i7;i+) timedatai=r_ds1302(dudizhii)/16*10+r_ds1302(dudizhii)%16; uchar table3=ONF;void wr_ds1302byte(uchar dat)/写一个字节的数据 uchar i; for(i=0;i=1; sck=1; void wr_ds1302(uchar add,uchar dat)/写数据 rst=0; _nop_(); sck=0; _nop_(); rst=1; _nop_(); wr_ds1302byte(add); wr_ds1302byte(dat); rst=0; _nop_(); io=1; sck=1;uchar r_ds1302(uchar add) uchar i,value; rst=0; _nop_(); sck=0; _nop_(); rst=1; _nop_(); wr_ds1302byte(add); for(i=0;i8;i+) if(yue=4)|(yue=6)|(yue=9)|(yue=11)r=30;if(a=1)&(yue=2)r=29;if(a=0)&(yue=2)r=28;return r; void keyscan(void) uchar z; uchar num=0;msdelay(500); if(key1=0) msdelay(10);if(key1=0)ds1302r_time();lcdx_time(10,0);while(1) if(key1=0)msdelay(500); num+; if(num=1) lcdxcom(0x80+0x40+4); lcdxcom(0x0f); while(key3=1)&(key1=1); do lcdxcom(0x80+0x40+4); lcdxcom(0x0f); while(!key3) shi+; if(shi=24) shi=0; lcdx_time(4,shi); msdelay(300); while(key1); miao=timedata6; fen=timedata5; shi=timedata4; day=timedata3; yue=timedata2; week=timedata1; nian=timedata0;void zhuan(void) m=timedata6; f=timedata5; s=timedata4; t=timedata3; y=timedata2; x=timedata1; n=timedata0;void pd(void) lcdx_time(10,miao); if(f!=fen) lcdx_time(7,fen); if(s!=shi) lcdx_time(4,shi); if(t!=day) lcdx_day(11,day); if(y!=yue) lcdx_day(8,yue); if(n!=nian) lcdx_day(5,nian); if(x!=week) lcdx_day(14,week);uchar panduan(uchar yue,uint nian) uchar r,a;a=(nian%400)=0|(nian%100!=0)&(nian%4=0);if(yue=1)|(yue=3)|(yue=5)|(yue=7)|(yue=8)|(yue=10)|(yue=12)r=31; while(key3=1)&(key1=1); do lcdxcom(0x80+11); lcdxcom(0x0f); while(!key3) day+; z=panduan(yue,nian); if(day=(z+1) day=0; lcdx_day(11,day); msdelay(300); while(key1); if(num=5) lcdxcom(0x80+8); lcdxcom(0x0f); while(key3=1)&(key1=1); do lcdxcom(0x80+8); lcdxcom(0x0f); while(!key3) yue+; if(yue=13) yue=0; lcdx_day(8,yue); msdelay(300); while(key1); if(num=6) lcdxcom(0x80+5); lcdxcom(0x0f); while(key3=1)&(key1=1); doif(num=2) lcdxcom(0xc0+7); lcdxcom(0x0f); while(key3=1)&(key1=1); do lcdxcom(0xc0+7); lcdxcom(0x0f); while(!key3) fen+; if(fen=60) fen=0; lcdx_time(7,fen); msdelay(300); while(key1); if(num=3) lcdxcom(0x80+14); lcdxcom(0x0f); while(key3=1)&(key1=1); do lcdxcom(0x80+14); lcdxcom(0x0f); while(!key3) week+; if(week=8) week=1; lcdx_day(14,week); msdelay(300); while(key1); if(num=4) lcdxcom(0x80+11); lcdxcom(0x0f);while(1) if(key2=0) num+; if(num=1) lcdxcom(0xc0+4); lcdxcom(0x0f); while(key3=1)&(key2=1); do lcdxcom(0xc0+4); lcdxcom(0x0f); while(!key3) dshi+; if(dshi=24) dshi=0; lcdx_time(4,dshi); msdelay(300);while(key2=1);if(num=2)lcdxcom(0xc0+7); lcdxcom(0x0f); while(key3=1)&(key2=1); do lcdxcom(0xc0+7); lcdxcom(0x0f); while(!key3) dfen+; if(dfen=60) dfen=0; lcdx_time(7,dfen); msdelay(300); lcdxcom(0x80+5); lcdxcom(0x0f); while(!key3) nian+; if(nian=20) nian=10; lcdx_day(5,nian); msdelay(300); while(key1); if(num=7) timedata4=shi;timedata5=fen;timedata6=0;timedata3=day;timedata2=yue;timedata0=nian;timedata1=week;setds1302();num=0;break; void setbeep(void) uchar num=0; msdelay(500); if(key2=0)msdelay(10); if(key2=0) lcdx_time(4,dshi); lcdx_time(7,dfen); lcdx_time(10,0);lcdxshuju(table31); p=0;/定时开标志 4、温度传感器ds18b20的.h函数:#ifndef _DS18B20_H_#define _DS18B20_H_#include#define uint unsigned int #define uchar unsigned charsbit ds=P23;void ds1820init(void);void ds1820xbyte(uchar dat);uchar ds1820rbyte(void);uchar rwendu(void);#endif温度传感器ds18b20的.c函数:#includeds18b20.h#includedelay.hvoid ds1820init(void)void ds1820xbyte(uchar dat) uchar i; for(i=0;i=1; uchar n; ds=1; ds18b20delay(8); ds=0; ds18b20delay(80); ds=1;while(key2=1);if(num=3)lcdx_time(4,shi);lcdx_time(7,fen); num=0; break;msdelay(300); void naozhong(void) if(b=1)&(dshi=shi)&(dfen=fen)&(miao=0)&(miao=1; ds=1;if(ds) a|=0x80; ds18b20delay(4); return a;uchar rwendu(void)uchar b,c; ds1820init(); ds1820xbyte(0xcc);/跳过rom ds1820xbyte(0x44);/启动温度测量 ds18b20delay(300); ds1820init(); ds1820xbyte(0xcc); ds1820xbyte(0xbe); b=ds1820rbyte(); c=ds1820rbyte(); c4; return c;ds18b20delay(8); n=ds; ds18b20delay(4);void ds1820xbyte(uchar dat) uchar i; for(i=0;i=1; ds18b20delay(4); uchar ds1820rbyte(void) uchar i,a; for(i=0;i=30) report=0; else report
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全用气手册3篇
- 出租车买卖条件3篇
- 工程代理人职责说明3篇
- 双方项目合作协议3篇
- 2025学前班班主任工作总结(15篇)
- 托管房屋租赁合同集锦(20篇)
- 高中语文作文教学中高阶思维训练的实证研究与效果分析
- 2024年新疆石河子国有资产经营有限公司岗位选聘考试真题
- 2024年神农架优抚医院招聘医疗卫生专业技术人员考试真题
- 浙江大学爱丁堡大学联合学院招聘笔试真题2024
- 项目部施工管理实施计划编制任务分工表
- 【2021部编版语文】-三年级下册第七单元教材解读--PPT课件
- 橙色黑板风小学生知识产权科普PPT模板
- 电网公司变电设备带电水冲洗作业实施细则
- 中国供销合作社标识使用手册课件
- Q∕CR 9218-2015 铁路隧道监控量测技术规程
- 甲状腺解剖及正常超声切面ppt课件
- 上海市城市地下空间建设用地审批及房地产登记试行规定
- 蠕墨铸铁项目可行性研究报告写作范文
- “V”法铸造工艺及应用
- 高二年级学业水平考试备考实施方案
评论
0/150
提交评论