1、09郑樟杰项目二 简易秒表项目二 简易秒表一、设计要求(1)1、使用单片机,设计秒表,能显示分分秒秒;2、使用三个按键停止,开始,复位,其中“开始”按键当开关由上向下拨时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时;3、使用液晶或数码管显示;4、使用外部中断:INT0开始,INT1停止(2)、设计思路: (1)整体程序主要分为3个部分:主程序、显示子程序和定时器中断程序。主程序主要是初始化部分和不断调用动态显示子程序部分。动态显示子程序完成4位LED的轮流位扫描,它被主程序不断调用,以保证稳定可靠的显示。显示时
2、间的刷新由定时器中断产生,定时器每100 ms中断一次,当中断10次后(即1 s后),对时间单元(秒计数单元、分计数单元)进行更新,然后通过拆字子程序将时间单元里面的十六进制数拆开为两个BCD码,并送到显示缓冲区。返回主程序后显示缓冲区的待显示数据被刷新一次,数码管相应的显示数值也就随之发生变化。 (2)用中断的编程思路使用定时器T0,定时器工作在定时方式,实现1秒定时,秒表计时显示用动态显示方式实现;通过键盘扫描方式取得KE0、KE1、KE2的键值,用键盘的中断处理程序实现秒表的启动、停止、清0等功能。4位LED显示的位码由单片机的P2口输出,段码由P0口输出,P2口线与LED之间接有200
3、限流电阻;LED为共阳极数码管,显示方式为动态显示方式;3个按键可以采用独立式键盘,其中两个按键分别连接到外部中断INT0、INT1,第3个按键连接到定时器1的T1端口,以中断方式实现键盘的扫描。二、硬件电路设计 1、单片机最小系统2、数码管的电路3、按键电路三、软件设计1、流程图2、说明解释:程序从主函数开始,初始化端口,定时器赋初值TH0=3CH,TL0=AFH,设置成允许定时器中断,开始定时,若定时时间到50ms,定时器溢出,执行中断函数;计数值timecount0加1,若timecount0加到100,timecount0就清为0之后,timecount加1,若timecount0等于
4、50,说明1s到了,timecount清空,秒计数器加1;把当前的时间送到P0,P2口在数码管上显示。判断TR0的值是否为0,若为0,这当前按键是开始,暂停或继续,若不为0,都要判断P3_4是否等于0,若等于0,计数值0,不等于0,退出中断,返回主函数,继续计数。三、系统测试(1).硬件调试硬件调试可分为脱机调试与联机调试两步进行。脱机调试是在用户系统未工作时的一种硬件检测。第一步:目测。检查外部的各种元件或者是电路是否有断点。目测结果:电路及各元件正常。第二步是通电检查。通电后发现各个交通灯均能发光,证明电路线路无误。联机调试:将编好的程序写入单片机后进行调试。(2).软件调试通过PROTE
5、US仿真,我们的程序能够实现想要所有功能,包括显示到记时、外部中断功能。在仿真时,应注意一下几个方面的问题:1. proteus仿真和用wave软件生成的hex文件应保存在同一个文件夹里,否则程序不能正常执行 2. 在运行proteus仿真图之前,必须先装载文件,要不然程序也无法正常运行。 3. 在proteus仿真过程中,硬件复位电路可能会不能实现复位功能,这对实际的硬件电路没有影响,需要复位时直接将proteus软件复位即可。 4. 由于我们的软件运行时在电脑上进行的,所以程序的精确度和电脑有关,在有些运行比较慢或者在电脑运行程序比较多的时候,计时会不准确,这种情况应当考虑。 5. 程序在
6、刚启动或者在暂停后继续运行的时候,反应比较慢,计时不准,不知道此问题在实际电路中会不会出现。(3)1.打开STC2.step1 步骤Selse MCU Type选择型号“STC12C5A60S2”,选择COM 端口 “COM3”3.打开程序文件“.HEX”文件4.点击Download/下载(4)时间的误差的调试过程若定时器为计数方式,操作方式为1,则计数器初值X0=216-t0fosc/12。式中fosc为振荡器的振荡频率。t0为需要定时的时间,也为中断的间隔时间。X0为定时器原计数初值。在对定时器溢出中断与CPU响应中断时间误差进行补偿时,定时器的新计数初值X1为:X1=216-t3 fos
7、c/12 t3=t0+t1+t2式中t0为中断间隔时间。t1为定时器停止计数时间,该时间为定时器停止计数到重新启动计数之间所有程序指令周期数的总和。t2为定时器溢出中断后,重新从OOH开始直至计数器停止时计的值。在误差补偿中,若将定时器计数初值X1取代X0,则可使定时器下次的溢出中断与CPU响应中断实现同步。附录 源程序清单#include #define uint unsigned int#define uchar unsigned charcode uchar duanma10=0xc0,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; sbit we1=P
8、10;sbit we2=P11;sbit we3=P12;sbit we4=P13;sbit Key=P23;sbit Key1=P33;void display();uchar i,num; void delay()uint i=0,j=0;for(;i188;i+) for(;j100;j+); void main() TMOD=0x01;TH0=0x3c;TL0=0xaf;ET0=1;EA=1; TR0=1;if(Key=0) while(1);void TO() TMOD=0x01 ; TH0=0xac; TRO=0x00 ; EX1=1; EA=1; while(1) void di
9、splay()we4=0;P0=duanmanum%10;delay();we4=1;we3=0 ;P0=duanma(num%100)/10;delay();we3=1;we2=0 ;P0=duanma(num%1000)/100;delay();we2=1;we1=0;P0=duanmanum/1000;delay();we1=1;void TOzhongduan(void) interrupt 1TH0=0x3c;TL0=0xaf; i+;if(i=20) i=0; num+; if (num=9999) num=0; if (Key=0) TR0=0; void int0_int() interrupt 0 TRO()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1