《单片机课程教学案设计—带有LCD的定时闹钟.docx》由会员分享,可在线阅读,更多相关《单片机课程教学案设计—带有LCD的定时闹钟.docx(18页珍藏版)》请在课桌文档上搜索。
1、装件等就片机易接口林锦程殁书总辂想告设计题目:带有LCD的定时闹钟学生姓名:系别:专业:班级:学号:指导教师:2011年12月16日郑州轻工业学院课程设计任务书题目带有LCD的定时闹钟专业、班级学号姓名主要内容:设使用89C51单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD时钟,假设LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可以使用。基本要求:.字符型LCD16*2显示器.显示格式“时时分分”。.由LED闪动来做秒计数表示。.一旦时间到侧发动声响,同时继电器启动,可以扩大控制家电开启和关闭。.程序执行后工作指示灯LED闪动,表示程序开场执行,LCD显示“0000”.按下操作键
2、K1-k4动作如下:(1) K1设置现在的时间。(2) K2显示闹钟设置的时间。(3) K3设置闹铃的时间。(4) K4-闹铃0N/0FF的状态设置,设置ON时连续三次发出“哗的一声,Off置为哗的一声。设置当前时间或闹铃时间如下:(1) K1时的调整。(2) K2分的调整。(3) K3设置完成。(5) OFF发出“哗K4闹铃时间到时,发出一阵声响,按下本键可以停顿声响。除了显示当前时间的功能外,还可以扩大如下功能;.增加秒表计数。.闹铃时间到侧产生音乐声。,增加减计数功能。,增加多组计数的功能。参考文献郭天祥51单片机C语言教程-入门。余发山单片机原理及应用技术。中国矿业大学出版社。涂世亮,
3、张友德。单片微机控制技术。清华大学出版社。一.设计本电子定时闹钟的目的和意义以单片机为核心的数字时钟是很有社会意义和社会价值的。钟表原先的报时功能已经原不能满足人们日益增长的要求,现代的电子时钟多带有类似自动报警、按时自动打铃、时间程序自动控制、定时播送、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等功能。1.1本LCD电子闹钟的特点和功能介绍数字钟介绍时钟是将小时、分钟、秒钟显示于人的肉眼的计时装置。而单片机模块中最常见的正是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。
4、而LCD电子定时闹钟是以单片机为根基的数字电路实现对时、分、秒的数字显示的数字计时装置,它的计时周期为24小时,另外应有校时功能和一些显示日期、闹钟等附加功能。一个基本的数字钟电路主要由译码显示器、“时,”分,”秒,”星期计数器、校时电路、报时电路和振荡器组成。目前电子钟广泛用于各种私人和公众场合,成为我们生活、工作和学习中不可缺少的好帮手。2总体方案设计2.1总体设计方案本LCD定时闹钟,是以单片机及外围接口电路为核心硬件,辅以其他外围硬件电路,用汇编语言设计的程序来实现的。根据C51单片机的外围接口特点扩展相应的硬件电路,然后根据单片机的指令设计出数字钟相应的软件,再利用软件执行一定的程序
5、来实现数字钟的功能。由于采用集成芯片性的单片机来制作电子钟,这样设计制作简单而且功能多、准确度高,也可方便扩大其他功能,实现也十分简单。本设计是利用AT89C51单片机为主控芯片,由LCD、晶振、电阻、电容、发光二极管、开关、喇叭等元件组成硬件电路,通过编写软件程序来实现和控制的数字定时闹钟o3硬件设计3.1 主控芯片AT89C51的设计在本LCD电子闹钟设计中就是采用利用我们熟悉的AT89C51单片机为主控芯片。AT89C51单片机由微处理器,存储器,I/O口以及特殊功能存放器SFR等局部构成。其存储器在物理上设计成程序存储器和数据存储器两个独立的空间,片内程序存储器的容量为4KB,片内数据
6、存储器为128个字节。89C51单片机有4个8位的并行I/O口:PO,Pl口,P2口和P3口。各个接口均由接口锁存器,输出驱动器,和输入缓冲器组成。PI口是唯一的单功能口,仅能用作通用的数据输入/输出口。P3口是双功能口除了具有数据输入/输出功能外,每条接口还具有不同的第二功能,如P3.0是串行输入口线,P3.1口是串行输出口线。在需要外部程序存储器和数据存储器扩展时,PO可作为分时复用的低8位地址/数据总线,P2口可作为高8位的地址总线。P3口也可作为AT89C51的一些特殊功能口,同时为闪烁编程和编程校验接收一些控制信号.3.2 时钟电路局部设计AT89C51系列的单片机的时钟方式分为内部
7、方式和外部方式。内部方式就是在单片机的XTALl和XTAL2的两引脚外接晶振,就够成了自激振荡器在单片机内部产生时钟脉冲信号。外部时钟方式是把外部已经有的时钟信号引入到单片机内部。时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的根基。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。本LCD电子闹钟设计是采用内部时钟方式,用一个12MHz晶振和两个30Pf瓷片电容组成,为单片机提供标准时钟,其中两个瓷片电容起微调作用.其电路图见图3.2。
8、之所以采用高性能的振荡电路,因为:1 .单片机电子钟的计时脉冲基准是由外部晶振的频率经过12分频后提供,采用内部的定时/计数器来实现计时功能。所以,外接晶振频率准确度直接影响电子钟计时的准确性。2 .单片机电子钟利用内部定时/计数器溢出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。大家都知道从定时/计数器产生中断请求到响应中断需要3-8个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期。3.3LCD显示电路局部为了获得更好的效果本设计并没有采用常见的LED,而是采用了型号为160
9、2的LCDoLCD有LED数码显示更好的更的直观效果,也更加经久耐用。液晶显示模块体积小功耗低、显示内容丰富,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件之一了。本LCD是2行16列液晶可显示2行16列英文字符,有8位数据总线D0-D7,RS,RW,EN三个控制端口(共14线),工作电压为5V。没背光,和常用的1602B功能和引脚一样(除了调背光的二个线脚).该模块也可只用D4-D7作为四位数据分两次传送。这样的话可以节省MCU的I/O口资源。引脚说明,见表3.1。VDD:电源正极,4.5-5.5V,通常使用5V电压;VL:LCD比照度调节端,电压调节范围为05V。接正电源
10、时比照度最弱,接地电源时比照度最高,但比照度过高时会产生“鬼影,因此通常使用一个IOK的电位器来调整比照度或者直接串接一个电阻到地;RS:MCU写入数据或者指令选择端。MCU要写入指令时,使RS为低电平;MCU要写入数据时,使RS为高电平;R/W:读写控制端。R/W为高电平时,读取数据;R/W为低电平时,写入数据;E:LCD模块使能信号控制端。写数据时,需要下降沿触发模块。D0-D7:8位数据总线,三态双向。如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4D7接口传送数据。本充电器就是采用4位数据传送方式;BLA:LED背光正极。需要背光时,BLA串接一个限流电阻接VDD,B
11、LK接地,实测该模块的背光电流为50mA左右;BLK:LED背光地端。|3.1LCD显示屏引脚说明编号符号引脚说明编号符号引脚说明1VCC电源地9D2双向数据口2VDD电源正极10D3双向数据口3VL比照度调节11D4双向数据口4RS数据/命令选择12D5双向数据口5R/W读/写选择13D6双向数据口6E模块使能端14D7双向数据口7DO双向数据口15BLK背光源地8Dl双向数据口16BLA背光源正极4软件设计4.1 软件设计概述这里用汇编的单片机程序构成了本LCD电子闹钟的软件系统。该程序实现时间及定时(时间以0点0分0秒为基准计算,闹铃定时以0时0分为基准计算)的显示,有外中断0和五个开关
12、实现校时,闹钟功能。其中程序的晶振频率为12MHz,最小计时单位为1/20秒。主芯片p.l-p.7输出数据到LCD数据总线,p3.0-2.2输出LCD控制信号,P2.1输出声音信号,.P1.0-P1.3输入外部控制信号,整个软件系统也是根据这个关系连接成一个完整的系统。4.2 主函数的设计本LCD电子闹钟的的主程序流程图如图4,1所示:4.write_com(0x80+0x40+7);write_sfm( 10,miao);write-com(0x80+0x40+10)4.3.2闹钟的实现闹钟功能的实现涉及到两个方面:闹铃时间设定和是否闹铃判别与相应处理。闹铃时间设定模块的设计可参照时间设定模
13、块,这里着重阐述闹铃判别与处理模块的设计问题。闹铃判别与闹铃处理的关键在于判别何时要进展闹铃。当时十位、时个位、分十位、分个位中任一位发生改变(进位)时,就必须进展闹铃判别。程序设计思想如图4.3。液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否那么此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表4.1是TC1602EL液晶模块的内部显示地址。表4.1内部显示地址1234567891011121314151600010203040506070809OAOBOCODOEOF404142434445464748494A4
14、B4C4D41-:4F硬件原理图程序:#includeinclude24C08.h#defineuintunsignedint#defineucharunsignedcharucharcodetable=,NOWTIME:*;ucharcodetable1=,SETNOWTIME:*;ucharcodetable2=,SETALARMTIME:;ucharcodealarm=,ALARMTIME:;ucharcodealarmoff=,ALARMTIME:OFF*;ucharcodealarmon=,ALARMTIME:ON”;sbitlcden=P32;sbitlcdrs=P30;sbitl
15、cdrw=P31;sbitK1=P10;sbitK2=P11;sbitK3=P12;sbitK4=P13;sbitbeep=P2A1;ucharflag,num,count,k1num,k2num,k3num,k4num;charmiao,shi,fen,ashi,afen;延时函数voiddelay(uintz)(uintx,y;for(x=z;x0;x-)for(y=110;y0;y-);婚鸣器子程序voiddi()beep=0;delay(100);beep=1;)写命令函数voidwrite_com(ucharcom)(Icdrs=O;Icdrw=O;Icden=O;P0=com;de
16、lay(5);lcden=1;delay(5);Icden=O;)写数据函数voidwrite_date(uchardate)(lcdrs=1;Icdrw=O;Icden=O;PO=date;delay(5);lcden=1;delay(5);Icden=O;)写时间函数voidwrite_sfm(ucharadd,uchardate)(ucharshi,ge;shi=date10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);显示时间初始化voidTimeInitO(write_com
17、(0x01);write_com(0x80);for(num=0;num9;num+)write-date(tablenum);delay(5);)write_com(0x80+0x40+6);write-date(,:*);delay(5);write_com(0x80+0x40+9);write-date(,:*);delay(5);write_sfm(4,shi);write_com(0x80+0x40+4);write_sfm(7,fen);write_com(0x80+0x40+7);write_sfm(10,miao);write_com(0x80+0x40+10);设当前时间vo
18、idSetNowTimeO(if(K1=0)(delay(5);if(K1=0)(while(!K1);di();shi+;if(shi=24)shi=O;write_sfm(4,shi);write_com(0x80+0x40+4);write_add(3,shi);if(K2=0)(delay(5);if(K2=0)(while(!K2);di();fen+;if(fen=60)fen=O;write_sfm(7,fen);write_com(0x80+0x40+7);write_add(2,fen);)if(K3=0)(delay(5);if(K3=0)(while(!K3);di();
19、k1num=0;TR0=1;Timelnit();)设闹钟时间voidSetAIarmTimeO(fag=O;if(K1=0)(delay(5);if(K1=0)(while(!K1);di();ashi+;if(ashi=24)ashi=0;write_sfm(4,ashi);write_com(0x80+0x40+4);write_add(4,ashi);if(K2=0)(delay(5);if(K2=0)(while(!K2);di();afen+;if(afen=60)afen=0;write_sfm(7,afen);write_com(0x80+0x40+7);write_add(5
20、,afen);)if(K3=0)(delay(5);if(K3=0)(while(!K3);di();k3num=0;EA=1;fag=1;Timelnit();)显示闹钟函数voidDispIayAIarmTimeO(write_com(0x01);write_com(0x80);for(num=0;num11;num+)(write-date(alarmnum);delay(5);)write_com(0x80+0x40+6);write-date(,:);delay(5);write_sfm(4,ashi);write_com(0x80+0x40+4);write_sfm(7,afen)
21、;write_com(0x80+0x40+7);/便盘扫描函数voidkeyscan()delay(5);if(K1=0)(TRO=O;while(!K1);di();k1num+;if(k1num!=0)(write_com(0x80);for(num=0;num13;num+)write_date(table1num);delay(5);SetNowTimeO;)else(if(K2=0)(delay(5);if(K2=0)(while(!K2);di();k2num+;)if(k2num=1)(EA=O;DispIayAIarmTimeO;k2num=2;if(k2num=3)(k2nu
22、m=0;EA=1;Timelnit();elseif(K3=0)(delay(5);if(K3=0)(while(!K3);di();k3num+;write_com(0x01);)if(k3num三=1)(EA=O;write_com(0x80);for(num=0;num15;num+)(write-date(table2num);delay(5);write_com(0x80+0x40+6);write_date(:);delay(5);write_sfm(4,ashi);write_com(0x80+0x40+4);write_sfm(7,afen);write_com(0x80+0x
23、40+7);SetAIarmTimeO;else(if(K4=0)(delay(5);if(K4=0)(while(!K4);di();k4num+;diO;k4num三2;flag=O;if(k4num=3)(k4num=0;di();delay(500);di();delay(500);di();fag=1;)if(flag=1&shi=ashi&fen=afen)(beep=-beep;delay(500);if(K4=0&flag=1)(delay(5);if(K4=0&flag=1)(while(!K4);di();fag=O;k4num=0;)/lcd1602初始化voidinit
24、()(Icden=O;shi=O;fen=O;miao=0;ashi=O;afen=O;count=0;k1num=0;init_24c08();设置 16X2显示,5X7点阵,8位数据接口设开显示,不显示光标写一个字符后地址指针加1显示清0,数据指针清0首次上电从AT24C08中读取出存储的数据write_com(0x38);write_com(OxOc);write_com(0x06);write_com(0x01);miao=read_add(1);fen=read_add(2);shi=read_add(3);ashi=read_add(4);afen=read_add(5);Time
25、lnit();TMOD=OxOI;TH0=(65536-50000)256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;主函数voidmain()(init();write_com(0x80);while(1)keyscan();中断服务子程序voidtimer()interrupt1TH0=(65536-50000)256;TL0=(65536-50000)%256;count+;if(count=20)(count=0;miao+;if(miao=60)(miao=0;fen+;if(fen=60)(fen三0;shi+;if(shi=24)(shi=0;
26、write_sfm(4,shi);write_add(3,shi);write_sfm(7,fen);write_add(2,fen);write_sfm(10,miao);write_add(1,miao);)设计总结这一次的单片机课程设计,使我考虑的很多东西,通过一个礼拜的学习与实践,使我对所学的知识进展了系统的复习与稳固,在以前的学习中不够清晰的概念得到了更好地理解。同时,通过课设,培养和锻炼了我的动手能力,这一点非常重要不仅对我以后的学习有帮助,还可以为以后的工作打下一定的根基。这段时间的学习,使我了解到了理论和实际之间的差异,第一次真正接触到了实际中的问题,并通过和教师,同学交流,加强了自身的分析问题,解决问题的能力。同时,我也发现了自己在某写方面的缺乏,这是我以后要加以改进的方面。这一次的课设对我的帮助很大,是我真正的认识到了理论与实际的区别,这将成为我学习目标和动力,更进一步的挖掘自己的能力,是自己获得进一步的提高。完成期限:2011-12-27指导教师签名:陈晓雷课程负责人签名:2011年12月16日