《LCD电子时钟的设计.doc》由会员分享,可在线阅读,更多相关《LCD电子时钟的设计.doc(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、东 北 石 油 大 学 课 程 设 计 课 程 单片机课程设计 题 目 单片机控制的LCD时钟设计 院 系 电气信息工程学院测控系 专业班级 学生姓名 学生学号 指导教师 2011年 4月 6日东北石油大学课程设计任务书课程 单片机课程设计 题目 单片机控制的LCD时钟设计 专业 姓名 学号 一、任务 设计一款基于STC89C52RC单片机的LCD数字时钟,实现显示当前时间以及具有调整日期与时间的功能。二、设计要求1 使用集成数字电路或单片机作为主控制芯片。2 使用LCD来显示现在的时间,显示格式为:上行显示:年-月-日;下行显示:时时:分分:秒秒。3 使用时钟芯片DS1302实现时钟定时。4
2、 具有调整日期与时间的功能。5 写出详细的设计报告。6 给出全部电路和源程序。三、参考资料1 求是科技. 单片机典型模块设计实例导航. 北京:人民邮电出版社. 2005.82 徐淑华, 程退安等.单片微型机原理及应用. 哈尔滨:哈尔滨工业大学出版社. 2005.13 孙余凯. 精选实用电子电路260例. 北京:电子工业出版社. 2007.64 殷春浩, 崔亦飞. 电磁测量原理及应用. 徐州:中国矿业大学出版社. 2003.75 LCD1602A数据手册6 DS1302数据手册完成期限 2011.3.28至2011.4.8 指导教师 专业负责人 2011年 3月 28 日目 录第1章 绪论31.
3、1 STC89C52RC单片机概述31.2 LCD概述31.3 DL1302简介41.4 本设计任务4第2章 总体方案论证与设计52.1显示部分52.2数字时钟52.3温度采集62.4总体硬件组成框图6第3章 系统硬件设计73.1 STC89C52RC单片机最小系统73.2 温度测量模块73.3 时钟模块83.4 LCD液晶显示模块83.5 键盘模块93.6 整体电路9第4章 系统的软件设计114.1主程序设计114.2时间设定程序流程114.3温度测量流程图12第5章 系统调试与测试结果分析145.1 使用的仪器仪表145.2 系统调试145.3 测试结果14结论15参考文献16附录1 程序
4、17附录2 仿真效果图27 第1章 绪论在新的世纪我们已经步入了第二个十年,随着全球经济的复苏和发展,由于在世界范围内人类需求的巨大释放,以及消费结构的升级,同时传统能源的稀缺以及带来的环境的破坏,都将带来新一轮的科技革命的巨变。因此,更适合人类社会协调、健康、可持续发展的新能源、新材料等便应运而生。LCD作为一种新的材料,LCD的设计制造技术与应用水平上都得到了迅速的提高,生产也得到了迅速的发展,并逐步形成产业,成为光电子行业的新兴产业领域。然而随着人们生活节奏的加快,时间对人们的重要性也越来越重要,因此,拥有一个不错的时钟对人们的生活将带来很大的方便。时钟,自从它发明的那天起,就成为人类的
5、朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。1.1 STC89C52RC单片机概述STC89C52RC单片机采用高性能的静态80C51设计,并采用先进工艺制造,还带有非易失去性FLASH程序储器。它是一种高性能、低功耗的8位CMOS微处理芯片,市场上应用最多。其主要性能如下:8KB Flash ROM,可以擦除1000次以上,数据保存10年。256字节内部RAM。电源控制模式: -时钟可停止和恢复; -空闲模式; -掉电模式。6个中断源。4个中断优先级。4个
6、8位I/O口。全双工增强型UART。3个16位定时器/计数器:T0、T1、T2。全静态工作方式:0-24MHz1.2 LCD概述LCD 液晶显示器是 Liquid Crystal Display 的简称,LCD 的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。LCD可以分为为两种类型,一种是文字模式LCD,一种是绘图模式LCD。LCD1602属于字符型液晶,能够同时显示16x2即32个字符。可以与8位CPU相联,指令功能强可以组合成各种输入、显示、移位方式以满足不同要求。显示黄绿带背光,显示对比
7、度可以调节,正常工作电压(VDD)为+5V,工作电流约为2mA(不计背光功耗),同时可靠性高寿命达50,000小时(25)。1.3 DS1302简介DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.55.5V。时钟可工作在24小时格式或12小时(AM/PM)格式。 DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302是D
8、S1202的升级产品,与DS1202兼容,但增加了主电源后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。1.4 本设计任务本系统以单片机芯片为核心部件,利用合理的程序控制,在液晶显示屏上实现各个功能并且显示等功能,使其显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。第2 章 总体方案论证与设计本设计采用STC89C52RC单片机作为本系统的控制模块。单片机可把由DS18B20、DS1302、AT24C02中的数据利用软件来进行处理,从而把数据传输到显示模块,实现温度、日历和闹铃的显示。以LCD液晶显示器为显示模块,把单片机传来的数据显示出
9、来,并且显示多样化。在显示电路中,主要靠按键来实现各种显示要求的选择与切换。下面对各模块的设计逐一进行论证比较。2.1 显示部分显示部分是本次设计的重要部分,一般有以下两种方案:方案一:采用LED显示,分静态显示和动态显示。对于静态显示方式,所需的译码驱动装置很多,引线多而复杂,且可靠性也较低。而对于动态显示方式,虽可以避免静态显示的问题,但设计上如果处理不当,易造成亮度低,有闪烁等问题。方案二:采用LCD显示。LCD液晶显示具有丰富多样性、灵活性、电路简单、易于控制而且功耗小等优点,对于信息量多的系统,是比较适合的。鉴于上述原因,我们采用方案二。2.2 数字时钟数字时钟是本设计的核心的部分。
10、根据需要可采用以下两种方案实现:方案一:方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。该方案具有硬件电路简单的特点,但当单片机不上电,程序将不执行。而且由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。方案二:方案采用Dallas公司的专用时钟芯片DS1302。该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完
11、备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,可使系统自动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。基于时钟芯片的上述优点,本设计采用方案二完成数字时钟的功能。2.3 温度采集由于现在用品追求多样化,多功能化,给系统加上温度测量显示模块,能够方便人们的生活,使该设计具有人性化。方案一:采用热敏电阻,可满足40摄氏度至90摄氏度测量范围,但热敏电阻精度重复性、可靠性较差,对于检测小于1摄氏度
12、的信号是不适用的。方案二:采用温度传感器DS18B20。DS18B20可以满足从-55摄氏度到+125摄氏度测量范围,且DS18B20测量精度高,增值量为0.5摄氏度,在一秒内把温度转化成数字,测得的温度值的存储在两个八位的RAM中,单片机直接从中读出数据转换成十进制就是温度,使用方便。基于DS18B20的以上优点,我们决定选取DS18B20来测量温度。2.4 总体硬件组成框图图2-1 总体硬件组成框图第3章 系统硬件设计3.1 STC89C52RC单片机最小系统最小系统包括晶体振荡电路、复位开关和电源部分。图3-1为STC89C52RC单片机的最小系统。图3-1 最小系统电路3.2 温度测量
13、模块温度测量传感器采用DALLAS公司DS18B20的单总线数字化温度传感器,测温范围为-55125,可编程为9位12位A/D转换精度,测温分辨率达到0.0625,采用寄生电源工作方式,CPU只需一根口线便能与DS18B20通信,占用CPU口线少,可节省大量引线和逻辑电路。接口电路如图3-2所示。图3-2 DS18B20测量电路3.3 时钟模块时钟模块采用DS1302芯片,DS1302是DALLAS公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM
14、/PM指示决定采用24或12小时格式DS1302与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线:RST复位、I/O数据线、SCLK串行时钟。时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW,其接线电路如图3-3。图3-3 时钟电路3.4 LCD液晶显示模块LCD液晶显示模块采用LCD1602型号,具有很低的功耗,正常工作时电流仅2.0mA/5.0V。通过编程实现自动关闭屏幕能够更有效的降低功耗。LCD1602分两行显示,每行可显示多达16个字符。LCD1602液晶模块内部的字符发生存储器(CGRO
15、M)已经存储了160个不同的点阵字符图形,通过内部指令可实现对其显示多样的控制,并且还能利用空余的空间自定义字符。其接线如图3-4。图3-4 LCD显示电路3.5键盘模块它是整个系统中最简单的部分,根据功能要求,本系统共需四个按键:功能移位键、功能加键、功能减键、立刻跳出调整模式键采用独立式按键。3.6整体电路 系统整体电路如图3-5 所示:图3-5系统总体电路图第4章 系统的软件设计4.1 主程序设计主流程图说明:程序开始运行时先初始化时钟控制器件DS1302、温度采集器件18B20和显示器件LCD1302,然后打开LCD1602,再读取温度、时间,把读取的数据送入LCD1602进行显示,期
16、间可以对温度和时间进行调整。其主程序流程如图4-1所示。图4-1 主程序流程图4.2 时间设定程序流程时间设定流程图说明:程序开始后初始化DS1302,然后从DS1302中读出数据,放入RAM中,然后调用显示子程序,使LCD1602相应的模块显示温度,其间也可对温度进行设置,设置完成后把数据重新送入RAM中,再由LCD1602相应模块显示,整个过程由此反复进行。图4-2 显示时间子程序流程4.3 温度测量流程图温度测量流程图说明:程序开始后先对DS18B20进行初始化,然后从DS18B20中读出数据放入RAM中,再调用子程序使LCD1602的相应模块进行显示。图4-3 温度测量程序流程图 第5
17、章 系统调试与测试结果分析5.1 使用的仪器仪表 数字万用表、秒表、电源、温度表5.2 系统调试根据系统设计方案,本系统的调试共分为三大部分:硬件调试,软件调试和软硬件联调。由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试:温度测量模块的调试,时钟模块的调试,LCD液晶显示模块的调试等,最后将各模块组合后进行整体测试。5.2.1硬件调试对各个模块的功能进行调试,主要调试各模块能否实现指定的功能。5.2.2软件调试 软件调试采用单片机仿真器WAVE6000L及微机,将编好的程序进行调试,主要是检查语法错误。5.2.3硬件软件联调 将调试好的硬件和软件进行联调,主要调试系统的实
18、现功能。5.3 测试结果此次系统设计结果较好,能动态显示实时时钟的时、分、秒,数据显示,能够实现时钟的定时,并且具有调整日期与时间的功能。结 论目前,市面上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于数字钟电路的基本组成包含了数字电路的主要组成部分,因此进行数字钟的设计是必要的,研究数字钟以及扩大其应用,有着非常现实的意义。单片机控制的LCD时钟,它具有编程灵活,便于电子钟功能的扩充,精度高等特点,同时可以用该电子钟发出各种控制信号。本设计采用STC89C52RC单片机作为本系统的控制模块。单片机可把由DS18B20、DS1302、AT24C02中的数据利用软件来进行处理,从
19、而把数据传输到显示模块,实现温度、日历和闹铃的显示。参考文献1 求是科技. 单片机典型模块设计实例导航. 北京:人民邮电出版社. 2005.82 徐淑华, 程退安等.单片微型机原理及应用. 哈尔滨:哈尔滨工业大学出版社. 2005.13 孙余凯. 精选实用电子电路260例. 北京:电子工业出版社. 2007.64 殷春浩, 崔亦飞. 电磁测量原理及应用. 徐州:中国矿业大学出版社. 2003.75LCD1602A数据手册6DS1302数据手册7DS18B20数据手册附录1 程序#include #include /#include LCD1602.h/#include DS1302.h#def
20、ine uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P17; /实时时钟时钟线引脚 sbit DS1302_IO = P16; /实时时钟数据线引脚 sbit DS1302_RST = P15; /实时时钟复位线引脚sbit wireless_1 = P30;sbit wireless_2 = P31;sbit wireless_3 = P32;sbit wireless_4 = P33;sbit ACC0 = ACC0;sbit ACC7 = ACC7;char hide_sec,hide_min,hide_ho
21、ur,hide_day,hide_week,hide_month,hide_year; /秒,分,时到日,月,年位闪的计数sbit Set = P20; /模式切换键sbit Up = P21; /加法按钮sbit Down = P22; /减法按钮sbit out = P23; /立刻跳出调整模式按钮sbit DQ = P10; /温度传送数据IO口char done,count,temp,flag,up_flag,down_flag;uchar temp_value; /温度值uchar TempBuffer5,week_value2;void show_time(); /液晶显示程序/*
22、液晶显示部分子程序*/Port Definitionssbit LcdRs= P25;sbit LcdRw= P26;sbit LcdEn = P27;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/内部等待函数*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();LcdEn=0;return DBPort;/向LCD写入命令或数据#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#defi
23、ne LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意顺序LcdEn=1;_nop_();/注意顺序LcdEn=0;_nop_();LCD_Wait();/设置显示模式#define LCD_SHOW0x04 /显示开#define LCD_HIDE0x00 /显示关 #define LCD_CURSOR0x02 /显示
24、光标#define LCD_NO_CURSOR0x00 /无光标 #define LCD_FLASH0x01 /光标闪动#define LCD_NO_FLASH0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|DisplayMode);/设置输入模式#define LCD_AC_UP0x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 画面可平移#define LCD_NO_MOVE0x00 /defaultv
25、oid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/初始化LCDvoid LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_A
26、C_UP|LCD_NO_MOVE); /AC递增, 画面不动/液晶字符输入的位置void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);/将字符输出到液晶显示void Print(unsigned char *str)while(*str!=0)LCD_Write(LCD_DATA,*str);str+;/*DS1302时钟部分子程序*/typedef struct _SYSTEMTIME_unsign
27、ed char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString11;unsigned char TimeString9;SYSTEMTIME;/定义的时间类型SYSTEMTIME CurrentTime;#define AM(X)X#define PM(X)(X+12) / 转成24小时制#define DS1302_SECOND0x80 /时钟芯片
28、的寄存器位置,存放时间#define DS1302_MINUTE0x82#define DS1302_HOUR0x84 #define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C void DS1302InputByte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS
29、1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据 DS1302_
30、RST = 0;/Write1302(0x8e,0x00); DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr)/读取DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302In
31、putByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time-Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); /高三位取出读
32、出乘ReadValue = Read1302(DS1302_MINUTE);Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);T
33、ime-Week = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);void DateToStr(SYSTEMTIME *Time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateStrin
34、g if(hide_year2) /这里的if,else语句都是判断位闪烁,2就不显示,输出字符串为 2007/07/22 Time-DateString0 = 2; Time-DateString1 = 0; Time-DateString2 = Time-Year/10 + 0; Time-DateString3 = Time-Year%10 + 0; else Time-DateString0 = ; Time-DateString1 = ; Time-DateString2 = ; Time-DateString3 = ;Time-DateString4 = /;if(hide_mon
35、thDateString5 = Time-Month/10 + 0; Time-DateString6 = Time-Month%10 + 0; else Time-DateString5 = ; Time-DateString6 = ; Time-DateString7 = /;if(hide_dayDateString8 = Time-Day/10 + 0; Time-DateString9 = Time-Day%10 + 0; else Time-DateString8 = ; Time-DateString9 = ; if(hide_weekWeek%10 + 0; /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 else week_value0 = ; week_value1 = 0;Time-DateString10 = 0; /字符串末尾加 0 ,判断结束字符void TimeToStr(SYSTEMTIME *Time) /将时,分,秒数据转换成液晶显示字符放到数组 TimeString; if(hide_hourTimeString0 = Time-Hour/10 + 0; Time-TimeString1 = Ti
限制150内