当前位置:文档之家› 单片机倒计时器设计说明书

单片机倒计时器设计说明书

单片机倒计时器设计说明书1.设计方案简介(1)4个按键组成2*2矩阵形式,接到P3口。

其中SW4接P3.6口,SW5接P3.7。

(2)通过T0定时器与P2.3引脚配合构成音频发生器,在P2.3引脚输出音频频率。

2.设计流程图3.设计原理3.1 AT89C513.1.1 AT89C51单片机简介图(a) 89C51部结构图AT89C51是美国ATMEL公司推出的系列单片机,将多种功能的8位CPU与FPEROM(快闪可编程/擦除只读存储器)结合在一个芯片上,是一种低功耗、高性能的CMOS控制器,为很多嵌入式控制应用提供了非常灵活而又价格适宜的方案,其性能价格比远高于同类芯片。

它与MCS-51指令系统兼容,片FPEROM允许对程序存储器在线重复编程,也可用常规的EPROM编程器编程,可循环写入/擦除1000次。

89C51含4KB的FPEROM,一般的EEPROM的字节擦除时间和写入时间基本上均为10ms,对于任一个实时控制系统来说,这样长的时间是不可能在线修改程序的。

与EEPROM相比较,FPEROM大大缩短了存储容擦除和写入的时间,为在线改写程序提供了极大的方便,而且价格也比带EPROM87C系列单片机便宜,这更显示出了89C系列的优越性。

它还有128*8Bit的片RAM;32根I/O线;2个16位定时/计数器;5个中断源;一个全双工的异步串行口;间歇和掉电工作模式;三级程序存储器加密;全静态工作,晶振工作围:0Hz—24MHz。

3.1.2 管脚功能AT89C51单片机为40引脚芯片如图(b)所示。

(1)I/O口线: P0、P1、P2、P3共四个八位P0口是三态双向口, 通称数据总线口, 因为只有该口能直接用于对外部存储器的读ˆ写操作。

P0口也用以输出外部存储器的低8位地址。

由于是分时输出, 故应在外部加锁存器将此地址数据锁存, 地址锁存信号用ALE。

P1口是专门供用户使用的I/O口, 是准双向口。

P2口是从系统扩展时作高8位地址线用。

不扩展外部存储器时, P口也可以作为用户I/O口线使用, P2口也是准双向口。

P3口是双功能口, 该口的每一位均可独立地定义为第一I/O 功能或第二I/O功能。

作为第一功能使用时操作同P1口。

P3口的第二功能如图(c)。

图(b) 89C51引脚图(2)控制口线: PSEN (片外取控制)、AL E( 地址锁存控制)、EA (片外储器选择)、RE2SET (复位控制) ;(3)电源及时钟: CCC、VSS; XTAL 1, XTAL 2图(c) 引脚功能表3.2 实验原理图图(1) 主控制电路图(2) LED数码管控制电路图(3) 蜂鸣器控制电路4.软件流程图4.1倒计时器主程序框图4.2显示子程序框图5.带详细注释的源程序清单;************************************************; 设计选题: 倒计时器系统设计; 描述: 4位LED数码显示"倒计时器",显示时间为99秒, ; 一个"开始"键,一个"复位"键,一个"暂停"键。

; 调用子程序: 计时子程序,显示子程序,定时子程序; 所用特殊寄存器:寄存器A,寄存器C; 所用中断:外部中断INT0,定时器T0; 实验作者: 肖延文--47号,高穹誉--10号;************************************************ORG 0000HLJMP START ;主程序必须避开地址000BHORG 000BH ;定时器0的中段服务程序,起始地;址为000BHLJMP IT00ORG 0030HSTART: MOV TH0,#0D8H ;装入初始值,定时10msMOV TL0,#0F0HMOV TMOD,#01H ;工作方式1MOV 33H,#09 ;显示初值为99sMOV 32H,#09MOV 31H,#00MOV 30H,#00SETB ET0 ;打开定时0SETB EA ;开总中断LOOP1: JB P3.6,LOOP ;判断高低位,即按键KEY0是否按下 LCALL DISPLAY ;为低,即按键按下,延时消抖LCALL DISPLAYJB P3.6,LOOP ;按键真的按下,并不是外界的干扰 SETB TR0 ;启动定时器HERE: LCALL DISPLAY ;调用显示JB P3.7,LOOP3 ;判断高低,即KEY1按键是否按下CLR TR0 ;按下,关闭定时器,这里并没有消抖LJMP LOOP1 ;等待KEY0的按下LOOP3: SJMP HERE ;KEY1没有按下,就需显示LOOP: LCALL DISPLAY ;KEY1没有按下,就需显示LJMP LOOP1;************************************************; 减10ms子程序;************************************************SUB1: DEC 30H ;百分位减1MOV A,30HCJNE A,#0FFH,LOOP2 ;判断百分位减到0之后是否再减1 MOV 30H,#09 ;是,装入初值9DEC 31H ;十分位减1MOV A,31HCJNE A,#0FFH,LOOP2 ;判断十分位减到0之后是否再减1 MOV 31H,#09DEC 32HMOV A,32HCJNE A,#0FFH,LOOP2MOV 32H,#09DEC 33HMOV A,33HCJNE A,#0FFH,LOOP2CLR P2.3 ;从99s减到0s后,驱动蜂鸣器 LCALL DELAY ;延时LCALL DELAYSETB P2.3 ;关闭蜂鸣器MOV 33H,#09 ;装入初值99sMOV 32H,#09MOV 31H,#00MOV 30H,#00LOOP2: NOP ;空指令RET ;返回;************************************************; 显示子程序;************************************************ DISPLAY: MOV DPTR,#TAB ;赋表首地址;选定片选数码管MOV A,#0FBHSETB P2.7MOV P0,A ;点亮最左边的数码管CLR P2.7XCH A,R0 ;暂存A的值;输出显示数据MOV A,33HMOVC A,A+DPTR ;根据表值查找所需的值SETB P2.6MOV P0,A ;显示值CLR P2.6LCALL DELAY ;延时;选择下一显示数码管XCH A,R0 ;恢复原值RL A ;循环左移,为下次做准备SETB P2.7MOV P0,ACLR P2.7XCH A,R0MOV A,32HMOVC A,A+DPTRSETB P2.6MOV P0,ACLR P2.6LCALL DELAYXCH A,R0RL ASETB P2.7MOV P0,ACLR P2.7XCH A,R0MOV A,31HMOVC A,A+DPTR SETB P2.6MOV P0,ACLR P2.6LCALL DELAYXCH A,R0RL ASETB P2.7MOV P0,ACLR P2.7XCH A,R0MOV A,30HMOVC A,A+DPTR SETB P2.6MOV P0,ACLR P2.6LCALL DELAYRET;************************************************; 数码管显示的数值;************************************************TAB: DB 0EDH,48H,0F4H,0B5H,99HDB 3DH,7DH,85H,0FDH,0BDH,0DDH,79H,6CH,0F1H,7CH,5CHIT00: MOV TH0,#0D8H ;装入初值10msMOV TL0,#0F0HLCALL SUB1 ;减10msRETI ;返回;************************************************;延时子程序,时间大约为:2us*10*250;************************************************DELAY: MOV R7,#10DEL2: MOV R6,#250DEL1: DJNZ R6,DEL1DJNZ R7,DEL2RETEND ;结束6.调试运行1. 接硬件图连线,为了确保四位数码管能够对应显示。

实验时,对P0口的接线做了调整。

即:P0.0接L1,P0.1接L2,P0.2接L3,P0.3接L4。

2. 从0030H单元开始连续运行,观察四个数码管显示情况是否与预期的结果一致。

如果不一致,则单步运行或断点运行进行调试,直至满足设计要求。

3. 整体运行,观察数码管显示是否符合要求。

如果不符合,则再调试,直至满足要求。

7.个人体会通过本次课程设计,我深深的体会到了作为一个硬件工程师的艰辛。

即使做一个小小的项目,都需要这么多的辛苦,必须考虑到问题的任何一个细节,否则最后也将是功败垂成。

原理图设计: 当我们选取了这样一个题目,我们就开始收集相关的各种资料,对题目有个大致的了解,规划一下设计的任务将要完成哪些功能。

然后就具体的每一项功能应该怎样具体的设计,例如用什么方法完成这一功能,这种想法是否合理。

经过长时间的查阅资料、思索、推敲,最后定出了这次设计的原理图。

编程调试:此次设计的编程,难点在于对LED数码管显示程序的编写,由于对AT89C51的工作原理不是很熟悉,所以一开始摸不着头脑。

看参考教材、上网查阅其相关资料,对AT89C51的工作原理有个大致的了解后,程序的编写也初见端倪了,所以花在编此段程序的时间最长;中断程序的编写也是常规的编写。

在整个程序的编写过程中,研究每个子程序是否好使,我是通过KeilC和proteus两个软件来实现的。

Proteus是一个单片机的仿真软件,发现它之后真的很受用,通过它可以不用连接硬件就能检查程序是否好使。

Keil C则帮助我检查程序是否存在语法错误之类的问题,还可以生成hex 文件,供proteus软件仿真使用。

通过这两个软件,我们把整个的程序调试正确。

通过上面的这个步骤,把程序调试好,接下来就是真正的硬件连接调试了。

程序既然已经在仿真的软件上通过认证,如果连接上硬件不好使的话,说明在硬件上某个部分存在一定的问题。

这点得到了验证:硬件模拟的时候,紧急情况用的开关有一个不好使,按下的时候没有反应。

相关主题