设计秒表时钟
计算机控制系统综合实践报告
题 目: 秒表/时钟计时器的设计
系 别:____ 电子信息与电气工程系__________
专 业:_____ 自动化专业________________
班 级:____ 08自动化(2)班____________
姓 名:___ ____________
学 号:__0805070153 0805070115 0805070124__
导 师: 储忠、胡晨曦_______ _________
成 绩:________________________
2011年 06 月 25 日
计算机控制系统设计任务书
秒表/时钟计时器的设计
第1节 引 言
单片机具有体积小,成本低,抗干扰能力强,面向控制,可以实现分机各分布式控制等优点。本秒表/时钟设计就是利用单片机的上述优点,采用目前市场上性能价格比较高的MCS-52单片机设计而成的最小系统。它在实际生活中具有广泛的应用。例如:工业生产中的定时启停自动化设备、学校中上下课铃定时控制、农村广播站每天早中晚广播的自动定时控制均可采用本仪器。
1.1 秒表概述
秒表是电器制造,电国,工业自动化控制、国防、实验室及科研单位理想的计时仪器,它广泛应用于各种继电器、电磁开关,控制器、廷时器、定时器等的时间测试。目前所使用的电秒表大多是指针式或集成电路型的,结构相对复杂、测试功能单一。本仪器还具有实时时钟、整点报时、手动计时的功能。
1.2 本设计任务
(1)用六位LED数码管显示时、分、秒; (2)使用按键开关可实现时分调整; (3)秒表/时钟功能转换; (4)关闭显示即省电功能。
1.3 系统主要功能
1.时钟功能
对于时钟功能,需要在数码管上显示小时、分钟和秒钟,因此,可以在内部存储空间分别定义它们的显示缓存空间,来存放小时、分钟和秒钟的BCD码,各2个字节。
由于时钟是不能停止的,因此需要采用内部定时器自动计时,并使用定时器中断处理程序来定时进行时间数值的刷新。52单片机的2个定时器都具有16位定时器的
工作模式。当晶振为12MHz时,16位定时器的最大定时值为65.536mS;要达到1秒钟,可以采用两种方法:采用一个定时器定时与软件计数相结合的方法;或者采用两个定时器级联的方法。由于秒表在计时功能时也需要用到1个定时器,因此,我们采用第一个方法,只使用1个定时器,例如使用T0。为了达到较为准确的计时,使T0
的溢出时间为50ms,使用一个字节作为软件计数器ST,计数值为20。定时器的中断处理程序对ST进行减1操作,当ST为0时,1秒到达,此时更新存放小时、分钟、秒钟的显示缓存区。
2.计时功能
当秒表用作计时功能时,也需要一个定时器进行10MS的定时,在本例中使用单片机的TIMER1。在TIMER1的中断处理程序中对SS和ss的缓存空间进行更新,与上面类似。
3.功能按键
再看按键的处理。这3个键可以采用中断的方法,也可以采用查询的方法来识别。对于A、B键,主要功能在于功能切换和数值复位,对于时间的要求不是很严格,而C键主要用于时间的锁定,需要比较准确的控制。因此可以考虑,对A、B键采用查询的方式,而对于C 键采用外部中断。
4.中断嵌套和控制
现在在我的方案中有3个中断,T0、T1中断和外部中断INT0。这3个中断的特点是:T0的工作是连续的,可以在误差范围内可以被打断但不可以停止;T1的工作同样可以在误差范围内被打断,但可以被INT0停止;INT0是用来启动或停止T1的。
2.系统硬件设计
2.1秒表/时钟计时器的硬件电路
秒表/时钟计时器的硬件电路如图所示,采用AT89C52单片机,最小化应用设计;采用共阳七段LED显示器,P0口输出段码数据,P2.0-P2.5口作列扫描输出,P1.0、P1.1、P1.2口接三个按钮开关,用以调时及功能设置。为了提供共阳LED数码管的驱动电压,用三极管8550作电源驱动输出。采用12M晶振,有利于提高秒计时的精确性。
图2.1硬件系统的总体设计框架
图2.2 P3口特殊功能
2.2电路原理图设计
电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局
合理的前提下力求美观。
设计电路原理图:
图2.3电路原理图
2.3 AT89C2052单片机及其引脚说明
AT89C2052是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
图2.4 AT89C52芯片
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
主要功能特性:
• 兼容MCS51指令系统 • 8k可反复擦写(>1000次)Flash ROM • 32个双向I/O口 • 256x8bit内部RAM
• 3个16位可编程定时/计数器中断 • 时钟频率0-24MHz
• 2个串行中断 • 可编程UART串行通道 • 2个外部中断源 • 共6个中断源
• 2个读写中断口线 • 3级加密位
• 低功耗空闲和掉电模式
第3节 系统程序的设计
3.1主程序
本设计中,计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。其主程序执行流程见下图
3.2显示子程序
数码管显示的数据存放在内存单元70H-75H中。其中70H-71H存放秒数据,72H-73H存放分数据,74H-75H存放时数据,每一地址单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。显示时,先取出70H-75H某一地址中的数据,然后查得对应的显示用段码,并从P0口输出,P2口将对应的数码管选中供电,就能显示该地址单元的数据值。为了显示小数点及“-”、“A”等特殊字符,在显示班级及计时时采用不同的显示子程序。
3.3定时器T0中断服务程序
定时器TO用于时间计时,定时溢出中断周期可分别设为50ms和10ms.中断进入后,现判断是时钟计时还是秒表计时,时钟计时累计中断20次(即1s)时,对秒计数单元进行加1操作,秒表计时每10ms进行加1操作。时钟计数单元地址分别在70H-71H(秒)、76H-77H(分)和78H-79H(时),最大计时值为23时59分59秒。而秒表计数单元地址也在70H-71H(0.01毫秒)、76H-77H(秒)和78H-79H(分),最大计时值为99分59.99秒。7AH单元内存放“熄灭符”数据(#0AH)。在计数单元中采用十进制BCD码计数,满60(秒表功能时有100)进位,T0中断服务程序执行流程见下图
图3.2
定时器T0、T1溢出周期为50ms(10ms),T0为秒计数用,T1为调整时闪烁用;P1.0,P1.1,P1.2为调整按钮,P0口为字符输出口,采用共阳显示管。
3.4 T1中断服务程序
T1中断服务程序用于指示调整单元数字的亮闪。在时间调整状态下,每过0.3s,将对应单元的显示数据换成“熄灭符”数据(#0AH)。这样在调整时间时,对应调整单元的显示数据会间隔闪亮。
3.5调时功能程序
调时功能程序的设计方法时:按下P1.0口按键,若按下时间短于1s ,则进入省电状态(数码管不亮,时钟不停);否则进入调分状态,等待操作,此时计时器停止走动。当再按下按钮时,若按下时间短于0.5s ,则时间加1分;若按下时间长于0.5s,则
进入小时调整状态。在小时调整状态下,当按键按下的时间长于0.5s,退出调整状态,时钟继续走动。P1.1口 按键在调时状态下可实现减1功能。 3.6整点响程序
如果在时钟状态下,如果是整点那么就用P3.2这个引脚来控制蜂鸣器。 3.7时钟/秒表功能程序
在正常计时状态下,若按下P1.1口按键,则进行时钟 /秒表功能的转换,转换后计时从开始。当按下P1.2口的按键时,可实现清0、计时启动、暂停功能。
第四节 控制源程序清单
/***************************
函数名称:简易数字钟加秒表
制作时间:2011年6月25日
函数功能:两个按键简易调整时间,两个键简易控制秒表,
一个自锁按键进行时钟、秒表切换
***************************/
#include
#define SEG P0
#define SL P1
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit key3 = P3^3;
sbit MiaoBiao = P3^2;
unsigned char code num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char h,m,s,h1,m1,s1 = 0;
unsigned char count,count1 = 0;
unsigned char flag1=1,flag2=1;TS=0;//时钟参数
unsigned char kk,MS=0;//秒表参数
void Delay(unsigned int tt)
{
}
while(tt--);
/////////////////////
/*********时钟显示*************/
//////////////////////////
void Display(unsigned char H,unsigned char M,unsigned char S)
{
if(flag1==1) { SL=0xFE;SEG=num[H/10];Delay(500);
SL=0xFD;SEG=num[H%10]|0x80;Delay(500);
}
if(flag2==1) { SL=0xFB;SEG=num[M/10];Delay(500);
SL=0xF7;SEG=num[M%10]|0x80;Delay(500);
} SL=0xEF;SEG=num[S/10];Delay(500);
SL=0xDF;SEG=num[S%10];Delay(500);
}
/////////////////////
/*********秒表显示*************/
//////////////////////////
void Display1(unsigned char H,unsigned char M,unsigned char S)
{
SL=0xFE;SEG=num[H/10];Delay(500);
SL=0xFD;SEG=num[H%10]|0x80;Delay(500);
SL=0xFB;SEG=num[M/10];Delay(500);
SL=0xF7;SEG=num[M%10]|0x80;Delay(500);
SL=0xEF;SEG=num[S/10];Delay(500);
SL=0xDF;SEG=num[S%10];Delay(500);
}
void Timer0_Init(void)
{
}
void main()
{
unsigned char T; MiaoBiao = 1; TMOD = 0X01;//定时器0工作在方式1,16位定时器 TH0 = (65536 - 50000)/256;//设定定时器的定时时间 TL0 = (65536 - 50000)%256; TR0 = 1; ET0 = 1; EA = 1; //定时器开始运行 //定时器0中断允许 //总中断允许
Timer0_Init();
while(1)
{
if((TS == 0)&&(key2 == 0)){while(key2==0); T++;} if(T != 1){ if(MiaoBiao == 1) { Display(h,m,s);
} else Display1(h1,m1,s1); T=0;
}
else {SL=0xff;} }
void To_Int0(void)interrupt 1
{
count++;count1++; if(MiaoBiao == 1) //时钟操作 { switch(TS) { case 1: if(count%10==0){flag1 = ~flag1;} if(key2==0) { } break; if(key1==0) { } while(key1==0) Display(h,m,s); TS++; //去抖动 //“时”每秒跳动两次 while(key2==0)Display(h,m,s); h++;
if(count%10==0){flag2 = ~flag2;} if(key2==0) { while(key2==0)Display(h,m,s); //“分”每秒跳动两次
m++;
}
break;
case 3: flag1=1;flag2=1;TS=0;
break;
}
}
if(count == 20) //标准时钟
{
s++;
if(s == 60){m++;s=0;}
if(m == 60){h++;m=0;}
if(h == 24)h=0;
count = 0;
}
if(MiaoBiao == 0) //秒表操作
{
if(key1==0)
{
while(key1==0) Display(h1,m1,s1);
//返回正常显示 //去抖动
} switch(MS) { } case 1: s1++; kk=1;//此时秒表开始走 break; case 2: kk=0;//此时秒表暂停不走 h1=h1;m1=m1;s1=s1; MS=0; break; if(key3==0)//秒表清零 { } while(key3==0) Display(h1,m1,s1); //去抖动 h1=0;m1=0;s1=0;//秒表清零 MS=0;///////////////////清零停止显示标志位 if(s1==20) //秒表运算 { } m1++;s1=0; if(m1 == 60){h1++;m1=0;} if(h1 == 60)h1=0; count1 = 0;
}
} TH0 = (65536 - 50000)/256; TL0 = (65536 - 50000)%256;
结 束 语
通过本次课程设计较系统地掌握有关单片机控制的设计思想和设计方法,主要对AT89C52的结构、功能、内部资源等了解并对其进行测试和加以应用的知识得到学习。由于是在我们短学期实习之后才来始写的,我们实习做的是电子钟,所以对时钟有了一定的掌握。这个设计的首先查阅资料,在上网找资料的同时也学到了许多东西,找到了很多学习单片机的网站,里面的内容都比较适合我们初学者去学,有些网站还专门介绍这种单片机的类型、用法、功能等等。其实我们平时不懂就应该自己去学习去弄明白。我应该在自己以后的学习中,不仅要有刻苦努力,要有钻研精神,还要有创新,对自己感兴趣的一定要用心去学。
参考文献
[1]张鑫,华臻,陈书谦,《单片机原理及应用》,电子工业出版社,2005.8,第1次印刷
[2]、杨光友,朱宏辉,《单片微型计算机原理及接口技术》,水利水电出版社2002.9 ,第1 版,第3 次印刷
[3]、杨文龙,《单片机原理及应用》,西安电子科技大学出版社1993,6, 第1 版
[4]、夏路易,石宗义,《电路原理图与电路板设计教程》北京希望电子工业出版2002