单片机原理及应用课程设计电子跑表_第1页
单片机原理及应用课程设计电子跑表_第2页
单片机原理及应用课程设计电子跑表_第3页
单片机原理及应用课程设计电子跑表_第4页
单片机原理及应用课程设计电子跑表_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、湖南人文科技学院课程设计报告课程名称:单片机原理及应用课程设计设计题目: 电子跑表 系 别: 通信与控制工程系 专 业: 自动化专业 班 级: 一班 学生姓名: 学 号: 起止日期: 年月日 11年12月26日 指导教师: 教研室主任: 指导教师评语: 指导教师签名: 年 月 日成绩评定项 目权重成绩阳鹏蔡作先1、设计过程中出勤、学习态度等方面0.22、课程设计质量与答辩0.53、设计报告书写及图纸规范程度0.3总 成 绩 教研室审核意见:教研室主任签字: 年 月 日教学系审核意见: 主任签字: 年 月 日摘 要本课程设计是有利用单片机设计一个电子跑表。所谓单片机即单片微型计算机。由ram,r

2、om,cpu构成定时、计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而51系列单片机是各单片机最典型和最有代表性的一种。本设计通过对它的学习、应用,以stc89c52单片机和8255芯片为核心,辅以必要的电路,设计了一个简易的电子跑表,具有电子时钟和秒表的功能。它由5v直流电源供电,通过数码管能够准确显示时间,充当秒表计时,按键即可对它进行控制,从而达到学习、设计、开发软、硬件的能力。关键词:单片机;电子跑表;stc89c52;中断;8255;display;数码管显示;键盘扫描 目 录设计要求11 方案论证与对比11.1 数码管显示方案一11.2

3、 数码管显示方案二12 硬件电路的设计22.1 stc89c52rc单片机与8255连接系统及复位电路的设计22.2 数码管显示电路32.3 时钟电路设计32.4 键盘控制电路设计42.5 系统总电路图43 系统程序设计53.1 总体设计 如图4:53.2 主程序63.3 显示子程序63.4 计时模块子程序83.4.1时钟计时程序93.4.2 秒表93.5 定时器t0中断服务程序94 调试及性能分析104.1硬件调试104.2软件调试104.3性能分析104.4控制源程序清单115详细仪器清单196总结与思考及致谢19参考文献20电子跑表1 设计要求:利用单片机作为控制核心,设计出电子跑表,具

4、有以下功能: (1)具有电子时钟和跑表功能;(2)做时钟时在4位led 显示器上显示分、秒;(3)做跑表时显示范围10000.0秒10999.9秒;(4)当按下启动按钮跑表开始计时,按下停止按钮停止计时,当按下复位按钮跑表回零。1 方案论证与对比数码管显示是本设计主要的部分。根据需要,可采用两种方案实现,即静态显示法和动态显示法。1.1 数码管显示方案一方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。该方式每一位都需要一个8位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示的位数较多时,静态显示所需的i/o口太多,造成了资

5、源的浪费。1.2 数码管显示方案二方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也与点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了i/o口,降低了能耗。由于静态现实法需要数据锁存器等硬件,接口复杂一些,又考虑到时钟显示只有4位,且系统没有其他的处理任务;并且从节省i/o口和降低能耗出发,所以决定采用动态扫描法实现led的显示,即采用方案二。2 硬件电路的设计2.1 stc89c52rc单片机与82

6、55连接系统及复位电路的设计stc89c52rc单片机与i/o扩展芯片8255的连接图如图1,其中包括一个单片机的最小系统。单片机最小系统包括晶振电路,复位电路以及电源电路。为了初始化单片机内部的某些特殊功能寄存器,必须采用复位的方式,复位后可使cpu及系统各部件处于确定的初始状态,并从初始状态开始正常工作。单片机的复位是靠外电路来实现的,复位操作有两种情况,即上电复位和手动(开关)复位。本系统采用上电复位方式。上电复位:上电复位电路时一种简单的复位电路,只要在rst复位引脚接一个电容到vcc,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到rst复位引脚一个短暂的高电

7、平信号,这个复位信号随着vcc对电容的充电而回落,所以rst引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,rst引脚的高电平信号必须维持足够才的时间。上电自动复位是通过外部复位电路的电容充电来实现的。只要vcc的上升时间不超过1ms,就可以实现自动上电复位。图1 stc89c52rc单片机与8255连接系统电路图2.2 数码管显示电路2.3 时钟电路设计时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准有条不紊的一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式:一种是内部时钟方式,另

8、一种为外部时钟方式。本文用的是内部时钟方式。通过单片机mcs-51内部计数器每50ms溢出中断来实现计时功能。2.4 键盘控制电路设计 该设计需要控制跑表开始和停止,当按下启动按钮跑表开始计时,按下停止按钮停止计时,当按下复位按钮跑表回零。还需要一个切换按键,使得时钟和跑表随时切换。按键的开关要消抖,一般的按键抖动的时间长度都没大于10ms,所以我们在判断按键是否按下就通过延时10ms后再检测电平值从而来实现按键输入。本文只选用了矩阵键盘的第一列前三个按键作为跑表开始、暂停、复位按键。用中断0作为常用按键实现显示的切换。2.5 系统总电路图 如图3: 图3 系统总电路图3 系统程序设计3.1

9、总体设计:复位电路stc89c52rcnec8255数码管驱动电路4位数码管显示实时时钟键盘实现开始暂停复位晶振时钟电路显示切换电路图4 总体框架图时间等内部ram初始化键盘,时钟的初始化显示初始化时间有键按下判断键值秒表/时钟开始秒表/时钟暂停秒表/时钟清零秒表与时钟切换ny0键1键2键into键图 5 主程序流程图3.2 :主程序本设计中秒表采用定时器t0中断完成。主程序循环调用显示子程序和查键子程序,当端口有开关按下时,转入相应功能程序。其程序执行流图如图5所示。3.3 显示子程序时间显示子程序每次显示4个连续内存单元的十进制bcd码数据,首地址在调用显示程序时先指定3。60h65h为秒

10、表计时单元,70h75h为时钟显示单元。由于采用7段共阳极数码管动态扫描实现数据显示,所以显示用十进制bcd码数据的对应段码存放在rom表中。显示时,先取出内存地址中的数据,然后查得对应的显示用段码从p0口输出,p2口将对应的数码管选中供电,就能显示该地址单元的数据值。时钟初始化第一次按下0键59分59秒到60秒到第一次按下0键秒个位+1分个位+1,秒位清0重置t0定时初值t0中断服务程序nnyy 图 6电子时钟程序流程图第一次按下3键1秒到999.9秒100秒到100秒到第一次按0键下秒表初始化秒百十位+1,秒个位清0重置t0初始值十分秒位+1秒百十位+1,秒十位清0秒个位+1,十分秒位清0

11、t0中断服务程序nnnyyy 图 7跑表程序流程图3.4 计时模块子程序3.4.1时钟计时程序50ms定时器溢出累加20次,使得最小单位为1s。此处电子时钟计时最大范围为59分59秒。如图6。3.4.2 秒表本模块利用了stc89c52的定时器0进行定时,每隔50ms就产生一次中断,2次累加从而实现跑表的最小计时单位为十分秒。按下2键后,启动跑表,数码管显示如图7所示。再次按下3键后,跑表停止,显示所记的时间。显示的时间范围为000.0999.9秒。表格 1电子时钟和秒表的显示电子时钟#分#秒秒表#。 #秒其中,#为所显示的数值。进行初始化时,#均显示的为00。跑表程序的流程图如图7所示。3.

12、5 定时器t0中断服务程序跑表和时钟显示共用定时器t0。定时溢出中断周期设为50ms,中断进入后先进行定时中断初值校正,当中断累计20次(即50*20=1s)时,对秒计时单元进行加1操作。时钟计数单元地址分别在70h71h(秒)、76h77h(分)中,最大计时值为59分59秒。7ah单元内存放“熄灭符”数据(#0ah),用于时间调整的闪烁功能。在计数单元中,采用十进制bcd码计数,满10进位。 4 调试及性能分析4.1 硬件调试硬件调试时可以检查印制板及焊接的质量情况,在检查无误的后可通点检查led显示器的点亮状况。若亮度不理想,可以调整p0口的电阻大小,一般情况下取200电阻即可获得满意的亮

13、度效果。实验室制作时,可结合示波器测试晶振及p0、p2端口的波形情况进行综合硬件测试分析。 4.2 软件调试根据上述需求分析得出的思路,进行c语言程序的编写。c语言程序一共分为三个部分:第一部分是stc89c52 芯片的初始化;第二部分是8255 可编程定时/计数芯片的初始化;第三部分是,模块的编写。在该电子跑表的设计过程中一共有两个模块:1. 计时和显示模块;2. 秒表模块。在各模块中可编写如p1=0x55进行各模块的测试。 软件调试在wave或keil c51编译器下进行,源程序编译及仿真调试应分段或以子程序为单元逐个进行,最后可结合硬件实时调试。4.3 性能分析设计之初的思路是选择将分,

14、秒分别保存在一个字节的内存单元中,这样在计时的设计上将变得简单,但这样的设计也带来一个问题,那就是在读入用户输入和将时间显示到屏幕上时的16 进制转到ascii 码时,由于涉及到将一个字节内容拆分转化,灵活性受到限制,于是考虑将分,秒的每一位用一个字节储存,这样在进行转化时将节省很多操作时间,设计过程中反复修改了程序的结构以达到优化目的,在时间显示出现问题后,我们进行了单元测试并最终发现了问题,在找到问题症结后,我们对显示部分代码及电路进行了完善5,最终得到了正确的显示结果。按照设计程序分析,led显示器动态扫描的频率约为167hz,实际使用观察时完全没有闪烁。由于计时中断程序中加了中断延时误

15、差处理,所以实际计时精度非常高。可满足多种场合的应用需要。4.4 控制源程序清单/*系统测试程序*/#include#define uint unsigned int#define uchar unsigned charuchar xdata 8255_pa _at_ 0xd9ff, 8255_pb _at_ 0xdbff, 8255_pc _at_ 0xddff, 8255_con _at_ 0xdfff;/定义外部变量,强制分配地 uchar code table=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28;uchar aa,bb,q

16、ian,bai,shi,ge,wa,qia,ba,sh,g,flag;sbit p3_2=p32; /切换显示按键管脚void display(qian,bai,shi,ge); /跑表显示函数void display1(wa,qia,ba,sh,g); /时钟显示函数void init(); /定时器 8255初始化函数void delay(uint z); /延时函数void in_key(); /显示切换按键函数void in_key1(); /控制按键函数 void main()init(); /初始化 while(1) in_key(); /扫描显示切换按键 if(flag=0) d

17、isplay1(wa,qia,ba,sh,g); /显示跑表 if(inkey()=0) tr0=1; else if(inkey()=1) tr0=0;else display(qian,bai,shi,ge);/显示时间 if(inkey()=0) r0=1; else if(inkey()=1) tr0=0; /* 函数名称:delay* 功能描述:简单延时 * 局部变量: x*/void delay(uint z) uint x;for(x=z;x0;x-); /延时 void init() 8255_con=0x81; /配置8255控制字 tmod=0x11; /配置定时器 th0

18、=(65536-50000)/256; /计数器赋初值 tl0=(65536-50000)%256; ea=1; et0=1; tr0=0;/* 函数名称:in_key* 功能描述:按键扫描 * 局部变量: i k* 调用模块:delay();table*/uchar in_key() uchar i,k; uchar keytab5=0x18,0x14,0x12; /矩阵键盘第一列按键有效 8255_pc=0x00; 8255_pa=0xff; 8255_pb=0xff; for(i=0;i2;i+) /循环扫描键盘 8255_pc=0x10; a=0xff; k=8255_pc; k=k&

19、0x0f; if(k!=0) /检测是否有键按下 delay(100); /消抖 k=8255_pc; k=k&0x0f; /获取键值 if(k!=0) break; delay(10); k=k+0x10; for(i=0;i5;i+) if(keytabi=k) break; return i;/* 函数名称:in_key1* 功能描述:切换显示 * 全局变量: flag* 调用模块:delay();in_key()*/void in_key1() p3_2=1; if(p3_2=0) delay(1000); if(p3_2=0) do8255_pb=0xff; while(p3_2!=

20、1); /松手检测 flag=flag; tr0=0; g=0;sh=0;qia=0;wa=0;qian=0;bai=0;shi=0;ge=0; tr0=0; th0=(65536-50000)/256; tl0=(65536-50000)%256; if(in_key()=2) g=0;sh=0;qia=0;wa=0;qian=0;bai=0;shi=0;ge=0; tr0=0; th0=(65536-50000)/256; tl0=(65536-50000)%256; /* 函数名称time0* 功能描述:中断 累加 服务程序 * 全局变量: aa,bb,qian,bai,shi,ge,w

21、a,qia,ba,sh,g*/void timer0() interrupt 1th0=(65536-50000)/256;tl0=(65536-50000)%256;aa+;bb+; if(aa=2) aa=0;ge+; if(ge=10) ge=0;shi+;if(shi=10) shi=0;bai+;if(bai=10) bai=0;qian+;if(qian=10) qian=0; if(bb=20) bb=0;g+;if(g=10) g=0;sh+;if(sh=6) sh=0;qia+;if(qia=10) qia=0;wa+;if(wa=6) wa=0; /* 函数名称:displ

22、ay(qian,bai,shi,ge)* 功能描述:数码管跑表显示 * 全局变量: table;* 调用模块: delay(); */void display(qian,bai,shi,ge) 8255_pb=0xff;/消隐 8255_pa=0xfb; 8255_pb=tableqian; delay(50); 8255_pb=0xff; /消隐 8255_pa=0xef; 8255_pb=(tableshi&0xdf); /显示小数点 delay(50); 8255_pb=0xff; /消隐 8255_pa=0xf7; 8255_pb=tablebai; delay(50); 8255_p

23、b=0xff;/消隐 8255_pa=0xdf; 8255_pb=tablege; delay(50);/* 函数名称:void display1(wa,qia,ba,sh,g)* 功能描述:数码管时钟显示 * 全局变量: table;* 调用模块: delay(); */void display1(wa,qia,ba,sh,g) 8255_pb=0xff;/消隐 8255_pa=0xfd; 8255_pb=tablewa; delay(50); 8255_pb=0xff;/消隐 8255_pa=0xfb; 8255_pb=tableqia; 8255_delay(50); 8255_pb=0xff; /消隐 8255_ a=0xef; 8255_pb=(tablesh); delay(50); 8255_

温馨提示

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

评论

0/150

提交评论