河南理工大学《数字电子技术》设计报告四位数字秒表*名:***学号:************专业班级:光电12-2班指导老师:***所在学院:电气工程与自动化学院2015年1月8日摘要本设计是设计一个单片机控制的多功能秒表系统。
秒表虽然是一个简单的小工具,但是给我们的生活带来许多方便,体育比赛中秒表是必不可少的裁判工具。
其核心是基于单片机的控制部分和晶振共同组成加以软件编程得以实现。
本设计的多功能秒表系统采用A T89s52单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、电源电路、LED数码管以及按键电路来设计计时器。
将软、硬件有机地结合起来,使得系统能够正确地进行计数,并且结合相应的显示驱动程序,使数码管能够正确地显示时间,暂停和中断。
我们设计的秒表可以同时记录八个相对独立的时间,通过上翻下翻来查看这八个不同的计时值,可谓功能强大。
其中软件系统采用汇编语言编写程序,包括显示程序,计数程序,中断,延时程序,按键消抖程序等,硬件系统利用PROTEUS强大的功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。
关键字:单片机,多功能秒表目录1.概述1.1设计目的1.2 设计要求1.3 设计意义2.系统总体方案及硬件设计2.1系统总体方案2.2硬件设计2.2.1 A T89S52单片机2.2.2振荡电路2.2.3复位电路2.2.4按键电路2.2.5显示电路2.2.6系统电路图3.软件设计3.1设计特点3.2设计思路4.PROTEUS软件仿真5.课程设计体会1.概述1.1设计目的设计一个单片机控制的秒表系统。
利用单片机的定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及按键来设计秒表。
将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时具有开始/暂停,清零等功能。
1.2设计要求(1)共四位LED显示,显示时间为00:00~59.99(2)共3个按键,分别是开始/暂停,清零键;(3)能同时记录多个相对独立的时间并分别显示;1.3设计意义(1)通过本次课程设计可以使我们进一步熟悉和掌握单片机内部结构和工作原理,了解单片机应用系统设计的基本步骤和方法。
(2)通过设计一个简单的实际应用输入及显示模拟系统,掌握单片机仿真软件PROTEUS的使用方法。
(3)该实验通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零、功能。
该种秒表在现实生活中应用广泛,具有现实意义。
2 设计方案及原理数字电子秒表具有显示直观、读取方便、精度高等优点,在计时中广泛使用。
本系统采用C51系列单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合硬件电路如电源电路晶振电路、复位电路、显示电路以及一些按键电路等来设计计时器,将软、硬件有机地结合起来。
其中软件系统采用汇编语言编写程序,硬件系统利用PROTEUS强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。
其中显示电路采用3个LED数码管显示时间,计时范围设置为0~99.9秒,即精确到0.1秒,用按控制秒表的“开始”、“暂停”、“复位”,按“开始”按键,开始计时;按“暂停”按键,系统暂停计时;再按“开始”键,系统继续计时;数码管显示当前计时值;按“复位”按键,系统清零。
设计原理图如下:图1 设计原理图3 硬件设计本实验利用单片机的定时器/计数器定时和计数的原理,通过采用Proteus仿真软件来模拟实现。
模拟AT89s52单片机、LED数码管以及控件来控制秒表的计数以及计时的开启、暂停、继续、与复位。
其中有三个数码管来显示数据,两个数码管显示秒(两位),另一个数码管显示十分之一秒,十分之一秒的数码管计数从0~9,满十进一后显示秒得数码管的个位加一,并且十分之一秒显示清零重新从零计数。
同理当个位满十进一后个位也清零重新计数,当计时超过范围(即超过99.9秒)后,所有数码管全部清零重新计数。
单片机引脚图2.2.2晶体振荡电路89C51芯片内部有一个高增益反相放大器,用于构成振荡器。
引线XTAL1和XTAL2分别为反向放大器的输入和输出,两端跨接石英晶体及两个电容就可构成稳定的自激振荡器。
这里,我们选用51单片机12MHZ的内部振荡方式,电容器C1,C2起稳定振荡频率,并对振荡频率有微调作用,C1和C2可在20-100PF之间取值,这里取33P。
2.2.3 复位电路采用上电加按键复位电路,上电后,由于电容充电,使RST持续一段高电平时间。
当单片机已在运行之中时,按下复位键也能使RST持续一段时间的高电平,从而实现上电加按键复位的操作。
2.2.4显示电路显示电路既可以选用液晶显示器,也可以选用数码管显示。
我们采用的是数码管显示电路。
用四个共阴极LED显示,LED是七段式显示器,内部有7个条形发光二极管和1个小圆点发光二极管组成,根据各管的亮暗组合成字符。
在用数码管显示时,我们有静态和动态两种选择,静态显示程序简单,显示稳定,但是占用端口比较多;动态显示所使用的端口比较少,可以节省单片机的I/O口。
在设计中,我们采用LED动态显示,用P0口驱动显示。
由于P0口的输出级是开漏电路,用它驱动时需要外接上拉电阻才能输出高电平。
3.软件设计3/************************************************//**设计题目:数字秒表/**功能:可计时999.9s,两个按键。
/**说明:一个起停按键,一个清零按键。
当按下起停按键,/** 则开始计时,再按一下起停按键,暂停计时,若/** 再按一下起停按键,则又开始计时,如此变换操作,/** 直到99.9s,暂停在此时间。
/** 按下清零按键,计时归零,可重新计/************************************************/#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define PDATA P0 // 数码管的段码#define SCAN P2 // 数码管的位选sbit ss=P1^0; // 起停sbit clear=P1^1; // 清零uint cnt=0; // 用于时间计数uchar full=0; // 计满999.9s标志uchar sel=0; // 选择相应的数码管显示uchar s3=0; // 第3位计数值uchar s2=0; // 第2位计数值uchar s1=0; // 第1位计数值uchar s0=0; // 第0位计数值uchar segdata[4]={0x00,0x00,0x00,0x00}; // 四个数码管的数据uchar code select[4]={0xef,0xdf,0xbf,0x7f}; // 四个数码管的位选信号uchar code table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //0-70x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//8-f/*****************函数声明***********************/void init();void delay(uchar z);/*****************主函数*************************/void main(){init();while(1){if(ss==0) // 起停按键按下时{delay(20); // 延时20ms,跳过抖动时间,再判断if(ss==0) // 确实有按键按下TR0=~TR0; // 将TR0取反,实现每按一次,就开始计数或者暂停计数while(!ss); // 等待按键弹起}if(clear==0){delay(20);if(clear==0) // 当清零键按下时,把下面的各值都清零{cnt=0;full=0;s0=0;s1=0;s2=0;s3=0;TR0=0;}while(!clear); // 等待按键弹起}}}/*****************初始化函数***********************/void init(){TMOD=0x11; // 定时器0,1工作于方式1;赋初值TH0=(65536-10000)/256; // T0定时10ms,用于计时TL0=(65536-10000)%256;TH1=(65536-1000)/256; // T1定时1ms,用于数码管扫描TL1=(65536-1000)%256;EA=1;ET0=1;ET1=1;TR0=0; // 初始,秒表不工作TR1=1; // 时钟一开始工作}/*****************定时器0中断*************/void timer0_int() interrupt 1 // 秒表{TH0=(65536-10000)/256;TL0=(65536-10000)%256;cnt++;if((cnt==10)&&(full==0)) // 当cnt=10,说明计了100ms,则将计时的数据更新一下,放到数码管上显示{ // 只有当cnt=10,并且时间没计到999.9s 时,才往下执行cnt=0;s0++;if((s3==9)&&(s2==9)&&(s1==9)&&(s0==9))full=1;else if(s0==10){s0=0; // 毫秒级s1++;if(s1==10){s1=0; // 秒s2++;if(s2==10) // 分{s2=0;s3++;}}}}}/*************定时器1中断****************/void timer1_int() interrupt 3 // 扫描数码管{TH1=(65536-1000)/256;TL1=(65536-1000)%256;// SCAN=~0xff; // 仿真时用此SCAN=0xff; // 先关了所有的数码管,避免数码管有重影if(sel==1)PDATA=table[segdata[sel]]-0x80; // 当显示到第1个数码管时,显示计时的小数点elsePDATA=table[segdata[sel]]; // 否则是其它的数码管,则不显示小数点//SCAN=~select[sel]; // 仿真时用此SCAN=select[sel]; // 送出数据后,再打开对应的数码管sel++;if(sel==4) // 扫描完4个数码管后,又开始重新扫描(从右到左扫描)sel=0;segdata[0]=s0; // 将计时的值放到对应的显示位置segdata[1]=s1;segdata[2]=s2;segdata[3]=s3;}/*************延时函数****************/void delay(uchar z){int x,y;for(x=z;x>0;x--)for(y=120;y>0;y--); // 1ms 延时}4.PROTEUS软件仿真根据实验要求,本次课设基本完成了设计要求,由于秒表系统并不一定仅仅局限于计时,定时等功能,还可以进行多项的扩展,可以利用AT89C51强大的扩展功能,进一步丰富秒表的功能,例如可设定计时时间,倒计时等等众多功能。