单片机设计秒表(共19页).doc
精选优质文档-倾情为你奉上 单片机课程设计 题 目 单片机秒表设计授课教师 董文会 学生姓名 吕丙扬 靳立松 李 扬 学 号 3 6 5 专 业 2010级电子信息工程 教学单位 物理与电子信息学院 完成时间 2013年6月24日专心-专注-专业目录一、 设计的目的及意义················································1二、 设计方案及原理··················································1三、 硬件设计与电路设计·············································2 3.1 AT89C51单片机最小系统简介···································2 3.2 复位按键·····················································4 3.3晶振电路·····················································4 3.4数码管显示模块···············································5 3.5按键开关·····················································5 3.6总电路图·····················································6四、 软件设计························································6 4.1秒表初始化设计··············································6 4.2按键检测程序····················································6 4.3开始计时····················································7 4.4计时程序····················································7 4.5显示程序····················································74.6暂停计时····················································74.7秒表清零····················································74.8延时程序····················································8 4.9程序流程图··················································8五、总结····························································9附录·······························································10参考文献···························································15·一、 设计的目的及意义 单片微型计算机体积小、功能强、性价比高等特点,所以广泛应用于电子仪表、家用电器、节能装置、军事装置、机器人、工业控制等诸多领域,使产品小型化、智能化,既提高了产品的功能和质量,又降低了成本,简化了设计。利用单片机的定时器/计数器定时和计数的原理,用集成电路芯片、LED 数码管以及按键来设计计时器。将软、硬件有机地结合起来,使他拥有正确的计时、暂停、清零、并同时可以用数码管显示,在现实生中应用广泛。秒表计时器常常用于体育竞赛及各种其他要求有较精确时间的各领域中。用AT89C51设计一个3位LED数码显示“秒表”,显示时间为0099秒,每秒自动加一。设计一个“开始”按键和一个“复位”按键。再增加一个“暂停”按键和一个“快加”按键(每10ms快速加一)。二、设计方案及原理 以AT89C51单片机为核心,设计一个秒表,具有计时功能,按键有启动计时、数据清零、停止、时间显示。 采用3个LED数码管显示时间,计时范围设置为099.9秒,即精确到0.1秒,用按键控制秒表的“开始”、“暂停”、“复位”,按“开始”按键,开始计时;按“暂停”按键,系统暂停计时;再按“开始”键,系统继续计时;数码管显示当前计时值;按“复位”按键,系统清零。系统总体方案如图2.1所示:AT89C513个数码显示管4个独立式按键 11.059MHz晶振电源开关图2.1 系统总设计图三、硬件设计与电路设计 3.1 AT89C51单片机最小系统简介 单片机最小系统由AT89C51、复位按钮、晶振组成。选用频率11.0592MHz晶振,两个30pF电容。如图3.1所示:图3.1单片机最小系统 VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚 备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。3.2 复位按键 复位按键如图3.2所示:图3.2 复位按键3.3晶振电路 系统总电路除以上的显示电路,按键电路和复位电路组成外,其次还剩晶振电路和电源电路。再将单片机与以上各部分电路合理的连接就组成了系统总电路。AT89C51单片机为主电路的核心部分,各个电路均为和单片机相连接,由单片机统筹和协调各个电路的运行工作。 AT89C51单片机提供了XTAL1和XTAL2两个专用引脚接晶振电路,因此只要将晶振电路接到两个专用引脚即可为单片机提供时钟脉冲,但在焊接晶振电路时要尽量使晶振电路靠近单片机,这样可以为单片机提供稳定的时钟脉冲。 晶振电路如图3.3所示: 图3.3 晶振电路3.4数码管显示模块 显示电路采用3位共阳极LED 数码管,P0 口由上拉电阻提高驱动能力,作为段码输出并作为数码管的驱动。P2 口的低四位作为数码管的位选端。LED1显示秒表的十秒位,LED2显示秒表的秒位,LED3显示毫秒位。复位后显示00.0。如图3.4所示:图3.4 数码管显示模块3.5按键开关 按键开关有4个按键,其中K1为开始按键,K2为暂停按键,K3为快加按键,K4为复位按键。按“开始”按键,开始计数,数码管显示从00开始每秒自动加一;按“复位”按键,系统清零,数码管显示00;按“暂停”按键,系统暂停计数,数码管显示当时的计数;按“快加”按键,系统每10ms快速加一,即数码管在原先的计数上快速加一。图3.5 按键开关3.6总电路图 将各个模块链接后组成总电路图,如图:3.6所示:图3.6总电路图四、 软件设计4.1秒表的初始化根据程序流程图,先进行秒表的初始化,即:将I/O口P3全写一,为秒表的控制输入做好准备;将数码管全部置零,使其处于秒表计时的初始状态;将工作寄存器R0R2以及30H初始化,留待后面的计时程序备用;将定时器0置于工作方式1,并为其装入计时预置数D8FE(因为程序运行过程中占用的时间会导致一定误差,此为经实物测试之后的修正值),即将定时器定为每10ms溢出;开总中断允许和定时器0中断允许。初始化完成后,即进入之后的按键扫描程序。4.2按键检测程序轮流检测开始计时(P3.2)、暂停计时(P3.3)、秒表清零(P3.4)三个按键。若发现有一个按键出现低电平(可能被按下),则延时10ms(调用延时子程序DELAY),延时完成后,若发现低电平消失,则说明该按键实际上未被按下,此时转回按键检测处继续检测;若发现仍然是低电平,则说明此键确实被按下了,此时就跳转至相应的程序标号处,执行相应的功能。4.3开始计时若确认“开始计时”键被按下,则跳转至程序标号“RUN”处,将定时器0计时允许控制位TR0置位,则定时器开始运行。此动作完成后,返回按键检测程序,等待操作者的下一次指令。4.4计时程序定时器0计时至10ms,溢出,引发中断,程序跳转至定时器0中断服务程序入口000BH处执行。程序跳转至中断服务程序TIME0。由于秒表的最小计时单位是0.1s,即100ms,因此需加入软件计时,使定时器0溢出10次之后才改变数码管的显示状态。因此每来一次中断就将30H中的数加1,若30H中的数没有到10,则给定时器0重新装入预置数,之后中断返回并继续等待中断;到10了,才进入显示程序,改变数码管的显示状态,执行完毕之后中断返回并继续等待中断。4.5显示程序将数码管的段选码放在数表TAB中。每秒计时完成后,将R0中的值(初值为0)送入A,然后自加1。若R0中的值没到10,则使用累加器A查表,并将查得的数码管段选码送入毫秒位数码管。之后将30H中的数置零,中断返回。若发现R0中的数到10了,则将R0置零,并转入秒位进位子程序SECOND,向秒位进位之后,继续照常向毫秒位送数。4.6暂停计时若确认“暂停计时”键被按下,则跳转至程序标号“PAUSE”处,将定时器0计时允许控制位TR0置零,则定时器暂停运行。此动作完成后,返回按键检测程序,等待操作者的下一次指令。 4.7秒表清零若确认“秒表清零”键被按下,则跳转至程序标号“STOP”处,将TR0置零,关闭定时器0运行。并且将数码管、工作寄存器、定时器0预置数全部重置,使其处于秒表计时的初始状态。此动作完成后,返回按键检测程序,等待操作者的下一次指令。4.8延时程序用于按键延时防抖,延时10ms。程序清单见附录。 4.9程序流程图 如图4.9所示:图4.8程序流程图五、总结 通过对本次课程的课程设计,使自己深刻的认识到自己的很多不足之处,在实际动手操作能力的不足,在进行程序编程时,自己需要,认真审题,看懂题目的要求!对于软件编程不益太简单或者太难。做到既能把课题完成又能锻炼 自己的能力!根据课题要求,复习相关的知识,查询相关的资料。根据课程条件,找到适合的方案,找到需要的元器件及工具,准备课程。根据课程设计的要求和自己所要增加的功能写好程序流程图,在程序流程图的基础上,根据芯片的功能写出相应的程序和增加额外的功能程序。然后再进行 程序调试和相应的修改,以达到能够实现所要求的功能的目的。还要根据课程的实际情况,添加些额外程序来使系统更加的稳定,如开关的去抖(采用延迟)。程序要尽量做到由各个子程序组成,在有些程序后面最好加注释。这样在程 序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。该课程设计的程序可以参考 MCS-51 系列单片机,也可自己根据自己熟悉的方法来编程如单片机 C 语言。在设计控制开关时,注意两个中断的打开和关闭的先后顺序,否则就会出错。这次的单片机课程设计重点是理论与实际的相结合。该设计从头到尾都要自己参与,熟悉了对整个设计的过程,更系统的锻炼了自己。 附录:#include<reg52.h> /52 系列单片机头文件 #define uchar unsigned char /宏定义#define uint unsigned intsbit dula=P26; /申明 U1 锁存器的锁存端 sbit wela=P27; /申明 U2 锁存器的锁存端 sbit key1=P34; /申明四个按键的锁存端sbit key2=P35;sbit key3=P36;sbit key4=P37; uchar code table= /含有 09 的数字数组 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f;void delayms(uint); /声明延时函数void display(uchar,uchar,uchar); /声明显示函数 void keyscan(); /声明按键函数 uchar num1,num2,bai,shi,ge; /变量声明 uint num; void main() /主函数入口 TMOD=0x11; /设置 TO,T1 定时器 TH0=(65536-45872)/256; /装初值11.05992M晶振50ms数为45872 TL0=(65536-45872)%256; TH1=(65536-45872)/256; TL1=(65536-45872)%256; EA=1; /开总中断 ET0=1; /开启定时器 T0 中断 ET1=1; /开启定时器 T1 中断 while(1) /程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体 keyscan(); /三个数码管要选送的数据 bai=num/100; /百位 shi=(num-100*bai)/10; /十位 ge=num-100*bai-shi*10; /个位 /直接把第二只数码管的小数点烧出来dula=1; /打开段选 P0=0x80; /送段选数据dula=0; /关闭断选 P0=0xff; /送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位 锁存端造成混乱 wela=1; /打开位选 P0=0xfd; /送位选数据 wela=0; /关闭位选 delayms(5); /延时 display(bai,shi,ge); void display(uchar bai, uchar shi,uchar ge) dula=1; /打开段选P0=tablebai; /送段选数据 dula=0; /关闭断选 P0=0xff; /送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存 端造成混乱wela=1; /打开位选 P0=0xfe; /送位选数据wela=0; /关闭位选 delayms(5); /延时 dula=1; /打开段选P0=tableshi; /送段选数据dula=0; /关闭断选 P0=0xff; /送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造 成混乱 wela=1; /打开位选 P0=0xfd; /送位选数据 wela=0; /关闭位选 delayms(5); /延时dula=1; /打开段选P0=tablege; /送段选数据dula=0; /关闭断选 P0=0xff; /送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造 成混乱 wela=1; /打开位选 P0=0xfb; /送位选数据 wela=0; /关闭位选 delayms(5); /延时 void delayms(uint xms) /延时子函数 uint i,j; for(i=xms;i>0;i-) /i=xms 即延时约 xms 毫秒for(j=110;j>0;j-); void keyscan() if(key1=0) /清零 delayms(10); /延时去抖 if(key1=0) while(!key1) /等待按下 TR0=0; /定时器 TR0 关闭 TR1=1; /定时器 TR1 打开 num=0; /送数据 num=0 TR1=0; /定时器 TR1 关闭 if(key2=0) /暂停和开始 delayms(10); if(key2=0) while(!key2); TR0=0;TR1=TR1; /每次按下,TR1 的状态时相反的 if(key3=0) /使计数器显示为 60.0while(!key3); TR0=0; TR1=1; num=600; TR1=0; if(key4=0) /实现计数器的倒数功能 while(!key4); TR1=0; TR0=1; void T0_time()interrupt 1 TH0=(65536-45872)/256; /重装初值TL0=(65536-45872)%256; num2+; if(num2=2) /如果到了2次,说明0.1秒的时间到 num2=0; /然后把num2清零重新再计2次num1+; if(num1=10) num1=0; if(num=0) /当 num 自减为0时,重新为 60.0,再开始倒计时 num=600; /num 逐渐自减 num-; /定时器 T0,中断序号为 1 void T1_time()interrupt 3 TH1=(65536-45872)/256; /重装初值 TL1=(65536-45872)%256; num2+; if(num2=2) /如果到了 2 次,说明 0.1 秒的时间到 num2=0; /然后把 num2 清零重新再计 2 次 num1+; if(num1=10)num1=0; num+; /num 逐渐自加 if(num=600) num=0; /这个数十用来送给数码管显示的,到了 60.0 后归零 参考文献1张毅刚, 彭喜元.单片机原理及接口技术M.人民邮电出版社.2单片机课程设计实例指导 李光飞等. 北京航空航天大学出版社351系列单片机原理、开发与应用实例 孙进平等编著 4单片机程序设计实例 先锋工作室编著 清华大学出版社