上机实验作业四:
题目:利用Protuse提供的显示电路和按键,设计一个手控计时器(秒表)。 要求:1. 显示出分、秒、1/100秒;
2. 设置计时/暂停按键S1和归零按键K0; 算法分析:
按一下S1键,进行计时状态(1)/暂停状态(0)的切换。 按一下K0键,置成暂停状态(0),计时器置0。 定义分、秒、1/100秒为MM,SS,NN。
MM,SS,NN是二进制数,要经代码转换才能进行显示。算法步骤:
第1步 初始化。 第2步 显示时间。
第3步 按下S1键则状态值取反。
第4步 按下K0键则状态值置0,计时器置0。 第5步 判别(状态值=0)则转到第7步。 第6步 进行计时。 第7步 转到第2步。 进一步细化:
第1步 1.1 (MM,SS,NN) 0
1.2 状态T0 ( 定义: T EQU 01H ) 1.3 (40H)~(42H) (MM, SS, NN)转换为BCD码;为BCD码再送到显示缓冲区) 第2步 2.1 显示时间。
第3步 3.1 判别S1=1则转到4.1(没有按下) 3.2 状态T取反
第4步 4.1判别K0=1则转到5.1(没有按下) 4.2状态T0
4.3 (MM,SS,NN)0
第5步 5.1 判别(状态T=0)则转到2.1
(把二进制数转换
第6步 6.1 延时10ms
6.2进行计时。 (NN+1≥100→ NN0, SS+1≥60→ SS0, MM+1
≥60→ MM0 )
If NN++≥100 then { NN0; SS++;
if SS++≥60 then { SS0; MM++; }
第7步 7.1转到1.3
流程图: ①~⑤为调试的步骤
if MM++≥60 then {MM0 }
} (2.1) 开始 ①初始化 ②代码转换 ①显示时间 ④ S1=1 Y N ④T取反 ⑤ K0=1 Y
N ⑤T=0,时间置0 ④Y T=0 N ③ 延时10ms ③计 时 编程调试步骤: ①:编写主程序
1. 编写主程序和显示子程序(范例程序:附在后面。) 主程序: ORG 0000H Main: LCALL ST ; 初始化子程序 Main1: LCALL DisLED ; 显示子程序 SJMP Main1 2. 输入并调试、运行通过。
②:添加把二进制数转换为BCD码并存到LED显示缓冲区的子程序。 先用EQU定义MM、SS、NN,然后在ST子程序中对其赋值。
1. 编写把MM、SS、NN(0~99)的二进制数转换为BCD码(参见P51页的【例3-51】)
并存入显示缓冲区(40H)~(42H)中的子程序BIN_BCD。 2. 加入到上面调试成功的程序中:
MM EQU 30H SS EQU 31H
NN EQU 32H
ORG 0000H
Main: LCALL ST ; MM0, SS0, NN0
Main1: LCALL BIN_BCD ; 例:MM=45=00101101B转换为BCD码01000101B
LCALL DisLED
SJMP Main1 BIN_BCD:
RET 3. 输入并调试、运行通过。
4. 修改ST子程序中的MM#9, SS#45, NN#86后再次运行通过。
③:添加计时子程序JISHI。 1. 编写JISHI子程序:
JISHI: INC NN MOV A, #100
CJNE A, NN, JSEND MOV NN, #0
INC SS
MOV A, #60
CJNE A, SS, JSEND MOV SS, #0 INC MM MOV A, #60
CJNE A, MM, JSEND MOV MM, #0
JSEND: RET 2. 加入到主程序中
Main: LCALL ST ;
Main1: LCALL BIN_BCD ; 二进制数转换为BCD码
LCALL DisLED
LCALL Delay10 ; 延时10ms LCALL JISHI ; 计时 SJMP Main1 3. 输入并调试、运行通过。
4. 修改DisLED子程序中的延时子程序Delay的时间约为1.667ms,再次运行通过。
④:添加S1键(计时/暂停键) 1. 加入到主程序中 T BIT 01H S1 EQU P3.1
Main:
LCALL ST ; 加入T0
Main1: LCALL BIN_BCD ; 二进制数转换为BCD码
LCALL DisLED
JB S1, Main2 CPL T JNB S1, $ Main2: JNB T, Main1 LCALL Delay10
LCALL JISHI ; 计时 SJMP Main1 2. 输入并调试、运行通过。 ⑤:添加K0键(归零键) 1. 加入到主程序中
T EQU 01H S1 EQU P3.1 K0 EQU P3.0
Main: LCALL ST Main1: LCALL BIN_BCD LCALL DisLED JB S1, Main2 CPL T JNB S1, $ Main2: JB K0, Main3 CLR T
MOV MM, #0 MOV SS, #0 MOV NN, #0 Main3: JNB T, Main1 LCALL Delay10
LCALL JISHI SJMP Main1 2. 输入并调试、运行通过。
;
; 二进制数转换为BCD码 ; 计时
范例程序:
ORG 0000H LJMP Main ORG 50H Main: LCALL ST
Main1: LCALL DisLED SJMP Main1
ST: MOV 40H, #00H ; 0 MOV MOV RET
DisLED: MOV MOV MOV MOV MOV MOV RET Delay10: MOV De1: MOV De2: DJNZ DJNZ RET END
41H, #00H 42H, #00H A, 42H P2, A A, 41H P1, A A, 40H P0,A
R3, #10 R4, #250 R4, De2 R3, De1 ; 0 ; 0
; 设 f = 6MHz ;
; 250*4us=1ms