秒表系统设计.docx
《秒表系统设计.docx》由会员分享,可在线阅读,更多相关《秒表系统设计.docx(20页珍藏版)》请在冰豆网上搜索。
![秒表系统设计.docx](https://file1.bdocx.com/fileroot1/2023-2/4/4c4d6c8b-d95c-4ddd-8b69-76bf529cbccf/4c4d6c8b-d95c-4ddd-8b69-76bf529cbccf1.gif)
秒表系统设计
电气信息学院
单片机技术课程设计报告
课题名称秒表系统的设计
专业班级09电气班
学号
学生姓名
指导教师易先军
评分
2012年6月12日至6月19日
课程设计量化评分标准
指标
分值
评分要素
得分
方案设计
20
方案选择合理,分析、设计正确,原理清楚,电路、程序流程图清晰,结构合理,程序简洁、正确。
设计报告
20
报告结构严谨,逻辑严密,论述层次清晰,语言流畅,表达准确,重点突出,报告完全符合规范化要求,用计算机打印成文。
调试与结果
20
过程清晰,调试方案设计合理,测试点选择适当,程序编写正确,调试步骤清楚。
电路及程序运行结果正确,达到预期效果。
工作态度
20
工作量饱满程度,题目难度;工作态度,按时完成设计任务,是否独立完成等。
答辩成绩
20
思路清晰;语言表达准确,概念清楚,论点正确;分析归纳合理,结论严谨;回答问题有理论根据,基本概念清楚。
总评成绩
指导老师评语:
答辩记录
1、例举设计过程中遇到的问题及其解决方法(至少两例)。
答:
(1)问题说明:
解决方法:
(2)问题说明:
解决方法:
2、教师现场提的问题记录在此(不少于2个问题)。
答:
摘要
近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。
本文阐述了基于单片机的数字电子秒表设计。
本设计主要特点是计时精度达到0.01s,解决了传统的由于计时精度不够造成的误差和不公平性,是各种体育竞赛的必备设备之一。
本设计的数字电子秒表系统采用8051单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计计时器。
将软、硬件有机地结合起来,使得系统能够实现五位LED显示,显示时间为0~99.9秒,计时精度为0.1秒。
关键字:
单片机;数字电子秒表;仿真
Abstract
Withtherapiddevelopmentofscienceandtechnologyinrecentyears,SCMapplicationsareconstant-depthmanner.Inthispaper,basedonsinglechipdesignofdigitalelectronicstopwatch.Themaincharacteristicsofthisdesigntimingaccuracyof0.1s,tosolvethetraditionalresultofalackaccuracyduetotimingerrorsandunfair,andisavarietyofsportscompetitions,oneoftheessentialequipment.InadditionthehardwarepartofthesetViewbuttononthestopwatchcanbethelasttimetosavetimeforuserqueries.
Thedesignofthemulti-functionstopwatchsystemusesSTC89C52microcontrollerasthecentraldevice,anduseitstimercountertimingandthecountprinciples,combinedwithdisplaycircuit,LEDdigitaltube,aswellastheexternalinterruptcircuittodesignatimer.Thesoftwareandhardwaretogetherorganically,allowingthesystemtoachievetwoLEDdisplayshowsthetimefrom0to99.9seconds,Timingaccuracyof0.1seconds.
Keyword:
LEDdisplay;High-precisionstopwatch;8051
1设计任务
1.实物参见下图,设计一个精度为0.1s的秒表系统。
2.设计,启动按钮、暂停按钮及清零按钮。
3.设计每到一秒钟有声音提醒功能,可通过按钮打开及关闭该提醒音。
2设计方案
2.1任务分析
这个课程设计是通过设计三个开关通过单片机控制液晶显像管的数字显示,从而做到每0.1秒显示个数字,而达到秒表的功能。
使用三个按键停止,开始,清零,其中“开始”按键当开关由上向下拨时开始计时,此时若再拨“暂停”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时,使用定时器中断。
2.2方案设计
1.硬件方案
根据设计的要求可知,系统的硬件原理框图如图2.1所示。
图2.1系统的硬件原理框图
单片机可选用AT89C51,它与8051系列单片机全兼容,但其内部带有4KB的FLASHROM,设计时无需外接程序存储器,为设计和调试带来极大的方便。
同时使用液晶显示屏使得接线简单明了,非常易于分析。
定时器中断产生为50ms的时间。
2.软件方案
根据设计要求,程序框图如图2.2所示。
主函数
声音提示
显示数值
图2.2主程序流程图
软件由C语言完成,软件设计可以分为以下几个功能模块:
主程序:
完成程序中断,清零。
计时程序模块:
为定时器的中断服务子程序,完成0.1秒。
显示程序模块:
是显示最下0.1s的时间。
3系统硬件设计
3.1时钟电路设计
图3.1单片机时钟电路
如图3.1所示,采用内部时钟产生方式,在XTAL1和XTAL2两端跨接晶体或陶瓷振荡器,与内部反相器构成稳定的自击震荡。
其发出的时钟脉冲直接送入片内定时控制部件。
3.2复位电路设计
如图3.2所示,采用上电+按钮电平复位方式,当按下按钮时,RST管脚高电平触发。
为保证复位可靠,RC时间常数应大于两个机器周期,电容取33uf,电阻取200欧。
图3.2单片机复位电路
3.3显示电路设计
如图3.4所示,是液晶显示电路的接线方法,P2.0到P2.7接D0到D7,VDD接高电平,VEE接下拉电阻,VSS接地,RS接P1.7,RW接地,E接P1.6。
这样连接使得LCD能显示小数点后一位的数字。
图3.3液晶显示电路
3.4嗡鸣电路设计
3.4嗡鸣电路图
当计时到达一秒时,P1.0段给出一个脉冲,使得形成通路,从而使嗡鸣电路开始工作。
3.5按键控制电路设计
3.5按键输入电路图
如图3.5所示,开关控制由三个连接到单片机的控制按钮组成。
通过软件编程,按下start开关开始计时工作,显示的最小精度为0.1秒,在按start按钮,系统暂停,按下stop系统停止运行,按下clear按键,显示屏上的数字清零。
4系统软件设计
4.10.1S定时和1S定时
以在系统中要实现准确的0.1s和1s定时。
采用89C51内部的定时/计数器T0,工作在方式1,定时时间计算公式为:
zΣ(216-计数初值)×晶振周期x12或扛(2-6-计数初值)×机器周期其最大定时时间为131ms,离0.ls还差很远。
因此.把秒计时用硬件和软件计数相结合的方法实现。
即把定时器的定时时间定为50ms,这样计数溢出2次就可得到0.1S.在中断中计数,进入一次加1,达到2次,便是0.1s.
用定时器T1计数,初值与T0一致,计数20次,便是1s.
4.2定时程序流程
(1)T0定时主程序流程定时主程序的主要功能是进行定时器,计数器的初始化编程,然后通过反复调用显示子程序的方法,等待0.1s定时中断的到来。
(2)T1定时器主程序没经过1s产生一个脉冲信号。
4.3秒表系统T0流程图
系统的程序结构流程图如图4.1所示。
系统软件中,使用了一个定时器(T0)资源产生秒信号。
系统在上电或复位后进入系统初始化。
图4.3定时器0中断处理流程图
4.4定时器1及中断响应
图4.2定时器0中断处理流程图
5仿真与性能分析
1、系统仿真过程
图5.1xxxx图
2仿真结果与分析
当点击仿真按钮,lcd1602显示0000.0。
按下“start”键,,lcd1602显示开始计时,精确到0.1s。
并每1s伴随响声。
按下“stop”键,lcd1602显示数值停止计数。
响声也停止。
按下“clear”键,lcd1602显示数值呗清零。
图5.2系统仿真结果
6心得体会
做了两周的课程设计,让人感受颇深,有关于单片机知识的,但更多是团队和合作。
我们小组一共3个人,人多,分工就显得很重要,在我们的集体的讨论之下,我得到了设计硬件电路和总体调试的任务,当时让我感到很有压力。
因为我们平时接触的都是纯粹理论的东西,做实验也是雾里看花,对硬件的认识是很缺乏的。
通过7天的努力,我们小组终于完成了单片机的课程设计。
我觉得作为一名自动化专业的学生,单片机的课程设计是很有意义的。
更重要的是如何把自己平时所学的东西应用到实际中。
虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的帮助和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。
我认为这个收获应该说是相当大的。
一开始我们从参考书上找来了课题,但是毕竟是参考书,做到后来发现很多程序都是不完整的,这让我们伤透了脑筋。
看着别的小组都弄得有模有样了,可是我们连一个课题都还没有定好。
好不容易又找到了课题,可是结果还是很不尽人意。
程序接线什么的都弄好了,调试也没有问题,可是就是无法达到预期想要的结果。
眼看2个礼拜就快结束了,别的小组都准备要答辩了。
无奈下我们不得不第三次改了课题。
参考书毕竟只是一个参考,设计这种东西最后还是要靠自己动脑筋。
然后我们大家一起齐心协力,从平时做的实验﹑老师上课的举例﹑书本上的知识以及老师的辅导和其他同学的帮助下终于完成了。
应该说这是通过我们小组成员的共同努力和动脑完成的,虽然内容并不是很复杂,但是我们觉得设计的过程相当重要,学到了很多,收获了很多。
我觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。
小组人员的配合﹑相处,以及自身的动脑和努力,都是以后工作中需要的。
所以我认为这次的课程设计意义很深,和其他4位同学的共同学习﹑配合﹑努力的过程也很愉快,另外还要感谢老师的耐心辅导。
很感谢学校和老师给我们安排了这次课程设计,让我真正感受到的是合作的重要,许多时候都是组员的讨论,老师的指导中的一句半句启发了我,就出现的让人欣喜的结果;理论知识同样很重要,有些问题都是由于基础知识掌握不好才出现的。
参考文献
[1]郑毛祥.单片机应用基础.人民邮电出版社,2006.6:
21-42
[2]李邓化,彭书华,许晓飞.智能检测技术及仪表.科学出版社,2007:
194-201
[3]戴佳.单片机C51语言应用程序设计.电子工业出版社,2006.7:
168-169
[4]朱民雄.计算机语言技术.北京航空航天大学出版社,2002.1:
103-105
[5]李鸿.单片机原理及应用.湖南大学出版社.2004:
8:
72-73
[6]刘建清.单片机技术.国防工业出版社,2006.8:
104-105
[7]杨宁,胡学军.单片机与控制技术.北京航空航天大学出版社,2005-03:
306-322
[8]马忠梅等.单片机C语言应用程序设计.北京航空航天大学出版社,1997:
201-211
[9]KaiE,SawataS,LkebukuroKetal.DetectionofPCRproductinsolutionusingsurfaceplasmonresonance.AnalyticalChemistry,1999.7.1:
796~800
附录1程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]="0123456789";//定义数组
uintu=0,v,w,x,y,z;
sbitlcden=P1^6;//lcd1602的位定义
sbitlcdrs=P1^7;
sbitbeep=P1^0;//蜂鸣器的位定义
sbitkey_start=P1^1;//位定义开始按钮
sbitkey_stop=P1^2;//位定义停止按钮
sbitkey_clear=P1^3;//位定义清零按钮
voiddelay(uint);//声明延时函数
voidinit();//申明lcd1602的初始化函数
voidwrite_com(uchar);//写指令
voidwrite_data(uchar);//写数据
voidkey_scan();//申明按键扫描函数
/*********************主函数**********************/
voidmain()
{
beep=0;//防止上电瞬间P1.0口默认高电平,蜂鸣器接通发声
init();//初始化lcd1602
TMOD=0X11;//T0,方式1;T1,方式1
TH0=0X3C;//T0,T1均装初值50ms
TL0=0XB0;
TH1=0X3C;
TL1=0XB0;
EA=1;//开总中断
ET0=1;//开定时器0
//TR0=1;//启动定时器1
ET1=1;//开定时器1
while
(1)
{
key_scan();//按键扫描是否有按键按下
write_com(0x80);//定位在lcd1602上的显示位置
write_data(table[v]);//写千位
delay(5);
write_data(table[w]);//写百位
delay(5);
write_data(table[x]);//写十位
delay(5);
write_data(table[y]);//写个位
delay(5);
write_data('.');//写小数点
delay(5);
write_data(table[z]);//写十分位
delay(5);
write_data('s');
}
}
/**********************************************/
voiddelay(uintms)//ms延时函数
{
uchari;
while(ms--)
for(i=0;i<123;i++);
}
voidwrite_com(ucharcom)//lcd1602写指令函数
{
lcdrs=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardat)//lcd1602写数据函数
{
lcdrs=1;
P2=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()//lcd1602初始化函数
{
lcden=0;
write_com(0x38);
write_com(0x0c);//开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清零,数据指针清零
}
voidkey_scan()//按键检测函数
{
if(key_start==0)//START键
{
delay(10);//延时消抖
if(key_start==0)
{
TR0=1;
TR1=1;
//u=0;//从0开始
}
}
if(key_stop==0)//STOP键
{
delay(10);
if(key_stop==0)
{
TR0=0;//关闭定时器T0,T1
TR1=0;
}
}
if(key_clear==0)//CLEAR键
{
delay(10);
if(key_clear==0)
{
TR0=0;//关闭定时器T0,T1
TR1=0;
u=0;
}
}
/******扫描后马上分离千,百,十,个,十分位*****************/
v=u/10000;//千位为v
w=u/1000%10;//百位为w
x=u/100%10;//十位x
y=u/10%10;//个位y
z=u%10;//十分位z
}
voidt0_time()interrupt1//每50ms进一次中断服务函数
{
ucharnum;
TH0=0X3C;//重装初值
TL0=0XB0;
num++;
if(num==2)//50ms*2=0.1s
{
num=0;//清零num
u++;//每0.1秒,u值加1
if(u==60000)
u=0;
}
}
voidt1_time()interrupt3//每50ms进一次中断服务函数
{
uchari;
TH1=0X3C;//重装初值
TL1=0XB0;
i++;
if(i==20&TR0==1)//50ms*20=1s
{
i=0;
beep=1;
delay(20);
beep=0;
}
}
感谢下载!
欢迎您的下载,资料仅供参考