电子时钟(LCD显示)课程设计_第1页
电子时钟(LCD显示)课程设计_第2页
电子时钟(LCD显示)课程设计_第3页
电子时钟(LCD显示)课程设计_第4页
电子时钟(LCD显示)课程设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题目2 电子时钟(lcd显示)1. 设计要求以at89c51单片机为核心的时钟,在lcd显示器上显示当前的时间:使用字符型lcd显示器显示当前时间。显示格式为“时时:分分:秒秒”。用4个功能键操作来设置当前时间。功能键k1k4功能如下。k1进入设置现在的时间。k2加1。k3减1。k4确认完成设置。程序执行后工作指示灯led闪动,表示程序开始执行,lcd显示“00:00:00”,然后开始计时。1.时钟的总体设计思路按照系统的设计功能要求,本时钟系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。微型控制器时钟电路按键调时数据显示 图一系统总原理图3.

2、系统硬件设计 3.1 单片机控制系统本次设计时钟电路,使用了atc89c51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,同时使用c语言程序来控制整个时钟显示,使得编程变得更容易,这样通过三个模块:键盘、芯片、显示屏即可满足设计要求。原理如图一所示。 atc89c51单片机芯片 vcc:供电电压。 gnd:接地。 p0口:p0口为一个8位漏级开路双向i/o口,每脚可吸收8ttl门电流。当p0口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在fiash编程时,p0

3、 口作为原码输入口,当fiash进行校验时,p0输出原码,此时p0外部必须接上拉电阻。 p1口:p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为低八位地址接收。 p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p2口当用于外部程序

4、存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程和校验时接收高八位地址信号和控制信号。 p3口:p3口管脚是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流(ill)这是由于上拉的缘故。 p3口也可作为at89c51的一些特殊功能口,如下表所示: 口管脚 备选功能 p3.0 rxd(串行输入口) p3.1 txd(串行输出口

5、) p3.2 /int0(外部中断0) p3.3 /int1(外部中断1) p3.4 t0(记时器0外部输入) p3.5 t1(记时器1外部输入) p3.6 /wr(外部数据存储器写选通) p3.7 /rd(外部数据存储器读选通) p3口同时为闪烁编程和编程校验接收一些控制信号。 rst:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。 ale/prog:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在flash编程期间,此引脚用于输入编程脉冲。在平时,ale端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用

6、于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ale脉冲。如想禁止ale的输出可在sfr8eh地址上置0。此时, ale只有在执行movx,movc指令是ale才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ale禁止,置位无效。 /psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。 /ea/vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/ea将内部锁定为reset;当/ea端保

7、持高电平时,此间内部程序存储器。在flash编程期间,此引脚也用于施加12v编程电源(vpp)。 xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。 xtal2:来自反向振荡器的输出。1) 复位电路复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。如图二所示: 图二 复位电路2) 晶振电路晶振电路原理图三: 图三 晶振模块原理图 选取原则:电容选取20pf,晶振为12mhz。3) 电源at89s51单片机的供电电源是5v的直流电。4) ea非/vpp 脚我们没有用外部扩展rom,因此ea非/vpp为高电平,即接+5v电源。3.2.2键盘控制系统设计按键需要4个,分别实现为

8、时间调整、时间的加、时间的减、退出四个功能。用单片机的4个i/o口接收控制信号,其电路如图四下: 图四 按键调时电路通过控制键来控制所要调节的是时、分、还是秒。在控制键按下后lcd中会在相应的位置出现光标,这时在通过加数键或减数键来控制时分秒的加或减。3.2.3.显示电路。显示电路如图五所示: 图五 显示电路4.软件设计4.1 软件主要要完成的功能(1)显示时间程序用软件调节时间,通过程序的调节,最后用lcd现实时钟(2)调节时间程序按键调节时间,能实现时、分的调节4.2软件设计的主要流程(1)系统总的流程图主要功能是负责时间的显示,通过写地址和写数据来实现时间的调节和控制,最后通过调用显示子

9、程序显示出来 如图六所示。(2)时间控制程序时间控制程序,用中断准确的控制时间,采用60进制,60秒为一分钟,60分钟为一个小时,全天设置为24小时。程序流程图如图七所示。程序用c语言编写,代码见附录二。编程时采用keil c,而仿真用protues,仿真时仿真图如图八所示开始定时器及中断定时器初始化按键调时是否设定参数执行显示程序ny 图六 总程序流程图 图七 时钟流程图5软件程序清单:#include #include #define uchar unsigned char#define uint unsigned int#define delaynop() _nop_();_nop_()

10、;_nop_();_nop_();sbit k1 =p10; /选择调整小时,分钟sbit k2 =p11; /增加sbit k3 =p12; /减少sbit k4 =p13;sbit spk=p30;sbit rs =p20;sbit rw =p21;sbit e =p22;uchar code str1 = current time ; /以下两个字符串的串长均为16uchar code str2 = set new time. ; /uchar hms_string = 00:00:00 ; /待显示的时间串bit settime= 0; /是否修改时间bit change_h_or_m

11、 =1; /1表示修改时,0表示修改分uchar millisecond, hour =0, minute =0, second =0;/-/延时函数/-void delayms(uint x) uchar i; while(x-) for (i = 0; i 120; i+);/-/lcd忙状态检测/-bit lcd_busy_check() bit result; rs = 0; rw = 1; e = 1; delaynop();result = (bit)(p0 & 0x80); e = 0; return result;/-/写lcd命令/-void lcd_write_comman

12、d(uchar cmd) while( lcd_busy_check();/判断lcd是否忙碌 rs = 0; rw = 0; e = 0;_nop_();_nop_(); p0 =cmd; delaynop(); e = 1; delaynop(); e = 0;/-/设置lcd显示位置/-void lcd_set_pos(uchar pos) lcd_write_command(pos | 0x80);/-/写lcd数据/-void lcd_write_data(uchar dat) while(lcd_busy_check();/判断lcd是否忙碌 rs = 1;rw = 0;e = 0

13、; p0 =dat ;delaynop(); e = 1;delaynop();e = 0;/-/lcd初始化/-void lcd_initialize() lcd_write_command(0x38); delayms(1); lcd_write_command(0x0c); delayms(1); lcd_write_command(0x06); delayms(1); lcd_write_command(0x01); delayms(1);/-/显示函数,在lcd指定的行上显示字符串/-void display_string(uchar * str,uchar lineno) ucha

14、r k; lcd_set_pos(lineno); for(k=0;k16;k+) lcd_write_data(strk); /-/蜂鸣函数/-void beep() uchar i, j =70; for (i =0; i; /显示修改标志 else hms_string3 = ; /不显示修改标志 hms_string4 = h / 10 + 0; /时 hms_string5 = h % 10 + 0; hms_string7 = m / 10 + 0; /分 hms_string8 = m % 10 + 0; hms_string10 = s / 10 + 0; /秒 hms_str

15、ing11 =s % 10 + 0; display_string(hms_string,0x40);/-/设置时间/-void change_time() settime=0; if( k1 = 0 | k2 = 0 | k3 = 0) /按下k1,k2,k3中的任何一个键即进入修改状态 tr0 = 0;display_string(str2,0x00); /第一行提示修改时间settime = 1; while (settime) if( k1 = 0) /确定调整小时还是分钟 beep(); while (k1 = 0) change_h_or_m = !change_h_or_m; e

16、lse if(k2 = 0) /增加 beep(); while ( k2 = 0); if(change_h_or_m = 1) if ( +hour = 24) hour = 0; else if ( +minute = 60) minute = 0; else if ( k3 = 0) /减少 beep(); while ( k3 = 0); if (change_h_or_m = 1) if ( -hour = 0xff) hour = 23; else if ( -minute = 0xff) minute = 59; else if ( k4 = 0 ) /确定 beep(); w

17、hile ( k4 = 0); display_string(str1,0x00); /第一行还原显示str1 settime = 0; tr0 = 1; display_hms(hour,minute,second); /外层while在这里结束/-/定时器0中断/-void time0() interrupt 1 th0 = (65536 -50000) / 256; tl0 = (65536 -50000) % 256; /重新装入50ms定时 if( +millisecond = 20) /50*20=1s millisecond = 0;if ( +second = 60) second =0; if( +minute = 60) minute = 0;if( +hour = 24) hour = 0;minute = 0;second = 0; /-/主函数/-void main() tmod = 0x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论