09郑樟杰项目二简易秒表.docx
《09郑樟杰项目二简易秒表.docx》由会员分享,可在线阅读,更多相关《09郑樟杰项目二简易秒表.docx(9页珍藏版)》请在冰豆网上搜索。
09郑樟杰项目二简易秒表
项目二简易秒表
一、设计要求
(1)1、使用单片机,设计秒表,能显示分分秒秒;
2、使用三个按键停止,开始,复位,其中“开始”按键当开关由上向下拨时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时;
3、使用液晶或数码管显示;
4、使用外部中断:
INT0开始,INT1停止
(2)、设计思路:
:
:
:
(1)整体程序主要分为3个部分:
主程序、显示子程序和定时器中断程序。
主程序主要是初始化部分和不断调用动态显示子程序部分。
动态显示子程序完成4位LED的轮流位扫描,它被主程序不断调用,以保证稳定可靠的显示。
显示时间的刷新由定时器中断产生,定时器每100ms中断一次,当中断10次后(即1s后),对时间单元(秒计数单元、分计数单元)进行更新,然后通过拆字子程序将时间单元里面的十六进制数拆开为两个BCD码,并送到显示缓冲区。
返回主程序后显示缓冲区的待显示数据被刷新一次,数码管相应的显示数值也就随之发生变化。
(2)用中断的编程思路使用定时器T0,定时器工作在定时方式,实现1秒定时,秒表计时显示用动态显示方式实现;通过键盘扫描方式取得KE0、KE1、KE2的键值,用键盘的中断处理程序实现秒表的启动、停止、清0等功能。
4位LED显示的位码由单片机的P2口输出,段码由P0口输出,P2口线与LED之间接有200Ω限流电阻;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等于50,说明1s到了,timecount清空,秒计数器加1;把当前的时间送到P0,P2口在数码管上显示。
判断TR0的值是否为0,若为0,这当前按键是开始,暂停或继续,若不为0,都要判断P3_4是否等于0,若等于0,计数值0,不等于0,退出中断,返回主函数,继续计数。
三、系统测试
(1).硬件调试
硬件调试可分为脱机调试与联机调试两步进行。
脱机调试是在用户系统未工作时的一种硬件检测。
第一步:
目测。
检查外部的各种元件或者是电路是否有断点。
目测结果:
电路及各元件正常。
第二步是通电检查。
通电后发现各个交通灯均能发光,证明电路线路无误。
联机调试:
将编好的程序写入单片机后进行调试。
(2).软件调试
通过PROTEUS仿真,我们的程序能够实现想要所有功能,包括显示到记时、外部中断功能。
在仿真时,应注意一下几个方面的问题:
1.proteus仿真和用wave软件生成的hex文件应保存在同一个文件夹里,否则程序不能正常执行
2.在运行proteus仿真图之前,必须先装载文件,要不然程序也无法正常运行。
3.在proteus仿真过程中,硬件复位电路可能会不能实现复位功能,这对实际的硬件电路没有影响,需要复位时直接将proteus软件复位即可。
4.由于我们的软件运行时在电脑上进行的,所以程序的精确度和电脑有关,在有些运行比较慢或者在电脑运行程序比较多的时候,计时会不准确,这种情况应当考虑。
5.程序在刚启动或者在暂停后继续运行的时候,反应比较慢,计时不准,不知道此问题在实际电路中会不会出现。
(3)1.打开STC
2.step1步骤SelseMCUType选择型号“STC12C5A60S2”,选择COM端口“COM3”
3.打开程序文件“.HEX”文件
4.点击Download/下载
(4)时间的误差的调试过程
若定时器为计数方式,操作方式为1,则计数器初值X0=216-t0×fosc/12。
式中fosc为振荡器的振荡频率。
t0为需要定时的时间,也为中断的间隔时间。
X0为定时器原计数初值。
在对定时器溢出中断与CPU响应中断时间误差进行补偿时,定时器的新计数初值X1为:
X1=216-t3×fosc/12
t3=t0+t1+t2
式中t0为中断间隔时间。
t1为定时器停止计数时间,该时间为定时器停止计数到重新启动计数之间所有程序指令周期数的总和。
t2为定时器溢出中断后,重新从OOH开始直至计数器停止时计的值。
在误差补偿中,若将定时器计数初值X1取代X0,则可使定时器下次的溢出中断与CPU响应中断实现同步。
附录源程序清单
#include
#defineuintunsignedint
#defineucharunsignedchar
codeucharduanma[10]={0xc0,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbitwe1=P1^0;
sbitwe2=P1^1;
sbitwe3=P1^2;
sbitwe4=P1^3;
sbitKey=P2^3;
sbitKey1=P3^3;
voiddisplay();
uchari,num;
voiddelay()
{
uinti=0,j=0;
for(;i<188;i++)
for(;j<100;j++);
}
voidmain()
TMOD=0x01;
TH0=0x3c;
TL0=0xaf;
ET0=1;EA=1;
TR0=1;
if(Key==0)
while
(1);
}
voidTO()
{
TMOD=0x01;
TH0=0xac;
TRO=0x00;
EX1=1;
EA=1;
while
(1)
}
voiddisplay()
{
we4=0;
P0=duanma[num%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=duanma[num/1000];
delay();
we1=1;
}
voidTOzhongduan(void)interrupt1
{
TH0=0x3c;
TL0=0xaf;
i++;
if(i==20)
{
i=0;
num++;
if(num==9999)num=0;
{if(Key==0)TR0=0;}
}
}
voidint0_int()interrupt0
{
TRO()
}