版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、报告学院名称: 专业名称:课设题目:带有温度显示和液晶显示器的实时时钟设计学生姓名: 学号 : 同组人: 指导教师: 完成时间:设计目标:设计基于单片机的具有液晶显示器的实时时钟,能够通过液晶显示器正确显示当前时间,包括年,月,日,星期,时,分,秒。 并且能够通过按键对系统的时间进行修改设定;能够显示当前的 室温。研究内容:学习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进行软件仿真,观察运行结果原理结果及分析一、设计方案原理与设计特点分析电子钟总的设计模块:各个模块电路原理分析:1、DS1302时钟采集
3、模块:1.1电路原理图:1.2DS1302 分析:首先DS1302是DALLAS公司推出的涓流充电时钟芯片。内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。DS1302芯片广脚介绍:XI、X2为32.768KHZ晶振管脚。GND为地。RST复位脚。 I/O数据输入/输出引脚。SCLK串行时钟。Vcc1,Vcc2电源供电管脚。与单片机连接的信号 线为:DS1302_SCLK接P1A6o实时时钟时钟线引脚DS1302_IO接P1A7o实时时钟数据线引脚DS1302_RST接P1A5。
4、实时时钟复位线引脚特别注意 DS1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一 位,SCLK信号线要有一个负跳变。即单片机对SCLK咬先送高电平,再送低电平。数据时通过IO进行传送的。因为DS1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一位,SCLK信号线要有一个负跳变。所以在对DS1302具体某地址进行一字节数据的写入或读取时,都要调用实时时钟写入一字节(内部函数)DS1302InputByte和实时时钟读取一字节 (内部函数)DS1302OutputByte两个函数。2、按键处理模块2.1按键连线图KOTO-T1PH10111一1213F1n15p316
5、1 7亠Mode模式键22按键扫描子程序流程图:2.3加减键处理子程序流程图是判断是否为加一键判断是否为修改模式是判断num=2 ?判断num=3是是是判断num否1 ?否是是是判断num=4 ?判断num=5 ?判断nun否6 ?修改day值, 并返回值,并返回修改 mouth修改year值,并返回转减一键程序修改秒值,并返回修改分值,并返回修改小时值,并返回减1子程序与加1子程序区别只在于修改数值处理不一样,其他都一样。3、LCD显示模块3.1LCD显示模块电路原理图3.2LCD1602芯片以及连线分析液晶显示器是一种功耗极低的被动式显示器件,1602广脚介绍:D0 D7数据传送引脚,VS
6、S为接地线,VDD为电源线,VEE为LCD驱动电压调节,由此可以调节显示亮 度。RS为寄存器选择信号,高电平选择数据寄存器,低电平选择指令寄存器。RW为读写控制信号,高电平读,低电平写。EN使能信号,读状态下高电平有效,写状态下下降沿有效。RS连接P2P。寄存器选择信号RW连接P2A1。读写控制信号线EN连接P2A2。使能信号线3.3LCD初始化程序流程图:在初始化过程中,要反复调用到write_com函数,此函数实现向要特别注意写命令和写数据的RS、RW、EN时序问题led写入命令的功能。4、温度采集显示模块4.1温度采集显示模块的原理图:4.2DS18B20芯片以及连线分析DSI820数字
7、温度计提供 9位(二进制)温度读数,指示器件的温度、信息经过单线接口 送入DSI820或从DSI820送出。因此从主机 CPU到DSI820仅需一条线(和地线),DSI820 的电源可以由数据线本身提供而不需要外部电源。DS18B20广脚说明:VCC为电源线,DQ为数据线,GND为地线。数据线 DQ与单片 机P1.0相连接。4.3温度采集显示模块子程序流程图:直接向18b20发送温 度变换命令读取温度寄存器的温 度值读低八位读高八位进行读取数据处理, 得出温度存放于变量temp 中初始化中,主在此程序中,要特别注意初始化,写和读取数据时的时序处理。首先,机总线先发送一复位脉冲(最短为480us
8、的低电平信号),接着刻释放总线并进入接收状 态。DSI8b20在检测到总线的上升沿之后,等待15-60US,接着DS18b20发出存在脉冲(低电平持续60-240 us)。写数据时序:当主机总线先从高拉至低电平时,就产生写时间隙。I7ts之后,再将总线拉高,读书序: 主机总线先从高拉至低电平时,总线只须保持低电平 产生读时间隙。5、总原理图以及主程序流程图:5.1总的原理图:5.2主程序流程图:初始化led1初始化内部定时器初始化DS1302从DS1302读取日期和时间移动光标并显示日期移动光标并显示时间移动光标并显示温度重复进行按键扫描Proteus仿真结果:AU1I1ATEAC51 E.:
9、;.T ;X1AJL2PSEr4 fiLE E*RP1LCD1 l.ibCdfllP2.0Wfi 陀期旳F2.3W111R.4A12P2.&A13P2.&A14F2.7JA13P3.3MNT1F3#TOF3 5/T1P024Bw阿p20RE5FACK-B22P0.&/AM ph va&iP0.3M3 pn 4Ap4 PD 5i!AMPfl 7用闪I 20134LU21S TPT l?sit!21 0250C1V:-.17上DC Q Hp53* *P w 训Ma三、实验数据计算处理,性能分析1、数据计算处理:1.1计算星期数的算法days=(today.day+1+2*today. mon th
10、+3*(today. mon th+1)/5+today.year+today.year/4- today.year/100+today.year/400)%7,由年月曰计算星期,用以显示星期数1.2加减键对时间日期改变处理算法对于年月日,时分秒来说,每个变量的最大值和最小值都不一样,所以当年月份时分 秒改变时,进行处理的算法也不一样,年没有最大值,所以不用采取“封顶”措施,每次 年加一处理时,直接自加,而对于月份来说,月份是不能超过13的,所以当月份自加到13时要重新置1,具体处理见程序,在每个语句后,我都有分析注释出来。1.3时分秒进位算法当秒,分达到 60时,向分进位,且秒数置零,从新开
11、始计数。当时达到24时,也一样处理。1.4年月日进位算法因为每个月份的天数都不同,所以事先先设定一数组:dayofmonth=31,28,31,30,31,30,31,31,30,31,30,31用以判定 12 个月的最大值,接着判断天 数,当超过本月最大天数时,月份加一,且天数要置1。月份判断比较简单,只要超过12,年份就加1,月份置1。2、性能分析:首先,led能够正确的显示1302芯片上面的时间和日期。其次,可以通过五个按键:K1, K2、K3、K4和K5键对电子钟进行时间和日期的调整。按K1键进行校时,可以分别对时及分进行单独校时,使其校正到标准时间,校时时用 K2键进行调整,需要校正
12、哪一位哪一位就闪烁。按K3键是对闪烁位进行加一的操作。按K4键是对闪烁位进行减一的操作。按K5键,就可以退出调整模式。但是,时间和日期显示正确,但温度显示错误。温度不能正常显示的主要原因是DS18b20 的数据传输不正确。五、实验结论以及体会实验结论:1、在该电子钟的设计中修改定时或调整时间时采用了闪烁,在编程上,首先进行了初 始化定义了程序的入口地址以及中断的入口地址,在主程序的开始定义了一组固定单元用来存储计数的秒,分,时以及定时时间的序号等。其次,时,分,秒显示用了软件译码 (查表 )的方式 ,再用了一段固定的程序段进行进制转化。最后,用查询方式对按键进行判断,若有键按下 ,则进行软件延
13、时消抖 ,避免了抖动引起的干扰 ,执行相应的定时 ,选时或调时程序段。对当 前时间或定时时间修改后又返回到最初的显示程序段,如此循环下去。2、在硬件上,选用 DS1302, LCD1602 相结合,首先 DS1302 内含有一个实时时钟 /日 历和 31 字节静态 RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作,这样读取数据简单。 其次,选用 LCD1602 进行显示时,数据位串行输入,接口连线少,低功耗,显示清晰。并 且本实验的电子钟即要实现时间的现实,还要实现日期的现实,所以若是运用数码管进行 显示的话,就算运
14、用动态显示,所占用的 IO 口多,并且所需的数码管个数多,硬件复杂。3、proteus 是一个非常好用的仿真软件,其具有强大的电路原理图绘制功能,且可以 实现模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统仿真、键盘、LCD 系统仿真等多种功能;和 keil 联合使用时可以检测所编写的程序的正确与否。将keil 和proteus 联合起来使用是实现电子设计制作的初步阶段,可避免在实际的硬件操作中因为电 路原理图或向单片机烧录的程序有误而造成的难以修改的为题。实验心得:1、通过本次实验,因为之前接触到的电子系统设计不多,所以一开始,感觉难以入 手,就算上网载了很多程序,也看不懂。后来请求
15、同学的帮助,了解了要对各种芯片编写 程序时首先应找到该芯片的数据手册,根据数据手册上的说明、时序要求及流程图编写对 应程序。2、其次,再次巩固了 Keil C51 工程文件的建立,程序编写以及编译的掌握程度。最 重要的是,因为只是水平有限,要自己编写 C 程序很难,但在此实验中,最大的收获莫过 于看懂别人的程序,分析之后,自己拼凑编写以实现不同的功能。并且掌握了 52C 程序的 编写过程。3、掌握了 Proteus 的使用方法,从实际操作中认识到Proteus 在仿真方面的优越性,激发了自己学习 Proteus 的兴趣;4、因为自己要修改程序,所以单单花费在程序分析的时间就很多,为了更好的理解
16、程 序,我把每句主要程序的后面都注释了该语句的意思,详情可以见程序清单,发现注释语 义的工作量也是非常大的。写实验报告时,每个模块的流程图都是自己画的,用 WORD 文 档画图真的很麻烦,而且不是很美观。因为时间比较仓促,流程图写的条理性不够,不过 相信以后多多练习,就可以做得更好。5、在这次实验中我遇到了很多故障,不过通过各种渠道(比如网络,请教同学,老师 等等)解决了一些故障,虽然没有全部解决,但能在短短一周内通过此次作业,实现电子 钟的功能,还是有点成就感的。在解决这些问题的过程中发现网络确实是一个很好的学习 平台,利用前人的经验可以提高自己的解决实际问题的能力。通过这一个多礼拜的学习实
17、 践,使我对所学的知识进行了系统的复习和巩固,在以前学习中不够清晰的概念得到了更 好的理解。相信通过不断的学习,能使自己扬长补短。六、程序清单1、主程序#include#include#define uchar unsigned char#define uint unsigned intfor(i=0 。 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
18、 。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_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(!
19、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(num=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,
20、 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(!jian) 。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) / 调小时e
21、nable(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_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-
22、 。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(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,
23、 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 。L1602_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)mo
24、n = bcdtodec(uc_R1302(0x89) 。 mon+ 。while(!jia) 。 if(mon12)L1602_char(1, 8, mon / 10 % 10 + 48)。L1602_char(1, 9, mon % 10 + 48) 。v_W1302(0x88,dectobcd(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
25、_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) 。 year+ 。 while(!jia) 。if(year20) year=0 。L1602_char(1, 5, year / 10 % 10 + 48)。L1602_char(1, 6, year % 10 +v_W1302(0x8c,dectobcd(year) 。 if(jian=0) delay(
26、5) 。名称功能输入返回值 :ACCfor(i=8。 i0 。 i-)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(1, 6, year % 10 +48)。v_W1302(0x8c,dectobcd(year) 。if(num=0)/关闭光标闪烁enable(0x0c)。v_W1302(0x80,uc_R1302(0x81)&0x7f) 。/开启 1302 记时/* 名称 :v_
27、RTInputByte ()* 功能 :往DS1302写入IByte数据* 输入 :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 = 0 。ACC = ACC 1 。/*uc_RTOutputByte ()从 DS1302 读取 1Byte 数据 无*/ uchar uc_RTOutputByte(void)uchar i 。T_RST = 1 。ACC = ACC 1 。
28、ACC7 = T_IO 。T_CLK = 1 。T_CLK = 0 。return(ACC) 。/* 名称 : v_W1302(uchar ucAddr, uchar ucDa)* 功能 : 往 DS1302 写入数据* 输入 : ucAddr: DS1302 地址 , ucDa: 要写 的数据* 返回值 : 无*/void v_W1302(uchar ucAddr, uchar ucDa)T_RST = 0 。T_CLK = 0 。T_RST = 1 。v_RTInputByte(ucAddr) 。 / 写地 址_nop_() 。_nop_() 。v_RTInputByte(ucDa) 。
29、/ 写 1Byte 数据T_CLK = 1 。T_RST = 0 。/* * 名称 : uc_R1302(uchar ucAddr)* 功能 : 读取 DS1302 某地址的数据* 输入 : ucAddr: DS1302 地址* 返回值 : ucDa : 读取的数据*/uchar uc_R1302(uchar ucAddr)uchar ucDa 。T_RST = 0 。T_CLK = 0 。T_RST = 1 。v_RTInputByte(ucAddr) 。/写地址,命令_nop_() 。_nop_() 。ucDa = uc_RTOutputByte() 。 / 读 1Byte 数据T_CLK
30、 = 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。data1=(bcd&0x70)4)*10+(bcd&0x0f) 。 return data1。uchar dectobcd(uchar dec)uchar dat 。 dat=(dec/10)4|(dec%10) 。
31、 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_W1302(0x8e,0) 。 v_W1302(0x84,0x00) 。 / 写入小时 v_W1302(0x8e,0) 。 v_W1302(0x86,0x00)
32、。 / 写入日 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 上进行显示* 输入 : 无* 输出 : 无*void Run_DS1302(void)unsigned int sec,
33、 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 ,将温度化为十进制 temp*=10 。/ 扩大 10 倍,显示
34、一位小数 ly_dis0=temp/1000 。 /千位 ly_dis1=temp%1000/100 。/百位ly_dis2=temp%1000%100/10 。 / 十位ly_dis3=temp%1000%100%10 。 / 个位 elsely_dis1=temp%100/10 。 /百位 ly_dis2=temp%100%10 。 / 十 位ly_dis3=0 。/个位v_W1302(0x8f, 0) 。sec = bcdtodec(uc_R1302(0x81) 。 / 读 出 DS1302 中的秒v_W1302(0x8f, 0) 。min = bcdtodec(uc_R1302(0x83) 。 / 读 出 DS1302 中的分v_W1302(0x8f, 0) 。hour = bcdtodec(uc_R1302(0x85) 。 / 读 出 DS1302 中的小时v_W1302(0x8f, 0) 。day = bcdtodec(uc_R1302(0x87) 。 / 读 出 DS1302 中的日v_W1302(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024无产权房买卖合同范文
- 订购水处理设备合同2024年
- 个人消费贷款合同
- 家庭害虫防控服务合同2024年版
- 健康医院诊所医疗仪器器材检测合同
- 塔吊司机劳务承包合同
- 房屋屋顶防水合同5篇
- 合同更改扩展协议
- 采购合同的订立与履行
- 工行无抵押借款合同
- 中学教代会代表选举办法
- 医院药房二维码溯源管理
- 四川省凉山州2023-2024学年七年级上学期期末检测历史试卷
- 《简述公平理论》课件
- 打地鼠游戏的设计与实现实验报告
- 物流管理专业人才需求分析与预测调研报告(2020年)
- 人是如何学习的II:学习者、境脉与文化
- 妊娠易栓症查房课件
- 精神科住培入科教育
- 播音主持专业职业生涯规划书
- 人教版六年级上册数学期末看图列式计算专题训练
评论
0/150
提交评论