keshe.asm
来自「该院程序是本人的51单片机课程设计 题目是 恒温控制模拟系统」· 汇编 代码 · 共 302 行
ASM
302 行
; ====================================================================
; 恒温控制模拟系统
; @Copyright 姓名: 王旭峰 计算机02——7班 学号: 03
; ====================================================================
AD0809 equ 8000h ; CS0 A/D片选地址
DA0832 equ 0A000h ; cs1 D/A片选地址
CLK164 equ 0FE04h ; 段控制口(接164时钟位)
DAT164 equ 0FE06h ; 段控制口(接164数据位)
LowTem equ 150 ; 温度控制下线
HigTem equ 200 ; 温度控制上限
OutBit equ 0FE02h ; 列线地址
Input equ 0FE00h ; 键盘读入口
Label bit 50h ; 自动手动标志位
LEDBuf equ 60h ; 显示缓冲
TemBuf equ 65h ; 存放A/D转换后的数据
SetBuf equ 66H ; 用于存放手动状态温度
; =====================================================================
; 程序开始部分
; =====================================================================
Org 0000h
Ljmp Main
LEDMAP: Db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
Db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h ; LED显示码
; =====================================================================
; 延时子程序, 用于LED显示
;======================================================================
Delay: Mov R6, #01h
DL: Mov R7, #00h
DL1: Djnz R7, DL1
Djnz R6, DL
Ret
; ====================================================================
; 显示"A"或者"H"
; ====================================================================
outState: Mov R2, #00100000B ; 选择第一个LED
Mov dptr, #OutBit ; 送LED片选地址
Mov A, #0
Movx @dptr, A ; 关所有八段管
Mov B, #8
jb Label, L3
Mov A, #74h
Ajmp DLP1
L3: Mov A, #77h
DLP1: Rlc A
Mov R3, A ; 暂存功能
Mov Acc.0, c ;
Mov dptr, #DAT164
Movx @dptr, A ;
Mov dptr, #CLK164
Setb Acc.0
Movx @dptr, A
Clr Acc.0
Movx @dptr, A ; 用来表示一个脉冲的下降沿
Mov A, R3
Djnz B, DLp1
Mov dptr, #OutBit
Mov A, r2
Movx @dptr, A ; 显示一位八段管
Acall Delay ; 调用延时子程序
Ret
; ===================================================================
; 测试是否有健按下
; ===================================================================
TestKey: Mov dptr, #OutBit
Mov A, #00h ; 送全扫描字 000000h
Movx @dptr, A ; 全扫描字送列线
Mov dptr, #Input ; 送行线地址
Movx A, @dptr ; 读入键状态
Cpl A ; 以高电平表示有键按下
Anl A, #0fh ; 高四位不用
Ret
; ===================================================================
; 12ms延时子程序,用于键盘去抖
; ===================================================================
T12MS: Mov R7, #18h
TM: Mov R6, #0FFh
TM6: Djnz R6, TM6
Djnz R7, TM
Ret
; ===================================================================
; 读键盘键值子程序
; ===================================================================
KeyTable: Db 16h, 15h, 14h, 0ffh
Db 13h, 12h, 11h, 10h
Db 0dh, 0ch, 0bh, 0ah
Db 0eh, 03h, 06h, 09h
Db 0fh, 02h, 05h, 08h
Db 00h, 01h, 04h, 07h
GetKey: Mov dptr, #OUTBIT
Mov P2, dph
Mov r0, #Low(Input)
Mov r1, #00100000b
Mov r2, #6
KLoop: Mov a, r1 ; 找出键所在列
Cpl a
Movx @dptr, a
Cpl a
Rr a
Mov r1, a ; 下一列
Movx a, @r0
Cpl a
Anl a, #0fh
jnz Goon1 ; 该列有键入
Djnz r2, KLoop
Mov r2, #0ffh ; 没有键按下, 返回 0ffh
Sjmp Exit
Goon1: Mov r1, a ; 键值 = 列 X 4 + 行
Mov a, r2
Dec a
Rl a
Rl a
Mov r2, a ; r2 = (r2-1)*4
Mov a, r1 ; r1中为读入的行值
Mov r1, #4
LoopC: Rrc a ; 移位找出所在行
jc Exit
Inc r2 ; r2 = r2+ 行值
Djnz r1, LoopC
Exit: Mov a, r2 ; 取出键码
Mov dptr, #KeyTable
Movc a, @a+dptr
Mov r2, a
WaitRelease: Mov dptr, #OUTBIT ; 等键释放
Clr a
Movx @dptr, a
Mov r6, #10
Call Delay
Call TestKey
jnz WaitRelease
mov a, r2
Ret
; =====================================================================
; 0809 A/D 模数转换子程序
; =====================================================================
ADC0809: Mov dptr, #AD0809 ; 指向0809首地址
Mov A, #0
Movx @dptr, A ; 启动A/D转换器
Mov A, #00h
Djnz ACC, $ ; 延时 > 100us
Movx A, @dptr ; 读入结果
Ret
; ======================================================================
; LED 显示子程序
; ======================================================================
DisplayLED: Mov r0, #LEDBuf ; 显示缓冲区
Mov r1, #3 ; 共使用3个八段管用于显示
Mov r2, #00010000b ; 从左边开始显示
Loop: Mov dptr, #OUTBIT
Mov a, #0
Movx @dptr, a ; 关所有八段管
Mov a, @r0
Mov B, #8 ; 送164
DLP: Rlc a
Mov r3, a
Mov acc.0, c
Mov dptr, #DAT164 ; 数据位送到164
Movx @dptr, a
Mov dptr, #CLK164 ; 输出时钟到164
Setb acc.0
Movx @dptr, a
Clr acc.0
Movx @dptr, a
Mov a, r3
Djnz B, DLP ; 需要输出8位
Mov dptr, #OUTBIT
Mov a, r2
Movx @dptr, a ; 选通一位八段管
Call Delay
Mov a, r2 ; 显示下一位
Rr a
Mov r2, a
Inc r0
djnz r1, Loop
ret
; ==================================================================
; 手动状态下调用执行的子程序
; ==================================================================
ExeMunual: Mov A, SetBuf
Mov dptr, #LEDMap
Mov B, #10
Div AB
Mov R2, A
Mov A, B
Movc A, @A+dptr
Mov LEDBuf+2, A
Mov A, R2
Mov B, #10
div AB
jz zero
Movc A, @A+dptr
zero: Mov LEDBuf, A
mov A, B
Movc A, @A+dptr
mov LEDBuf+1, A
ACall DisplayLED
;用于比较控制电机的转动
Mov dptr, #DA0832
Mov A, SetBuf
Clr C
Subb A, #LowTem
jnc exit2
Mov A, #0FFH
Movx @Dptr, A ; 输出
sjmp counti1
exit2: Mov A, SetBuf
Clr C
Subb A, #HigTem
jc exit3
Mov A, #00h
Movx @dptr, A
sjmp counti1
exit3: Mov A, #128
Movx @dptr, A
counti1: Acall TestKey
jz exit1
; Acall T12MS
; Acall TestKey
;jz exit1
ACall Getkey
cpl p1.1
Mov B, A
clr c
subb A, #04h
jnz Add1
inc SetBuf
Sjmp exit1
Add1: Mov A, B
clr c
subb A, #01H
jnz exit1
dec SetBuf
Sjmp exit1
exit1: Ret
; ==================================================================
; 自动状态下调用执行的子程序
; ==================================================================
ExeAuto: Acall ADC0809
Mov Tembuf, A ; 送一地址下进行保存
Mov dptr, #LEDMap
Mov B,#10
Div AB
Mov R2, A
Mov A, B
Movc A, @A+dptr
Mov LEDBuf+2, A
Mov A, R2
Mov B, #10
div AB
jz zero1
Movc A, @A+dptr
zero1: Mov LEDBuf, A
mov A, B
Movc A, @A+dptr
mov LEDBuf+1, A
ACall DisplayLED
Mov dptr, #DA0832
Mov A, Tembuf
Clr C
Subb A, #LowTem
jnc exit7
Mov A, #0FFH
Movx @Dptr, A ; 输出
sjmp exit9
exit7: Mov A, Tembuf
Clr C
Subb A, #HigTem
jc exit8
Mov A, #00h
Movx @dptr, A
sjmp exit9
exit8: Mov A, #128
Movx @dptr, A
exit9: Ret
; ==================================================================
; 主程序
; ==================================================================
Main: Mov sp, #70h
Mov SetBuf, #150
setb Label ; 赋初值
MLoop: Acall outState ; 显示自动
Key1: Acall TestKey
jz key2 ; 无键入,则转
; Acall T12MS ; 调用12ms延时子程序
; Acall TestKey
; jz key2
Acall GetKey ; 读入键码
Cjne A, #07h, key2
Cpl Label
Acall outState
Key2: jb Label, EAuto
EMunual: ; Mov TemBuf, SetBuf
LCall ExeMunual
Ajmp Quit
EAuto: LCall ExeAuto
Quit: Ajmp MLoop
End
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?