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 + -
显示快捷键?