多功能计时器的设计.docx
《多功能计时器的设计.docx》由会员分享,可在线阅读,更多相关《多功能计时器的设计.docx(22页珍藏版)》请在冰豆网上搜索。
多功能计时器的设计
一.设计要求:
(1)任务
设计并制作一个可以完成足球、篮球比赛及其他用处途的多用计时装置。
(2)设计要求
1)基本要求
1LED数码管显示计时结果;
2适用于足球、篮球各种倒计时要求;
3根据比赛要求设置相应的按键;
4电源由外部提供,+5V;
5计时时间到报警。
2)发挥要求
①改用LCD显示;
2增加其他计时功能;
3由6V电池供电(稳压电源提供);
4时间到乐曲报警;
5整体电路效率>60%;
6计时精度1s/h。
二.系统实现:
本系统由软件与硬件仿真电路两部分组成,通过keil与protues联调实现足球、篮球计时的各种要求。
系统由LCD1602显示,七个按键控制开始暂停选择等功能。
硬件仿真电路图
系统设计程序总流程图
三.主要硬件部分设计与选型
LCD1602显示器
为了获得更好的效果本设计并没有采用常见的LED,而是采用了型号为LM016L的LCD。
LCD有LED数码显示更好的更的直观效果,也更加经久耐用。
液晶显示模块体积小功耗低、显示内容丰富,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件之一了。
本LCD是2行16列液晶可显示2行16列英文字符,有8位数据总线D0-D7,RS,R/W,EN三个控制端口(共14线),工作电压为5V。
没背光,和常用的1602B功能和引脚一样(除了调背光的二个线脚).该模块也可以只用D4-D7作为四位数据分两次传送。
这样的话可以节省MCU的I/O口资源。
引脚说明:
VDD:
电源正极,-,通常使用5V电压。
VL:
LCD对比度调节端,电压调节范围为0-5V。
接正电源时对比度最弱,接地电源时对比度最高,但对比度过高时会产生“鬼影”,因此通常使用一个10K的电位器来调整对比度,或者直接串接一个电阻到地。
RS:
MCU写入数据或者指令选择端。
MCU要写入指令时,使RS为低电平;MCU要写入数据时,使RS为高电平。
R/W:
读写控制端。
R/W为高电平时,读取数据;R/W为低电平时,写入数据。
E:
LCD模块使能信号控制端。
写数据时,需要下降沿触发模块。
D0-D7:
8位数据总线,三态双向。
如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4-D7接口传送数据。
BLA:
LED背光正极。
需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右。
BLK:
LED背光地端。
1602液晶模块内部的控制器共有11条控制指令,如表所示:
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
表:
控制命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
1为高电平、0为低电平)
指令1:
清显示,指令码01H,光标复位到地址00H位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
与HD44780相兼容的芯片时序表如下:
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
无
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出
无
表:
基本操作时序表
对于温度显示模块的编写也要了解其时序图,通过时序图,编写相关的驱动程序,实现其相关读写操作,此外,要想要让其显示正确的命令,还要注意其内部相关控制指令。
在本设计中主要用的是写入指令的子程序。
LCD1602的读写时序图
四、主要功能模块程序设计
这里只介绍LCD1602显示程序
本系统使用LCD1602实现显示,只要参照LCD1602的使用手册进行初始化和程序编写就可以显示,即在程序编写中添加LCD1602的驱动程序。
这里的驱动程序主要包括:
初始化函数、设置显示坐标、写字符函数及写字符串函数。
LCD1602的部分读写控制时序程序如下所示:
(1)写命令函数:
向寄存器写入控制字
参数:
A--控制字
W_CMD:
ACALLWAIT;//侧忙碌状态
CLRRW;//写命令时,R/W为低电平
CLRRS;//写入指令。
RS为低电平
SETBE;//置高使能线.
MOVLCD,A;//接收命令字并送到数据总线上
CLRE:
//在使能线的下降沿写入数据
RET
(2)写数据函数:
向寄存器写入数据
参数:
A--待要显示数据
W_DATA:
ACALLWAIT//侧忙碌状态
SETBRS//写数据时,RS为高电平
CLRRW//写入数据。
RW为低电平
SETBE//置高使能线
MOVLCD,A//接收数据并送到数据总线上
CLRE//在使能线的下降沿写入数据
RET
五、功能演示
1、开始界面,此时通过按键选择功能,有篮球赛计时和足球赛计时
2、选择篮球赛后出现下面界面,篮球赛是倒计时。
Period:
01表示第一小节,12:
00表示本节剩余分秒时间,10表示24秒计时时间
3、按下开始按键。
开始倒计时,计时时可以随时暂停,计时和暂停过程中都可以进行24秒复位。
4、第一小节时间结束,时间停止,并且蜂鸣器发出报警声音
5、再按下开始按钮,则进行第二小节计时,第一行小节标志换为02
6、选择足球赛计时功能后显示下面界面,足球赛是正计时。
第一行显示比赛是上半场还是下半场,第二行比赛进行的时间,由于足球赛具有伤停补时时间,而且时间不确定,所以设计extra:
0x。
比赛工程中可用按键extra+extra-进行调节。
7、按下开始键后开始计时。
中间可以暂停开始
8、加时0分钟,45分钟时自动暂停。
加时1分钟,46分钟时自动暂停。
并报警
9、按开始键进行下半场计时。
第一行显示Secondhalf
六、程序实现
RSEQU;写入数据
(1)或指令(0)选择端
RWEQU;读
(1)写(0)控制
EEQU;;使能
LCDEQUP2;LCD数据口
BFEQU;忙标志
BA_FOBIT30H;选择功能标志位,1为篮球赛,0为足球赛
EXTEQU31H;加时赛储存地址
HOUEQU34H;节数,上下半场储存地址
MINEQU35H;分钟储存地址
SECEQU36H;秒储存地址
COUNTEQU3CB0H;T0初值
COUNT1EQU20;20*50Ms=1S
COUNT2EQU37H
DATA_1EQU38H;写数据数据首地址
CMD_1EQU39H;写指令指令首地址
SECCOUNEQU10H;存放20的地址
LEDBUFEQU40H;显示数据(数字)首地址
LCDBUFEQU4AH;显示数据(字符)首地址
ORG0000H
LJMPMAIN
ORG000BH;T0中断入口
LJMPSTIME;调用定时器T0中断服务子程序
MAIN:
MOVSP,#60H;装入固定点显示字母或符号
MOVLCDBUF+0,#0
MOVLCDBUF+1,#1
MOVLCDBUF+2,#2
MOVLCDBUF+3,#3
MOVLCDBUF+4,#4
MOVLCDBUF+5,#5
MOVLCDBUF+6,#6
MOVLCDBUF+7,#7
MOVLCDBUF+8,#8
MOVLCDBUF+9,#9
MOVLCDBUF+10,#10
MOVLCDBUF+11,#11
MOVLCDBUF+12,#12
MOVLCDBUF+13,#13
MOVLCDBUF+14,#14
MOVLCDBUF+15,#15
MOVP1,#0FFH;P1口输出至高电平
SETB;蜂鸣器口
;---------LCD1602初始化-------------------
MOVA,#00000001B;发送清屏操作指令;
CALLW_CMD;调写入指令子程序
MOVA,#00001100B;发送显示开/关控制
ACALLW_CMD;指令,无光标,无闪烁
MOVA,#00011100B;发送光标移动指令
ACALLW_CMD;光标和字一起移动,光标自动右移
MOVA,#00111100B;发送功能设置指令
CALLW_CMD;8位DB,双行,5x7字符
MOVA,HOU;判断第几小节(上下半场
CJNEA,#01,LOP;非01跳转lop判断hou为00还是别的
LOP:
JNCDINGSHI;进位标志为1说明HOU>1比赛小节结束,不显示功能选择界面
MOVHOU,#01;进位标志为0说明HOU<01,为00,比赛刚开始HOU=1并显示功能选择界面
;---------LCD1602初始化结束---------------------
HUAN:
MOVDATA_1,#LCDBUF
MOVCOUNT2,#16;显示字符数为16个
MOVCMD_1,#B;显示从第一行第一个开始
MOVDPTR,#TAB1;装入查表地址,
LCALLDISPLAYLCD;调用显示子程序
MOVDATA_1,#LCDBUF
MOVCOUNT2,#16
MOVCMD_1,#B
MOVDPTR,#TAB2;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
CE:
JNB,BA;功能选择判断,按下为低电平,选择篮球赛计时
JNB,FO;功能选择判断,按下为低电平,选择足球计时
SJMPCE
BA:
SETBBA_FO;选择的篮球赛标志位置1
SJMPDINGSHI
FO:
CLRBA_FO;选择的足球赛标志位置0
;---------T0定时初始化--------------------------
DINGSHI:
MOVA,#00000001B;清屏
CALLW_CMD
MOVLEDBUF+5,#10
MOVTMOD,#01H;设置T0定时,模式1
MOVTH0,#HIGH(COUNT);装入高4位初始值
MOVTL0,#LOW(COUNT);装入低4位初始值
SETBEA;开中断
SETBET0;开T0中断允许位,此时没有启动中断,
MOVSECCOUN,#COUNT1;把数值20放到10H单元中
;---------T0定时初始化结束------------------------
JNBBA_FO,FOOT;查看标志位,选择功能显示
BASKE:
;篮球赛计时显示
MOVMIN,#12;初始化定时时间,分
MOVSEC,#00;秒
MOVEXT,#24;24秒倒计时
MOVDATA_1,#LCDBUF;第一行显示Period:
(小节数)
MOVCOUNT2,#7
MOVCMD_1,#B
MOVDPTR,#TAB5;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
JMP2DIS:
JB,JMP2DIS1;按键则进行24秒复位
JNB,$
MOVEXT,#24
JMP2DIS1:
LCALLMOVBUF1;数据处理
MOVDATA_1,#LEDBUF;第一行第八九个空显示节数
MOVCOUNT2,#2
MOVCMD_1,#B
MOVDPTR,#TAB;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
MOVDATA_1,#LEDBUF+3;第二行从第一个空开始显示分秒数
MOVCOUNT2,#5
MOVCMD_1,#B
MOVDPTR,#TAB;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
MOVDATA_1,#LEDBUF+8;第二行第十十一个空显示24秒倒计时
MOVCOUNT2,#2
MOVCMD_1,#B
MOVDPTR,#TAB;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
JBTR0,JMP2DIS;计时已开始则返回循环显示
JB,$;计时开始按键等待
LCALLBUZZER
SETBTR0;启动计时
LJMPJMP2DIS
FOOT:
MOVMIN,#00
MOVSEC,#00
MOVEXT,#00
MOVA,HOU;判断上下半场
CJNEA,#1,XIA
MOVDATA_1,#LCDBUF;是上半场则第一行显示Firsthalf
MOVCOUNT2,#10
MOVCMD_1,#B
MOVDPTR,#TAB6;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
AJMPextra
XIA:
MOVDATA_1,#LCDBUF;是下半场则第一行显示Secondhalf
MOVCOUNT2,#11
MOVCMD_1,#B
MOVDPTR,#TAB7;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
extra:
MOVDATA_1,#LCDBUF;第二行第八个空开始显示extra:
(加时时间)
MOVCOUNT2,#6
MOVCMD_1,#B
MOVDPTR,#TAB8;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
FOOT1:
JB,JIAN;加时时间设置,减1,加1
JNB,$
INCEXT
JIAN:
JB,FOOT2
JNB,$
DECEXT
FOOT2:
LCALLMOVBUF1;数据处理
MOVDATA_1,#LEDBUF+3;显示分秒计时
MOVCOUNT2,#5
MOVCMD_1,#B
MOVDPTR,#TAB;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
MOVDATA_1,#LEDBUF+8;显示24秒计时
MOVCOUNT2,#2
MOVCMD_1,#B
MOVDPTR,#TAB;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
JBTR0,FOOT1
JB,$
ACALLBUZZER
SETBTR0;启动计时
LJMPFOOT1
BUZZER:
CLR;蜂鸣器子程序
LCALLT100MSD
SETB
RET
MOVBUF1:
;数据处理子程序
PUSHACC
MOVA,HOU
MOVB,#10
DIVAB
MOVLEDBUF,A
MOVLEDBUF+1,B
MOVA,MIN
MOVB,#10
DIVAB
MOVLEDBUF+3,A
MOVLEDBUF+4,B
MOVA,SEC
MOVB,#10
DIVAB
MOVLEDBUF+6,A
MOVLEDBUF+7,B
MOVA,EXT
MOVB,#10
DIVAB
MOVLEDBUF+8,A
MOVLEDBUF+9,B
POPACC
RET
;-------------定时器T0中断服务子程序----------
STIME:
MOVTH0,#HIGH(COUNT);重新装入高4位初始值
MOVTL0,#LOW(COUNT);重新装入低4位初始值
DJNZSECCOUN,TIMEEND3;判断是否够1秒(20*50us=1S)
MOVSECCOUN,#COUNT1;重新装入20
PUSHACC;堆栈
JNBBA_FO,FOOTSEC
SEC1CHA:
MOVA,EXT
DECA
MOVEXT,A
CJNEA,#-1,SECCHA
MOVEXT,#24
SECCHA:
MOVA,SEC;"秒"处理
DECA
MOVSEC,A
CJNEA,#-1,TIMEEND2;判断是否够60秒
MOVSEC,#59;够60秒后,秒位清0
MINCHA:
MOVA,MIN;"分"处理
DECA
MOVMIN,A
CJNEA,#-1,TIMEEND2
HOUCHA:
MOVA,HOU
INCA
MOVHOU,A
AJMPSTOP0;节数有进位则表示一小节节数,暂停。
TIMEEND2:
POPACC
TIMEEND3:
JNB,STOP;判断是否按下,按下则暂停
RETI
FOOTSEC:
INCSEC
MOVA,SEC
CJNEA,#60,TIMEEND1;判断是否够60秒
MOVSEC,#00;够60秒后,秒位清0
FOOTMIN:
INCMIN
MOVA,MIN
CJNEA,#45,EXTR;计时45+EXT分钟
MOVA,EXT
CJNEA,#0,TIMEEND1
SJMPFOOTHOU
EXTR:
JCTIMEEND1
DECEXT
CJNEA,#0,FOOTHOU
SJMPTIMEEND1
FOOTHOU:
MOVA,HOU;上半场结束,HOU加1,
INCA
MOVHOU,A
LCALLMOVBUF1;显示当前时间,否则时间停留在上一个显示59秒,非00秒
MOVDATA_1,#LEDBUF+3
MOVCOUNT2,#5
MOVCMD_1,#B
MOVDPTR,#TAB;装入查表地址
LCALLDISPLAYLCD;调用显示子程序
MOVMIN,#00
AJMPSTOP0
TIMEEND1:
POPACC;弹出堆栈
TIMEEND:
JNB,STOP;按下则暂停
RETI
;-------------计时停止子程序-------------
STOP0:
CLRTR0
LCALLBUZZER
LCALLT500MSD
LCALLBUZZER
LCALLT500MSD
LCALLBUZZER
LCALLT500MSD
STOP:
LCALLBUZZER
STOP1:
JNBBA_FO,STOP2;足球赛,不执行下面程序
JB,STOP2;篮球赛复位24秒计时
MOVEXT,#24
STOP2:
JB,STOP1;按下则暂停结束,开始计时
LCALLBUZZER
RETI
;------------------LCD1602显示子程序------------------
DISPLAYLCD:
MOVR0,DATA_1;显示首地址
MOVR1,COUNT2
MOVR2,CMD_1;发送第一行DDRAM地址设置指令
MOVA,R2
ACALLW_CMD
LOOP1:
MOVA,@R0
MOVCA,@A+DPTR;查表
ACALLW_DATA;调用LCD显示字子程序
INCR0;显示下一个字
JNB,TG
TG:
DJNZR1,LOOP1
CLR
LOOP:
MOVA,#00001100B;发送显示开/关控制
ACALLW_CMD