51单片机秒表计时.docx
- 文档编号:5683593
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:10
- 大小:87.08KB
51单片机秒表计时.docx
《51单片机秒表计时.docx》由会员分享,可在线阅读,更多相关《51单片机秒表计时.docx(10页珍藏版)》请在冰点文库上搜索。
51单片机秒表计时
实验设计报告
设计题目:
51单片机外扩8155秒表计时
班级:
______计算机091班
姓名:
学号:
指导老师:
日期:
51单片机秒表计时
一、设计目的
(1)利用单片机定时器中断和定时器计数方式实现秒定时。
(2)通过LED显示程序的调整,熟悉单片机与LED的接口技术,熟悉LED动态显示的控制过程。
(3)掌握8155芯片的用法及口地址的计算方法。
(3)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示和定时器中断等多种功能的综合程序。
(4)进一步学习单片机开发系统的整个流程。
二、设计任务
首先以89C51单片机的原理图为背景,利用51单片机的P0、P2口外扩一片8155芯片。
将6个共阳极数码管的断码用8155的B口控制,位码用8155的A口控制。
其次,用51单片机的P30、P31接两个独立的按键。
最后用keilC编写软件,驱动各个外围设备。
三、设计需求
利用STC-89C52单片机作为系统核心控制部分,用外围6个数码管、两个独立按键实习秒表计时的功能。
当接P30的按键按下时,秒表开始计时,当接P30的按键打开时暂停,当接P31的按键按下时数码管清零。
四、设计材料
序号
器件
数量
功能
1
STC-89C52单片机最小系统板
1
核心
2
8155芯片
1
外扩I/O口
3
共阳极数码管
6
计时
4
开关
2
控制数码管的计
时与暂停
内容要求
一、题目分析,功能要求。
(1)要求:
利用实训电路板,用6个共阳极数码管实现秒表计时显示。
以一个按键开关实现启动、停止,另一个实现清零功能。
(2)方法:
用单片机定时器T0中断方式,实现100毫秒定时;利用单片机定时器0方式1计数。
(3)实验线路分析:
采用实训电路板,其原理图参见附录。
6个7段LED数码管分别由8155的A口和B口控制,使数码管显示00-00-00的字样。
用一个开关控制数码管的启动与停止,另外一个实现清零。
另外再加上一个晶振电路就够成了整个秒表的电路。
(4)软件设计:
软件整体设计思路是主程序进行初始化,以开关的闭合与打开判断秒表是否开始计时,LED通过定时计算器中断的方式进行显示。
当开关闭合,定时器开始计时,并在数码管上显示。
当开关打开,定时器停止工作并在数码管上继续显示前一时刻的时间。
当另外一个开关闭合时,数码管清零。
二、总体方案设计
三、硬件设计
电路图如下所示
Protues仿真:
四、软件设计
#include
#include
#defineA8155XBYTE[0XFE21]
#defineB8155XBYTE[0XFE22]
#defineC8155XBYTE[0XFE23]
#defineK8155XBYTE[0XFE20]
sbitp30=P3^0;
sbitp31=P3^1;
charcodeshow[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};
charshowdata[6]={0xC0,0xbf,0xC0,0xC0,0xbf,0xC0};
charshowdata_0[6]={0xC0,0xbf,0xC0,0xC0,0xbf,0xC0};
intt,i,j;
intflag=0,count=0,fen=0;
voiddelay(intms);
voidstart();
voidpasue();
voidclear();
voidmain()
{
TMOD=0x01;
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
EA=1;
ET0=1;
TR0=1;
P=0xff;
K8155=0x03;
while(p31==1)
{
A8155=0x01;
if(p30==0&&p31==1)
{
start();
}
elseif(p30==1&&p31==1)
{
pasue();
}
elseif(p30==1&&p31==0)
{
clear();
}
}
}
voidpasue()
{
for(i=0;i<6;i++)
{
B8155=showdata[i];
delay(5);
A8155=A8155<<1;
if(A8155==0x40)
{
A8155=0x01;
}
}
}
voidclear()
{
for(i=0;i<6;i++)
{
B8155=showdata_0[i];
delay(5);
A8155=A8155<<1;
if(A8155==0x40)
{
A8155=0x01;
}
}
}
voidstart()
{t=0;
while(t<=2)
{
for(i=0;i<6;i++)
{
B8155=showdata[i];
delay(5);
A8155=A8155<<1;
if(A8155==0x40)
{
A8155=0x01;
}
}
if(t==2)
{
flag++;
if(flag<=9)
{
showdata[0]=show[flag];
}
else
{
flag=0;
count++;
if(count<=60)
{
showdata[2]=show[count%10];
showdata[3]=show[count/10];
}
else
{
fen++;
count=0;
showdata[5]=show[fen];
}
}
}
}
}
voiddelay(intms)
{
intj,i;
for(j=0;j { for(i=0;i<100;i++); } } voidtime0_int(void)interrupt1 { TL0=(65536-50000)%256;// TH0=(65536-50000)/256; t++; } 五、系统集成及测试 调试程序 (1)调试主程序。 主程序运行后,在无任何按键输入时观察有无显示,时钟是否工作,其时、分、秒显示的变化过程是否正确。 若运行结果不正确,首先应根据程序运行的实际现象分析判断哪些因素可引起相关故障,再通过调试方法逐一认证和排除。 例如: 若定时/计数器的初始化出错,则时钟将不能工作;若显示程序出错,则将不能正确显示时钟单元内容;若定时/计数器中断服务子程序出错,则其显示数据的变化规律将不正常。 (2)调试子程序。 在调试主程序时,必然要调用相关的功能子程序。 因此,首先应明确子程序的具体功能,通过对子程序的分析,确定子程序的入口、出口参数及相关标识位的状态,然后在满足入口条件的状态下,设法检查从主程序进入子程序,再由子程序返回到主程序的运行过程。 可采用跟踪运行或运行至光标处的方法,检查从主程序进入子程序内部的运行过程,再通过单步运行等方法检查子程序内部的运行情况和返回主程序的过程。 通过反复调试,发现并排除软件与硬件存在的各类问题,以满足系统设计的预期目的。 六、总结 通过本次秒表的实验,各方面又得到了进一步的提高。 从整个单片机开发系统的把握上,感觉比以前更具有信心,当然,在焊接、调试的时候也显得更轻松,至少知道从哪些地方入手,怎样判断正确与否。 尤其是在调试大型程序时,需先根据要求划分模块,优化结构;再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用;再根据各模块性质和功能将各模块细化,设计出程序流程图;最后才根据各模块流程图编制具体程序。 调试时应先调主程序,实现最基本最主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。 总的来说,还有很多的不足之处,要在以后的实践中慢慢完善,不断的提高这方面的能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 秒表 计时