




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、微型计算机控制技术大作业设计题目:定时闹钟课程设计院 系:计算机科学与信息工程学院 学生姓名:曹紫莹学 号: 201103010036专业班级:计算机科学与技术(嵌入式方向)11-1指导教师:赵凯 目录1、课程内容要求及目的11.1设计题目11.2 设计要求11.3能显示时时分分秒秒。11.4能够设定定时时间、修改定时时间。12、设计实现方案222.2 原理及工作过程说明23、硬件设计33.1 主控芯片AT89C51的设计33.2 时钟电路部分设计43.3 LCD显示电路部分54、软件设计64.1 软件设计概述64.2 主函数的设计64.3.1 程序初始化74.3.2 闹钟的实现84.3.3
2、显示程序85、 实验总结及心得体会236、参考文献24基于单片机的定时闹钟1、课程内容要求及目的设计题目基于单片机的定时闹钟1.2 设计要求1、能显示时时分分秒秒。2、能够设定定时时间、修改定时时间。3、定时时间到能发出报警声或者启动继电器,从而控制电器的启停。LCD电子闹钟的特点和功能介绍时钟是将小时、分钟、秒钟显示于人的肉眼的计时装置。而单片机模块中最常见的正是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。而LCD电子定时闹钟是以单片机为基础的数字电路实现对时、分、秒的数字显示的
3、数字计时装置,它的计时周期为24小时,另外应有校时功能和一些显示日期、闹钟等附加功能。一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”,“星期”计数器、校时电路、报时电路和振荡器组成。目前电子钟广泛用于各种私人和公众场合,成为我们生活、工作和学习中不可缺少的好帮手。由于时钟的实用性和在人们生活中的重要性,所以尝试设计以单片机为核心的数字时钟是很有意义的。钟表原先的报时功能已经原不能满足人们日益增长的要求,现代的电子时钟多带有类似自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等功能,本设计中LCD电子时钟采用LCD显示时间和
4、日期年月,直观实用,而且可以方便的校调,附带的万年历和定时功能也是很方便和实用的。2、设计实现方案2.1原理本LCD定时闹钟,是以单片机及外围接口电路为核心硬件,辅以其他外围硬件电路,用汇编语言设计的程序来实现的。根据C51单片机的外围接口特点扩展相应的硬件电路,然后根据单片机的指令设计出数字钟相应的软件,再利用软件执行一定的程序来实现数字钟的功能。由于采用集成芯片性的单片机来制作电子钟,这样设计制作简单而且功能多、精确度高,也可方便扩充其他功能,实现也十分简单。本设计是利用AT89C51单片机为主控芯片,由LCD、晶振、电阻、电容、发光二极管、开关、喇叭等元件组成硬件电路,通过编写软件程序来
5、实现和控制的数字定时闹钟。如图2.1所示。2.2 原理及工作过程说明使用AT89C51单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD时钟。定时闹钟的基本功能如下:l 显示格式为“时时:分分”。l 由LED闪动来做秒计数表示。l 一旦时间到则发出声响,同时继电器启动,可以扩充控制家电的开启和关闭。程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00”,按下操作键K1K4动作如下:(1) K1设置现在的时间。(2) K2显示闹钟设置的时间。(3) K3设置闹铃的时间。(4) K4闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的
6、一声。设置当前时间或闹铃时间如下。(1) K1时调整。(2) K2分调整。(3) K3设置完成。(4) K4闹铃时间到时,发出一阵声响,按下本键可以停止声响。本题目的难点在于4个按键每个都具有两个功能。3、硬件设计3.1 主控芯片AT89C51的设计在本LCD电子闹钟设计中就是采用利用我们熟悉的AT89C51单片机为主控芯片。AT89C51单片机由微处理器,存储器,I/O口以及特殊功能寄存器SFR等部分构成。其存储器在物理上设计成程序存储器和数据存储器两个独立的空间,片内程序存储器的容量为4KB,片内数据存储器为128个字节。89C51单片机有4个8位的并行I/O口:P0口,P1口,P2口和P
7、3口。各个接口均由接口锁存器,输出驱动器,和输入缓冲器组成。P1口是唯一的单功能口,仅能用作通用的数据输入/输出口。P3口是双功能口除了具有数据输入/输出功能外,每条接口还具有不同的第二功能,如P3.0是串行输入口线,P3.1口是串行输出口线。在需要外部程序存储器和数据存储器扩展时,P0可作为分时复用的低8位地址/数据总线,P2口可作为高8位的地址总线。P3口也可作为AT89C51的一些特殊功能口,同时为闪烁编程和编程校验接收一些控制信号.3.2 时钟电路部分设计AT89C51系列的单片机的时钟方式分为内部方式和外部方式。内部方式就是在单片机的XTAL1和XTAL2的两引脚外接晶振,就够成了自
8、激振荡器在单片机内部产生时钟脉冲信号。外部时钟方式是把外部已经有的时钟信号引入到单片机内部。时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。3.1。图而之所以采用高性能的振荡电路,因为:1.单片机电子钟的计时脉冲基准是由外部晶振的频率经过12分频后提供,采用内部的定时/计数器来实现计时功能。所以,外接晶振频率精确度直接影响电子钟计时的准确性。 2.单片机电 子钟利用内部定时/计数器溢
9、出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。大家都知道从定时/计数器产生中断请求到响 应中断需要3-8个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的 机器周期。3.3 LCD显示电路部分为了获得更好的效果本设计并没有采用常见的LED,而是采用了型号为1602的 LCD。LCD有LED数码显示更好的更的直观效果,也更加经久耐用。液晶显示模块体积小功耗低、显示内容丰富,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件之一了。本LCD是2行16列液晶 可显示2行16列英
10、文字符,有8位数据总线D0-D7,RS,R/W,EN三个控制端口(共14线),工作电压为5V。没背光,和常用的1602B功能和引脚一样(除了调背光的二个线脚). 该模块也可只用D4-D7作为四位数据分两次传送。这样的话可以节省MCU的I/O口资源。引脚说明,见表3.1。VDD:电源正极,4.55.5V,通常使用5V电压;VL:LCD对比度调节端,电压调节范围为05V。接正电源时对比度最弱,接地电源时对比度最高,但对比度过高时会产生“鬼影”,因此通常使用一个10K的电位器来调整对比度或者直接串接一个电阻到地;RS:MCU写入数据或者指令选择端。MCU要写入指令时,使RS为低电平;MCU要写入数据
11、时,使RS为高电平;R/W:读写控制端。R/W为高电平时,读取数据;R/W为低电平时,写入数据;E:LCD模块使能信号控制端。写数据时,需要下降沿触发模块。D0D7:8位数据总线,三态双向。如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4D7接口传送数据。本充电器就是采用4位数据传送方式;BLA: LED背光正极。需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右;BLK: LED背光地端.表3.1 LCD显示屏引脚说明编号符号引脚说明编号符号引脚说明1VCC电源地9D2双向数据口2VDD电源正极10D3双向数据口3VL对比度调节11D
12、4双向数据口4RS数据/命令选择12D5双向数据口5R/W读/写选择13D6双向数据口6E模块使能端14D7双向数据口7D0双向数据口15BLK背光源地8D1双向数据口16BLA背光源正极4、软件设计4.1 软件设计概述这里用汇编的单片机程序构成了本LCD电子闹钟的软件系统。该程序实现时间及定时(时间以0点0分0秒为基准计算,闹铃定时以0时0分为基准计算)的显示,有外中断0和五个开关实现校时,闹钟功能。其中程序的晶振频率为12MHz,最小计时单位为1/20秒。主芯片p0.1-p0.7输出数据到LCD数据总线,p3.0-2.2输出LCD控制信号,P2.1输出声音信号,.P1.0-P1.3输入外部
13、控制信号,整个软件系统也是根据这个关系连接成一个完整的系统。4.2 主函数的设计本LCD电子闹钟的的主程序流程图如图4.1所示:图4.1 4.3.1 程序初始化在系统开始上电时,需要.首先初始化液晶:void TimeInit()write_com(0x01); /初始化1602液晶write_com(0x80); /设置现实初始坐标for(num=0;num<9;num+) /显示年月日write_date(tablenum); delay(5);write_com(0x80+0x40+6); /写出时间显示部分的两个冒号write_date(':');delay(5)
14、;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)4.3.2 闹钟的实现闹钟功能的实现涉及到两个方面:闹铃时间设定和是否闹铃判别与相应处理。闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。闹铃判别与.闹铃处理的关键在于判别何时要进行闹铃
15、。当时十位、时个位、分十位、分个位中任一位发生改变(进位)时,就必须进行闹铃判别。程序设计思想如图4.2。4.3.3 显示程序显示程序包括时钟显示和定时显示程序。具体程序见附录。液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表4.1是TC1602EL液晶模块的内部显示地址。12345678910111213141516000102030405060708090A0B0C0D0E0F404142434445464748494A4B4C4D4E4F 附录1 定时闹钟仿真电
16、路图附录2 定时闹钟的控制程序代码#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit key1=P10; sbit key2=P11;sbit key3=P12;sbit key4=P13;sbit lcden=P22; sbit lcdrs=P20;sbit lcdrw=P21;sbit jdq=P23;sbit led=P24; sbit sound=P25;int a,b,i,min,hour,minge,minshi,hourge,hourshi,amin,ahour,aming
17、e,aminshi,ahourge,ahourshi,sec,secshi,secge;/unsigned char code x=0xFF,0xC7,0x83,0x01,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF;/unsigned char code z=0xFF,0xE3,0xC1,0x80,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x7F,0xFF,0xFF;uchar code table1='0','1','2'
18、;,'3','4','5','6','7','8','9'uchar code table2="Time:00:00:00 "uchar code Alarm_1="Alarm:00:00 "uchar code nul=" "uchar num1,num2;bit flag=0;void delay(unsigned int xms)/延时程序uint i,j; for(i=xms;i>0;i-) for(j=124
19、;j>0;j-);void write_com(uchar com) /LCD命令控制,写指令函数delay(5) ;lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_data(uchar date) /LCD数据控制,写数据函数delay(5);lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;void time()/设置时间函数 while(1)if(key1=0) delay(10);if(key1=0)if(hour=23) /"时"设置ho
20、ur=0;elsehour+;hourge=hour%10;hourshi=hour/10;write_com(0x0f);delay(2);write_com(0x80+6);write_data(table1hourge); /"时"个位写入LCD第二行第6位delay(5);write_com(0x80+5);delay(2);write_data(table1hourshi); /"时"十位写入LCD第二行第5位while(!key1);/delay(1);if(key2=0) delay(10);if(key2=0)if(min=59)/&qu
21、ot;分"设置min=0;elsemin+;minge=min%10;minshi=min/10;write_com(0x0f);write_com(0x80+9);write_data(table1minge); /"分"个位写入LCD第二行第9位delay(1);write_com(0x80+8);write_data(table1minshi); /"分"十位写入LCD第二行第8位delay(1);while(!key2); if(key3=0) delay(10);if(key3=0)write_com(0x0c); /整体显示,关光标
22、,不闪烁TR1=1; /定时计数器1启动while(!key3);break; /key3松开时,显示时间"时""分"位均已设置完毕 void alarm()/设置闹钟时间函数 while(1)if(key1=0) delay(10);if(key1=0)if(ahour=23)/闹钟"时"设置ahour=0;elseahour+;ahourge=ahour%10;ahourshi=ahour/10;write_com(0x0f);/delay(2);write_com(0x80+0x40+8);write_data(':
23、39;);write_com(0x80+0x40+7);write_data(table1ahourge);delay(1);write_com(0x80+0x40+6);/delay(2);write_data(table1ahourshi);delay(1);while(!key1);if(key2=0) /闹钟"分"设置 delay(10);if(key2=0)if(amin=59)amin=0;elseamin+;aminge=amin%10;aminshi=amin/10;write_com(0x0f);/delay(2);write_com(0x80+0x40+
24、10);write_data(table1aminge);delay(1);write_com(0x80+0x40+9);/delay(2);write_data(table1aminshi);delay(1);while(!key2); if(key3=0) flag=flag; delay(10);if(key3=0)write_com(0x0c);write_com(0x80+0x40);for(i=0;i<11;i+)write_data(nuli);while(!key3);break; /设置结束,此时LCD第二行无数据显示,只有第一行有时间显示 void keyscan()
25、/键盘扫描 if(key1=0) delay(10);if(key1=0)while(!key1); /key1键松开后执行下一行程序time(); /调用time()函数,即时间设置 else if(key2=0) delay(10);if(key2=0)while(!key2)ahourge=ahour%10;ahourshi=ahour/10;write_com(0x80+0x40+7);write_data(table1ahourge);delay(5);write_com(0x80+0x40+6);delay(2);write_data(table1ahourshi);aminge=
26、amin%10;aminshi=amin/10;write_com(0x80+0x40+10);write_data(table1aminge);delay(5);write_com(0x80+0x40+9);delay(2);write_data(table1aminshi);write_com(0x80+0x40);for(i=0;i<11;+i)write_data(Alarm_1i); /显示闹钟设置的时间write_com(0x80+0x40);for(i=0;i<11;i+)write_data(nuli); /key2松开后,LCD只有第一行显示时间,闹钟设置时间不显
27、示 else if(key3=0) delay(10);if(key3=0)while(!key3); /表示闹钟时间设置退出 ahourge=ahour%10;ahourshi=ahour/10;write_com(0x80+0x40+7);write_data(table1ahourge);delay(5);write_com(0x80+0x40+6);delay(2);write_data(table1ahourshi);aminge=amin%10;aminshi=amin/10;write_com(0x80+0x40+10);write_data(table1aminge);dela
28、y(5);write_com(0x80+0x40+9);delay(2);write_data(table1aminshi);write_com(0x80+0x40);for(i=0;i<11;+i)write_data(Alarm_1i);/显示闹钟设置时间alarm(); /调用闹钟时间设置函数 else if(key4=0)/以下进行闹铃开关的设置 delay(5);if(key4=0) while(!key4);a=a+1;if(a%2=0) /闹钟"on"for(b=0;b<6;b+)sound=sound; /蜂鸣器发出3次"哗"
29、的响声delay(200);sound=1;else if(a%2=1) /闹钟"off"sound=0; /蜂鸣器发出1次"哗"的响声delay(300);sound=1;delay(300); sound=1; void lcd_init() /LCD初始化函数lcden=0;lcdrw=0;write_com(0x38); /设置8位格式,2行,5×7write_com(0x0c); /整体显示,关光标,不闪烁write_com(0x06); /设定输入方式,增量不转移write_com(0x01); /清除屏幕显示delay(2);wr
30、ite_com(0x80);for(i=0;i<16;i+)write_data(table2i); /写入显示时间数据delay(1);void judge()if(sec=60)min+;sec=0;if(min=60)hour+;min=0;if(hour=24)hour=0;void init()/AT89C51初始化函数key1=1;key2=1;key3=1;key4=1;sec=0;a=0;sound=1;amin=-1; /四个按键均未按下,闹钟时间"分"的初值为1(防止仿真图刚启动时,就达到闹钟时间,蜂鸣器发出响声)/led=1;TMOD=0x10;
31、 /定时计数器T1、T2均工作在方式1TH1=0x3C;TL1=0xB0; /计数初值为15536EA=1;ET1=1;TR1=1; /定时计数器T1启动void equa()if(amin=min&&ahour=hour&&a%2=0) /显示时间与闹钟设置时间完全一样且闹钟"on"jdq=0; /P23口的电位置0,继电器启动,外部LED-GREEN灯电路导通 sound=sound; /蜂鸣器发出"哗哗哗"响声else jdq=1; void led1() interrupt 3/LED1中断函数TL1=0xB0;T
32、H1=0x3C;if(flag)equa(); num1+;num2+;if(num2>=20)sec+;num2=0;judge();if(num1=10) /计时10次50ms,即500msnum1=0;led=led;/P24口电位取反,LED灯亮void main() /主函数lcd_init(); /调用LCD初始化函数init(); /调用AT89C51初始化函数while(1)keyscan(); /调用扫描函数 /显示时间"秒"加1minge=min%10;minshi=min/10;write_com(0x80+9);write_data(table1minge);delay(5);write_com(0x80+8);write_data(table1minshi);hourge=hour%10;hourshi=hour/10;write_com(0x80+6);write_data(table1hourge);delay(5);write_com(0x80+5);write_data(table1hourshi);write_com(0x80+7);write_data(':');delay(5);write_com(0x80+10);write_data(':');delay(5);s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论