单片机设计秒表报告Word下载.docx
《单片机设计秒表报告Word下载.docx》由会员分享,可在线阅读,更多相关《单片机设计秒表报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
3.3.1共阴极数码管原理图以及四位数码管引脚图6
3.3.2红绿灯模拟仿真电路6
3.3.351单片机主控实物图以及原理图6
4.软件设计6
4.1软件功能设计6
4.2软件流程设计7
4.2.1主流程图8
4.2.2按键判断9
4.2.3数码管显时10
5.软件调试10
5.1单元调试10
5.1.1显示模块测试10
5.1.2按键模块测试11
5.2总体测试11
6.心得体会11
7.参考文献12
附录113
附录226
顺计时秒表以及倒计时秒表设计
1摘要
(1)近年来随着科技的飞速发展,单片机的应用正在不断的走向深入,同时带动着传统控制检测日新月异更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面的知识是不够的,还要根据具体的硬件结构,以及针对具体的应用对象的软件结合,加以完善。
(2)人们在日常生活中,有很多时候要精确地计算时间,但往往因为人为因素造成人们不愿意看到的误差。
秒表的出现,解决了传统的由于人为因素造成的误差和不公平性。
。
(3)本次设计主要完成具备基本功能的电子秒表的理论和实践设计,电子秒表是重要的记时工具,广泛运用于各行各业中。
作为一种测量工具,电子秒表相对其它一般的记时工具具有便捷、准确、可比性高等优点。
不仅可以提高精确度,而且可以大大减轻操作人员的负担,降低错误率。
因此电子秒表常常用于体育竞赛及各种其他要求有较精确时间的各领域中。
其中开启、停止按键的使用方法与传统的机械计时器相同,即按一下开启按键,启动计时器开始计时,按一下停止按键计时终止。
而复位按键可以在任何情况下使用,即使在计时过程中,只要按一下复位按键,计时应立即终止,并对计时器清零。
(4)在有些时刻会涉及到倒计时的功能,比如在10S内要完成什么任务,这就要用到一定时间的定时器,这里为秒表增加了一个倒计时的功能手动设置初值,然后开始倒计时,大大增加了这个设计的实用性。
1.1课程设计制作题目及要求
用AT89S52单片机设计顺计时和倒计时功能的电子秒表。
要求:
用四位数码管显示时间,最高位显示分,精确到0.1S,启动按键、暂停按键、清零按键按键,采用单片机内部定时器方式计时。
(1)顺计时秒表:
在系统开始运行之后,按键四控制定时器的开启,如果系统没有进入倒计时模式,则按下按键四直接开始秒表计时,计时最大长度为9分59秒。
(2)暂停、继续计时:
在顺计时或倒计时过程中,按键三可以控制定时器的暂停,这样可以起到暂停计时的作用,再次按下这个按键,又重新启动定时器,继续上一次的时间开始计时。
(3)倒计时:
在系统刚开始通电时,如果给系统赋值,则系统自动进入倒计时模式,在设置完初值过后,按下按键四开启定时器,开始计时。
(4)复位按键在任何时间都可以起到清零的作用。
2.系统方案设计
2.1设计思路
通过设置模式倒计时还是顺计时两种,分别进去两种模式,这个模式切换可以通过按键来控制,秒表的时间显示我们用4位数码管,这样既容易操作,也容易理解,在秒表运行的过程中吗,还可以通过按键来进行中断,使秒表暂停或者继续计时。
在秒表设计中,时间的精准度是设计的一大要素,所以设计的时间控制用AT89s52的定时器进行,设定定时器初值为46080,(由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断),记录20次中断标志为1s,同时用IO口的电平转换来检测按键,来判断相应的功能。
用数码管显示时刻相应的时间。
2.2总体设计框图
3.硬件设计
3.1硬件选型
单片机特点:
(1)高集成度,体积小,高可靠性单片机将各功能部件集成在一块晶体芯片上,集成度很高,体积自然也是最小的。
芯片本身是按工业测控环境要求设计的,内部布线很短,其抗工业噪音性能优于一般通用的CPU。
单片机程序指令,常数及表格等固化在ROM中不易破坏,许多信号通道均在一个芯片内,故可靠性高。
(2)控制功能强为了满足对对象的控制要求,单片机的指令系统均有极丰富的条件:
分支转移能力,I/O口的逻辑操作及位处理能力,非常适用于专门的控制功能。
(3)低电压,低功耗,便于生产便携式产品为了满足广泛使用于便携式系统,许多单片机内的工作电压仅为1.8V~3.6V,而工作电流仅为数百微安。
(4)易扩展片内具有计算机正常运行所必需的部件。
芯片外部有许多供扩展用的三总线及并行、串行输入/输出管脚,很容易构成各种规模的计算机应用系统。
(5)优异的性能价格比单片机的性能极高。
为了提高速度和运行效率,单片机已开始使用RISC流水线和DSP等技术。
单片机的寻址能力也已突破64KB的限制,有的已可达到1MB和16MB,片内的ROM容量可达62MB,RAM容量则可达2MB。
由于单片机的广泛使用,因而销量极大,各大公司的商业竞争更使其价格十分低廉,其性能价格比极高。
数字逻辑电路特点:
用数字电路逻辑器件组成控制电路,这样原理简单清楚,但是调节起来很复杂,需要更改电路结构。
根据设计要求及设计的需要我采用单片机来作为控制手段,选用AT89S52单片机作为该课程设计的核心来对数字信息进行处理及储存。
它是一个低电压,高性能的CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口,AT89S52可以按照常规方法进行编程,也可以在线编程。
3.2系统硬件电路原理详图
3.2.1复位电路原理图以及时钟电路原理图
3.3实际连线详图
3.3.1共阴极数码管原理图以及四位数码管引脚图
3.3.2红绿灯模拟仿真电路
3.3.351单片机主控实物图以及原理图
4.软件设计
4.1软件功能设计
利用单片机的定时器产生准确的时钟信号,从而进行时间控制,控制十字路口的红、黄、绿灯交替亮灭。
并且使用共阴极四位LED数码管,时刻显示当前路口的红灯或者绿灯还将持续的时间。
两个方向的通行时间可用按键进行设置,可以控制路口的红绿灯的持续时间,这样模拟现实中的不同时间段,车流量不同而智能控制时间,这样更加合理的控制路口的通行,提高道路的通行效率,系统的启停和复位也由按键控制。
4.2软件流程设计
4.2.1主流程图
4.2.2按键判断
4.2.3数码管显时
5.软件调试
5.1单元调试
5.1.1显示模块测试
首先在硬件电路上按照要求连接数码管,然后由单片机控制,看能否控制数码管显示任何组合,测试通过则开始调试红绿灯程序代码,不通过则检查问题,硬件问题或者软件问题。
最后在中断完成扫描一次数码管,看数码管的显示是否良好,消隐是否消彻底,测试完成后,确认无误则进行下一步测试。
5.1.2按键模块测试
在按键接入电路之后,用万用表的测试通断档检测每个按键按下时,按键是否接通如果接通,则按键电路硬件无误,在软件程序里面测试,每个检测按键的程序都延时一小段时间在检测按键情况,如果按键情况不变,则判断执行按键程序,如若延时后按键情况消失,则判断为系统的电源抖动,不予处理。
5.2总体测试
在程序搭建完成之后,结合硬件进行最后的测试,用按键控制时间加减,然后观察程序的BUG,做多种尝试,尽量消除完程序存在的BUG,比如时间如果减为0,或者时间加到数码管显示的最大值之后怎么处理,都是我们程序里面要考虑到的问题,然后检测中断程序控制的时间与实际时间的差距,尽量调整时间没有差距,这也是程序控制与实际的结合,达到误差标准之后,然后运行程序,要求时间持续时间长,如果出现问题,那么就要分析问题原因,是硬件问题还是软件BUG,将问题处理完之后,作品完成。
6.心得体会
在调试的过程中,遇到很多问题,第一、不够细心比如由于粗心大意焊错了线,由于对单片机理论的不熟悉导致编程出现错误。
第二,是在学习态度上,这次课设是对我的学习态度的一次检验。
对于这次单片机综合课程实习,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。
我们这次实习所遇到的多半问题多数都是由于我们不够严谨。
第三,在做人上,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。
在这次难得的课程设计过程中我锻炼了自己的思考能力和动手能力。
通过题目选择和设计电路的过程中,加强了我思考问题的完整性和实际生活联系的可行性。
在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。
还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。
并且我们熟练掌握了有关器件的性能及测试方法。
再次感谢老师的辅导以及同学的帮助,是他们让我有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。
课程设计时间虽然很短,但我学习了很多的东西,使我眼界打开,感受颇深。
7.参考文献
[1]周伟,淮阴师范学院,数学科学学院,《c语言程序设计》课程教学研究,维普期刊资源整合服务平台。
[2]谭浩强,《c语言程序设计》(第四版),清华大学出版社,北京,2010年。
[3]郭天祥.十天学会单片机。
附录1
《C语言源程序代码》
#include<
reg52.h>
intrins.h>
#defineuintunsignedint//宏定义
#defineucharunsignedchar//宏定义
sbitK1=P1^0;
//定义按键1为加时间
sbitK2=P1^1;
//定义按键2为减时间
sbitK3=P1^2;
//定义按键3为暂停时间
sbitK4=P1^3;
//定义按键4为开始计时
ucharcodewetable[]={0xf7,0xfb,0xfd,0xfe};
//数码管位选0xfe,0xfd,0xfb,0xf7
//共阳极数码管0xef,0xdf,0xbf,0x7f
ucharcodedutable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};
//数码管段选
//共阳极数码管0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
ucharcodedutable1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xBF};
//数码管段选-加点
uintclosedu,closewe,ge,count,doucount,dounum,shi,shi1,ge1,doucount,dounum1;
//定义大变量
ucharwenum,num1,num=0,doufirst=0,fen=0,doufirst1=0;
//定义小变量
voiddelay(uintz);
//微小延时函数函数声明
voidinit();
//定时器初始化函数声明
voiddisplay(uintfen,uintshi,uintge,uintdoufrist);
//显示函数声明
voiddisplay1(uintfen,uintshi1,uintge1,uintdoufrist1);
voidmain()//主函数
{
P1=0xFF;
//P1口清零(段选口)
while
(1)
{
if(K1==0)//按键1按下
{
delay(500);
//延时消抖
if(K1==0)//确认按键1按下
{
num1++;
//秒时间加1
if(num1==60)//按键设定时间是秒数不能大于60,
num1=0;
fen++;
if(fen>
9)//按键设定时间是分钟数不能大于9
{
fen=0;
}
}
shi1=num1/10;
ge1=num1%10;
delay(500);
}
if(K2==0)
if(K2==0)
{
num1--;
//秒时间减1
if(num1<
=0)//按键设定时间是秒数不能小于0,
num1=60;
if(fen<
=0)//按键设定时间是分钟数不能小于0
{
fen=10;
}
fen--;
}
delay(500);
if(K4==0)
if(K4==0)
init();
while
(1)
if(num1!
=0)
{
while
(1)
if(K3==0)//一边计时,一边判断暂停是否按下
delay(1000);
if(K3==0)//确认暂停是否按下
EA=0;
//关闭中使能端
display1(fen,shi1,ge1,doufirst1);
//显示暂停时的值
if(K3==0)
EA=1;
if(K3==0)//一边计时,一边判断暂停是否按下
//num=shi*10+ge;
}
display1(fen,shi1,ge1,doufirst1);
//显示秒表计数时的值
elseif(num1==0)
if(K3==0)//一边计时,一边判断暂停是否按下
display(fen,shi,ge,doufirst);
//num=shi*10+ge;
display(fen,shi,ge,doufirst);
display1(fen,shi1,ge1,doufirst1);
//显示手动加减初始值时的值
}
}
voidinit()//初始化函数
dounum=0;
doucount=0;
count=0;
wenum=0;
//各个变量赋初值
closedu=0xff;
closewe=0xff;
P2=closewe;
//关闭位选
P3=closedu;
//关闭段选
TMOD=0x01;
TH0=(65536-46080)/256;
//由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;
//46080的来历,为50000*11.0592/12
EA=1;
//打开总中段
ET0=1;
TR0=1;
voiddelay(uintz)//延时1ms函数
uintx,y;
for(x=z;
x>
0;
x--)
for(y=0;
y<
11;
y++)
}
voiddisplay(uintfen,uintshi,uintge,uintdoufrist)//显示函数
wenum=3;
P2=wetable[wenum];
//选中第一个数码管
P3=dutable[doufirst];
//给上分秒值
delay(10);
//P3=closedu;
wenum--;
//选中第一个数码管
P3=dutable1[ge];
//给上秒值个位
P3=dutable[shi];
//给上分秒值十位
P3=dutable1[fen];
//给上分值
voiddisplay1(uintfen,uintshi1,uintge1,uintdoufrist1)//显示秒表倒函数
P3=dutable[10];
P3=dutable1[ge1];
P3=dutable[shi1];
P3=dutable1[10];
voidtime0()interrupt1
count++;
doucount++;
if(count==20)//1S钟数值加1
count=0;
num++;
num1--;
if(num>
59)
num=0;
if(num1==0)
num1=60;
fen--;
shi=num/10;
ge=num%10;
ge1=nu