资源描述
一.设计要求:
(1) 任务
设计并制作一个可以完成足球、篮球比赛及其他用处途的多用计时装置。
(2) 设计要求
1) 基本要求
① LED数码管显示计时结果;
② 适用于足球、篮球各种倒计时要求;
③ 根据比赛要求设置相应的按键;
④ 电源由外部提供,+5V;
⑤ 计时时间到报警。
2)发挥要求
① 改用LCD显示;
② 增加其他计时功能;
③ 由6V电池供电(稳压电源提供);
④ 时间到乐曲报警;
⑤ 整体电路效率>60%;
⑥ 计时精度1s/h。
二.系统实现:
本系统由软件与硬件仿真电路两部分组成,通过keil与protues联调实现足球、篮球计时的各种要求。系统由LCD1602显示,七个按键控制开始暂停选择等功能。
2.1硬件仿真电路图
2.2系统设计程序总流程图
开始
初始化
篮球赛?
足球赛?
篮球赛计时界面
开始?
Y
功能选择界面
HOU=1?
LCD显示上半场
LCD显示下半场
开始?
计时并显示
计时并显示
N
Y
Y
24秒复位?
EXT=24
暂停?
开始?
24秒复位?
EXT=24
时间到?
HOU+1
时间到?
HOU+1
暂停
开始?
暂停
开始?
Y
Y
Y
Y
暂停?
开始?
Y
Y
Y
Y
Y
Y
Y
Y
N
N
N
N
N
N
N
N
N
N
N
N
N
N
三.主要硬件部分设计与选型
3.1 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:电源正极,4.5-5.5V,通常使用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条控制指令,如表3.2所示:
序号
指令
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
读出的数据内容
表3.2:控制命令表
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=高脉冲
输出
无
表3.3:基本操作时序表
对于温度显示模块的编写也要了解其时序图,通过时序图,编写相关的驱动程序,实现其相关读写操作,此外,要想要让其显示正确的命令,还要注意其内部相关控制指令。在本设计中主要用的是写入指令的子程序。
LCD1602的读写时序图
四、主要功能模块程序设计
这里只介绍LCD1602显示程序
本系统使用LCD1602实现显示,只要参照LCD1602的使用手册进行初始化和程序编写就可以显示,即在程序编写中添加LCD1602的驱动程序。这里的驱动程序主要包括:初始化函数、设置显示坐标、写字符函数及写字符串函数。LCD1602的部分读写控制时序程序如下所示:
(1) 写命令函数:向寄存器写入控制字
参数:A--控制字
W_CMD:
ACALL WAIT; //侧忙碌状态
CLR RW; //写命令时,R/W为低电平
CLR RS; //写入指令。RS为低电平
SETB E; //置高使能线 .
MOV LCD, A; // 接收命令字并送到数据总线上
CLR E: //在使能线的下降沿写入数据
RET
(2)写数据函数:向寄存器写入数据
参数:A--待要显示数据
W_DATA:
ACALL WAIT //侧忙碌状态
SETB RS //写数据时,RS为高电平
CLR RW //写入数据。RW为低电平
SETB E //置高使能线
MOV LCD, A // 接收数据并送到数据总线上
CLR E //在使能线的下降沿写入数据
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、按开始键进行下半场计时。第一行显示Second half
六、程序实现
RS EQU P3.0 ;写入数据(1)或指令(0)选择端
RW EQU P3.1 ;读(1)写(0)控制
E EQU P3.2; ;使能
LCD EQU P2 ;LCD数据口
BF EQU P2.7 ;忙标志
BA_FO BIT 30H ;选择功能标志位,1为篮球赛,0为足球赛
EXT EQU 31H ;加时赛储存地址
HOU EQU 34H ;节数,上下半场储存地址
MIN EQU 35H ;分钟储存地址
SEC EQU 36H ;秒储存地址
COUNT EQU 3CB0H ;T0初值
COUNT1 EQU 20 ;20*50Ms=1S
COUNT2 EQU 37H
DATA_1 EQU 38H ;写数据数据首地址
CMD_1 EQU 39H ;写指令指令首地址
SECCOUN EQU 10H ;存放20的地址
LEDBUF EQU 40H ;显示数据(数字)首地址
LCDBUF EQU 4AH ;显示数据(字符)首地址
ORG 0000H
LJMP MAIN
ORG 000BH ;T0中断入口
LJMP STIME ;调用定时器T0中断服务子程序
MAIN: MOV SP,#60H ;装入固定点显示字母或符号
MOV LCDBUF+0,#0
MOV LCDBUF+1,#1
MOV LCDBUF+2,#2
MOV LCDBUF+3,#3
MOV LCDBUF+4,#4
MOV LCDBUF+5,#5
MOV LCDBUF+6,#6
MOV LCDBUF+7,#7
MOV LCDBUF+8,#8
MOV LCDBUF+9,#9
MOV LCDBUF+10,#10
MOV LCDBUF+11,#11
MOV LCDBUF+12,#12
MOV LCDBUF+13,#13
MOV LCDBUF+14,#14
MOV LCDBUF+15,#15
MOV P1,#0FFH ;P1口输出至高电平
SETB P3.5 ;蜂鸣器口
;---------LCD1602初始化-------------------
MOV A, #00000001B ;发送清屏操作指令;
CALL W_CMD ;调写入指令子程序
MOV A, #00001100B ;发送显示开/关控制
ACALL W_CMD ;指令,无光标,无闪烁
MOV A, #00011100B ;发送光标移动指令
ACALL W_CMD ;光标和字一起移动,光标自动右移
MOV A, #00111100B ;发送功能设置指令
CALL W_CMD ;8位DB,双行,5x7字符
MOV A,HOU ;判断第几小节(上下半场
CJNE A,#01,LOP ;非01跳转lop判断hou为00还是别的
LOP:JNC DINGSHI ;进位标志为1说明HOU>1比赛小节结束,不显示功能选择界面
MOV HOU,#01 ;进位标志为0说明HOU<01,为00,比赛刚开始HOU=1并显示功能选择界面
;---------LCD1602初始化结束---------------------
HUAN:
MOV DATA_1,#LCDBUF
MOV COUNT2,#16 ;显示字符数为16个
MOV CMD_1,#10000001B ; 显示从第一行第一个开始
MOV DPTR, #TAB1 ;装入查表地址,
LCALL DISPLAYLCD ;调用显示子程序
MOV DATA_1,#LCDBUF
MOV COUNT2,#16
MOV CMD_1,#11000001B
MOV DPTR, #TAB2 ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
CE:JNB P1.0,BA ;功能选择判断,P1.0按下为低电平,选择篮球赛计时
JNB P1.1,FO ;功能选择判断,P1.1按下为低电平,选择足球计时
SJMP CE
BA:SETB BA_FO ;选择的篮球赛标志位置1
SJMP DINGSHI
FO:CLR BA_FO ;选择的足球赛标志位置0
;---------T0定时初始化--------------------------
DINGSHI:MOV A, #00000001B ;清屏
CALL W_CMD
MOV LEDBUF+5,#10
MOV TMOD,#01H ;设置T0定时,模式1
MOV TH0,#HIGH(COUNT) ;装入高4位初始值
MOV TL0,#LOW(COUNT) ;装入低4位初始值
SETB EA ;开中断
SETB ET0 ;开T0中断允许位,此时没有启动中断,
MOV SECCOUN,#COUNT1 ;把数值20放到10H单元中
;---------T0定时初始化结束------------------------
JNB BA_FO,FOOT ;查看标志位,选择功能显示
BASKE: ;篮球赛计时显示
MOV MIN,#12 ;初始化定时时间,分
MOV SEC,#00 ;秒
MOV EXT,#24 ;24秒倒计时
MOV DATA_1,#LCDBUF ;第一行显示Period:(小节数)
MOV COUNT2,#7
MOV CMD_1,#10000001B
MOV DPTR, #TAB5 ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
JMP2DIS:
JB P1.4,JMP2DIS1 ;按键p1.4则进行24秒复位
JNB P1.4,$
MOV EXT,#24
JMP2DIS1:LCALL MOVBUF1 ;数据处理
MOV DATA_1,#LEDBUF ;第一行第八九个空显示节数
MOV COUNT2,#2
MOV CMD_1,#10001000B
MOV DPTR, #TAB ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
MOV DATA_1,#LEDBUF+3 ;第二行从第一个空开始显示分秒数
MOV COUNT2,#5
MOV CMD_1,#11000001B
MOV DPTR, #TAB ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
MOV DATA_1,#LEDBUF+8 ;第二行第十十一个空显示24秒倒计时
MOV COUNT2,#2
MOV CMD_1,#11001010B
MOV DPTR, #TAB ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
JB TR0,JMP2DIS ;计时已开始则返回循环显示
JB P1.3,$ ;计时开始按键等待
LCALL BUZZER
SETB TR0 ;启动计时
LJMP JMP2DIS
FOOT:
MOV MIN,#00
MOV SEC,#00
MOV EXT,#00
MOV A,HOU ;判断上下半场
CJNE A,#1,XIA
MOV DATA_1,#LCDBUF ;是上半场则第一行显示First half
MOV COUNT2,#10
MOV CMD_1,#10000001B
MOV DPTR, #TAB6 ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
AJMP extra
XIA:
MOV DATA_1,#LCDBUF ;是下半场则第一行显示Second half
MOV COUNT2,#11
MOV CMD_1,#10000001B
MOV DPTR, #TAB7 ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
extra:MOV DATA_1,#LCDBUF ;第二行第八个空开始显示extra:(加时时间)
MOV COUNT2,#6
MOV CMD_1,#11001000B
MOV DPTR, #TAB8 ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
FOOT1: JB P1.7,JIAN ;加时时间设置,P1.6减1,P1.7加1
JNB P1.7,$
INC EXT
JIAN:JB P1.6,FOOT2
JNB P1.6,$
DEC EXT
FOOT2: LCALL MOVBUF1 ;数据处理
MOV DATA_1,#LEDBUF+3 ;显示分秒计时
MOV COUNT2,#5
MOV CMD_1,#11000001B
MOV DPTR, #TAB ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
MOV DATA_1,#LEDBUF+8 ;显示24秒计时
MOV COUNT2,#2
MOV CMD_1,#11001110B
MOV DPTR, #TAB ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
JB TR0,FOOT1
JB P1.3,$
ACALL BUZZER
SETB TR0 ;启动计时
LJMP FOOT1
BUZZER:
CLR P3.5 ;蜂鸣器子程序
LCALL T100MSD
SETB P3.5
RET
MOVBUF1: ;数据处理子程序
PUSH ACC
MOV A,HOU
MOV B,#10
DIV AB
MOV LEDBUF,A
MOV LEDBUF+1,B
MOV A,MIN
MOV B,#10
DIV AB
MOV LEDBUF+3,A
MOV LEDBUF+4,B
MOV A,SEC
MOV B,#10
DIV AB
MOV LEDBUF+6,A
MOV LEDBUF+7,B
MOV A,EXT
MOV B,#10
DIV AB
MOV LEDBUF+8,A
MOV LEDBUF+9,B
POP ACC
RET
;-------------定时器T0中断服务子程序----------
STIME:
MOV TH0,#HIGH(COUNT) ;重新装入高4位初始值
MOV TL0,#LOW(COUNT) ;重新装入低4位初始值
DJNZ SECCOUN,TIMEEND3 ;判断是否够1秒(20*50us=1S)
MOV SECCOUN,#COUNT1 ;重新装入20
PUSH ACC ;堆栈
JNB BA_FO,FOOTSEC
SEC1CHA:MOV A,EXT
DEC A
MOV EXT,A
CJNE A,#-1,SECCHA
MOV EXT,#24
SECCHA: MOV A,SEC ;"秒"处理
DEC A
MOV SEC,A
CJNE A,#-1,TIMEEND2 ;判断是否够60秒
MOV SEC,#59 ;够60秒后,秒位清0
MINCHA: MOV A,MIN ;"分"处理
DEC A
MOV MIN,A
CJNE A,#-1,TIMEEND2
HOUCHA: MOV A,HOU
INC A
MOV HOU,A
AJMP STOP0 ;节数有进位则表示一小节节数,暂停。
TIMEEND2:POP ACC
TIMEEND3:JNB P1.2,STOP ;判断是否按下P1.2,按下则暂停
RETI
FOOTSEC:INC SEC
MOV A,SEC
CJNE A,#60,TIMEEND1 ;判断是否够60秒
MOV SEC,#00 ;够60秒后,秒位清0
FOOTMIN:INC MIN
MOV A,MIN
CJNE A,#45,EXTR ;计时45+EXT分钟
MOV A,EXT
CJNE A,#0,TIMEEND1
SJMP FOOTHOU
EXTR: JC TIMEEND1
DEC EXT
CJNE A,#0,FOOTHOU
SJMP TIMEEND1
FOOTHOU:MOV A,HOU ;上半场结束,HOU加1,
INC A
MOV HOU,A
LCALL MOVBUF1 ;显示当前时间,否则时间停留在上一个显示59秒,非00秒
MOV DATA_1,#LEDBUF+3
MOV COUNT2,#5
MOV CMD_1,#11000001B
MOV DPTR, #TAB ;装入查表地址
LCALL DISPLAYLCD ;调用显示子程序
MOV MIN,#00
AJMP STOP0
TIMEEND1:POP ACC ;弹出堆栈
TIMEEND:JNB P1.2,STOP ;按下P1.2则暂停
RETI
;-------------计时停止子程序-------------
STOP0: CLR TR0
LCALL BUZZER
LCALL T500MSD
LCALL BUZZER
LCALL T500MSD
LCALL BUZZER
LCALL T500MSD
STOP:
LCALL BUZZER
STOP1: JNB BA_FO,STOP2 ;足球赛,不执行下面程序
JB P1.4,STOP2 ;篮球赛复位24秒计时
MOV EXT,#24
STOP2: JB P1.3,STOP1 ;P1.3按下则暂停结束,开始计时
LCALL BUZZER
RETI
;------------------LCD1602显示子程序------------------
DISPLAYLCD:
MOV R0,DATA_1 ;显示首地址
MOV R1,COUNT2
MOV R2,CMD_1 ;发送第一行DDRAM地址设置指令
MOV A,R2
ACALL W_CMD
LOOP1: MOV A, @R0
MOVC A, @A+DPTR ;查表
ACALL W_DATA ;调用LCD显示字子程序
INC R0 ;显示下一个字
JNB PSW.5,TG
TG:
DJNZ R1,LOOP1
CLR PSW.5
LOOP:
MOV A, #00001100B ;发送显示开/关控制
ACALL W_CMD ;指令,无光标,无闪烁
LJMP EXIT ;跳出LCD1602显示子程序
WAIT:
MOV LCD, #0FFH ;令P2作输入口使用
CLR RS
SETB RW
CLR E
NOP
SETB E
JB BF, WAIT ;判断LCD忙标志
RET
W_CMD: ;入口参数A
ACALL WAIT
MOV LCD, A
CLR RS
CLR RW
SETB E
NOP
CLR E
RET
W_DATA: ;入口参数A
ACALL WAIT
MOV LCD, A
SETB RS
CLR RW
SETB E
NOP
CLR E
RET
EXIT:
RET
;------------------LCD1602显示子程序结束------------------
DELAY: MOV R6,#00H ;延时子程序
MOV R7,#00H
DELAY1: NOP
DJNZ R7,DELAY1
DJNZ R6,DELAY1
RET
;********************************
;**********延时子程序************
;********************************
T10MSD:
SETB RS0
MOV R4, #12
TM:MOV R3, #128
TM6:DJNZ R3, TM6
DJNZ R4, TM
CLR RS0
RET
T100MSD:
MOV R3, #200
D11:MOV R4, #125
D12:DJNZ R4, D12
DJNZ R3, D11
RET
T500MSD:
LCALL T100MSD
LCALL T100MSD
LCALL T100MSD
LCALL T100MSD
LCALL T100MSD
NOP
RET
TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH
TAB1:DB 77H,65H,6cH,63H,6fH,6dH,65H,20H,74H,6fH,20H,75H,73H,65H,20H,20H
;Welcome to use
TAB2:DB 53H,65H,6cH,65H,63H,74H,20H,6dH,6fH,64H,65H,20H,20H,20H,20H,20H
;Select mode
TAB5:DB 50H,65H,72H,69H,6fH,64H,3AH ;Period:
TAB6:DB 46H,69H,72H,73H,74H,20H,68H,61H,6cH,66H ;First half
TAB7:DB 53H,65H,63H,6fH,6eH,64H,20H,68H,61H,6cH,66H ;Second half
TAB8:DB 65H,78H,74H,72H,61H,3AH ;extra:
END
展开阅读全文