答辩用计时器河北工程大学.docx
《答辩用计时器河北工程大学.docx》由会员分享,可在线阅读,更多相关《答辩用计时器河北工程大学.docx(22页珍藏版)》请在冰点文库上搜索。
![答辩用计时器河北工程大学.docx](https://file1.bingdoc.com/fileroot1/2023-7/22/864c7355-4e9a-4e7f-8c3e-2fd5db63d137/864c7355-4e9a-4e7f-8c3e-2fd5db63d1371.gif)
答辩用计时器河北工程大学
信息与电气工程学院
课程设计说明书
(2013/2014学年第2学期)
课程名称:
单片机课程设计
题目:
答辩用计时器设计
专业:
电气工程及其自动化
班级:
电气1104
姓名:
学号:
指导教师:
设计周数:
2周
设计成绩:
2014年6月20日
目录
一、课程设计任务简介3
1.1目的:
3
1.2主要任务3
1.3技术要求4
二、设计方案4
2.1硬件设计4
2.2软件方案5
三、系统硬件设计5
3.1最小系统电路5
3.2显示电路6
3.3声光电路6
3.4按键电路7
四、系统软件设计8
4.1、主程序8
4.2、显示程序8
4.3、按键扫描程序8
4.4、按键处理程序8
4.5、定时中断服务程序8
五、系统调试8
5.1静态调试8
5.2动态调试9
5.3软件调试9
5.4调试结果10
附录一、原理图12
附录二、PCB图13
附录三、程序清单14
一、课程设计任务简介
1.1目的:
(1)了解倒计时计时器的原理,从而学会制作答辩用计时器。
(2)通过答辩用计时器的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及使用方法。
(3)学习与掌握各种组合逻辑电路与时序电路的原理与使用方法。
1.2主要任务
(1)4位数码管用于显示分十位、分个位;秒十位、秒个位;
(2)调节键、加一键、减一键、开始键;
(3)蜂鸣器及红色发光二极管。
要求:
上电时,显示为10:
00,一旦运行开始,蜂鸣器不响,发光二极管不亮。
经过一秒刷新数据,仅有“开始”键有效。
根据“调节”键按下的次数,分别用于调整分十位、分个位、秒十位。
按下“加一”或“减一”键是针对具体调节对象进行数据修改。
奇数次按下“开始”键,从当前显示数据开始倒计时,偶数次按下“开始”键,暂停计时,且保持显示数据不变。
当定时结束时,以一定频率驱动蜂鸣器,并使发光二极管发光。
1.3技术要求
(1)熟练应用protel绘制原理图和pcb图。
(2)掌握数码管显示相关电路和程序。
(3)单片机中断程序设计。
二、设计方案
2.1硬件设计
根据设计的要求可知,系统的硬件原理框图如图所示。
图2.1系统的硬件原理框图
2.2软件方案
根据设计要求,程序框图如图所示。
软件可由汇编语言完成,也可由C语言完成。
软件设计可以分为以下几个功能模块:
主程序:
初始化、数码管显示、按键扫描和按键处理。
定时中断程序:
完成对一秒的定时。
三、系统硬件设计
3.1最小系统电路
该板作为课程设计的核心电路板使用,板上有单片机及附属电路,RS-232通信驱动电路,高低电平测试电路等。
课程设计电路中需要的其他电路在此基础上扩展,通过插孔连接。
扩展电路在万用板上制作。
3.2显示电路
如上图所示,由四个共阳数码管来实现倒计时。
由于P0口输出电流小,需外接上拉电阻,公共端通过三极管驱动接到P1口的P1.0、P1.1、P1.2、P1.3口用单片机来控制其片选。
3.3声光电路
因为课题要求定时结束时LED蜂鸣器同时工作来声光报警,鉴于单片机P1口带负载能力有限,我们选择了PNP三极管9012作为驱动,同时又为了给LED限流,我们又串入了电阻,这样可以达到理想的结果。
3.4按键电路
按键按下后低电平读入p1口,接上拉电阻,确护芯片正常工作,控制电流的大小。
四、系统软件设计
4.1、主程序
主程序的设计包括:
初始化子程序,中断初始化子程序,有关内存单元及相关部件的初始化和一些子程序调用等等。
初始化子程序:
为显示缓冲区写入10:
00
中断初始化子程序:
为定时器赋初值,开中断。
4.2、显示程序
显示程序:
将显示缓冲区中的4位BCD码用动态扫描方式扫描显示。
4.3、按键扫描程序
按键扫描程序:
循环检测开始键和调节键是否按下并记录键值
4.4、按键处理程序
按键处理程序:
根据按键扫描得到的键值进行相关运算,再根据结果进行相应处理。
4.5、定时中断服务程序
定时中断服务程序:
进行计时操作,完成一秒的定时。
定时器0每隔50ms溢出中断一次,则循环中断20次延时时间为1秒,上述过程重复60次为1分钟,分计时60次为1小时。
五、系统调试
5.1静态调试
静态调试是在用户系统未工作时的一种硬件检测。
第一步:
目测。
检查外部的各种元件或者是电路是否有断点。
第二步:
用万用表测试。
先用万用表复核目测中有疑问的连接点,再检测各种电源线与地线之间是否有短路现象。
第三步:
加电检测。
给板加电,检测所有插座或是器件的电源端是否符合要求的值
第四步:
联机检查。
因为只有用单片机开发系统才能完成对用户系统的调试。
5.2动态调试
动态调试:
是在用户系统工作的情况下发现和排除用户系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。
动态调试的一般方法是由近及远、由分到合。
由分到合是指首先按逻辑功能将用户系统硬件电路分为若干块,当调试电路时,与该元件无关的器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上。
当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。
由分到合的调试既告完成。
由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及远的分层,然后分层调试。
调试时,采用去掉无关元件的方法,逐层调试下去,就定位故障元件了。
5.3软件调试
软件调试:
是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
可以利用仿真器加以调试,对系统单个单元进行调试,当单元电路成功后,在对整个程序调试,最后在用CPU芯片调试。
5.4调试结果
开始运行
上电时刻
开始运行
计时结束
附录一、原理图
附录二、PCB图
附录三、程序清单
DISPBUFEQU40H;定义显示缓冲区
TIME_COUNTEQU44H;定义定时器计数单元
K1BITP2.0;开始键
K2BITP2.1;调节键
K3BITP2.2;加一键
K4BITP2.3;减一键
K1_NUMEQU45H;开始键键值
K2_NUMEQU46H;调节键键值
ORG0000H
AJMPMAIN
ORG000BH;定时中断入口地址
AJMPTIME_0;进入定时中断服务子程序
ORG0030H
MAIN:
MOVP1,#0FFH;P1口置一
CLRP2.4;开数码管中间小灯,作为时间指示灯
MOVK1_NUM,#0;开始键键值清零
MOVK2_NUM,#0;调节键键值清零
MOV47H,#200;为47H单元赋值
LCALLINIT_0;调用定时中断初始化子程序
LCALLINIT_DATA;调用数据初始化子程序
LOOP:
LCALLDISP;调用显示子程序
LCALLKEY_SCAN;调用按键扫描子程序
LCALLKEY_PROC;调用按键处理子程序
MOVA,DISPBUF;判断计时是否结束
CJNEA,#0,NEXT_6
MOVA,DISPBUF+1
CJNEA,#0,NEXT_6
MOVA,DISPBUF+2
CJNEA,#0,NEXT_6
MOVA,DISPBUF+3
CJNEA,#0,NEXT_6
CLRTR0;结束,关定时0
LOOP1:
LCALLDISP_GOOD;调用显示GOOD子程序
LCALLBEEP_ONE;调用蜂鸣器子程序
SETBP2.4;关时间指示灯
CLRP2.6;点亮计时结束指示灯
DJNZ47H,LOOP1
AJMPMAIN;循环
NEXT_6:
AJMPLOOP
;以下是按键扫描子程序
KEY_SCAN:
JBK1,NEXT_7;判断开始键是否按下,没有跳转
LCALLDL_10MS;按下,消抖
JNBK1,$
INCK1_NUM;开始键键值加一
AJMPKEY_SCAN;继续扫描
NEXT_7:
JBK2,NEXT_8;判断调节是否按下,没有跳转
LCALLDL_10MS;按下,消抖
JNBK2,$
INCK2_NUM;调节键键值加一
AJMPKEY_SCAN;继续扫描
NEXT_8:
RET;返回
;以下是按键处理子程序
KEY_PROC:
MOVA,K1_NUM;判断开始键键值是奇数还是偶数
MOVB,#2
DIVAB
MOVA,B
CJNEA,#0,NEXT_9;奇数跳转,偶数顺序执行
CLRTR0;关定时器
AJMPTZ;跳转至按键调整
NEXT_9:
SETBTR0;开定时器
AJMPPROC_EXIT;退出按键处理
TZ:
MOVA,K2_NUM;根据调节键键值做出不同处理
CJNEA,#1,TZ_FENGE;调节键键值等于1,调秒的十位
TZ_MSHI:
JBK3,TZ_SUB_MSHI;是否加一,不是跳转
LCALLDL_10MS;按下,消抖
JNBK3,$
INCDISPBUF+2;秒十位加一
MOVA,DISPBUF+2;是否超过5
CJNEA,#6,TZ_MSHI;超过清零,没有继续扫描
MOVDISPBUF+2,#0
AJMPTZ_MSHI
TZ_SUB_MSHI:
JBK4,PROC_EXIT;是否减一,不是跳转
LCALLDL_10MS;按下,消抖
JNBK4,$
DECDISPBUF+2;秒十位减一
MOVA,DISPBUF+2;是否减到0
CJNEA,#0FFH,TZ_MSHI;减到0,为秒十位赋5,没有继续扫描
MOVDISPBUF+2,#5
AJMPTZ_MSHI
TZ_FENGE:
CJNEA,#2,TZ_FENGSHI
JBK3,TZ_SUB_FENGE
LCALLDL_10MS
JNBK3,$
INCDISPBUF+1
MOVR0,DISPBUF+1
CJNER0,#0AH,TZ_FENGE
MOVDISPBUF+1,#0
AJMPTZ_FENGE
TZ_SUB_FENGE:
JBK4,PROC_EXIT
LCALLDL_10MS
JNBK4,$
DECDISPBUF+1
MOVR0,DISPBUF+1
CJNER0,#0FFH,TZ_FENGE
MOVDISPBUF+1,#9
AJMPTZ_FENGE
TZ_FENGSHI:
CJNEA,#3,NEXT_10
JBK3,TZ_SUB_FENGSHI
LCALLDL_10MS
JNBK3,$
INCDISPBUF
MOVR0,DISPBUF
CJNER0,#0AH,TZ_FENGSHI
MOVDISPBUF,#0
AJMPTZ_FENGSHI
TZ_SUB_FENGSHI:
JBK4,PROC_EXIT
LCALLDL_10MS
JNBK4,$
DECDISPBUF
MOVR0,DISPBUF
CJNER0,#0FFH,TZ_FENGSHI
MOVDISPBUF,#9
AJMPTZ_FENGSHI
NEXT_10:
CJNEA,#4,PROC_EXIT;若调节键键值超过3,给键值赋一
MOVK2_NUM,#1
PROC_EXIT:
RET;返回
;以下是定时器中断服务子程序
TIME_0:
PUSHACC;保存数据
PUSHPSW
MOVTH0,#4BH;重新赋初值
MOVTL0,#6AH
DJNZTIME_COUNT,TIME_EXIT;一秒到了吗
MOVA,DISPBUF+3;秒个位减一
CJNEA,#0,NEXT;判断秒个位是否为0
MOVDISPBUF+3,#9;为0,给秒个位赋9
MOVA,DISPBUF+2
CJNEA,#0,NEXT_1;判断秒十位是否为0
MOVDISPBUF+2,#5;为0,给秒十位赋5
MOVA,DISPBUF+1
CJNEA,#0,NEXT_4;判断分个位是否为0
MOVDISPBUF+1,#9;为0,给分个位赋9
MOVA,DISPBUF
CJNEA,#0,NEXT_5;判断分十位是否为0
AJMPEXIT_1;为0,跳转
NEXT:
DECDISPBUF+3;不为0,秒个位减一
AJMPEXIT_1
NEXT_1:
DECDISPBUF+2;不为0,秒十位减一
AJMPEXIT_1
NEXT_4:
DECDISPBUF+1;不为0,分个位减一
AJMPEXIT_1
NEXT_5:
DECDISPBUF;不为0,分十位减一
AJMPEXIT_1
EXIT_1:
MOVTIME_COUNT,#20;重新为定时器计数单元赋值
TIME_EXIT:
POPPSW
POPACC
RETI
;以下是显示子程序
DISP:
MOVDPTR,#TAB;数据首地址给DPTR
MOVA,DISPBUF;取显示分十位数
MOVCA,@A+DPTR
MOVP0,A;发给P0
CLRP1.0;开分十位
LCALLDL_2MS;延时
SETBP1.0;关分十位
MOVA,DISPBUF+1;取显示分个位数
MOVCA,@A+DPTR
MOVP0,A
CLRP1.1
LCALLDL_2MS
SETBP1.1
MOVA,DISPBUF+2;取显示秒十位数
MOVCA,@A+DPTR
MOVP0,A
CLRP1.2
LCALLDL_2MS
SETBP1.2
MOVA,DISPBUF+3;取显示秒个位数
MOVCA,@A+DPTR
MOVP0,A
CLRP1.3
LCALLDL_2MS
SETBP1.3
RET
;以下是显示GOOD子程序
DISP_GOOD:
MOVDPTR,#TAB
MOVA,#9
MOVCA,@A+DPTR
MOVP0,A
CLRP1.0
LCALLDL_2MS
SETBP1.0
MOVA,#0
MOVCA,@A+DPTR
MOVP0,A
CLRP1.1
LCALLDL_2MS
SETBP1.1
MOVA,#0
MOVCA,@A+DPTR
MOVP0,A
CLRP1.2
LCALLDL_2MS
SETBP1.2
MOVA,#10
MOVCA,@A+DPTR
MOVP0,A
CLRP1.3
LCALLDL_2MS
SETBP1.3
RET
;以下是数据初始化子程序
INIT_DATA:
MOVDISPBUF,#01H;上电显示10:
00
MOVDISPBUF+1,#00H
MOVDISPBUF+2,#00H
MOVDISPBUF+3,#00H
RET
;以下是定时器初始化子程序
INIT_0:
MOVTIME_COUNT,#20;为定时计数值赋20
MOVTMOD,#01H;定时器T0,方式1
MOVTH0,#4BH;定时50MS赋初值
MOVTL0,#6AH
SETBEA;开中断
SETBET0;开定时器T0中断
RET
;以下是蜂鸣器响一声子程序
BEEP_ONE:
CLRP2.7;开蜂鸣器
ACALLDL_2MS;延时2ms
SETBP2.7;关蜂鸣器
ACALLDL_2MS;延时2ms
RET
;以下是2ms延时子程序
DL_2MS:
MOVR5,#050H
DL2MS0:
MOVR6,#0BH
DJNZR6,$
DJNZR5,DL2MS0
RET
;以下是2ms延时子程序
DL_10MS:
MOVR5,#065H
DL10MS0:
MOVR6,#030H
DJNZR6,$
DJNZR5,DL10MS0
RET
;共阳数码管显示表
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0A1HEND