电子时钟设计实验报告.docx
《电子时钟设计实验报告.docx》由会员分享,可在线阅读,更多相关《电子时钟设计实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
电子时钟设计实验报告
单片机电子时钟设计报告
一、设计任务
本次课程设计的电子时钟电路,是基于单片机STC89C52、时钟芯片和液晶显示,运用C语言编程实现。
电子时钟可以显示日期的年、月、日和时间的时、分、秒,具有复位功能。
二、系统硬件设备及芯片简介
数字电子钟系统设计已经成熟,但是目前系统设计时基本都是采用LED作为显示电路,造成硬件电路复杂、功耗高、产品体积庞大等特点;液晶显示模块由于具有低功耗、寿命长、体积小、显示内容丰富、价格低、接口控制方便等优点,因此在各类电子产品中被极广泛地推广和应用。
字符型液晶显示模块是一类专门用于显示字母、数字、符号等点阵式液晶显示模块。
本系统设计采用字符型液品显示模块LCD1602作为显示器件,这样不仅简化了系统的硬件设计,而且极大地提高了系统的可靠性。
1LCD1602简介
字符型液晶显示模块LCD1602已经是单片机应用设计中最常用的信息显示器件。
LCD1602可以显示两行,每行16个字符,采用+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。
2LCD1602功能介绍
2.1引脚功能
LCD1602采用标准14脚(无背光)或16脚(带背光)接
口,各引脚功能见表1。
表1引脚功能
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
DataI/O
2
VDD
电源正极
10
D3
DataI/O
3
VL
液晶显示偏压信号
11
D4
DataI/O
4
RS
数据/命令选择端
12
D5
DataI/O
5
R/W
读/写选择端
13
D6
DataI/O
6
E
使能信号
14
D7
DataI/O
7
D0
DataI/O
15
BLA
背光源正极
8
D1
DataI/O
16
BLK
背光源负极
2.2LCD1602读写指令
LCD1602读写指令较多且较复杂,具体使用可以查相关资料,下面仅列出最常用的的一些命令:
①写指令38H:
显示模式设置;②写指令08H:
显示关闭;③写指令01H:
显示清屏;④写指令06H:
显示光标移动设置;⑤写指令0CH:
显示开及光标设置。
2.3LCD1602读写操作时序
LCD1602读写操作时序总体上来说是比较简单的,掌握其有两种方法:
一种是只看时序图,另外一种方法是直接记忆和总结读写时电平高低和变化。
很显然第二种更简单和直接,下面就列出典型读写的时序要求,以方便编写程序。
(1)读状态:
输入:
RS=L,RW=H,E=H。
输出:
D0-D7=状态字。
(2)写指令:
输入:
RS=L,RW=L,D0-D7=指令码,E=上升沿。
输出:
无。
(3)读数据:
输入:
RS=H,RW=H,E=H。
输出:
D0-D7=数据。
(4)写数据:
输入:
RS=H,RW=L,D0-D7=数据,E=上升沿。
输出:
无。
2.4LCD1602显示方法
液晶显示模块是慢速显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平(即不忙),否则该指令失效。
显示字符时,要先输入显示字符地址,即告诉模块在哪里显示字符。
因为写入显示地址时要求最高位D7恒定为高电平,所以实际写入的数据应该是要显示地址值加上80H,即将最高位D7置为1。
在使用此显示模块时一般要对其进行初始化,设置所需要的显示参数。
液晶模块在显示字符时光标是自动右移的,无需人工干预。
每次输入指令前,都要判断液晶模块是否处于忙状态。
3数字电子钟硬件电路设计
硬件电路系统设计主要由单片机最小系统、输入电路、输出电路等组成。
单片机最小系统同所有单片机系统,在此不作讨论。
输入电路主要时间调节电路,为简化系统我们使两个外部中断来调节“时”和“分”数值,即将INT0、INT1分别接两个按钮。
LCD显示器和单片机接口电路可以采用总线方式或者是模拟口线方式,本设计采用第二种方式,即以单片机I/O模拟控制信号。
具体电路见图1,P0口作为数据,并接上拉电阻提升电压,P2.0接LCD的RS端、P2.1接LCD的R/W端、P2.2接LCD的E端,“分”调节按钮接INT0,“时”调节按钮接INT1,图1省略了电源和单片机最小系统电路。
图1数字电子钟硬件电路
三、设计电路图及程序
1.电路图如下
原理图如下:
2.程序
共有四段程序,用Keil仿真是程序列表如图
Regx52.h程序为:
#ifndef__AT89X52_H__
#define__AT89X52_H__
sfrP0=0x80;
sfrSP=0x81;
sfrDPL=0x82;
sfrDPH=0x83;
sfrPCON=0x87;
sfrTCON=0x88;
sfrTMOD=0x89;
sfrTL0=0x8A;
sfrTL1=0x8B;
sfrTH0=0x8C;
sfrTH1=0x8D;
sfrP1=0x90;
sfrSCON=0x98;
sfrSBUF=0x99;
sfrP2=0xA0;
sfrIE=0xA8;
sfrP3=0xB0;
sfrIP=0xB8;
sfrT2CON=0xC8;
sfrT2MOD=0xC9;
sfrRCAP2L=0xCA;
sfrRCAP2H=0xCB;
sfrTL2=0xCC;
sfrTH2=0xCD;
sfrPSW=0xD0;
sfrACC=0xE0;
sfrB=0xF0;
/*------------------------------------------------
P0BitRegisters
------------------------------------------------*/
sbitP0_0=0x80;
sbitP0_1=0x81;
sbitP0_2=0x82;
sbitP0_3=0x83;
sbitP0_4=0x84;
sbitP0_5=0x85;
sbitP0_6=0x86;
sbitP0_7=0x87;
/*------------------------------------------------
PCONBitValues
------------------------------------------------*/
#defineIDL_0x01
#defineSTOP_0x02
#definePD_0x02/*Alternatedefinition*/
#defineGF0_0x04
#defineGF1_0x08
#defineSMOD_0x80
/*------------------------------------------------
TCONBitRegisters
------------------------------------------------*/
sbitIT0=0x88;
sbitIE0=0x89;
sbitIT1=0x8A;
sbitIE1=0x8B;
sbitTR0=0x8C;
sbitTF0=0x8D;
sbitTR1=0x8E;
sbitTF1=0x8F;
/*------------------------------------------------
TMODBitValues
------------------------------------------------*/
#defineT0_M0_0x01
#defineT0_M1_0x02
#defineT0_CT_0x04
#defineT0_GATE_0x08
#defineT1_M0_0x10
#defineT1_M1_0x20
#defineT1_CT_0x40
#defineT1_GATE_0x80
#defineT1_MASK_0xF0
#defineT0_MASK_0x0F
/*------------------------------------------------
P1BitRegisters
------------------------------------------------*/
sbitP1_0=0x90;
sbitP1_1=0x91;
sbitP1_2=0x92;
sbitP1_3=0x93;
sbitP1_4=0x94;
sbitP1_5=0x95;
sbitP1_6=0x96;
sbitP1_7=0x97;
sbitT2=0x90;/*ExternalinputtoTimer/Counter2,clockout*/
sbitT2EX=0x91;/*Timer/Counter2capture/reloadtrigger&dirctl*/
/*------------------------------------------------
SCONBitRegisters
------------------------------------------------*/
sbitRI=0x98;
sbitTI=0x99;
sbitRB8=0x9A;
sbitTB8=0x9B;
sbitREN=0x9C;
sbitSM2=0x9D;
sbitSM1=0x9E;
sbitSM0=0x9F;
/*------------------------------------------------
P2BitRegisters
------------------------------------------------*/
sbitP2_0=0xA0;
sbitP2_1=0xA1;
sbitP2_2=0xA2;
sbitP2_3=0xA3;
sbitP2_4=0xA4;
sbitP2_5=0xA5;
sbitP2_6=0xA6;
sbitP2_7=0xA7;
/*------------------------------------------------
IEBitRegisters
------------------------------------------------*/
sbitEX0=0xA8;/*1=EnableExternalinterrupt0*/
sbitET0=0xA9;/*1=EnableTimer0interrupt*/
sbitEX1=0xAA;/*1=EnableExternalinterrupt1*/
sbitET1=0xAB;/*1=EnableTimer1interrupt*/
sbitES=0xAC;/*1=EnableSerialportinterrupt*/
sbitET2=0xAD;/*1=EnableTimer2interrupt*/
sbitEA=0xAF;/*0=Disableallinterrupts*/
/*------------------------------------------------
P3BitRegisters(Mnemonics&Ports)
------------------------------------------------*/
sbitP3_0=0xB0;
sbitP3_1=0xB1;
sbitP3_2=0xB2;
sbitP3_3=0xB3;
sbitP3_4=0xB4;
sbitP3_5=0xB5;
sbitP3_6=0xB6;
sbitP3_7=0xB7;
sbitRXD=0xB0;/*Serialdatainput*/
sbitTXD=0xB1;/*Serialdataoutput*/
sbitINT0=0xB2;/*Externalinterrupt0*/
sbitINT1=0xB3;/*Externalinterrupt1*/
sbitT0=0xB4;/*Timer0externalinput*/
sbitT1=0xB5;/*Timer1externalinput*/
sbitWR=0xB6;/*Externaldatamemorywritestrobe*/
sbitRD=0xB7;/*Externaldatamemoryreadstrobe*/
/*------------------------------------------------
IPBitRegisters
------------------------------------------------*/
sbitPX0=0xB8;
sbitPT0=0xB9;
sbitPX1=0xBA;
sbitPT1=0xBB;
sbitPS=0xBC;
sbitPT2=0xBD;
/*------------------------------------------------
T2CONBitRegisters
------------------------------------------------*/
sbitCP_RL2=0xC8;/*0=Reload,1=Captureselect*/
sbitC_T2=0xC9;/*0=Timer,1=Counter*/
sbitTR2=0xCA;/*0=Stoptimer,1=Starttimer*/
sbitEXEN2=0xCB;/*Timer2externalenable*/
sbitTCLK=0xCC;/*0=SerialclockusesTimer1overflow,1=Timer2*/
sbitRCLK=0xCD;/*0=SerialclockusesTimer1overflow,1=Timer2*/
sbitEXF2=0xCE;/*Timer2externalflag*/
sbitTF2=0xCF;/*Timer2overflowflag*/
/*------------------------------------------------
T2MODBitValues
------------------------------------------------*/
#defineDCEN_0x01/*1=Timer2canbeconfiguredasup/downcounter*/
#defineT2OE_0x02/*Timer2outputenable*/
/*------------------------------------------------
PSWBitRegisters
------------------------------------------------*/
sbitP=0xD0;
sbitFL=0xD1;
sbitOV=0xD2;
sbitRS0=0xD3;
sbitRS1=0xD4;
sbitF0=0xD5;
sbitAC=0xD6;
sbitCY=0xD7;
/*------------------------------------------------
InterruptVectors:
InterruptAddress=(Number*8)+3
------------------------------------------------*/
#defineIE0_VECTOR0/*0x03ExternalInterrupt0*/
#defineTF0_VECTOR1/*0x0BTimer0*/
#defineIE1_VECTOR2/*0x13ExternalInterrupt1*/
#defineTF1_VECTOR3/*0x1BTimer1*/
#defineSIO_VECTOR4/*0x23Serialport*/
#defineTF2_VECTOR5/*0x2BTimer2*/
#defineEX2_VECTOR5/*0x2BExternalInterrupt2*/
#endif
LCD1602驱动程序为:
#ifndefLCD_CHAR_1602_2005_4_9
#defineLCD_CHAR_1602_2005_4_9
#include
//PortDefinitions**********************************************************
sbitLcdRs=P2^0;
sbitLcdRw=P2^1;
sbitLcdEn=P2^2;
sfrDBPort=0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
//内部等待函数**************************************************************************
unsignedcharLCD_Wait(void)
{
LcdRs=0;
LcdRw=1;_nop_();
LcdEn=1;_nop_();
//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
//实际硬件时打开此语句
LcdEn=0;
returnDBPort;
}
//向LCD写入命令或数据************************************************************
#defineLCD_COMMAND0//Command
#defineLCD_DATA1//Data
#defineLCD_CLEAR_SCREEN0x01//清屏
#defineLCD_HOMING0x02//光标返回原点
voidLCD_Write(bitstyle,unsignedcharinput)
{
LcdEn=0;
LcdRs=style;
LcdRw=0;_nop_();
DBPort=input;_nop_();//注意顺序
LcdEn=1;_nop_();//注意顺序
LcdEn=0;_nop_();
LCD_Wait();
}
//设置显示模式************************************************************
#defineLCD_SHOW0x04//显示开
#defineLCD_HIDE0x00//显示关
#defineLCD_CURSOR0x02//显示光标
#defineLCD_NO_CURSOR0x00//无光标
#defineLCD_FLASH0x01//光标闪动
#defineLCD_NO_FLASH0x00//光标不闪动
voidLCD_SetDisplay(unsignedcharDisplayMode)
{
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
}
//设置输入模式************************************************************
#defineLCD_AC_UP0x02
#defineLCD_AC_DOWN0x00//default
#defineLCD_MOVE0x01//画面可平移
#defineLCD_NO_MOVE0x00//default
voidLCD_SetInput(unsignedcharInputMode)
{
LCD_Write(LCD_COMMAND,0x04|InputMode);
}
//移动光标或屏幕************************************************************
/*
#defineLCD_CURSOR0x02
#defineLCD_SCREEN0x08
#defineLCD_LEFT0x00
#defineLCD_RIGHT0x04
voidLCD_Move(unsignedcharobject,unsignedchardirection)
{
if(object==LCD_CURSOR)
LCD_Write(LCD_COMMAND,0x10|direction);
if(object==LCD_SCREEN)
LCD_Write(LCD_COMMAND,0x18|direction);
}
*/
//初始化LCD************************************************************
voidLCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//开启显示,无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动
}
//***