当前位置:文档之家› 51单片机可调电子时钟

51单片机可调电子时钟

目录摘要 (2)Abstract (3)1.设计目的 (4)2.设计任务 (4)2.1.任务1:开机界面的设置 (4)2.2.任务2:LCD-1602显示日期时间 (4)2.3.任务3:时间与日期的调整 (4)3.硬件设计 (4)3.1.STC89C51(51单片机) (4)3.2.LCD-1602液晶显示屏 (5)4.软件设计 (7)4.1.应用软件 (7)4.2.程序框图 (7)4.3.使用说明 (7)4.4.注意事项 (8)4.5.调试结果 (8)5.收获 (9)附录: (10)附录A.硬件图 (10)附录B.主要程序 (11)摘要电子时钟是单片机系统的一个应用,由硬件和软件相配合使用。

本文通过对单片机的控制实现日历功能电子时钟的设计,以达到学习、了解单片机相关指令在各方面的应用。

硬件由主控器、显示电路、键盘接口等三个模块组成。

该时钟设计以STC-89C51作为主控器,控制显示时钟信息;显示模块用LCD-1602液晶屏;键盘接口电路由普通按键完成。

软件利用C语言编程实现单片机的控制功能。

关键词:电子时钟、单片机、LCD-1602液晶显示AbstractElectronic clock is a single chip microcomputer system application, by the use of hardware and software. In this paper, through the control of single-chip microcomputer to achieve the design of the electronic clock, in order to achieve learning, to understand the microcontroller related instructions in various aspects of the application. The hardware is composed of three modules, such as the main controller, the display circuit, the keyboard interface and so on. The clock is designed with STC-89C51 as the main controller, controlling the display clock information; the display module uses the LCD-1602 LCD screen; the keyboard interface circuit is completed by the ordinary button. Software uses C language programming microcontroller control functions.Key words: electronic clock, single chip microcomputer,LCD-1602 liquid crystal display1.设计目的该电子时钟由C语言编写而成,利用单片机定时器控制时钟运行,实现按键调整时间和日期的功能。

2.设计任务2.1.任务1:开机界面的设置上电显示开机界面,“King.G”闪烁两次,之后进入主界面。

2.2.任务2:LCD-1602显示日期时间采用双行显示,第一行显示“2015-11-11”第二行显示“08-00-00”并且开始跑表。

2.3.任务3:时间与日期的调整采用三个独立按键,按下功能键,定时器暂停,光标开启并在秒数位置闪烁,其他两个按键可对秒数进行加减操作。

每按一次功能键,光标依次从秒数移至年历数,当光标显示在何位置时,其他两个按键可对该位置的数值进行调整,调整结束,定时器开启。

3.硬件设计3.1.STC89C51(51单片机)STC89C51RC是采用8051核的ISP(In System Programming)在系统可编程芯片,最高工作时钟频率为80MHz,片内含8K Bytes的可反复擦写1000次的Flash 只读程序存储器,器件兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。

STC89C51RC系列单片机是单时钟/机器周期(1T)的兼容8051 内核单片机,是高速/ 低功耗的新一代8051 单片机,全新的流水线/精简指令集结构,内部集成MAX810 专用复位电路0。

具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。

另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

最高运作频率35MHz,6T/12T可选0。

图3.1.1 89C51控制模块3.2.LCD-1602液晶显示屏LCD1602液晶显示器0是目前广泛使用的一种字符型液晶显示模块。

它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。

不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。

为了降低成本,现在绝大多数制造商都直接将裸片做到本子上。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

图3.2.1 LCD1602显示模块序指令RS R/W D7 D6 D5 D4 D3 D2 D1 D0 号1 清显示0 0 0 0 0 0 0 0 0 12 光标返回0 0 0 0 0 0 0 0 1 *3 置输入模式0 0 0 0 0 0 0 1 I/D s4 显示开/关控制0 0 0 0 0 0 1 D C B5 光标或字符移位0 0 0 0 0 1 S/C R/L * *6 置功能0 0 0 0 1 DL N F * *0 0 0 1 字符发生存贮器地址7 置字符发生存储器地址8 置数据存贮器0 0 1 显示数据存贮器地址9 读忙标志或地址0 1 BF 计数器地址1 0 要写的数据内容10 写数到CGRAM或DDRAM11 从CGRAM或1 1 读出的数据内容DDRAM读数表3.2.2 1602控制指令开始初始化单片机数据处理按键按下 LCD -1602液晶显示判断调整条件4. 软件设计4.1. 应用软件软件运行环境:KEIL UV4 PROTEUS 7.5本设计软件涉及KEIL UV4、STC 烧录软件,由KEIL UV4编写C 语言程序以及进行调试,由STC 烧录软件将调试好的程序下载入单片机中。

4.2. 程序框图图4.2.1 程序框图程序开始后,先进入初始化,定时器打开,LCD 液晶显示模式设置,单片机循环进行数据处理,此时,LCD-1602显示时间。

若按键按下,判断调整条件,经单片机处理后,液晶显示数据更换,以达到调整时间的目的。

4.3. 使用说明按下功能键,进入时间、日期调整界面,依次按下可逐个调整秒、分、时、日、月、年。

调整结束后,再次按下功能键可恢复时间界面。

加数键,可以增加位数上的数值;减数键可减少位数上数值。

增加和减少需要在时间调整下可以使用,在不调整时间的情况下,两个按键均无法使用。

时间日期调整范围2000年1月1日00:00:00-2099年12月31日23:59:59。

4.4.注意事项该时钟是采用单片机及C语言逻辑控制的。

缺少闰年2月29天的补偿功能。

4.5.调试结果如图4.5.1所示,当不进行操作时,时间正常运行;如图4.5.2所示当按下调整时间功能键时,时间暂停且光标开启,此时可增加或减少光标所在位的数值。

图4.5.1 时间运行界面图4.5.2 调整时间界面5.收获经过本次的设计,深入了解了单片机I/O口的使用,学会使用数据手册来查阅LCD-1602的使用。

对于按键扫描更加的了解。

对单片机学习过程中的定时器,中断系统一级单片机各引脚的功能有了更加深入的了解。

参考文献:[1] 李叶紫,等.MCS-51单片机应用教程[M].北京:清华大学出版社,2004.[2] 张培仁.MCS-51单片机原理与应用[M].北京:清华大学出版社,2003.[3] 朱华光.浅议LCD1602的编程技巧[J].电脑知识与技术,2010,6(18).附录:附录A.硬件图附录B.主要程序#include<reg52.h>#include<intrins.h>sbit RS = P2^2; //定义端口sbit RW = P2^3;sbit EN = P2^4;sbit KEY_function=P3^4;sbit KEY_ADD=P3^5;sbit KEY_DEC=P3^6;sbit key4=P3^7;sbit DUAN=P2^6;//定义锁存使能端口段锁存sbit WEI=P2^7;// 位锁存#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0unsigned char t,s,f,m,b,n,y,r; unsigned char flag=0;void DelayUs2x();void DelayMs();bit LCD_Check_Busy();void LCD_Write_Com();void LCD_Write_Data() ;void LCD_Clear();void LCD_Write_String() ;void LCD_Write_Char();void LCD_Init();unsigned char KeyScan (void ){if(!KEY_function){DelayMs(10);if(!KEY_function){flag++;while(!KEY_function); if(flag==1){TR1=0;LCD_Write_Com(0xC0+10); LCD_Write_Com(0x0f);}if(flag==2){LCD_Write_Com(0xC0+7); }if(flag==3){LCD_Write_Com(0xC0+4); }if(flag==4){LCD_Write_Com(0x80+11); }if(flag==5){LCD_Write_Com(0x80+8); }if(flag==6){LCD_Write_Com(0x80+5); }if(flag==7){flag=0;LCD_Write_Com(0x0c);TR1=1;}}}if(flag!=0){if(!KEY_ADD){DelayMs(10);if(!KEY_ADD){while(!KEY_ADD);if(flag==1){m++;if(m==60)m=0;LCD_Write_Char(10,1,m/10+0x30); LCD_Write_Char(11,1,m%10+0x30); LCD_Write_Com(0xC0+10);}if(flag==2){f++;if(f==60)f=0;LCD_Write_Char(7,1,f/10+0x30); LCD_Write_Char(8,1,f%10+0x30); LCD_Write_Com(0xC0+7);}if(flag==3){s++;if(s==24)s=0;LCD_Write_Char(4,1,s/10+0x30); LCD_Write_Char(5,1,s%10+0x30); LCD_Write_Com(0xC0+4);}if(flag==4){r++;if(r==32)r=1;LCD_Write_Char(11,0,r/10+0x30); LCD_Write_Char(12,0,r%10+0x30); LCD_Write_Com(0x80+11);}if(flag==5){y++;if(y==13)y=1;LCD_Write_Char(8,0,y/10+0x30); LCD_Write_Char(9,0,y%10+0x30); LCD_Write_Com(0x80+8);}if(flag==6){n++;if(n==100)n=0;LCD_Write_Char(5,0,n/10+0x30); LCD_Write_Char(6,0,n%10+0x30); LCD_Write_Com(0x80+5);}}}if(!KEY_DEC){DelayMs(10);if(!KEY_DEC){while(!KEY_DEC);if(flag==1){m--;if(m==-1)m=59;LCD_Write_Char(10,1,m/10+0x30); LCD_Write_Char(11,1,m%10+0x30); LCD_Write_Com(0xC0+10);}if(flag==2){f--;if(f==-1)f=59;LCD_Write_Char(7,1,f/10+0x30); LCD_Write_Char(8,1,f%10+0x30); LCD_Write_Com(0xC0+7);}if(flag==3){s--;if(s==-1)s=23;LCD_Write_Char(4,1,s/10+0x30); LCD_Write_Char(5,1,s%10+0x30); LCD_Write_Com(0xC0+4);}if(flag==4){r--;if(r==0)r=31;LCD_Write_Char(11,0,r/10+0x30); LCD_Write_Char(12,0,r%10+0x30); LCD_Write_Com(0x80+11);}if(flag==5){y--;if(y==0)y=12;LCD_Write_Char(8,0,y/10+0x30); LCD_Write_Char(9,0,y%10+0x30); LCD_Write_Com(0x80+8);}if(flag==6){n--;if(n==-1)n=99;LCD_Write_Char(5,0,n/10+0x30); LCD_Write_Char(6,0,n%10+0x30); LCD_Write_Com(0x80+5);}}}}return 0;}/*主函数*/void main(){LCD_Init();LCD_Clear();LCD_Write_String(5,0,"King.G"); DelayMs(500);LCD_Clear();DelayMs(500);LCD_Write_String(5,0,"King.G"); DelayMs(500);LCD_Clear();DelayMs(500);LCD_Write_String(3,0,"2015-11-11"); LCD_Write_String(4,1,"08:00:00"); while (1){KeyScan();}}void time() interrupt 3{TH1=0x3c;TL1=0xb0;t++;if(t==20){ t=0;m++;if(m==60){m=0;f++;}if(f==60){f=0;s++;}if(s==24){s=0;r++;}if(r==32&&y==1) {r=1;y++;}if(r==29&&y==2) {r=1;y++;}if(r==32&&y==3) {r=1;y++;}if(r==31&&y==4) {r=1;y++;}if(r==32&&y==5) {r=1;y++;}if(r==31&&y==6) {r=1;y++;}if(r==32&&y==7) {r=1;y++;}if(r==32&&y==8) {r=1;y++;}if(r==31&&y==9) {r=1;y++;}if(r==32&&y==10) {r=1;y++;}if(r==31&&y==11) {r=1;y++;}if(r==32&&y==12) {r=1;y++;}if(y==13){y=1;n++;}if(n==100){n=0;}LCD_Write_Char(4,1,s/10+0x30); LCD_Write_Char(5,1,s%10+0x30);LCD_Write_Char(7,1,f/10+0x30); LCD_Write_Char(8,1,f%10+0x30); LCD_Write_Char(10,1,m/10+0x30); LCD_Write_Char(11,1,m%10+0x30); LCD_Write_Char(5,0,n/10+0x30); LCD_Write_Char(6,0,n%10+0x30);LCD_Write_Char(8,0,y/10+0x30); LCD_Write_Char(9,0,y%10+0x30); LCD_Write_Char(11,0,r/10+0x30); LCD_Write_Char(12,0,r%10+0x30); }}20。

相关主题