电子时钟设计实验报告.docx
《电子时钟设计实验报告.docx》由会员分享,可在线阅读,更多相关《电子时钟设计实验报告.docx(26页珍藏版)》请在冰点文库上搜索。
电子时钟设计实验报告
单片机电子时钟设计报告
一、设计任务
本次课程设计的电子时钟电路,是基于单片机STC89C52、时钟芯片和液晶显示,运用C语言编程实现。
电子时钟可以显示日期的年、月、日和时间的时、分、秒,具有复位功能。
二、系统硬件设备及芯片简介
数字电子钟系统设计已经成熟,但是目前系统设计时基本都是采用LED作为显示电路,造成硬件电路复杂、功耗高、产品体积庞大等特点;液晶显示模
块由于具有低功耗、寿命长、体积小、显示内容丰富、价格低、接口控制方便
等优点,因此在各类电子产品中被极广泛地推广和应用。
字符型液晶显示模块是一类专门用于显示字母、数字、符号等点阵式液晶显示模块。
本系统设计采
用字符型液品显示模块LCD1602作为显示器件,这样不仅简化了系统的硬件设计,而且极大地提高了系统的可靠性。
1LCD160前介
字符型液晶显示模块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,RWH,E=Ho
输出:
D0-口7=状态字。
(2)写指令:
输入:
RS=L,RW=L,D0—D7=指令码,£=上升沿。
输出:
无。
(3)读数据:
输入:
RS=H,RWH,E=H。
输出:
D0-D7=数据。
⑷写数据:
卒队:
RS=H,RWL,D0-D7MO,E=±JW。
输出:
无。
2.4LCD1602显示方法
液晶显示模块是慢速显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平(即不忙),否则该指令失效。
显示字符时,要先输入显示字符地址,即告诉模块在哪里显示字符。
因为写入显示地址时要求最高位D7恒定为高电平,所以实际写入的数据应该是要显示地址值加上80H,即将最高位D7置为1。
在使用此显示模块时一般要对其进行初始化,设置所需要的显示参数。
液晶模块在显示字符时光标是自动右移的,无需人工干预。
每次输入指令前,都要判断液晶模块是否处于忙状态。
3数字电子钟硬件电路设计
硬件电路系统设计主要由单片机最小系统、输入电路、输出电路等组成。
单片机最小系统同所有单片机系统,在此不作讨论。
输入电路主要时间调节电路,为简化系统我们使两个外部中断来调节“时”和“分”数值,即将INTO、INT1分别接两个按钮。
LCD显示器和单片机接口电路可以采用总线方式或者是模拟口线方式,本设计采用第二种方式,即以单片机I/O模拟控制信号。
具体电路见图1,P0口作为数据,并接上拉电阻提升电压,P2.0接LCD的RS端、P2.1接LCD的R/W端、P2.2接LCD的E端,“分”调节按钮接INT0,“时”调节按钮接INT1,图1省略了电源和单片机最小系统电路。
图1数字电子钟硬件电路
三、设计电路图及程序
1.电路图如下
■3fi
n
115V
U2
亟
Hi
MS
■22耳
■Z7
■3e
:
12-01-07
■12'25'05
原理图如下:
KTM1
XTJk
J3T
D口支l;
巫
ALE
心皿PO:
AD1H:
AD:
的」怔的」皿的工如1的EADE的W
KAA!
P工L安P12AJ0P:
2A)1m:
K:
AijPUaHp:
m
P.501XD裆:
芷P52OT0Psj5?
tT
M.+TO丁工
P:
:
2.程序
共有四段程序,用Keil仿真是程序列表如图
aaa
&a01aDIff0auor
,[巴^|T»rget1
-!
□Target1
-,丁SourceGroup1
S-g]DS13Q2X
-图regx52.h
|!
!
;]kdl&O2.h
|Jintrins>
国dsl302h
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*/
#defineIDL0x01
#defineSTOP0x02
#definePD_
0x02/*Alternatedefinition*/
#defineGF0_
#defineGF1_
#defineSMOD
0x04
0x08
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;
sbitRXD=0xB0;
sbitTXD=0xB1;
sbitINT0=0xB2;
sbitINT1=0xB3;
sbitT0=0xB4;
sbitT1=0xB5;
sbitWR=0xB6;
sbitRD=0xB7;
sbitP3_7=0xB7;
/*Serialdatainput*/
/*Serialdataoutput*/
/*Externalinterrupt0*/
/*Externalinterrupt1*/
/*Timer0externalinput*/
/*Timer1externalinput*/
/*Externaldatamemorywritestrobe*/
/*Externaldatamemoryreadstrobe*/
/*
IPBitRegisters*/
sbitPX0=0xB8;sbitPT0=0xB9;sbitPX1=0xBA;sbitPT1=0xBB;sbitPS=0xBC;sbitPT2=0xBD;
/*
T2CONBitRegisters*/
sbitCP_RL2=0xC8;
sbitC_T2=0xC9;
sbitTR2=0xCA;
sbitEXEN2=0xCB;
sbitTCLK=0xCC;
sbitRCLK=0xCD;
sbitEXF2=0xCE;
sbitTF2=0xCF;
/*0=Reload,1=Captureselect*/
/*0=Timer,1=Counter*/
/*0=Stoptimer,1=Starttimer*/
/*Timer2externalenable*/
/*0=SerialclockusesTimer1overflow,1=Timer2*/
/*0=SerialclockusesTimer1overflow,1=Timer2*/
/*Timer2externalflag*/
/*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*/
#defineTF2_VECTOR
#defineEX2VECTOR
/*0x2BTimer2*/
/*0x2BExternalInterrupt2*/#endif
LCD1602驱动程序为:
#ifndefLCD_CHAR_1602_2005_4_9
#defineLCD_CHAR_1602_2005_4_9
#include//Port
Definitions**********************************************************sbitLcdRssbitLcdRwsbitLcdEnsfrDBPort
//内部等待函数
*********************************************************************
*****
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();
}
//设置显示模式
************************************************************voidLCD_SetInput(unsignedcharInputMode)
voidLCD_SetDisplay(unsignedcharDisplayMode)
{.
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
}
{.
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递增,画面不动
}//************************************************************************voidGotoXY(unsignedcharx,unsignedchary){if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));}voidPrint(unsignedchar*str){while(*str!
='\0'){LCD_Write(LCD_DATA,*str);str++;
}
/*
voidLCD_LoadChar(unsignedcharuser[8],unsignedcharplace){.
unsignedchari;
LCD_Write(LCD_COMMAND,0x40|(place*8));
for(i=0;i<8;i++)
LCD_Write(LCD_DATA,user[i]);
}
*/
//********************************************************************
****
#endif
Intrins.h程序为:
#ifndef__INTRINS_H_
#define__INTRINS_H
externvoid_nop_(void);
externbit_testbit
externunsignedchar_cror_externunsignedint_iror_externunsignedlong_lror_externunsignedchar_crol_externunsignedint_irol_externunsignedlong_lrol_
(bit);
(unsignedchar,unsignedchar);
(unsignedint,unsignedchar);
(unsignedlong,unsignedchar);
(unsignedchar,unsignedchar);
(unsignedint,unsignedchar);
(unsignedlong,unsignedchar);
externunsignedchar_chkfloat_(float);
externvoid_push_(unsignedchar_sfr);
externvoid_pop_(unsignedchar_sfr);
#endif
DS1302时钟程序为:
#ifndef_REAL_TIMER_DS1302_2003_7_21_
#define_REAL_TIMER_DS1302_2003_7_21_
sbitDS1302_CLK=P1A6;〃实时时钟时钟线引脚
sbitDS1302_IO=PW7;〃实时时钟数据线引脚
sbitDS1302_RST=PW5;〃实时时钟复位线引脚
sbitACC0=ACCA0;
sbitACC7=ACCA7;
typedefstruct__SYSTEMTIME__
unsignedcharSecond;
unsignedcharMinute;
unsignedcharHou