搜档网
当前位置:搜档网 › 电子时钟设计实验报告

电子时钟设计实验报告

电子时钟设计实验报告
电子时钟设计实验报告

单片机电子时钟设计报告

一、设计任务

本次课程设计的电子时钟电路,是基于单片机STC89C52、时钟芯片和液晶显示,运用C语言编程实现。电子时钟可以显示日期的年、月、日和时间的时、分、秒,具有复位功能。

二、系统硬件设备及芯片简介

数字电子钟系统设计已经成熟,但是目前系统设计时基本都是采用LED

作为显示电路,造成硬件电路复杂、功耗高、产品体积庞大等特点;液晶显示模块由于具有低功耗、寿命长、体积小、显示容丰富、价格低、接口控制方便等优点,因此在各类电子产品中被极广泛地推广和应用。字符型液晶显示模块是一类专门用于显示字母、数字、符号等点阵式液晶显示模块。本系统设计采用字符型液品显示模块LCD1602 作为显示器件,这样不仅简化了系统的硬件设计,而且极提高了系统的可靠性。

1 LCD1602简介

字符型液晶显示模块LCD1602已经是单片机应用设计中最常用的信息显示器件。LCD1602可以显示两行,每行16个字符,采用+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。

2 LCD1602功能介绍

2.1 引脚功能

LCD1602采用标准14脚(无背光)或16脚(带背光)接

口,各引脚功能见表1。

表1 引脚功能

2.2 LCD1602读写指令

LCD1602读写指令较多且较复杂,具体使用可以查相关资料,下面仅列

出最常用的的一些命令:①写指令38H:显示模式设置;②写指令08H:

显示关闭;③写指令01H:显示清屏;④写指令06H:显示光标移动设

置;⑤写指令0CH:显示开及光标设置。

2.3 LCD1602 读写操作时序

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.4 LCD1602显示方法

液晶显示模块是慢速显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平(即不忙),否则该指令失效。显示字符时,要先输入显示字符地址,即告诉模块在哪里显示字符。因为写入显示地址时要求最高位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__

sfr P0 = 0x80;

sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A;

sfr TL1 = 0x8B;

sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr P1 = 0x90;

sfr SCON = 0x98; sfr SBUF = 0x99; sfr P2 = 0xA0; sfr IE = 0xA8;

sfr P3 = 0xB0; sfr IP = 0xB8;

sfr T2CON = 0xC8;

sfr T2MOD = 0xC9;

sfr RCAP2L = 0xCA;

sfr RCAP2H = 0xCB;

sfr TL2 = 0xCC;

sfr TH2 = 0xCD;

sfr PSW = 0xD0;

sfr ACC = 0xE0;

sfr B = 0xF0;

/*------------------------------------------------ P0 Bit Registers

------------------------------------------------*/ sbit P0_0 = 0x80;

sbit P0_1 = 0x81;

sbit P0_2 = 0x82;

sbit P0_3 = 0x83;

sbit P0_4 = 0x84;

sbit P0_5 = 0x85;

sbit P0_6 = 0x86;

sbit P0_7 = 0x87;

/*------------------------------------------------

PCON Bit Values

------------------------------------------------*/ #define IDL_ 0x01

#define STOP_ 0x02

#define PD_ 0x02 /* Alternate definition */

#define GF0_ 0x04

#define GF1_ 0x08

#define SMOD_ 0x80

/*------------------------------------------------ TCON Bit Registers

------------------------------------------------*/ sbit IT0 = 0x88;

sbit IE0 = 0x89;

sbit IT1 = 0x8A;

sbit IE1 = 0x8B;

sbit TR0 = 0x8C;

sbit TF0 = 0x8D;

sbit TR1 = 0x8E;

sbit TF1 = 0x8F;

/*------------------------------------------------ TMOD Bit Values

------------------------------------------------*/ #define T0_M0_ 0x01

#define T0_M1_ 0x02

#define T0_CT_ 0x04

#define T0_GATE_ 0x08

#define T1_M0_ 0x10

#define T1_M1_ 0x20

#define T1_CT_ 0x40

#define T1_GATE_ 0x80

#define T1_MASK_ 0xF0

#define T0_MASK_ 0x0F

/*------------------------------------------------ P1 Bit Registers

------------------------------------------------*/ sbit P1_0 = 0x90;

sbit P1_1 = 0x91;

sbit P1_2 = 0x92;

sbit P1_3 = 0x93;

sbit P1_4 = 0x94;

sbit P1_5 = 0x95;

sbit P1_6 = 0x96;

sbit P1_7 = 0x97;

sbit T2 = 0x90; /* External input to Timer/Counter 2, clock out */ sbit T2EX = 0x91; /* Timer/Counter 2 capture/reload trigger & dir ctl */

/*------------------------------------------------

SCON Bit Registers

------------------------------------------------*/

sbit RI = 0x98;

sbit TI = 0x99;

sbit RB8 = 0x9A;

sbit TB8 = 0x9B;

sbit REN = 0x9C;

sbit SM2 = 0x9D;

sbit SM1 = 0x9E;

sbit SM0 = 0x9F;

/*------------------------------------------------

P2 Bit Registers

------------------------------------------------*/ sbit P2_0 = 0xA0;

sbit P2_1 = 0xA1;

sbit P2_2 = 0xA2;

sbit P2_3 = 0xA3;

sbit P2_4 = 0xA4;

sbit P2_5 = 0xA5;

sbit P2_6 = 0xA6;

sbit P2_7 = 0xA7;

/*------------------------------------------------ IE Bit Registers

------------------------------------------------*/ sbit EX0 = 0xA8; /* 1=Enable External interrupt 0 */ sbit ET0 = 0xA9; /* 1=Enable Timer 0 interrupt */ sbit EX1 = 0xAA; /* 1=Enable External interrupt 1 */ sbit ET1 = 0xAB; /* 1=Enable Timer 1 interrupt */ sbit ES = 0xAC; /* 1=Enable Serial port interrupt */ sbit ET2 = 0xAD; /* 1=Enable Timer 2 interrupt */

sbit EA = 0xAF; /* 0=Disable all interrupts */

/*------------------------------------------------

P3 Bit Registers (Mnemonics & Ports)

------------------------------------------------*/ sbit P3_0 = 0xB0;

sbit P3_1 = 0xB1;

sbit P3_2 = 0xB2;

sbit P3_3 = 0xB3;

sbit P3_4 = 0xB4;

sbit P3_5 = 0xB5;

sbit P3_6 = 0xB6;

sbit P3_7 = 0xB7;

sbit RXD = 0xB0; /* Serial data input */

sbit TXD = 0xB1; /* Serial data output */

sbit INT0 = 0xB2; /* External interrupt 0 */

sbit INT1 = 0xB3; /* External interrupt 1 */

sbit T0 = 0xB4; /* Timer 0 external input */

sbit T1 = 0xB5; /* Timer 1 external input */

sbit WR = 0xB6; /* External data memory write strobe */ sbit RD = 0xB7; /* External data memory read strobe */

IP Bit Registers

------------------------------------------------*/

sbit PX0 = 0xB8;

sbit PT0 = 0xB9;

sbit PX1 = 0xBA;

sbit PT1 = 0xBB;

sbit PS = 0xBC;

sbit PT2 = 0xBD;

/*------------------------------------------------

T2CON Bit Registers

------------------------------------------------*/

sbit CP_RL2= 0xC8; /* 0=Reload, 1=Capture select */

sbit C_T2 = 0xC9; /* 0=Timer, 1=Counter */

sbit TR2 = 0xCA; /* 0=Stop timer, 1=Start timer */

sbit EXEN2= 0xCB; /* Timer 2 external enable */

sbit TCLK = 0xCC; /* 0=Serial clock uses Timer 1 overflow, 1=Timer 2 */ sbit RCLK = 0xCD; /* 0=Serial clock uses Timer 1 overflow, 1=Timer 2 */ sbit EXF2 = 0xCE; /* Timer 2 external flag */

sbit TF2 = 0xCF; /* Timer 2 overflow flag */

T2MOD Bit Values

------------------------------------------------*/

#define DCEN_ 0x01 /* 1=Timer 2 can be configured as up/down counter */ #define T2OE_ 0x02 /* Timer 2 output enable */

/*------------------------------------------------

PSW Bit Registers

------------------------------------------------*/

sbit P = 0xD0;

sbit FL = 0xD1;

sbit OV = 0xD2;

sbit RS0 = 0xD3;

sbit RS1 = 0xD4;

sbit F0 = 0xD5;

sbit AC = 0xD6;

sbit CY = 0xD7;

/*------------------------------------------------

Interrupt Vectors:

Interrupt Address = (Number * 8) + 3

------------------------------------------------*/

#define IE0_VECTOR 0 /* 0x03 External Interrupt 0 */

#define TF0_VECTOR 1 /* 0x0B Timer 0 */

#define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */

#define TF1_VECTOR 3 /* 0x1B Timer 1 */

#define SIO_VECTOR 4 /* 0x23 Serial port */

#define TF2_VECTOR 5 /* 0x2B Timer 2 */

#define EX2_VECTOR 5 /* 0x2B External Interrupt 2 */

#endif

LCD1602驱动程序为:

#ifndef LCD_CHAR_1602_2005_4_9

#define LCD_CHAR_1602_2005_4_9

#include

//Port

Definitions**********************************************************

sbit LcdRs = P2^0;

sbit LcdRw = P2^1;

sbit LcdEn = P2^2;

sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

//部等待函数

********************************************************************* *****

unsigned char LCD_Wait(void)

{

LcdRs=0;

LcdRw=1; _nop_();

LcdEn=1; _nop_();

//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,

//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80

//实际硬件时打开此语句

LcdEn=0;

return DBPort;

}

//向LCD写入命令或数据

************************************************************ #define LCD_MAND 0 // mand

#define LCD_DATA 1 // Data

#define LCD_CLEAR_SCREEN 0x01 // 清屏

#define LCD_HOMING 0x02 // 光标返回原点

void LCD_Write(bit style, unsigned char input)

{

LcdEn=0;

LcdRs=style;

LcdRw=0; _nop_();

DBPort=input; _nop_();//注意顺序

LcdEn=1; _nop_();//注意顺序

LcdEn=0; _nop_();

LCD_Wait();

}

//设置显示模式

************************************************************ #define LCD_SHOW 0x04 //显示开

#define LCD_HIDE 0x00 //显示关

#define LCD_CURSOR 0x02 //显示光标

#define LCD_NO_CURSOR 0x00 //无光标

#define LCD_FLASH 0x01 //光标闪动

#define LCD_NO_FLASH 0x00 //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)

{

LCD_Write(LCD_MAND, 0x08|DisplayMode);

}

//设置输入模式

************************************************************ #define LCD_AC_UP 0x02

#define LCD_AC_DOWN 0x00 // default

#define LCD_MOVE 0x01 // 画面可平移

#define LCD_NO_MOVE 0x00 //default

void LCD_SetInput(unsigned char InputMode)

{

LCD_Write(LCD_MAND, 0x04|InputMode);

}

//移动光标或屏幕

************************************************************

/*

#define LCD_CURSOR 0x02

#define LCD_SCREEN 0x08

#define LCD_LEFT 0x00

#define LCD_RIGHT 0x04

void LCD_Move(unsigned char object, unsigned char direction)

{

if(object==LCD_CURSOR)

LCD_Write(LCD_MAND,0x10|direction);

if(object==LCD_SCREEN)

LCD_Write(LCD_MAND,0x18|direction);

}

*/

//初始化

LCD************************************************************ void LCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_MAND,0x38); //8位数据端口,2行显示,5*7点阵

LCD_Write(LCD_MAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标

LCD_Write(LCD_MAND,LCD_CLEAR_SCREEN); //清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动

}

//******************************************************************** ****

void GotoXY(unsigned char x, unsigned char y)

{

if(y==0)

LCD_Write(LCD_MAND,0x80|x);

if(y==1)

LCD_Write(LCD_MAND,0x80|(x-0x40));

}

void Print(unsigned char *str)

{

while(*str!='\0')

{

LCD_Write(LCD_DATA,*str);

str++;

}

相关主题