




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数字式温度计学生学号:学生姓名: 指导教师:刘焕平 机电工程系2014年 月 日设计目标:设计基于单片机的具有液晶显示器的实时时钟,能够通过液晶显示器正确显示当前时间,包括年,月,日,星期,时,分,秒。并且能够通过按键对系统的时间进行修改设定;能够显示当前的室温。研究内容:学习eda软件proteus的使用,能够利用proteus软件画出电路图并实现仿真。学习电子系统设计步骤,按步骤完成电子系统的概要设计、选型、详细设计,系统测试仿真。设计带有温度显示基于单片机具有液晶显示功能的实时时钟,编写程序,并利用proteus软件进行模拟仿真。研究方法:绘制原理图及电路图,利用软件环境编程调试。实验步
2、骤:1、打开keil软件,新建一个工程文件,选择好芯片,并记得在 “options for target 1”的output选项中,将create hex fil选项勾起来。2、将编写的程序保存成“.c”的形式3、编译保存好的c文件,并根据提示修改程序中的错误,直到编译成功为止4、打开proteus软件,画出实验电路图5、在89c51中,载入原来已生成的hex文档6、按下运行键,对proteus进行软件仿真,观察运行结果原理结果及分析一、设计方案原理与设计特点分析电子钟总的设计模块:按键处理模块89c51cpu控制模块温度采集模块lcd显示模块ds1302时钟采集模块各个模块电路原理分析:1、
3、ds1302时钟采集模块:1.1电路原理图:1.2 ds1302分析:首先ds1302是dallas公司推出的涓流充电时钟芯片。内含有一个实时时钟/日历和31字节静态ram通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。ds1302芯片广脚介绍:x1、x2为32.768khz晶振管脚。gnd 为地。rst复位脚。i/o数据输入/输出引脚。sclk串行时钟。vcc1,vcc2电源供电管脚。与单片机连接的信号线为: ds1302_sclk 接p16; 实时时钟时钟线引脚 ds1302_io 接p17; 实时时钟数据线引脚 ds
4、1302_rst 接p15; 实时时钟复位线引脚特别注意ds1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一位,sclk信号线要有一个负跳变。即单片机对sclk咬先送高电平,再送低电平。数据时通过io进行传送的。1.3数据处理子程序流程图是否调用时间获取子程序ds1302_gettime 否 是调用read1302函数,读取各个时间参数,并存放于readvalue变量中对readvalue数据进行转换,转换成十进制数,并赋给time指针中。调用年份转换成可供lcd显示的字段子程序datetostr时间转换成可供lcd显示的字段子程序timetostr结束因为ds1302芯片在读
5、取或写入数据时,都是一位一位传送的,并且每传送一位,sclk信号线要有一个负跳变。所以在对ds1302具体某地址进行一字节数据的写入或读取时,都要调用实时时钟写入一字节(内部函数) ds1302inputbyte和实时时钟读取一字节(内部函数) ds1302outputbyte两个函数。2、按键处理模块2.1按键连线图从左到右依次是:进位键,数字加,数字减,退出mode模式键2.2按键扫描子程序流程图:mode键是否按下将进位按键键次数存放于变量mode_num中mode_num=5?mode_num=1?mode_num=2?mode_num=4?mode_num=3? 否 否 否 否 是
6、是 是 是 是mode_num=6?mode_num=7? 否 否 移动光标,并返回 是 是2.3加减键处理子程序流程图判断是否为修改模式 否判断是否为加一键 是转减一键程序 否 是判断num=2?判断num=3判断num=1? 否 否 是 是 是修改day值,并返回修改mouth值,并返回修改year值,并返回判断num=6?判断num=5?判断num=4? 否 否 是 是 是 修改小时值,并返回修改分值,并返回修改秒值,并返回减1子程序与加1子程序区别只在于修改数值处理不一样,其他都一样。3、lcd显示模块3.1 lcd显示模块电路原理图3.2 lcd1602芯片以及连线分析液晶显示器是一
7、种功耗极低的被动式显示器件,1602广脚介绍:d0d7数据传送引脚,vss为接地线,vdd为电源线,vee为 lcd驱动电压调节,由此可以调节显示亮度。rs为寄存器选择信号,高电平选择数据寄存器,低电平选择指令寄存器。rw为读写控制信号,高电平读,低电平写。en使能信号,读状态下高电平有效,写状态下下降沿有效。 rs连接p20; 寄存器选择信号rw连接p21; 读写控制信号线en连接p22; 使能信号线3.3lcd初始化程序流程图:写指令0x38,显示模式设置写指令,显示光标写指令,光标移动清屏在初始化过程中,要反复调用到write_com函数,此函数实现向lcd写入命令的功能。要特别注意写命
8、令和写数据的rs、rw、en时序问题4、温度采集显示模块4.1温度采集显示模块的原理图:4.2ds18b20芯片以及连线分析dsl820数字温度计提供 9 位(二进制)温度读数,指示器件的温度、信息经过单线接口送入dsl820 或从dsl820送出。因此从主机cpu到dsl820仅需一条线(和地线) ,dsl820的电源可以由数据线本身提供而不需要外部电源。ds18b20广脚说明:vcc为电源线,dq为数据线,gnd为地线。数据线dq与单片机p1.0相连接。4.3温度采集显示模块子程序流程图:直接向18b20发送温度变换命令 读取温度寄存器的温度值读低八位读高八位进行读取数据处理,得出温度存放
9、于变量temp中 在此程序中,要特别注意初始化,写和读取数据时的时序处理。首先,初始化中,主机总线先发送一复位脉冲(最短为 480us 的低电平信号),接着刻释放总线并进入接收状态。 dsl8b20在检测到总线的上升沿之后,等待 15-60us,接着ds18b20发出存在脉冲(低电平 持续 60-240 us)。写数据时序:当主机总线先从高拉至低电平时,就产生写时间隙。读书序: 主机总线先从高拉至低电平时,总线只须保持低电平l7ts之后,再将总线拉高,产生读时间隙。5、总原理图以及主程序流程图:5.1总的原理图:5.2主程序流程图:初始化lcd初始化内部定时器初始化ds1302从ds1302读
10、取日期和时间移动光标并显示日期移动光标并显示时间移动光标并显示温度重复进行按键扫描二、proteus仿真结果:三、实验数据计算处理,性能分析1、数据计算处理:1.1计算星期数的算法days=(today.day+1+2*today.month+3*(today.month+1)/5+today.year+today.year/4-today.year/100+today.year/400)%7,由年月日计算星期,用以显示星期数1.2加减键对时间日期改变处理算法对于年月日,时分秒来说,每个变量的最大值和最小值都不一样,所以当年月份时分秒改变时,进行处理的算法也不一样,年没有最大值,所以不用采取“
11、封顶”措施,每次年加一处理时,直接自加,而对于月份来说,月份是不能超过13的,所以当月份自加到13时要重新置1,具体处理见程序,在每个语句后,我都有分析注释出来。1.3时分秒进位算法当秒,分达到60时,向分进位,且秒数置零,从新开始计数。当时达到24时,也一样处理。1.4年月日进位算法因为每个月份的天数都不同,所以事先先设定一数组:dayofmonth=31,28,31,30,31,30,31,31,30,31,30,31用以判定12个月的最大值,接着判断天数,当超过本月最大天数时,月份加一,且天数要置1。月份判断比较简单,只要超过12,年份就加1,月份置1。2、性能分析: 首先,lcd能够正
12、确的显示1302芯片上面的时间和日期。其次,可以通过五个按键: k1, k2、k3、k4和k5键对电子钟进行时间和日期的调整。按k1键进行校时,可以分别对时及分进行单独校时,使其校正到标准时间,校时时用k2键进行调整,需要校正哪一位哪一位就闪烁。按k3键是对闪烁位进行加一的操作。按k4键是对闪烁位进行减一的操作。按k5键,就可以退出调整模式。但是,时间和日期显示正确,但温度显示错误。温度不能正常显示的主要原因是ds18b20的数据传输不正确。五、实验结论以及体会实验结论:1、在该电子钟的设计中修改定时或调整时间时采用了闪烁,在编程上,首先进行了初始化定义了程序的入口地址以及中断的入口地址,在主
13、程序的开始定义了一组固定单元用来存储计数的秒,分,时以及定时时间的序号等。其次,时,分,秒显示用了软件译码(查表)的方式,再用了一段固定的程序段进行进制转化。最后,用查询方式对按键进行判断,若有键按下,则进行软件延时消抖,避免了抖动引起的干扰,执行相应的定时,选时或调时程序段。对当前时间或定时时间修改后又返回到最初的显示程序段,如此循环下去。2、在硬件上,选用ds1302,lcd1602相结合,首先ds1302内含有一个实时时钟/日历和31字节静态ram通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作,这样读取数据简单。其次
14、,选用lcd1602进行显示时,数据位串行输入,接口连线少,低功耗,显示清晰。并且本实验的电子钟即要实现时间的现实,还要实现日期的现实,所以若是运用数码管进行显示的话,就算运用动态显示,所占用的io口多,并且所需的数码管个数多,硬件复杂。3、proteus是一个非常好用的仿真软件,其具有强大的电路原理图绘制功能,且可以实现模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统仿真、键盘、lcd系统仿真等多种功能;和keil联合使用时可以检测所编写的程序的正确与否。将keil和proteus联合起来使用是实现电子设计制作的初步阶段,可避免在实际的硬件操作中因为电路原理图或向单片机烧录的程序有误
15、而造成的难以修改的为题。实验心得:1、通过本次实验,因为之前接触到的电子系统设计不多,所以一开始,感觉难以入手,就算上网载了很多程序,也看不懂。后来请求同学的帮助,了解了要对各种芯片编写程序时首先应找到该芯片的数据手册,根据数据手册上的说明、时序要求及流程图编写对应程序。2、其次,再次巩固了keil c51工程文件的建立,程序编写以及编译的掌握程度。最重要的是,因为只是水平有限,要自己编写c程序很难,但在此实验中,最大的收获莫过于看懂别人的程序,分析之后,自己拼凑编写以实现不同的功能。并且掌握了52c程序的编写过程。3、掌握了proteus的使用方法,从实际操作中认识到proteus在仿真方面
16、的优越性,激发了自己学习proteus的兴趣;4、因为自己要修改程序,所以单单花费在程序分析的时间就很多,为了更好的理解程序,我把每句主要程序的后面都注释了该语句的意思,详情可以见程序清单,发现注释语义的工作量也是非常大的。写实验报告时,每个模块的流程图都是自己画的,用word文档画图真的很麻烦,而且不是很美观。因为时间比较仓促,流程图写的条理性不够,不过相信以后多多练习,就可以做得更好。5、在这次实验中我遇到了很多故障,不过通过各种渠道(比如网络,请教同学,老师等等)解决了一些故障,虽然没有全部解决,但能在短短一周内通过此次作业,实现电子钟的功能,还是有点成就感的。在解决这些问题的过程中发现
17、网络确实是一个很好的学习平台,利用前人的经验可以提高自己的解决实际问题的能力。通过这一个多礼拜的学习实践,使我对所学的知识进行了系统的复习和巩固,在以前学习中不够清晰的概念得到了更好的理解。相信通过不断的学习,能使自己扬长补短。六、程序清单191、主程序#include#include#define uchar unsigned char#define uint unsigned intsbit dq=p30;unsigned int temp;unsigned char ly_dis4=0,0,0,0;unsigned char tl=0,th=0;sbit acc0 = acc0;sbit
18、 acc7 = acc7;sbit t=p10;/进入调时按键sbit jia=p11;/加一按键sbit jian=p12;/减一按键sbit m=p13;/退出调时按键sbit beep=p20;/蜂鸣器sbit jtod=p14;/矩阵按键转独立按键,该脚置0sbit t_clk = p16; /*实时时钟时钟线引脚 */sbit t_io = p35; /*实时时钟数据线引脚 */sbit t_rst = p17; /*实时时钟复位线引脚 */sbit e=p27;/1602使能引脚sbit rw=p26;/1602读写引脚sbit rs=p25;/1602数据/命令选择引脚uchar
19、 code hanzi8=0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x11,0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00;void v_w1302(uchar ucaddr, uchar ucda);uchar uc_r1302(uchar);uchar dectobcd(uchar bcd);uchar bcdtodec(uchar);void beep();void delay(uchar x) uchar i; while(x-) for(i=0
20、;i0;i-) dq = 0; / 给脉冲信号 dat=1; dq = 1; / 给脉冲信号 if(dq) dat|=0x80; mdelay(5); return(dat);void mwrite(unsigned char dat)/写字节 unsigned char i=0; for (i=8; i0; i-) dq = 0; dq = dat&0x01; mdelay(5); dq = 1; dat=1; /装入自定义字符(汉字)void writch() uchar i,j; enable(0x40); for(i=0;i8;i+) for(j=0;j59) sec=0; l1602
21、_char(2, 9, sec/10%10+48); l1602_char(2, 10, sec%10 + 48); v_w1302(0x80,dectobcd(sec)|0x80); if(jian=0) /秒减一 delay(5); if(jian=0) while(!jian); sec=bcdtodec(uc_r1302(0x81); sec-; if(sec=-1) sec=59; l1602_char(2, 9, sec/10%10+48); l1602_char(2, 10, sec%10 + 48); v_w1302(0x80,dectobcd(sec)|0x80); if(n
22、um=2) /调分钟 enable(0xc0+6); if(jia=0) delay(5); if(jia=0) min = bcdtodec(uc_r1302(0x83); min+; while(!jia); if(min59) min=0; l1602_char(2, 6, min / 10 % 10 + 48); l1602_char(2, 7, min % 10 + 48); v_w1302(0x82,dectobcd(min); if(jian=0) delay(5); if(jian=0) min = bcdtodec(uc_r1302(0x83); min-; while(!j
23、ian); if(min=-1) min=59; l1602_char(2, 6, min / 10 % 10 + 48); l1602_char(2, 7, min % 10 + 48); v_w1302(0x82,dectobcd(min); if(num=3) /调小时 enable(0xc0+3); if(jia=0) delay(5); if(jia=0) hour = bcdtodec(uc_r1302(0x85); hour+; while(!jia); if(hour23) hour=0; l1602_char(2, 3, hour / 10 % 10 + 48); l1602
24、_char(2, 4, hour % 10 + 48); v_w1302(0x84,dectobcd(hour); if(jian=0) delay(5); if(jian=0) while(!jian); hour = bcdtodec(uc_r1302(0x85); hour-; if(hour=-1) hour=23; l1602_char(2, 3, hour / 10 % 10 + 48); l1602_char(2, 4, hour % 10 + 48); v_w1302(0x84,dectobcd(hour); if(num=4) /调日期 enable(0x80+11); if
25、(jia=0) delay(5); if(jia=0) hour = bcdtodec(uc_r1302(0x87); day+; while(!jia); if(day31) day=0; l1602_char(1, 11, day / 10 % 10 + 48); l1602_char(1, 12, day % 10 + 48); v_w1302(0x86,dectobcd(day); if(jian=0) delay(5); if(jian=0) while(!jian); day=bcdtodec(uc_r1302(0x87); day-; if(day=-1) day=31; l16
26、02_char(1,11,day/10%10+48); l1602_char(1,12,day%10+48); v_w1302(0x86,dectobcd(day); if(num=5)/调月份 enable(0x80+8); if(jia=0) delay(5); if(jia=0) mon = bcdtodec(uc_r1302(0x89); mon+; while(!jia); if(mon12) mon=0; l1602_char(1, 8, mon / 10 % 10 + 48); l1602_char(1, 9, mon % 10 + 48); v_w1302(0x88,decto
27、bcd(mon); if(jian=0) delay(5); if(jian=0) while(!jian); mon = bcdtodec(uc_r1302(0x89); mon-; if(mon=-1) mon=12; l1602_char(1, 8, mon / 10 % 10 + 48); l1602_char(1, 9, mon % 10 + 48); v_w1302(0x88,dectobcd(mon); if(num=6)/调年份 enable(0x80+5); if(jia=0) delay(5); if(jia=0) year = bcdtodec(uc_r1302(0x8d
28、); year+; while(!jia); if(year20) year=0; l1602_char(1, 5, year / 10 % 10 + 48); l1602_char(1, 6, year % 10 + 48); v_w1302(0x8c,dectobcd(year); if(jian=0) delay(5); if(jian=0) while(!jian); year = bcdtodec(uc_r1302(0x8d); year-; if(year=-1) year=20; l1602_char(1, 5, year / 10 % 10 + 48); l1602_char(
29、1, 6, year % 10 + 48); v_w1302(0x8c,dectobcd(year); if(num=0)/关闭光标闪烁enable(0x0c); v_w1302(0x80,uc_r1302(0x81)&0x7f);/开启1302记时/* 名称 : v_rtinputbyte()* 功能 : 往ds1302写入1byte数据* 输入 : ucda 写入的数据* 输出 : 无*/void v_rtinputbyte(uchar ucda)uchar i;acc = ucda;t_rst = 1;for(i=8; i0; i-)t_io = acc0;t_clk = 1;t_clk
30、 = 0;acc = acc 1;/* 名称 : uc_rtoutputbyte()* 功能 : 从ds1302读取1byte数据* 输入 :无* 返回值: acc*/uchar uc_rtoutputbyte(void) uchar i;t_rst = 1;for(i=8; i0; i-)acc = acc 1;acc7 = t_io;t_clk = 1;t_clk = 0;return(acc);/* 名称 : v_w1302(uchar ucaddr, uchar ucda)* 功能 : 往ds1302写入数据* 输入 : ucaddr: ds1302地址, ucda: 要写的数据* 返
31、回值 : 无*/void v_w1302(uchar ucaddr, uchar ucda)t_rst = 0;t_clk = 0;t_rst = 1;v_rtinputbyte(ucaddr); / 写地址 _nop_();_nop_();v_rtinputbyte(ucda); / 写1byte数据t_clk = 1;t_rst = 0;/* 名称 : uc_r1302(uchar ucaddr)* 功能 : 读取ds1302某地址的数据* 输入 : ucaddr: ds1302地址* 返回值 : ucda :读取的数据*/uchar uc_r1302(uchar ucaddr)uchar
32、 ucda;t_rst = 0;t_clk = 0;t_rst = 1;v_rtinputbyte(ucaddr); /写地址,命令_nop_();_nop_();ucda = uc_rtoutputbyte(); /读1byte数据t_clk = 1;t_rst = 0;return(ucda);/* 名称 : bcdtodec(uchar bcd)* 功能 : bcd码转换为dec码(dec码为十进制数据:bcd:0x11-dec为数值11(hex:0x0b)* 输入 : bcd码* 输出 : dec码*/uchar bcdtodec(uchar bcd)uchar data1; data
33、1=(bcd&0x70)4)*10+(bcd&0x0f);return data1;uchar dectobcd(uchar dec) uchar dat;dat=(dec/10)4|(dec%10);return dat;/* 名称 : write_ds1302init()* 功能 : 往ds1302中写入数据。最开始显示的数据就是在这里设置的。* 输入 : 无* 输出 : 无*/void write_ds1302init(void)v_w1302(0x8e,0);v_w1302(0x80,0x00);/写入秒v_w1302(0x8e,0);v_w1302(0x82,0x00);/写入分v_
34、w1302(0x8e,0);v_w1302(0x84,0x00);/写入小时v_w1302(0x8e,0);v_w1302(0x86,0x00);/写入日v_w1302(0x8e,0);v_w1302(0x88,0x00);/写入月v_w1302(0x8e,0);v_w1302(0x8a,0x00);/写入星期v_w1302(0x8e,0);v_w1302(0x8c,0x00);/写入年 v_w1302(0x90,0xa6);/单二极管,2k电阻充电/* 名称 : run_ds1302(void)* 功能 : 读出ds1302中的数据,并在液晶1602上进行显示* 输入 : 无* 输出 : 无
35、*/void run_ds1302(void) unsigned int sec, min, hour, day, month, year;minit(); mwrite(0xcc); / 跳过读序号列号的操作 mwrite(0x44); / 启动温度转换 mdelay(100); minit(); mwrite(0xcc); /跳过读序号列号的操作 mwrite(0xbe); /读取温度寄存器等 mdelay(100); tl=read(); /读取温度值低位 th=read(); /读取温度值高位 temp=th8; temp|=tl;if(temp=4; /右移4位,相当于乘0.0625
36、,将温度化为十进制 temp*=10; /扩大10倍,显示一位小数ly_dis0=temp/1000; /千位ly_dis1=temp%1000/100; /百位ly_dis2=temp%1000%100/10; /十位ly_dis3=temp%1000%100%10; /个位elsetemp=temp;temp+=1;temp=4;ly_dis0=0x0c; /负数 ly_dis1=temp%100/10; /百位ly_dis2=temp%100%10; /十位ly_dis3=0; /个位v_w1302(0x8f, 0);sec = bcdtodec(uc_r1302(0x81); /读出ds1302
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 项目申请报告和可行性研究报告
- 农业遥感技术应用实战手册
- 陵园墓地装修设计施工合同
- 知名智能家居控制系统
- 家庭农场农业发展指南
- 产业发展 规划
- 公司上市的可行性分析报告
- 农业产业链质量提升行动指南
- 三基训练护理复习试题有答案(一)
- 矿业行业智能化采矿与安全管理方案
- 政府采购评审专家考试试题库(完整版)
- 贵州省兽药经营质量管理规范实施细则
- 常规弱电系统施工单价表纯劳务
- 劳动合同(模版)4篇
- 2024-2025学年小学信息技术(信息科技)五年级下册人教版教学设计合集
- 2024年大学试题(林学)-森林经理学考试近5年真题集锦(频考类试题)带答案
- 医学教材 《妇产科学》第9版课件-胎儿异常与多胎妊娠
- 2025年国家公务员考试行测(地市级)行政职业能力测验试卷与参考答案
- 【魔镜洞察】2024药食同源保健品滋补品行业分析报告
- 2024年黄河委员会招聘历年(高频重点复习提升训练)共500题附带答案详解
- 肺肉芽肿性疾病的病理诊断
评论
0/150
提交评论