《单片机与接口技术课程设计(LCD显示的电子钟、多功能多拓展).doc》由会员分享,可在线阅读,更多相关《单片机与接口技术课程设计(LCD显示的电子钟、多功能多拓展).doc(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单片机与接口技术课程设计报告课题名称LCD显示的电子钟学院自动控制与机械工程学院专业机械设计制造及其自动化班级2010级(六)班姓名学号时间2013.1.7-2013.1.18摘 要单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。本课程设计就是应用单片机强大的控制功能制作LCD智能电子钟,该电子钟包括三大功能:实时显示年、月、日、时、分、秒;实时监测环境温度(可根据需要启动高温报警功能);电子闹钟。本设计采用的是AT89C52单片机,该单
2、片机采用的MCU51内核,因此具有很好的兼容性,内部带有8KB的ROM,能够存储大量的程序。计时芯片采用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时、分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。温度检测采用DALLAS公司的数字化温度传感器DS18B20,该芯片采用的是独特的“一线总线”的方式与单片机进行通信,一线总线独特而且经济的特点,是用户可以轻松的组建传感器网络,为测量系统的构建引入全新的概念。实时温度采用一线总线的方式传输大大提高了信号的抗干扰性,分辨率可通过软件设置,其小巧
3、的体积为各种环境下测量温度提供了方便。显示器件采用通用型1602液晶,可显示32个字符,如果使用数码管来做显示器件需消耗大量的系统资源,因此采用低功耗的1602液晶,该液晶显示方便,功能强大,完全能满足数字万年历的显示要求。通过此次课程设计能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。目 录一、设计任务及要求31.设计任务32.设计要求3二、设计的基本方案及步骤31.设计方案32.设计步骤5三、系统硬件电路设计51、LCD液晶显示模块设计62、实时时间计算模块设计63、实时环境温度检测模块设计74、报警(闹铃)模块设计85、设置模块设计8四、系统软件设计8五、
4、系统硬件仿真运行情况图11结束语:15参考文献:15附录一:电路原理图16附录二:源程序代码16一、设计任务及要求1.设计任务基于AT89C51单片机,制作一个LCD显示的智能电子钟。2.设计要求1)使用文字型LCD显示当前日期和时间;2)显示格式为:“年-月-日,时时:分分:秒秒”;3)用4个功能键操作来设置当前时间,功能键K1-K4功能如下;K1选择设置年/月/日,时/分/秒;K2加1;K3减1;K4确认完成设置;4)程序执行后LCD显示日历和时间;5)增加万年历显示“年月日”;6)增加闹铃功能,时间到则产生音乐声;7)增加温度传感器显示当前的温度。3.设计元件:AT89C52单片机;LC
5、D采用LM016L16*2字符型LCD液晶显示器;采用定时器DS1302;温度传感器DS18B20;四个开关; 一个1k排阻。二、设计的基本方案及步骤1.设计方案此系统以AT89C52单片机为控制核心,通过与DS1302和DS18B20通信获取实时时间和实时环境温度,并将得到的数据通过1602液晶显示出来,同时通过相应的按键调整相应的值。因此本设计可分为以下模块:显示模块、实时时间计算模块、实时环境温度采集模块、报警模块、设置模块(时间设置模块、最高温度设置模块、闹铃设置模块)。总体设计图框(图1):图1 总体设计框图下面对各个模块逐一进行分析:1)液晶显示模块1602液晶也叫1602字符型液
6、晶,它是一种专门用来显示字母、数字、符号等点阵型液晶模块。它有若干个5x7或5x11点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。1602的驱动电路带有11条指令,可以很方便的控制液晶的实现效果,如:清屏、左移、右移、光标显示。而且1602显示的字符在下一条指令为到来之前不会改变,也就能够维持显示的字符,1602液晶占用的系统资源也少。故采用1602液晶组成此设计的显示模块。2)实时时间计算模块DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU
7、进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。利用单片机强大的控制功能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。3)实时环境温度采集模块DS18B20是美国DALLAS公司生产的数字温度传感器,采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度
8、测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。测量温度范围宽,测量精度高,在使用中不需要任何外围元件,支持多点组网功能。多个 DS18B20 可以并联在惟一的单线上,实现多点测温,供电方式灵活。DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构趋于更简单,可靠性更高。因此非常适合本系统使用。4)报警(闹铃)模块此模块采用无源蜂鸣器实现,只要编写相应的程序即可实现发出不同频率的声音。5)设置模块因设置模块只需编写相应的程序外加相应的按键即可实现,实现方法较简单,在此不再介绍。2.设计
9、步骤1)首先根据设计要求,分析电子钟的工作原理,然后查阅相关元件资料及文献。如LCD液晶显示器,DS18b20温度传感器,DS1302时钟芯片;2)针对实现的功能,利用proteus软件来画硬件图;3)结合硬件图,写出相关硬件的的程序框图,然后进行编写程序。4)用keil软件进行程序编译,调试,然后再送给proteus仿真,实现各模块硬件的仿真运行;5)最后将各个模块的程序组合,调试,编译,实现整体仿真。三、系统硬件电路设计系统硬件Proteus仿真原理图(图2):图2 系统硬件Proteus仿真原理图1、LCD液晶显示模块设计LCD1602液晶与单片机的接口电路(图3):图3 LCD1602
10、液晶与单片机的接口电路图1)1602液晶功耗较小,可直接与单片机接口相接,电源直接与电源电路相接,使用单片机的P0口和P2口与1602进行通信。由于P0口为漏极,所以加个排阻,D0D7连接P0口,LCD的使能信号端接P2.7,数据/命令端(H/L)接P2.6,读/写选择端(H/L)接P2.5。2)1602相应功能特性介绍:(1)+5V电压,对比度可调;(2)内含复位电路;(3)提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;(4)有80字节显示数据存储器DDRAM;(5)内建有160个5x7点阵的字型字符发生器CGROM;(6)8个可由用户自定义的5x7的字符发生器CGRA
11、M;2、实时时间计算模块设计DS1302与单片机的接口电路(图4):图4 DS1302与单片机的接口电路各引脚的功能为:1Vcc2:5V电源(当Vcc2Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2 Vcc1时,由Vcc1向DS1302供电。);2、3X1、X2 是外接晶振脚(32.768KHZ的晶振);4地(GND);6I/O:数据输入输出口;5CE/RST:复位脚;7SCLK:串行时钟输入;8Vcc1:备用电池端。3、实时环境温度检测模块设计DS18B20与单片机的接口电路(图5):图5 DS18B20与单片机的接口电路数据DQ端接在P3.3口。DS18B20通过单总线实现
12、与单片机的通信,每个DS18B20都有一个唯一的序列号,可以方便的实现组网检测,以9 位数字量的形式反映器件的温度值。DS18B20 通过一个单线接口发送或接收信息,因此在中央微处理器和DS18B20 之间仅需一条连接线(加上地线)。用于读写和温度转换的电源可以从数据线本身获得,无需外部电源。所以多只DS1820 可以同时连在一根单线总线上,这样就可以把温度传感器放在许多不同的地方。这一特性在HVAC 环境控制、探测建筑物、仪器或机器的温度以及过程监测和控制等方面非常有用。4、报警(闹铃)模块设计蜂鸣器与单片机的接口电路(图6):图6蜂鸣器与单片机的接口电路图报警(闹铃)模块采用单片机输出一定
13、频率的方波从而使蜂鸣器发出声音。5、设置模块设计各按键与单片机的接口电路(图7):图7各按键与单片机的接口电路设置模块采用四个按键k1、k2、k3、k4与P14、P15、P16、P17相接组成独立按键。四、系统软件设计软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。因为此系统的程序涉及的模块较多,所以程序编写也采用模块化设计。C语言具有编写灵活、移植方便、便于模块化设计的特点,所以此系统的软件采用C51语言编写。1.程序总流程图(图8):图8 程序总流程图2.子程序流程图:1)LCD液晶显示(图9):图9 LCD液晶显示流程图2)报警(闹铃)(图10):图10 报警(闹
14、铃)流程图3)实时环境温度检测(图11):图11 实时环境温度检测流程图4)设置(图12):图12 设置流程图五、系统硬件仿真运行情况图 图13 开始运行LCD显示情况1.显示实时时间(图14):图14 实时时间显示图2.显示当前温度(图15):图15 当前温度显示图3.时间设置(图16):图16 时间设置图4.闹铃设置:1)OFF状态:图17 闹铃OFF状态图2)ON状态:图18 闹铃ON状态图 3)闹铃时间到,闹铃响:图19 闹铃时间到,响铃图5.最高报警温度设置:1)OFF状态:图20 超温报警OFF状态图 2)ON状态:图21 超温报警ON状态图3)检测温度:图22 测温图4)超温报警
15、,蜂鸣器响:图23 超温报警图结束语:在这短短两周转瞬即逝的课程设计实训期间,很大程度上提高了我们自主学习和思考的能力,从中我们受益匪浅,同时,巩固了我们这学期以来所学的单片机原理与接口技术这门课程,让我们找到了求知的乐趣,明白了带我们的的老师们的良苦用心和殷切希望。本次课程设计中所涉及的大部分知识,在课本上是没有的,而是在已有知识的基础上,通过到图书馆查阅相关资料和网上资源,经过反复思考,经融合而得出的。本次课程设计实训切实体现了将课本所学知识运用到实际生活中的价值所在!参考文献:【1】吴亦锋、陈德为,单片机原理与接口技术M, 北京:电子工业出版社,2010.【2】王小建、胡长胜,单片机设计
16、与应用M,北京:清华大学出版社,2010.8.【3】凌志浩、张建正,AT89C52单片机原理与接口技术M,北京:高等教育出版社,2011.3.【4】朱清慧,Proteus显示控制系统设计与实例M,北京:清华大学出版社,2011.5.附录一:电路原理图附图1附录二:源程序代码#include#includeunsigned char code displaywelcome= Welcome To My Lcd Timer;/欢迎界面unsigned char code displaywish= Happy Every Day _; /欢迎界面unsigned char code overtemp
17、erature=OVERTEMPERATURE!;unsigned char code digit=0123456789; /数字代码unsigned char mode,TH,TL,TN,TD,length,tempswitch,Maxtemp=40,amode,alarmmode,minutes,hours,minutea,seconds,houra=12;sbit SCLK=P10;/DS1302时钟输入sbit DATE=P11;/DS1302数据输入sbit REST=P12;/DS1302复位端口sbit SET=P14;/DS1302设置模式选择位sbit ADD=P15;/增加
18、sbit RED=P16;/减小sbit CANL=P17; /确定void delay1ms(int i)/1毫秒延时 int j,k; while(i-) for(j=76;j1;j-); for(k=29;k1;k-); void delaynus(unsigned char n) /延时若干微秒 unsigned char i; for(i=0;i0;i-) _nop_(); void baojing(unsigned char n) unsigned char x,i; while(n-) for(i=0;i5;i+) for(x=0;x200;x+) beep=beep; dely
19、500(); for(i=0;i3;i+) for(x=0;x200;x+) beep=beep; dely500(); dely500(); /*DS1302模块*/ void Write1302(unsigned char date)/向1302写数据 unsigned char i;SCLK=0;delaynus(2);for(i=0;i=1; void WriteSet1302(unsigned char cmd,unsigned char date) /根据相应的命令输入相应的数据 REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(5);Wri
20、te1302(date);SCLK=1;REST=0; unsigned char Read1302(void)/读取1302数据 unsigned char i,date;delaynus(2);for(i=0;i=1;if(DATE=1)date|=0x80;SCLK=1;delaynus(2);SCLK=0;delaynus(2);return date; unsigned char ReadSet1302(unsigned char cmd)/根据命令读取1302相应的值unsigned char date;REST=0;SCLK=0;REST=1;Write1302(cmd);del
21、aynus(2);date=Read1302();SCLK=1;REST=0;return date;void IntDS1302(void) /DS1302初始化 unsigned char flag; flag= ReadSet1302(0x81);if(flag&0x80) /判断时钟芯片是否关闭 WriteSet1302(0x8E,0x00); /根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,(0/10)4|(0%10); /根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,(0/10)4|(0%10); /根据写分寄存器命令字,写入
22、分的初始值WriteSet1302(0x84,(0/10)4|(0%10); /根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,(0/10)4|(0%10); /根据写日寄存器命令字,写入日的初始值WriteSet1302(0x88,(0/10)4|(0%10); /根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,(10/10)4)*10+(value&0x0f);display_Second(seconds);value=ReadSet1302(0x83);minutes=(value&0x70)4)*10+(value&0x0f);dis
23、play_Minute(minutes);value=ReadSet1302(0x85);hours=(value&0x70)4)*10+(value&0x0f);display_Hour(hours);value=ReadSet1302(0x87);day=(value&0x70)4)*10+(value&0x0f);display_Day(day);value=ReadSet1302(0x89);month=(value&0x70)4)*10+(value&0x0f);display_Month(month);value=ReadSet1302(0x8D);year=(value&0xf0
24、)4)*10+(value&0x0f);display_Year(year);void displaystar(void) /显示欢迎界面unsigned char i,j;Write_Address(0x0f);while(displaywelcomei!=0)Write_Date(displaywelcomei);i+;delay1ms(1);i=0;Write_Address(0x4f);while(displaywishi!=0)Write_Date(displaywishi);i+;delay1ms(1);j=40;while(j-)Write_com(0x18);/循环左移dela
25、y1ms(700); Write_com(0x01);delay1ms(10);void gbdisplay(unsigned char address) /时间调整时光标闪烁Write_Address(address);delay1ms(5);Write_com(0x0f);delay1ms(5); void displaymaxt(unsigned char x) /显示最大温度unsigned char i,j,k;Write_com(0x0c);delay1ms(2);Write_Address(0x44);i=x/100;j=x/10;k=x%10;Write_Date(digiti
26、);Write_Date(digitj);Write_Date(digitk);/*时间调整部分*/void hourset(void)/调时unsigned char timevalue,hour;delay1ms(500);/防止多次触发WriteSet1302(0x8e,0x00);/将写保护去掉,确保能正常将调整后的数值写入DS1302timevalue=ReadSet1302(0x85); /读取此时的数值hour=(timevalue&0x70)4)*10+(timevalue&0x0f);while(1)if(ADD=0)delay1ms(50);if(ADD=0)hour+;d
27、elay1ms(300);while(ADD=0);if(RED=0)delay1ms(50);if(RED=0)hour-;delay1ms(300);if(hour=0) hour=23;while(RED=0);timevalue=(hour)/10)=24) hour=0;delay1ms(5);if(CANL=0) mode=0;Write_com(0x0c);break;if(SET=0) break;WriteSet1302(0x8e,0x80);void minuteset(void) /调分unsigned char timevalue,minute;delay1ms(500
28、);WriteSet1302(0x8e,0x00);timevalue=ReadSet1302(0x83);minute=(timevalue&0x70)4)*10+(timevalue&0x0f);while(1)if(ADD=0)delay1ms(10);if(ADD=0)minute+;if(minute=60) timevalue=0;while(ADD=0);if(RED=0)delay1ms(10);if(RED=0)minute-;delay1ms(300);if(minute=0) minute=59;while(RED=0);timevalue=(minute/10)=60)
29、 minute=0;delay1ms(5);if(CANL=0) mode=0;Write_com(0x0c);break;if(SET=0) break;WriteSet1302(0x8e,0x80);void secondset(void) /秒归零unsigned char second;delay1ms(500);WriteSet1302(0x8e,0x00);while(1)if(ADD=0)delay1ms(10);if(ADD=0)second=0;WriteSet1302(0x80,0x00);while(ADD=0);delay1ms(1);display_Second(second);Write_Address(0x4f);delay1ms(5);if(CANL=0) mode=0;Write_com(0x0c);break;if(SET=0) break;WriteSet1302(0x8e,0x80);void yearset(void)/调年unsigned char datevalue,year;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x8d);year=(datevalue&0x70)4)*10+(datevalue&0x0f);while(1)if(ADD=0)