秒表的设计1设计要求1.1 设计任务(1)实现计时范围00.00-99.99秒表(2)实现秒表精确到0.01秒(3)实现秒表的三个控制键;开启计时键,暂停键和复位键1.2 设计要求用单片机设计一个计时范围在00.00致99.99的秒表,秒表精确在0.01秒秒表有三个控制键分别是;秒表计时开启键,计时暂停键和秒表复位键。
1.3 方案论证方案一:用AT89C51作为主要芯片,采用排阻,并用汇编语言写程序,采用硬件消抖方案二:采用三极管驱动数码管,C语言编写程序,在编写程序时进行软件消抖相比之后方案二更简便,因为软件消抖更容易,C语言程序更容易懂,易修改,硬件电路更简单。
2 设计思想2.1 硬件设计思想数字电子秒表具有显示直观、读取方便、精度高等优点,在计时中广泛使用。
本设计用单片机组成数字电子秒表,力求结构简单、精度高为目标。
设计中包括硬件电路的设计和系统程序的设计。
其硬件电路主要有主控制器,计时与显示电路和回零、启动等。
主控制器采用单片机AT89C52,显示电路采用四位共阳极LED数码管显示计时时间。
由于本实验有四位数码管,如果采用静态显示要占用全部的I/O端口,所以本次试验采用静态显示,建立最小单片机系统,在AT89C51单片机的P2端通过三极管接上4位七段共阴极数码管,P2.0脚接第一位数码管片选端,P2.1脚接第二位数码管片选端,P2.2脚接第三位数码片选端,P2.3脚接第四位数码管片选端,这四位分别显示秒时间的十位,个位,小数点后一位,小数点后两位显示的片选控制端。
P2.4脚接小数点控制端。
秒表控制键盘。
用P3.0接键盘开启计时键,P3.1接键盘计时暂停键,P3.2接键盘计时复位键。
2.2 软件设计思想采用C语言编写程序,程序共有四部分;第一部分是主程序,用于对程序的中断控制、数据等的初始化,并且对秒表控制键盘的扫描。
第二部分时间产生程序,用定时/计数器0中断程序用时产生时间,利用每10m进入本中断程序一次第三部分4位七段共阴极数码管动态显示程序,用定时/计数1中断程序每50ms对数码管各扫描一次,是利用人眼视觉暂留实现数码管的显示。
第四部分动态扫描延时程序,用于在对数码管动态扫描时,每扫描一个数码管后的延时程序。
以实现四位数码时间同时显示的效果。
3 电路原理与电路图3.1 电路原理AT89C51单片机做为控制电路,用P1口做为数据输出端,P2口做为4位七段共阴极数码管的片选控制输出口,P3.0,P3.1,P3.2做为键盘接口。
时间显示器,由4位七段共阴极数码管构成。
3.2 电路原理图3.3 AT89C52单片机及其引脚说明AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
主要功能特性:•兼容MCS51指令系统• 8k可反复擦写(>1000次)Flash ROM• 32个双向I/O口• 256x8bit内部RAM• 3个16位可编程定时/计数器中断•时钟频率0-24MHz• 2个串行中断•可编程UART串行通道• 2个外部中断源•共6个中断源• 2个读写中断口线• 3级加密位•低功耗空闲和掉电模式•软件设置睡眠和唤醒功能3.4数码管显示系统电路3.41 数码管的介绍微机化测控系统中常用的测量数据的显示器有发光二极管显示器(简称LED或数码管)和液晶显示器(简称LCD)。
这两种显示器都具有线路简单、耗电少、成本低、寿命长等优点,本系统输出结果选用2个LED显示。
LED数码管的外形结构如图2-4,外部有10个引脚,其中3, 8脚为公共端也称位选端,其余8个引脚称为段选端,当要使某一位数码管显示某一数字((0-9中的一个)必须在这个数码管的段选端加上与数字显示数字对应的8位段选码(也称字形码),在位选端加上低电平即可。
LED有共阴极和共阳极两种。
如图2-4所示。
二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。
一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。
当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。
为了保护各段LED不被损坏,需外加限流电阻。
共阴极共阳极图 3.5 LED数码管结构原理图图3.6 LED数码管引脚图数码管显示器有两种工作方式,即静态显示方式和动态扫描显示方式。
为节省端口及降低功耗,本系统采用动态扫描显示方式。
动态扫描显示方式需要解决多位LED数码管的“段控”和“位控”问题,本电路的通过P1口实现:而每一位的公共端,即LED数码管的“位控”,则由P3口控制。
这种连接方式由于多位字段线连在一起,因此,要想显示不同的内容,必然要采取轮流显示的方式,即在某一瞬间,只让其中的某一位的字位线处于选通状态,其它各位的字位线处于断开状态,同时字段线上输出这一位相应要显示字符的字段码。
在这一瞬时,只有这一位在显示,其他几位则暗。
在本系统中,字位线的选通与否是通过PNP 三极管的导通与截止来控制,即三极管处于“开头”状态。
使用LED显示器时,要注意区分这两种不同的接法。
为了显示数字或字符,必须对数字或字符进行编码。
七段数码管加上一个小数点,共计8段。
因此为LED显示器提供的编码正好是一个字节。
TX实验板用共阴LED显示器,根据电路连接图显示16进制数的编码已列在下表。
表3.1 LED字形显示代码表字型共阳极段共阴极段字型共阳极段共阴极段0 C0H 3FH 9 90H 6FH1 F9H 06H A 88H 77H2 A4H 5BH B 83H 7CH3 B0H 4FH C C6H 39H4 99H 66H D A1H 5EH5 92H 6DH E 86H 79H6 82H 7DH F 84H 71H7 F8H 07H 空白FFH 00H8 80H 7FH P 8CH 73H3.4.2 四位数码管的介绍数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
四位数码管阳=阴极连接在一起,阳极分开有各自的位选,动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。
选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
4 系统程序的设计4.1主程序本设计中,计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。
其主程序执行流程见下图开始显示单元清0T0,T1设为16位计数器模式允许T0中断调用显示子程序y键按下?n调用整点报y进入功能程序图3.14.2显示子程序数码管显示的数据存放在内存单元70H-75H中。
其中70H-71H存放秒数据,72H-73H存放分数据,74H-75H存放时数据,每一地址单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出70H-75H某一地址中的数据,然后查得对应的显示用段码,并从P0口输出,P2口将对应的数码管选中供电,就能显示该地址单元的数据值。
为了显示小数点及“-”、“A”等特殊字符,在显示班级及计时时采用不同的显示子程序。
4.3定时器T0、T1中断服务程序定时器TO、T1用于时间计时,定时溢出中断周期可分别设为50ms和10ms.中断进入后,现判断是时钟计时还是秒表计时,时钟计时累计中断20次(即1s)时,对秒计数单元进行加1操作,秒表计时每10ms进行加1操作。
在计数单元中采用十进制BCD码计数,满60(秒表功能时有100)进位,T0中断服务程序执行流程见下图4.4程序清单#include<reg52.h>#define uint unsigned int ;定义变量类型#define uchar unsigned charsbit key1=P3^1; 定义按键接口sbit key2=P3^2;sbit DP=P1^7;uint bb,shu; 定义变量int aa=0;uchar table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,}; 寄存器地址定义void delay(uint z);延时程序void keyscan();键盘扫描程序void display(aa);显示程序void delay(uint z);延时子程序{uint x,y;for(x=20;x>0;x--);每20秒延时一次for(y=z;y>0;y--);}void keyscan();键盘扫描,采用循环嵌套{if(key1==0) 判断P1.0的电平,决定是否延时{delay(10);if(key1==0){shu=1;}while(!key1);}if(key2==0){delay(10);if(key2==0){shu=2;}while(!key2);}}void display(aa);显示子程序,输出到七段四位数码管{P1=~table[aa/1000];P2=0x7f;delay(15); 延时P2=0xff;P2=0xff;delay(1);P1=~table[aa/100%10];DP=0;P2=0xbf;delay(15);P2=0xff;P2=0xff;delay(1);P1=~table[aa%100/10];P2=0xdf;delay(15);P2=0xff;P2=0xff;delay(1);P1=~table[aa%10];P2=0xef;delay(15);P2=0xff;P2=0xff;delay(1);}void time0() interrupt 1 定时模块{TH0=(65536-10000)/256;TH0中断TL0=(65536-10000)%256;TL0中断aa++;if(aa>9999){aa=0;}}void main() 主程序{TMOD=0X01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;while(1){keyscan();if(shu==1){TR0=1;寄存器初始化shu=0;}if(shu==2){TR0=0;shu=0;}display(aa);}}5仿真结果仿真环境Proteus 是英国Labcenter公司开发的电路分析与实物仿真软件。