光电0905邵亚云演讲定时器.docx
- 文档编号:26540332
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:37
- 大小:438.04KB
光电0905邵亚云演讲定时器.docx
《光电0905邵亚云演讲定时器.docx》由会员分享,可在线阅读,更多相关《光电0905邵亚云演讲定时器.docx(37页珍藏版)》请在冰豆网上搜索。
光电0905邵亚云演讲定时器
《开放式单片机应用系统专题设计》
专题名称:
演讲定时器
班级:
光电0905班
姓名:
邵亚云
学号:
U200913045
指导教师:
曹丹华
一、任务要求
演讲定时器
1、记时精度为1秒。
2、可通过键盘设置规定讲演时间。
3、有启动键、停止键。
4、时间过半时有声音提示。
(1秒)
5、正常讲演时绿灯每隔3秒闪烁一次。
6、讲演结束前一分钟有声音提示,同时指示灯由绿灯变为黄灯,且闪烁频率不断加快,到达定时时间蜂鸣器长鸣一声(2秒)。
二、功能特点与使用说明
功能特点:
这是一个演讲定时器,其主要功能是定时。
设定一个初始时间,当输入时间不符合格式要求时会报错。
开始后进行倒计时,以一秒为一个最小单位。
在剩余时间多于一分钟时绿色跑马灯以三秒为一个周期变换着亮,以提示时间还充足。
当剩余时间少于一分钟时,跑马灯不再变化,转而黄灯开始闪并且频率越来越快以告诉演讲者时间已经剩余不多。
在响铃方面,当时间过半时,又一次长一秒的蜂鸣;当还剩余一分钟的时候,也有一个长达一秒的响铃;最后结束时有一个长达两秒钟的蜂鸣。
在演讲过程中可以通过KINT键来控制倒计时的进行或者停止。
使用说明:
开始时,需要设定演讲时间,按下四个键后数码管即显示当前值,注意格式要正确,否则蜂鸣器响不停且报错。
设定完初始值之后要按下KINT键,定时开始,再看下KINT键则定时暂停,如此往复。
在执行的任何时候,按下复位键则所有全部归零,从头开始。
三、方案设计
设计思路
这是一个演讲定时器,所以要设计一个可以输入初始数据的倒计时模式,演讲以一秒为单位就足够精确,因此需要有一个定时器。
由于在定时的同时,数码管要不断显示,所以这个定时器应该设计成一个定时器中断。
考虑到定时器的最大定时时间也远不能达到一秒,因此必须要有一个循环来实现。
综上考虑,我选择定时器2,它可以自动装载初值,并且定时时间可以达到尽量大。
由于需要由KINT键控制计时的开始和暂停,所以需要一个外部中断,这个外部中断可以打开和关闭定时器。
在跑马灯方面,需要三秒亮一次,所以可以放在定时器2中断中执行,只要三秒一个周期就可以了,花样可以自己设计。
由于要求黄灯以一个变化的频率亮,所以就不能将其放在定时器2的中断执行中,要另外开一个定时器,这里设定为定时器0。
这样,总结起来:
需要一个外部中断0,以控制计时的开始和暂停;定时器2,秒倒计时并控制跑马灯闪烁以及蜂鸣器的开和关;定时器0,控制黄灯的频率变化闪烁。
分析与计算
定时器2:
定时器2可以自动赋初值。
设定一次循环25ms,循环40次,即可得到1s,计算得初值389EH,这里是有误差的,但是经过计算,六分钟的误差不超过一秒,因此对于一个演讲定时器来说是足够精确的。
定时器0:
定时器0仅仅控制黄灯的闪动,在定时方面,让它一个循环定时最大,初值直接全0,这样它的一个周期有30多毫秒。
经过秒值的循环可以达到不同频率闪动的要求。
资源分配:
R0为数据指针,指向存放四个数码管显示数字的地址
R1存放T0定时器的循环次数
R2、R3为键盘寄存器的初值
R4为定时器2循环次数
R6为跑马灯计数的值,跑马灯三秒一个周期
R7为跑马灯的花样
20H、21H两个单元存放分和秒的数值
22H-25H依次存放四个数码管最高到最低位的数值
50H存放一个循环次数
51H、52H存放行列值以计算
四、流程图
本演讲定时器采用了多个中断,因此需要用一个主程序流程图和多个流程图来反映其中的过程。
以下是一个主程序流程图和九个子程序的详细流程图
图1、主程序流程图
图2、按键键盘程序
图3、正常显示程序
图4、错误显示程序
图5、外部中断0(KINT键)程序流程图
图6、T2定时器中断程序
图7、过半响铃子程序
图8.一分钟提醒子程序
图9、结束相邻子程序
图10、T0定时器中断程序
源程序
以下为可以在KEILC上硬件访问并正确运行的程序代码
//Filename:
演讲定时器
//Description:
1、记时精度为1秒。
//2、可通过键盘设置规定讲演时间。
若有输入错误则报错
//3、有启动键、停止键
//4、时间过半时有声音提示。
(1秒)
//5、正常讲演时绿灯每隔3秒闪烁一次。
//6、讲演结束前一分钟有声音提示,同时指示灯由绿灯变为黄灯,且闪烁频率不断加快,到达定时时间蜂鸣器长鸣一声(2秒)。
//Date:
2011,11.11
//Designedby:
邵亚云光电0905U200913045
//Sourceused:
R0为数据指针,指向存放四个数码管显示数字的地址
//R1存放T0定时器的循环次数
//R2、R3为键盘寄存器的初值
//R4为定时器2循环次数
//R6为跑马灯计数的值,跑马灯三秒一个周期
//R7为跑马灯的花样
//20H、21H两个单元存放分和秒的数值
//22H-25H依次存放四个数码管最高到最低位的数值
//50H存放一个循环次数
//51H、52H存放行列值以计算
;------------------------------------
;-GeneratedInitializationFile--
;------------------------------------
$include(C8051F310.inc)
MINITEQU20H;分地址
SECNDEQU21H;秒地址
MINIT1EQU22H;分的十位地址
MINIT2EQU23H;分的个位地址
SECND1EQU24H;秒的十位地址
SECND2EQU25H;秒的个位地址
HALFMEQU26H;分的一半地址
HALFSEQU27H;秒的一半地址
XUNHEQU50H;一个循环数所在的地址
KEYP1EQU51H;按键行地址
KEYP2EQU52H;按键列地址
KEYBITP0.1;KINT按键位
LEDDATBITP3.3;跑马灯数据输入位
LEDCLKBITP3.4;跑马灯时钟
ORG0000H;开始
AJMPSTART;跳至主程序
ORG0003H;外部中断0入口
LJMPKINT;跳至KINT中断
ORG000BH;定时器0中断入口
LJMPT0INTR;跳至定时器0
ORG002BH;定时器2中断入口
LJMPT2INTR;跳至定时器2
ORG0100H
START:
;开始
LCALLInit_Device;硬件设备
CLRP3.1;关闭蜂鸣器
MOVR0,#22H;R0指针赋初值
MOVR2,#00H;键盘寄存器R2赋初值
MOVR3,#00H;键盘寄存器R3赋初值
MOVR4,#28H;定时器2循环次数赋初值
MOVR6,#00H;赋初值
MOVR7,#0AAH;跑马灯寄存器R7赋初值
MOVXUNH,#04H;为循环次数赋初值
MOVSP,#40H;堆栈起始位
MOVTMOD,#01H;T0定时器工作方式1
MOVTH0,#00H;T0赋初值
MOVTL0,#00H
MOVTMR2RLH,#38H;定时器2高位初值
MOVTMR2RLL,#9EH;定时器2低位初值
SETBET0;开启定时器0的中断控制
SETBET2;开启定时器2的中断控制
SETBEX0;开启外部中断0
MOVIT01CF,#01H
SETBEA;开启总中断
//--------KEYENTER--------------------------------
KSTART:
;键盘按键
MOVP2,#0F0H;将一个初值赋给P2端,列全为1
LCALLDEL4MS;延时4ms
MOVA,P2;再将P2端口的值取出
CJNEA,#0F0H,NEXT;判断,若取出数有变化则跳至下个判断
SJMPKSTART;若没有变化则调回
NEXT:
;下一步判断
MOVP2,#0F0H;再将上述操作重复,目的是判断是否确实有按;键按下
LCALLDEL4MS;延时4ms
MOVA,P2;取数
CJNEA,#0F0H,SAVE;确实有,则要开始进行保存按键信息
SJMPKSTART;没有,就跳回开始键盘按键
SAVE:
;保存数据阶段
MOVKEYP1,A;将刚才取出的数存入KEYP1中
MOVP2,#0FH;再将一个初值赋给P2端,行全为1
LCALLDEL4MS;延时4ms
MOVA,P2;再将数取出
MOVKEYP2,A;并将取出的数存入KEYP2中
KEND:
;键盘按键结束阶段
LCALLDEL4MS;延时4ms
MOVP2,#0F0H
LCALLDEL4MS;延时4ms
MOVA,P2
CJNEA,#0F0H,KEND
MOVP2,#0F0H
LCALLDEL4MS;延时4ms
MOVA,P2
CJNEA,#0F0H,KEND
MOVA,KEYP2
HERE1:
RRCA;带进位的右移,将唯一的一个0找出
INCR2;R2值加一
JCHERE1;若没有到那个1,再右移一次
DECR2;最后减一
MOVA,KEYP1
SWAPA;将A的高低位交换以便
HERE2:
RRCA;进行前述相同的操作
INCR3
JCHERE2
DECR3
MOVA,R3;接下来就是按键值的计算
RLA;乘二
RLA;再乘二
ADDA,R2;将它们相加即得按键值
MOV@R0,A;将其存入指针所指向的分十位地址单元中
INCR0;将指针加一
MOVR2,#00H;将两个寄存器的初值归零
MOVR3,#00H
DJNZXUNH,KSTART;判断要求循环的四次到了没有,没有的话再继续等待键盘按键
MOVA,MINIT1;四次循环之后计算出分和秒的值
MOVB,#10;十位乘以十加上个位即为分值
MULAB
ADDA,MINIT2
MOVMINIT,A;最后将分值存入分地址单元中
;
MOVA,SECND1;秒也进行同样的操作
MOVB,#10
MULAB
ADDA,SECND2
MOVSECND,A;将值存入秒地址单元中
CJNEA,#60,JUDGE;但是要进行的另一个判断,就是输入的秒值
;大于60是不正确的输入,要舍去
JUDGE:
JCGOON;若秒值小于60,则可以继续运行
LJMPDISP2;否则跳至错误显示段
GOON:
;以下是为了求得输入时间的一半所做的操作
MOVA,MINIT
MOVB,#2
DIVAB;分值除以2
MOVHALFM,A;此即得分值的一半
MOVA,#30
MULAB;余数乘以30
MOVHALFS,A
MOVA,SECND
MOVB,#2
DIVAB;分值除以2
ADDA,HALFS;和上述秒值相加即得
MOVHALFS,A;此即得秒值的一半
//---------DISPLAY--------------------------------------
DISP1:
;以下为数码管显示程序段
MOVDPTR,#TAB1;进行查表
MOVA,MINIT;将分值赋给A
MOVB,#10
DIVAB;将A除以10
MOVCA,@A+DPTR;查表
SETBP0.7;将数码管的最高位点亮
SETBP0.6
MOVP1,A;A即为分的十位
LCALLDEL05MS;延时0.5ms以使数码管亮
MOVA,B;B则为分的个位
MOVCA,@A+DPTR;查表
SETBP0.7;将数码管的第二位点亮
CLRP0.6
INCA;将分和秒之间的小数点加上
MOVP1,A;A即为分的个位
LCALLDEL05MS;延时0.5ms以使数码管亮
MOVA,SECND
MOVB,#10
DIVAB
MOVCA,@A+DPTR;查表
SETBP0.6;将数码管的第三位点亮
CLRP0.7
MOVP1,A;A即为秒的十位
LCALLDEL05MS;延时0.5ms以使数码管亮
MOVA,B
MOVCA,@A+DPTR;查表
CLRP0.7;将数码管的最低位点亮
CLRP0.6
MOVP1,A;A即为秒的个位
LCALLDEL05MS;延时0.5ms以使数码管亮
MOVA,MINIT
CJNEA,#0,BACK
MOVA,SECND
CJNEA,#0,BACK
TAB1:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H
BACK:
LJMPDISP1
DISP2:
;以下为错误显示程序段
SETBP3.1;开启蜂鸣器以警告
MOVDPTR,#TAB2
MOVA,#00H;为A赋初值
MOVCA,@A+DPTR;查表
SETBP0.7
SETBP0.6
MOVP1,A;显示C
LCALLDEL05MS;延时0.5ms以使数码管亮
MOVA,#01H
MOVCA,@A+DPTR
SETBP0.7
CLRP0.6
MOVP1,A;显示U
LCALLDEL05MS;延时0.5ms以使数码管亮
MOVA,#02H
MOVCA,@A+DPTR
CLRP0.7
SETBP0.6
MOVP1,A;显示O。
即,显示CUO,错误输入
LCALLDEL05MS;延时0.5ms以使数码管亮
TAB2:
DB9CH,7CH,0FCH
LJMPDISP2
//--------KINTINTERRUPT------------------
KINT:
;以下为KINT按键中断程序段
JNBKEY,K3;判断是否有按键按下,若没有,则跳回
JBF0,K1;若有,判断标志位是否为一,是则跳至K1
SETBTR2;开启T2定时器
SETBF0;标志位置一
AJMPK2;跳至K2
K1:
CPLTR2;对TR2取反,以开启或者关闭定时器2
CPLTR0
K2:
JBKEY,K3;再次判断是否有按键,没有则返回
AJMPK2;否则一直保持
K3:
RETI;返回
//-------TIMER2INTERRUPT------------------------------
//-------INCLUDELIGHTANDRING------------------------
T2INTR:
;T2定时器中断程序段
CLRTF2H;溢出标志位清零
DJNZR4,TIAO;判断R4是否已经减为一,若没有则跳至返回
MOVR4,#28H;若有,则再次对其赋值,为下一次循环做准备
MOVA,SECND;将秒值赋给A
CJNEA,#00,JIANYI;判断秒值是否为0,若不是,则直接跳至减一操作
MOVA,#60;若是,则要将60赋给秒值
MOVSECND,A
DECMINIT;并对分进行减一操作
JIANYI:
DECA;直接减一
MOVSECND,A
SJMPLIGHT;并跳至绿灯模式
TIAO:
LJMPRETURN;这可以认为是一个跳板
LIGHT:
;以下是要判断跑马灯是否是时候亮
MOVA,MINIT;将分值赋给A
CJNEA,#00,GREEN;若还是在一分时间以上则可以进行跑马灯
CLRP0.0;否则就将黄灯点亮
SETBTR0;并将TO定时器打开
SJMPRING;此时要跳至响铃程序段
GREEN:
;跑马灯闪烁程序段
INCR6;加一操作
CJNER6,#03H,RING;若未加到3则不进行跑马灯闪烁
CLRLEDCLK;将时钟信号变为低电平
MOVA,R7;将初值赋给A
RLA;左移
MOVR7,A;再将A值存入寄存器中
MOVC,ACC.7;并将最高位给C
MOVLEDDAT,C;此时即可将C输入跑马灯数据输入端
SETBLEDCLK;给一个高电平使时钟信号有一个由低向高的跳变
MOVR6,#00H;将计数标志寄存器清零
RING:
LCALLRING1;调用过半响铃子程序
LCALLRING2;调用一分钟提醒子程序
LCALLRING3;调用结束响铃子程序
RETURN:
RETI;返回
T0INTR:
MOVTH0,#00H;T0赋初值
MOVTL0,#00H
DJNZR1,RETURN2;将R1减一,判断R1是否为0,若不为0则返回
MOVR1,SECND;为0,则将R1再次赋初值
CPLP0.0;开黄灯
RETURN2:
RETI
//----------RING-------------------------------
RING1:
;过半响铃子程序
MOVA,HALFM;将分的一半赋给A
CJNEA,MINIT,RETURN;判断是否已经到分的一半时间,若没有,则返回
MOVA,HALFS;将秒的一半赋给A
CJNEA,SECND,RETURN;判断是否已经到秒的一半时间,若没有,则返回
SETBP3.1;到时间则响铃
LCALLDEL1S;延时一秒
CPLP3.1;关闭响铃
RET;返回
RING2:
;一分钟提醒子程序
MOVA,MINIT
CJNEA,#01,RETURN;判断是否到一分,若没有,则返回
MOVA,SECND
CJNEA,#00,RETURN;判断是否到0秒,若没有,则返回
SETBP3.1;到时间则响铃
LCALLDEL1S;延时一秒
CPLP3.1;关闭响铃
RET
RING3:
;结束响铃子程序
MOVA,MINIT
CJNEA,#00,RETURN;判断是否到0分,若没有,则返回
MOVA,SECND
CJNEA,#00H,RETURN;判断是否到0秒,若没有,则返回
SETBP3.1;到时间则响铃
LCALLDEL1S;延时两秒
LCALLDEL1S
CPLP3.1;关闭响铃
//--------CLEAR-----------------------
CLEAR:
;以下为到时间后的清零程序段
MOVMINIT,#00H;当分到达0
MOVSECND,#00H;秒也到达0时
MOVA,#00H;将A赋值为0
MOVCA,@A+DPTR;查表
CLRP0.7;数码管显示最后一位
CLRP0.6
INCA;显示小数点
MOVP1,A;显示0
SETBP0.0
SJMPCLEAR;并在这里循环
RET;返回
//---------DELEY----------------------------------
DEL4MS:
MOV30H,#0BH;延时4ms
DL1:
MOV32H,#04H
DL0:
M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 光电 0905 邵亚云 演讲 定时器