单片机电子时钟课程设计

单片机电子时钟课程设计
单片机电子时钟课程设计

《电子线路设计》课程设计说明书

数字电子钟

系、部:电气与信息工程系

学生姓名:l雷锋

专业:电子信息工程

班级:电子0901班

完成时间:2012-12-18

摘要

时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。

数字电子钟的设计方法有多种,其中,利用单片机实现的电子钟具有编程灵活,便于电子钟功能的扩充,即可用该电子钟发出各种控制信号,精确度高等特点,同时可以用该电子钟发出各种控制信号。

本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机AT89S52芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。与传统机械表相比,它具有走时精确,显示直观等特点。它的计时周期为24小时,显满刻度为“23时59分59秒”,另外具有校时功能等特点。该电子钟可以做到的功能:

上电或按键复位后能自动显示系统提示符“P.”进入时钟准备状态。第一次按电子钟启动/暂停键,电子钟从0时0分0秒开始运行,进入时钟运行状态。再次按电子钟启动/暂停键,则电子钟进入时钟暂停状态,此时可按下调整键调整时间,分别通过时间加,时间减两个按键调整时间。调整结束后可按启动/暂停键再次进入时钟运行状态。通过设置的A、B、C、D四个键来调整运行,并且利用了8位LED显示时分秒。

此电子钟严格按照要求设计,最终达到预期的效果,能够正确显示“P”点以及时分秒的计时,算是一次比较成功的设计了。

关键词:电子钟;单片机;汇编

ABSTRACT

Clock, since it was invented that day, becomes the friend of mankind, but as time goes on, the continuous development of science and technology, people on the time measurement accuracy is higher and higher, more and more wide application. How to let the clock to better serve the people, how to make our old friend bloom? This requests the people to continue to design a new clock.

The design of digital electronic clock methods are various, among them, realize the use of single-chip electronic clock with programming flexibility, ease of electronic clock function expansion, can use the electric clock out of control signal, high accuracy, and can use the electric clock out of control signal.

This paper mainly introduces the MCU internal timer / counter to realize the electronic clock method, designed by the MCU and AT89S52 chip and LED digital tube as the core, supplemented by necessary circuit, composed of a single-chip electronic clock. Compared with the traditional mechanical watches, it has a precise path, intuitive display characteristics. Its time period is 24 hours, was in full scale as " twenty-three fifty-nine 59 seconds", and a school function etc.. The electronic clock can achieve the function of:

Power on or reset button to automatically display the system prompt" P." into clock ready state 2 for the first time by electronic clock start / adjusting keys, electronic bell from 0 when 0 minute 0 seconds start running, enter the clock running state. Again by the electronic clock start / adjusting keys, electronic bell clock adjustment state is entered, this time by the adjusting button to adjust the time, after adjustment according to the start / adjusting key again into the clock running state. By setting the A, B, C, D four keys to adjust the operation, and the use of 8 bit LED is displayed every minute.

The electronic clock in strict accordance with the requirements of the design, finally achieve the desired effect, can correctly display" P" and of accurate timing, is a successful design.

Key words:electronic clock; single-chip microcomputer; compilation

目录

1 电子钟功能及总体方案的介绍 (1)

1.1 电子钟功能介绍 (1)

1.1.1 基本功能要求 (1)

1.2 总体方案介绍 (1)

1.2.1 计时方案 (1)

1.2.2 键盘/显示方案 (1)

2 硬件系统设计 (3)

2.1 硬件系统各模块功能介绍 (3)

2.1.1 显示电路 (3)

2.1.2 键盘控制电路 (3)

2.1.3 电子钟的启、停及时间调整 (4)

3 软件系统设计 (5)

3.1 单片机的使用资源情况 (5)

3.2 电子钟程序流程框图 (6)

3.2.1 主程序流程框图 (6)

3.2.2 键扫子程序流程框图 (7)

3.2.3 中断服务程序流程框图 (8)

3.2.4 显示子程序流程框图 (9)

3.3 电子钟总体程序清单 (10)

4 电子钟设计结论 (18)

4.1 使用说明书 (18)

4.1.1 操作说明 (18)

4.2 电子钟运行结果 (18)

4.2.1 待机 (18)

4.2.2 启动 (18)

4.2.3 运行 (19)

4.3 误差分析 (19)

4.4 设计体会 (19)

参考文献 (20)

附录 (21)

1 电子钟功能及总体方案的介绍

1.1 电子钟功能介绍

1.1.1 基本功能要求

可调整运行的电子钟具有三种工作状态:“P.”状态、运行状态、调整状态。(1)、“P.”状态,依靠上电或按复位键进入,在此状态下,按B、C、D键均无效,按A键有效,进入运行状态;

(2)、运行状态,按A键进入,在此状态下,按B、C、D键均无效,只有按A 键有效,按下A键后,退出运行状态,进入暂停状态;

(3)、调整状态,在暂停此状态下,按A、B、C、D键均有效。如按下A键,则退出调整状态,进入运行状态;按下B键,则分别对时、分、秒位进行选择,按下C、D键对选择的位进行加减,调整结束后必须按A键,即可退出调整状态,进入运行状态。

基本功能要求:

“P.”稳定地显示在LED显示器的最左端数码管上,无A键按下(在“P.”状态下,按下B、C、D键无效),则不进入电子钟的运行状态,继续显示“P.”。

按下A键后,电子钟以起始时间:00时00分00秒开始运行。

再次按下A 键后,电子钟退出运行状态,进入暂停状态,利用B、C、D键把电子钟的显示时间修改为当前实时时间,时间修改正确后可再次按下A键,电子钟则退出调整状态,进入运行状态。

注意:每次按下C、D键,只允许加一,不允许连加。

1.2 总体方案介绍

1.2.1 计时方案

利用AT89S52单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时。该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。

1.2.2 键盘/显示方案

AT89S52的P0口和P2口外接由八个LED数码管(LED7~LED0)构成的显示器,

用P0口作LED的段码输出口,P2口作八个LED数码管的位控输出线,P1口外接四个按键A、B、C、D构成键盘电路。

AT89S52 是一种低功耗,高性能的CMOS 8位微型计算机。它带有8K Flash 可编程和擦除的只读存储器(EPROM),该器件采用ATMEL的高密度非易失性存储器技术制造,与工业上标准的80C51和80C52的指令系统及引脚兼容,片内Flash 集成在一个芯片上,可用与解决复杂的问题,且成本较低。简易电子钟的功能不复杂,采用其现有的I/O便可完成,所以本书中采用此的设计方案,结构如图1如示。

图1 电子钟原理框图

2 硬件系统设计

2.1硬件系统各模块功能介绍

2.1.1显示电路

在本次课程设计中,我采用的是八位共阳数码管,显示原理跟单个LED的显示原理完全相同,在段控线和位控线都串接一个电阻,以提高其输出功率,在这里采用470欧母电阻。

2.1.2键盘控制电路

键盘是最常用的输入设备,是实现人机对话的纽带。按其结构形式可分为非编码键盘和编码键盘。

编码键盘采用硬件方法产生键码。每按下一个键,键盘能自动生成键盘代码,键数较多,且具有去抖动功能。这种键盘使用方便,但硬件较复杂。非编码键盘仅提供按键开关工作状态,其键码由软件确定,这种键盘键数较少,硬件简单,广泛应用于各种单片机应用系统,在单片机控制电路中,可把单片机使用的键盘分为独立式和矩阵式两种。独立式实际上就是一组独立的按键,这些按键可直接与单片机的I/O口连接,即每个按键独占一条口线,这种接法简单。矩阵式键盘也称行列式键盘,因为键的数目较多,所以键按行列组成矩阵。本设计中键盘数目较少,且为安装方便,因此在本设计中采用独立式接法。

按从一个键到键的功能被执行主要应包括两项工作:一是键的识别,即在键盘中找出被按的是哪个键,另一项是键功能的实现。第一项工作是使用接口电路实现的,而第二项工作则是通过执行相应服务程序来完成。具体来说,键盘接口应完成以下操作功能:

(1) 键盘扫描,以判定是否有键被按下(称之为“闭合键”)。

(2) 键识别,以确定闭合键的行列位置。

(3) 产生闭合键的键码。

(4) 排除多键、串键(复键)及去抖动。

以上这些内容通常是以软硬件结合的方式来完成的,即在软件的配合下由接口电路来完成。但具体哪些由硬件哪些由软件完成,要看接口电路的情况。

总的原则是,硬件复杂软件就简单,硬件简单软件就得复杂一些。

2.1.3电子钟的启、停及时间调整

电子钟设置4个按键通过程序控制来完成电子钟的启、停及时间调整。

A键控制电子钟的启、停;

B键选择位;

C键位加;

D键位减。

2.2系统电路图

2.2.1 电路原理图见附录

2.2.2 电路PCB图见附录

2.2.3 电路元器件布局图见附录

图2 元器件清单

3 软件系统设计

3.1单片机的使用资源情况

3.1.1资源使用说明

●P3口为二极管的控制端

●P0口用作地址/数据总线

●P2口用作地址/数据总线

●P1.0、P1.1、P1.2、P1.3口线作为键盘输入端

既在AT89S52的P3口用来接八个发光二极管的阴极,控制其亮与灭,P0口和P2口外接由8个LED数码管构成的显示器,用P0口作LED的段码输出口(P0.0~P0.7对应于LED的a~dp),P2口作LED的位控输出线,P2口外接四个个按键A、B、C、D(分别对应于P1.0、P1.1、P1.2、P1.3口)用于调整显示接口电路。

3.1.2数码管显示模块

数码管显示是通过调用显示子程序来实现的,由于数码管的显示要有实时性,所以在执行其他程序时依然要经常调用显示子程序。数码管的段控由CPU 改变P2口相应位电平来实现。

3.1.3按键控制模块

开始/暂停,位选择按键由外部中断来实现,加键,减键通过键盘扫描来实现。

3.2电子钟程序流程框图3.2.1主程序流程框图

3.2.2键扫子程序流程框图

3.2.3中断服务程序流程框图

图5 中断服务程序流程框图

3.2.4显示子程序流程框图

图6 显示子程序流程图

3.3电子钟总体程序清单

/* 课程设计电子钟 */

/* 电子0901班全昌炽 */

/* crystal=12Mhz */

/* P2口位控口,P0口段控口,键盘s1控制P1口 */

#include

#include

#define uchar unsigned char

#define uint unsigned int

/*共阳数码管字型码*/

/*0,1,2,3,4,5,6,7,8,9,p.,灭*/

Char code

dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c,0x ff,0xbf};

/*P点显示代码序号*/

char find_code[]={11,11,11,10,11,11,11,11};

char s=0,m=0,h=0;

char x,y=0,n=0;

bit s2bz=0;

bit s5bz=0;

bit a=0;

//函数名: void Delay1ms(uint count)

//功能:延时时间为1ms

//输入参数:count,1ms计数

//说明:总共延时时间为1ms乘以count,crystal=12Mhz

/* 延迟函数 */

void Delay1ms(uint count)

{

uint j;

while(count--!=0)

{

for(j=0;j<80;j++);

}

}

/*显示函数*/

void put_on_leds()

{

char i,j=0xfe;

char k;

for(i=0;i<8;i++)

{

P2=j;

k=find_code[i];

P0=dis_code[k];

Delay1ms(1);

j=_crol_(j,1);

P0=0xff;

}

}

/* 函数原型:keychuli();

功能:处理与键盘相连的P1口的内容,作为键值。*/

uchar keychuli()

{

uchar k;

k=P1; //P1口内容送K

k=~k; //取反

return(k); //返回键值

}

/*****

* 函数原型:key();

* 功能:键盘扫描函数,函数返回值即键值。

******/

uchar key()

{

uchar keyzhi,keyzhii; //电子钟键盘按键键值临时存放

keyzhi=keychuli(); //调P1口处理函数

if(keyzhi!=0) //有键动作延时去抖动,否则函数返回

{

put_on_leds();

put_on_leds();

keyzhi=keychuli(); //再次调P1口处理函数

if(keyzhi!=0) //真正有键按下,取键值并暂存

{

keyzhii=keyzhi;

while(keyzhi!=0) //判按键是否释放,没有释放延时去抖动等待释放

{

put_on_leds();

put_on_leds();

keyzhi=keychuli();

}

keyzhi=keyzhii; //按键释放后恢复按键键值

}

}

return(keyzhi); //返回按键键值

}

/*中断函数*/

void TTC0() interrupt 1

{

TH0=0x3c; //重装初值

TL0=0xb0;

x++;

if(x==20) //判断是否循环20次,即1s {

x=0;

find_code[4]=s%10; //给显示缓冲数组赋值

find_code[5]=s/10;

find_code[3]=11;

s++; //秒自加

if(s>=60) //判断是否达到1分钟

{

s=0; //秒清零

find_code[7]=m%10;

find_code[0]=m/10;

m++; //分自加

if(m>=60) //判断是否达到1小时

{

m=0; //分清零

find_code[2]=h%10;

find_code[3]=h/10;

h++; //时自加

if(h>=24) //判断是否达到1天

h=0; //时清零

}

}

}

}

/*显示初始化*/

void chushihua()

{

find_code[4]=s%10;

find_code[5]=s/10;

find_code[6]=12;

find_code[7]=m%10;

find_code[0]=m/10;

find_code[1]=12;

find_code[2]=h%10;

find_code[3]=h/10;

put_on_leds();

}

/*按键中断函数*/

void INTT0() interrupt 0 using 0

{

s2bz=!s2bz;

}

void INTT1() interrupt 2 using 2

{

s5bz=1;

}

/*主函数*/

void main()

{

EA=1; //中断初始化,打开中断 ET0=1;

EX0=1;

EX1=1;

IT0=1;

IT1=1;

ET1=1;

TMOD=0X01;

TH0=0x3c;

TL0=0xb0;

while(1)

{

put_on_leds(); //显示P点

if(s2bz==1)

{

while(1)

{

n=0;

chushihua(); //初始化

TR0=1; //开定时器

if(s2bz==0) //判断是否按下暂停键

{

while(s2bz==0)

{

TR0=0; //关定时器

put_on_leds(); //显示暂停值

if(s5bz==1) //判断功能键是否按下

{

s5bz=0; //将功能键标志位清零

if(n<3)

n++;

else

n=1;

}

switch(key()) //判断加减键是否按下

{

case 0x04: //加按下

switch(n)

{

case 1: //n等于1,时自加

h++;

find_code[3]=h/10;

find_code[2]=h%10;

put_on_leds();

if(h>=23)

h=-1;

break;

case 2: //n等于2,分自加

m++;

find_code[0]=m/10;

find_code[7]=m%10;

put_on_leds();

if(m>=59)

m=-1;

break;

case 3: //n等于3,秒自加

s++;

find_code[5]=s/10;

find_code[4]=s%10;

put_on_leds();

if(s>=59)

s=-1;

break;

}

break;

case 0x08: //减按下switch(n)

{

case 1: //n等于1,时自减

h=24;

h--;

相关主题
相关文档
最新文档