课程设计 数字秒表_第1页
课程设计 数字秒表_第2页
课程设计 数字秒表_第3页
课程设计 数字秒表_第4页
课程设计 数字秒表_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机控制技术综合应用设计题目 数字秒表 二级学院 电子信息与自动化学院 专 业 电气工程及其自动化 班 级 110070403 学生姓名 学号 学生姓名 学号 学生姓名 学号 指导教师 时间: 2013年12月16日 考核项目平时成绩20分设计50分答辩30分得分总分考核等级教师签名 摘要 随着电子科技的飞速发展,单片机在日常生活中应用的越来越广泛。本文以stc89c52单片机为核心器件,利用了单片机定时器具有精确定时的特点,制作了一个简易的数字秒表,可计时范围为0至59分59秒990毫秒,计时精度达到了0.01秒。该秒表的功能包括起停、复位、切换显示界面以及记录时间。在秒表的显示上,使用了

2、lcd1602液晶显示屏,这样使结果更加清楚直观。而当前时间与所记录时间则是分开在两个不同的界面上,利用按键来选择察看某一个界面,操作方便而且结果精确。关键字: 单片机 秒表 lcd1602液晶显示目录一 问题重述.11.1 设计要求.11.2 拓展要求.1二 设计方案与论证.12.1 方案比较.12.2 方案论证.12.3 方案选择.12.4 总方案设计框图.2三 单元模块设计.23.1 按键控制电路.23.2 单片机最小系统电路.33.3 lcd1602显示电路.43.4 总电路仿真图.5四 软件模块设计流程图.64.1 主循环函数的流程图.64.2 定时器0的中断服务子程序.74.3 定

3、时器1的中断服务子程序.84.4 两个显示函数的子程序.94.5 外部中断0和外部中断1的中断服务子程序.9五 软件系统测试.105.1 系统仿真效果图.10六 实物图及测试分析.10 6.1 实物效果图.106.2 测试结果及误差分析.11七 设计总结.12八 参考文献.12九 附录.139.1 元件清单.139.2 源程序代码.131、问题重述1.1 设计要求:制作简易秒表,最小显示位10ms,计时范围059分59秒990毫秒一键控制三种工作状态:清零、计时、停止系统工作符合一般秒表要求1.2 拓展要求:可记录多个成绩秒表精度0.1s2、设计方案与论证在mcu的选择上直接选取物美价廉的st

4、c89c52型号的单片机,虽然它是一款较低级的单片机,但是用于制作秒表来说已经足够了。在这里主要讨论显示电路的选择2.1 方案比较:方案一:选用七段数码管做显示设备方案二:选用lcd1602液晶显示屏做显示设备2.2 方案论证:方案一:七段数码管操作方便,并且显示效果良好价格也低廉。但是在界面切换到记录数据的时候并不是十分直观,在与单片机相接的时候还要在加驱动,加大了工作量,并且数码管的耗能较大。方案二:lcd1602液晶显示屏显示清晰,切换显示界面也很直观,可直接与单片机相连,方便快捷且耗能较少。但是价格较高,操作起来较复杂。2.3方案选择:综合各个方面,选择lcd1602作为显示设备。2.

5、4 总方案设计框图:按键控制电路单片机最小系统电路lcd1602显示电路图1 总方案设计图3、单元模块设计3.1 按键控制电路 图2 按键控制电路图放置四个按键开关,分别接在单片机的p3.1p3.4上,另一端接地。如图2所示,单片机检测这几个引脚的高低电平状态即可知道是否按下了开关。而这四个开关分别控制记录、起停、复位以及界面切换的功能,通过单片机对四个按键状态检测的反馈来分别实现这四个功能。3.2 单片机最小系统电路图3 单片机最小系统图单片机的最小系统(如图3)就是单片机能够正常工作所必须具备的部分。包括三个部分,分别是复位电路、晶振电路和电源电路。3.2.1 复位电路在单片机系统中,复位

6、电路是非常关键的,当程序跑飞(运行不正常)或死机(停止运行)时,就需要进行复位。mcs-5l 系列单片机的复位引脚rst( 第9 管脚) 出现2个机器周期以上的高电平时,单片机就执行复位操作。如果rst 持续为高电平,单片机就处于循环复位状态。复位操作通常有两种基本形式:上电自动复位和开关复位。而在本文中采用的为上电复位,即每次上电的瞬间给单片机复位。3.2.2 晶振电路xtal1(19 脚):芯片内部振荡电路输入端;xtal2(18 脚):芯片内部振荡电路输出端;xtal1 和xtal2 是独立的输入和输出反相放大器,它们可以被配置为使用石英晶振的片内振荡器,或者是器件直接由外部时钟驱动。本

7、文中采用的是内时钟模式,即采用利用芯片内部的振荡电路,在xtal1、xtal2 的引脚上外接定时元件(一个石英晶体和两个电容),内部振荡器便能产生自激振荡。以此来提供给单片机工作信号脉冲。3.2.3 电源电路:电源电路即为单片机提供电源的电路,20脚接地,40教接电源,一般选择5v。51 单片机的ea/vpp(31 脚) 是内部和外部程序存储器的选择管脚。当ea 保持高电平时,单片机访问内部程序存储器;当ea 保持低电平时,则不管是否有内部程序存储器,只访问外部存储器。对于现今的绝大部分单片机来说,其内部的程序存储器(一般为flash)容量都很大,因此基本上不需要外接程序存储器,而是直接使用内

8、部的存储器。 3.2.4 p0口外接上拉电阻:51 单片机的p0 端口为开漏输出,内部无上拉电阻,为了能使p0 口在输出时能驱动nmos 电路和避免输入时读取数据出错,需外接上拉电阻。一般选择4.7k10k的上拉电阻即可。本文中选取的是4.7k的上拉电阻。3.3 lcd1602显示电路 图4 lcd1602液晶显示屏接线图1602液晶也叫1602字符型液晶(如图4),它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,显示的内容为16x2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。如图4所示,1脚为电源地;2脚为5v电源正极;3脚为调节背光引脚,此处接10k滑动变阻器来调节

9、背光,以便能够能清楚的看到液晶屏所显示的字符;第4脚:rs为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。本文中接在单片机的p1.0端口上;第5脚:rw为读写信号线,高电平时进行读操作,低电平时进行写操作。本文中接在单片机的p1.1端口上;第6脚:e端为使能端,高电平时读取信息,负跳变时执行指令。本文中接在单片机的p1.5端口上;第714脚:d0d7为8位双向数据端。本文中接在单片机的p0端口上;3.4 总电路仿真图图5 总电路图4、软件模块设计4.1 主循环函数的流程图如下:开始初始化定时器、外部中断及液晶产生t0中断进入t0的中断子程序进入外部中断int0的中断子程序进入

10、外部中断int1的中断子程序进入t1的中断子程序产生t1中断产生int0中断产生int1中断nynynyny 图6 主循环流程图4.2 定时器0的中断服务子程序t0中断入口tr0=1返回重新给定时器赋初值msec=msec+1msec=100sec=sec+1;msec=0sec=60min=min+1;sec=0min=60min=0 nyy nyny ny图7 图7 定时中断0的中断子程序流程图4.3 定时器1的中断服务子程序t1中断入口重新给定时器赋初值key1=0记录下当前的时间值key4=0flag=flagflag=0调用显示1调用显示2返回 ny nyny图8定时中断1的中断子程

11、序流程图4.4 两个显示函数的子程序显示程序1入口显示秒表以及记录数据的个数返回显示程序2入口显示已经记录下的数据返回图10 显示函数2的流程图图9 显示函数1的流程图4.5 外部中断0和外部中断1的中断服务子程序外部中断1的中断入口返回key3=0清除所有当前数据,并把定时器重新赋初值外部中断0的中断入口tr0=tr0返回key2=0 nny y图11 外部中断0的中断子程序流程图 图12 外部中断0的中断子程序流程图5、软件系统测试:5.1 仿真效果图 图13 未计数时界面1显示图 图14未计数时界面2显示图图13为未开始计时时显示界面一的显示值。图14为未开始计时时显示界面二的显示值。

12、图15 计数时界面1显示图 图16 计数时界面2显示图图15为开始计时并已记录了两次时的显示界面一的显示值 。图16为开始计时并已记录了两次时的显示界面二的显示值 。6、 实物图及测试分析6.1 实物效果图图17未计数时界面1显示图图17表示为开始计时时,界面一的显示如图所示,显示值全部为0。 图18计数时界面1显示图图18表示开始计时,并且已经完成两次记录时界面一的显示值,如图所示,record等于2,表示已经完成了两次记录。 图19 计数时界面2显示图图19表示界面二的显示值,即显示已经记录下的两个数据,如图所示第一行为第一个数据,第二行为第二个数据。6.2 测试结果及误差分析6.2.1

13、测试结果 表1 测试记录表测试值3.42s7.80s15.88s24.51s54.64s117.73s实际值3.43s7.82s15.90s24.53s54.68s117.79s误差0.01s0.02s0.02s0.02s0.04s0.06s6.2.2 误差分析虽然是利用单片机的定时器做了精确定时,但是其实单片机每次进出中断都是有一定的时间损耗的,因此事实上并不是百分之百精确,还是会产生一定的误差。如果通过多次测试,然后对定时器的初值做一个修正,这样会再次提高精确度,但是并不存在绝对的精确,只能将误差减小。如果要求更精确的秒表,那么就不是简单的单片机定时器就可以解决的,需要采用更精准的时钟及高

14、速芯片来完成精度要求了。七、设计总结在紧张的两个星期中,我们实验小组终于排除了困难,完成了秒表系统的设计与制作。在实验中,我们用上了平时上课老师教给我们的知识,让我们的设计有了更多的思路,让我们学到了很多书本上没有的知识,同时也让我们学习了许多课外的知识,不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。在发现问题和解决问题后,最终我们的设计还是成功了。本次课程设计主要从硬件和软件两个方面结合说明设计的总体思路和

15、实现过程,预期的设计目的是:能够实现计时的基本功能,正常显示计时。在设计过程中,曾经遇到很多的障碍,设计图经过许多次的修改最后才定下来,但在调试的过程中又出现了问题需要修改原理图;在编程那里花费的时间是最多的,编程的过程是要考虑到程序的可行性和是否与硬件兼容。而能否接好线是本试验的一大难题!在设计中有好多问题都是因为理论知识不扎实,在有些管脚的置零置一上,概念的模糊,还有就是对单片机的指令不够熟悉。通过此次课程设计我们有了更深的认识,只有在设计制作的过程中不断的学习才能有更新的进步。不论在什么地方、什么岗位我门都要不断学习,学以致用。才能把我们的工作做的更好。八、参考文献1刘乐善.微型计算机接

16、口技术及应用m.北京:北京航空航天大学出版社,20012王东峰,单片机c语言应用100例,北京,电子工业出版社,20093禹言春,单片机的多机通信,安徽,安徽农学通报,20074陈海宴,51单片机原理及应用,北京,北京航空航天大学出版社,20105李平,单片机入门与开发北京,机械工业出版社,2008九、附录9.1 元件清单原理图型号个数数值单片机at89c511-晶振crystal112mhz液晶显示lcd:lm016c1-电阻res110k电容cap320p;10u排阻respack-8110k滑动变阻器rv1110k按键button4-9.2 源程序代码#include /包含51头文件#

17、include/包含空操作头文件/*两个宏定义类型,方便操作*/typedef unsigned char uint8;/宏定义typedef unsigned int uint16;#define count0 10000 /设置定时器0定时时间为10ms#define th_0 (65536-count0)/256 /给定时器赋初值#define tl_0 (65536-count0)%256#define count1 15000 /设置定时器1定时时间为15ms#define th_1 (65536-count1)/256 /给定时器赋初值#define tl_1 (65536-cou

18、nt1)%256/*单片机位定义*/sbit rs=p10; /lcd1602寄存器选择sbit rw=p11; /lcd1602读写选择位sbit en=p15; /lcd1602使能信号位sbit busy=p07; /忙碌标志位,将bf位定义为p0.7sbit key1=p31; /定义按键1为p31口 用于记录当下的时间sbit key2=p32;/定义按键2为p32口 用于控制秒表的开始与暂停sbit key3=p33; /定义按键3为p33口 用于清零所有记录及当前计时sbit key4=p34; /定义按键4为p34口 用于切换当前计时与记录计时的界面/*设置一些全局变量*/ui

19、nt8 num=0,sec=0,min=0,rec=0,flag=0; /num表示以10ms单位计时 sec表示秒 /min表示分钟 rec表示记录的次数 flag作为切换显示的标志位uint8 code dis2=0123456789; /定义记录显示数组uint8 code dis1=0123456789; /定义秒表的显示数组uint8 num12=0,0; /定义记录数据的数组,用以保存记录的数据uint8 sec12=0,0; / 此处只设置记录两次uint8 min12=0,0; uint8 key1status = 0;/定义key1的状态位uint8 key4status =

20、 0;/定义key4的状态位void delay(uint8 n) /短延时 初始化lcd1602所用 uint8 a,b,c; for(c=n;c0;c-) for(b=142;b0;b-) for(a=2;a0;a-);void busy_test() /忙检验 p0 = 0xff;dors = 0;rw = 1;en = 0;en = 1;while(busy=1);en = 0;/*函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate*/void write_cmd (uint8 dictate) busy_test(); /如果忙就等待 en = 0; p0 = d

21、ictate; rs = 0; /rs和r/w同时为低电平时,可以写入指令 rw = 0; _nop_(); _nop_(); /空操作两个机器周期,给硬件反应时间 /将数据送入p0口,即写入指令或地址 _nop_(); _nop_();_nop_();_nop_(); /空操作四个机器周期,给硬件反应时间 en = 1; /e置高电平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 en = 0; /当e由高电平跳变成低电平时,液晶模块开始执行命令 /*函数功能:将数据(字符的标准ascii码)写入液晶模块入口参数:x(为字符常量

22、)*/ void write_data(uint8 x) busy_test(); en = 0; p0 = x; rs = 1; /rs为高电平,rw为低电平时,可以写入数据 rw = 0; /e置低电平(写指令时,e为高脉冲, / 就是让e从0到1发生正跳变,所以应先置0 /将数据送入p0口,即将数据写入液晶模块 _nop_();_nop_();_nop_();_nop_();/空操作四个机器周期,给硬件反应时间 en = 1; /e置高电平 _nop_();_nop_();_nop_();_nop_(); /空操作四个机器周期,给硬件反应时间 en = 0; /当e由高电平跳变成低电平时

23、,液晶模块开始执行命令 /*函数功能:指定字符显示的实际地址入口参数:x*/ void write_addr(uint8 x) write_cmd(x|0x80); /显示位置的确定方法规定为80h+地址码x /*函数功能:对lcd的显示模式进行初始化设置*/void init_lcd1602() delay(10); /延时15ms,首次写指令时应给lcd一段较长的反应时间 write_cmd(0x38); /显示模式设置:162显示,57点阵,8位数据接口delay(2); /延时5mswrite_cmd(0x0c); /显示模式设置:显示开,有光标,光标闪烁delay(2);write_

24、cmd(0x06); /显示模式设置:光标右移,字符不移delay(2);write_cmd(0x01); /清屏幕指令,将以前的显示内容清除delay(2);/*lcd页面一的显示函数 主要显示秒表及是否记录到数据*/void display1()/显示函数1 显示秒表以及记录情况uint8 i,j,k,m,n,o,p,q;i=num/10;j=num%10;k=sec/10;m=sec%10;n=min/10;o=min%10;write_addr(0x00); /设置从第一行的第一格开始显示write_data(t); /写入字母t write_data(i);write_data(m)

25、;write_data(e);write_data(:); write_data(dis1n); /写入min的最高位write_data(dis1o); write_data(:);write_data(dis1k);write_data(dis1m); write_data(.);write_data(dis1i);write_data(dis1j); write_data(dis10); p=rec/10;q=rec%10; write_addr(0x40); /设置从第二行的第一格开始显示write_data(r); write_data(e);write_data(c);write_

26、data(o);write_data(r);write_data(d);write_data(:); write_data(dis1p);write_data(dis1q); /*lcd页面二的显示函数主要显示已经记录的两个数据*/void display2()/显示函数2 显示记录write_addr(0x00); /设置从第一行的第一格开始显示记录的第一个数据write_data(r); /写入字母t write_data(e);write_data(:);write_data(1);write_data(,); write_data(dis1min10/10); /写入min的最高位wr

27、ite_data(dis1min10%10); write_data(:);write_data(dis1sec10/10);write_data(dis1sec10%10); write_data(.);write_data(dis1num10/10);write_data(dis1num10%10); write_data(dis10); write_addr(0x43); /设置从第二行的第三格开始显示已经记录的第二个数据write_data(2);write_data(,); write_data(dis1min11/10); /写入min的最高位write_data(dis1min1

28、1%10); write_data(:);write_data(dis1sec11/10);write_data(dis1sec11%10); write_data(.);write_data(dis1num11/10);write_data(dis1num11%10); write_data(dis10); void init_timer0()/定时器0初始化th0=th_0; /设置定时器初值tl0=tl_0;ea=1;/打开总终端允许位et0=1; /打开定时器0的中断允许位tr0=0; /选择关闭定时器0tmod|=0x01; /设置工作方式1void init_timer1()/定时

29、器1初始化th1=th_1; /设置定时器初值tl1=tl_1;ea=1;/打开总终端允许位et1=1; /打开定时器1的中断允许位tr1=1; /选择打开定时器1tmod|=0x10; /设置工作方式1void init_int0_1() /外部中断0和1的初始化ex0=1; /打开外部中断的允许位ex1=1;it0=0; /设置外部中断的触发方式为低电平触发it1=0;void xiaodou() /用于按键消抖的短延时函数,大概8msuint8 i,j;for(i=0;i8;i+)for(j=0;j110;j+);main() /主函数init_lcd1602();/初始化lcd1602

30、init_timer0();/初始化定时器0init_timer1();/初始化定时器1init_int0_1();/初始化外部中断0和1while(1); /主循环void timer0() interrupt 1 /定时器0中断函数 用于精确定时th0=th_0; /进入中断则重新给定时器赋初值tl0=tl_0;num=num+1; /num自加1,进入一次表示10msif(num=100)/如果自加100次,则表示1s sec=sec+1;/因此表示秒的变量加1num=0;/并且把num清0 if(sec=60)/如果自加60s,则表示1分钟min=min+1;/因此表示分钟的变量加1sec=0;/清零秒变量if(min=60) /满60分钟后清零分钟位min=0;void t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论