电子时钟LCD显示课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目2 电子时钟(LCD 显示) 1. 设计要求
以AT89C51单片机为核心的时钟,在LCD 显示器上显示当前的时刻: 利用字符型LCD 显示器显示当前时刻。

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

用4个功能键操作来设置当前时刻。

功能键K1~K4功能如下。

K1—进入设置此刻的时刻。

K2—加1 。

K3—减1。

K4—确认完成设置。

程序执行后工作指示灯LED 闪动,表示程序开始执行,LCD 显示“00:00:00”,然后开始计时。

1.时钟的整体设计思路
依照系统的设计功能要求,本时钟系统的设计必需采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。

图一系统总原理图
3.系统硬件设计 单片机控制系统
本次设计时钟电路,利用了ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,利用键盘键上的按键来调整时钟的时、分、秒,同时利用C 语言程序来控制整个时钟显示,使得编程变得更易,如此通过三个模块:键盘、芯片、显示屏即可知足设计要求。

原理如图一所示。

ATC89C51单片机芯片
VCC:供电电压。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P0口的管脚第一次写1时,被概念为输入。

P0能够用于外部程序数据存储器,它能够被概念为数据/地址的低八位。

在FIASH编程时,P0 口作为原码输入口,当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口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄放器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外手下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
RXD(串行输入口)
TXD(串行输出口)
/INT0(外部中断0)
/INT1(外部中断1)
T0(记时器0外部输入)
T1(记时器1外部输入)
/WR(外部数据存储器写选通)
/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。

当振荡器复位器件时,要维持RST脚两个机械周期的高电平时刻。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于按时目的。

但是要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

现在,ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

若是微处置器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。

在由外部程序存储器取指期间,每一个机械周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN
信号将不出现。

/EA/VPP:当/EA维持低电平时,则在此期间外部程序存储器(0000H-FFFFH),无论是不是有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端维持高电平时,其间内部程序存储器。

在FLASH 编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

1)复位电路
复位电路有两种方式:上电复位和按钮复位,咱们主要用按钮复位方
式。

如图二所示:
图二复位电路
2)晶振电路
晶振电路原理图三:
图三晶振模块原理图
选取原则:电容选取20pF,晶振为12MHz。

3)电源
AT89S51单片机的供电电源是5V的直流电。

4)EA非/Vpp 脚
咱们没有效外部扩展ROM,因此EA非/Vpp为高电平,即接+5V电源。

3.2.2键盘控制系统设计
按键需要4个,别离实现为时刻调整、时刻的加、时刻的减、退出四个功能。

用单片机的4个I/O口接收控制信号,其电路如图四下:
图四按键调时电路
通过控制键来控制所要调节的是时、分、仍是秒。

在控制键按下后LCD中会在相应的位置出现光标,这时在通过加数键或减数键来控制时分秒的加或减。

3.2.3.显示电路。

显示电路如图五所示:
图五显示电路
4.软件设计
软件主要要完成的功能
(1)显示时刻程序
用软件调节时刻,通进程序的调节,最后用LCD现实时钟
(2)调节时刻程序
按键调节时刻,能实现时、分的调节
软件设计的主要流程
(1)系统总的流程图
主要功能是负责时刻的显示,通过写地址和写数据来实现时刻的调节和控制,最后通过挪用显示子程序显示出来如图六所示。

(2)时刻控制程序
时刻控制程序,用中断准确的控制时刻,采用60进制,60秒为一分钟,60分钟为一个小时,全天设置为24小时。

程序流程图如图七所示。

程序用C 语言编写,代码见附录二。

编程时采用KEIL C ,而仿真用PROTUES ,仿真时仿真图如图八所示
图六 总程序流程图 图七 时钟流程图 5软件程序清单: #include <> #include <>
#define uchar unsigned char #define uint unsigned int
#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();} sbit K1 =P1^0;
. ";
//
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;
开始
定时器及中断定时
按键调时
是否执行
N Y
//-------------------------------------------------------------------------------------------------
//延时函数
//-------------------------------------------------------------------------------------------------
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(); // 显示过程中允许修改时间 }
}
图八电路原理图
图九电路professional仿真图。

相关文档
最新文档