当前位置:文档之家› (完整版)电子时钟(LCD显示)

(完整版)电子时钟(LCD显示)

电气工程及自动化专业单片机原理及应用课程设计报告姓名:XXXXXX学号:XXXXXXX专业班级:XXXXXX题目:电子时钟(LCD显示)电气与电子工程学院二〇一四年十二月三十日目录一、设计目的 (2)二、设计任务和要求 (2)三、设计原理分析 (2)四、硬件资源及其分配 (3)五、硬件图 (4)六、程序框图 (5)七、程序 (7)八、调试运行 (13)九、仿真截图 (13)十、设计心得体会 (14)一、设计目的1、设计要求以AT89C51单片机为核心的时钟,在LCD 显示器上显示当前的时间。

2、 使用字符型LCD 显示器显示当前时间。

显示格式为“时时:分分:秒秒”。

3、用4个功能键操作来设置当前时间。

4、熟悉掌握proteus 编成软件以及keil 软件的使用 二、设计任务与要求本设计以AT89C51单片机为核心,通过时钟程序的编写,并在LCD 显示器上显示出来。

该编程的核心在于定时器中断及循环往复判断是否有按键操作,并对每个按键的操作在LCD 显示器上作出相应的反应。

由于LCD 显示器每八位对应一个字符,故把秒、分、时的个位和十位分开表示。

该课题中有四个控制开关KM1、KM2、KM3、KM4分别控制时、分、秒、确定的调整,时间按递增的方式调整,每点一次按钮则相应的时间个位加以,且时间调整不干扰其他为调整时间的显示。

三、设计原理分析1、按照系统的设计功能要求,本时钟系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。

图一 系统总原理图2、软件主要完成功能(1)显示时间程序用软件调节时间,通过程序的调节,最后用LED现实时钟(2)调节时间程序按键调节时间,能实现时、分的调节3、软件设计主要流程时间控制程序时间控制程序,用中断准确的控制时间,采用60进制,60秒为一分钟,60分钟为一个小时,全天设置为24小时。

四、硬件资源及原理图AT89C51芯片AT89C51 是美国ATMEL 公司生产的8 位Flash ROM 单片机。

其最突出的优点是片内ROM 为Flash ROM,可擦写1000 次以上,应用并不复杂的通用ROM 写入器就能方便的擦写,读取也很方便,价格低廉,具有片程序ROM 二级保密系统。

因此可灵活应用于各种控制领域。

AT89C51 包含以下一些功能部件:1. 一个8 位CPU ;2. 一个片内振荡器和时钟电路;3. 4KB Flash ROM ;4. 128B 内RAM;5. 可寻址64KB 的外ROM 和外RAM 控制电路;6. 两个16 位定时/计数器;7. 21 个特殊功能寄存器;8. 4 个8 位并行I/O 口;9. 一个可编程全双工串行口;10. 5 个中断源,可设置成2 个优先级。

AT89C51 单片机一般采用双列直插DIP 封装,共40 个引脚,图2-1 为其引脚排列图。

40 个引脚大致可分为4 类:电源、时钟、控制各I/O 引脚五、硬件图六、程序框图七、程序#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit K1 =P0^0;sbit K2 =P0^1;sbit K3 =P0^2;sbit K4 =P0^3;sbit SPK=P3^0;sbit RS =P2^0;sbit RW =P2^1;sbit E =P2^2;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 =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_Command(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;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) {uchar k;LCD_Set_Pos(LineNo);for(k=0;k<16;k++) LCD_Write_Data(str[k]);}//蜂鸣函数void Beep(){uchar i, j = 70;for(i=0;i<200;i++){while(--j);SPK= ~SPK;}DelayMS(300); SPK=0;}//时分秒显示void Display_HMS(uchar h,m,s){if(Settime) HMS_String[3] = '>';//显示修改标志else HMS_String[3] = ' '; //不显示修改标志HMS_String[4] = h/10 + '0'; //时HMS_String[5] = h%10 + '0';HMS_String[7] = m/10 + '0'; //分HMS_String[8] = m%10 + '0';HMS_String[10]= s/10 + '0'; //秒HMS_String[11]= 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;}else 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();while(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 = 0x01;TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;IE = 0x82;SPK = 0;LCD_Initialize();Display_String(Str1,0x00); //第一行显示TR0 = 1;P1 = 0xFF;while(1){Display_HMS(Hour,Minute,Second); //第二行显示时分秒DelayMS(500);Change_Time(); //显示过程中允许修改时间}}八、调试运行1、按硬件原理图接线用4个功能键操作来设置当前时间。

功能键K1~K4功能如下。

K1—进入设置现在的时间。

K2—设置小时。

K3—设置分钟。

K4—确认完成设置。

程序执行后工作指示灯LED闪动,表示程序开始执行,LED显示“00:00:00”,然后开始计时九、仿真截图结论:采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。

相关主题