找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 772|回复: 1
打印 上一主题 下一主题
收起左侧

求大佬看下单片机汇编程序吧,实在不知道哪里不对

[复制链接]
跳转到指定楼层
楼主
我的仿真图也改了下,用的共阳极数码管,自己也用了别的显示程序测了,没得问题。但是我程序一仿真数码管就没得动静
程序:TEMP_ZH EQU 30H       ;温度存放单元
TEMPL   EQU        25H                  ;低字节存放
TEMPH   EQU 26H       ;高字节存放
TEMP_TH EQU 27H                  ;高温报警温度
GEW     EQU 24H       ;定义个位
SHI     EQU 23H       ;定义十位
BAI     EQU 22H       ;定义百位

K1      EQU P1.0
K2      EQU P1.1
K3      EQU P1.2

BUZ     EQU P2.4          ;蜂鸣
FLAG    EQU 21H.0          ;温度传感器标志位
DQ      EQU P3.3

;******************主程序************************
        ORG   0000H
                SJMP  START
                ORG   0030H
START:  MOV   SP,   #60H
                MOV   P0,   #0FFH  ;让p0输出高电平,熄灭数码管
                MOV   P2,        #0F0H
                MOV   R7,   #0   
MIAN:   MOV   TEMP_TH, #85 ;设立高温报警温度为85
LOOP4:  ACALL RESET        ;18B20复位程序
LOOP1:        JNB   FLAG, LOOP4
LOOP:        ACALL ZXD                   ;调用读取温度子程序
                ACALL TURN                   ;调用数据转化程序
                ACALL DISPLAY           ;调用显示程序
LOOP2:        ACALL KEY                   ;调用键盘
                INC   TEMP_ZH
                JMP   LOOP

;*******************DS18B20复位初始化程序************************
RESET:  SETB  DQ
        NOP
                NOP
                CLR   DQ
                MOV   R1,   #3
DLY:    MOV   R0,   #107
        DJNZ  R0,   $
                DJNZ  R1,   DLY                ;延时648μs程序
                SETB  DQ                         ;拉高数据线
                NOP
                NOP
                NOP
                MOV   R0,   #25H
T2:     JNB   DQ,   T3
        DJNZ  R0,   T2
                JMP   T4
T3:     SETB  FLAG
        JMP   T5
T4:     CLR   FLAG
        JMP   T7
T5:     MOV   R0,   #249
T6:     DJNZ  R0,   T6
T7:     SETB  DQ
        RET
;*************************温度读写指令**************************
ZXD:    MOV   SP,   #60H
        ACALL RESET               
                JNB   FLAG, ZXD          
                MOV   A,    #0CCH          ;跳过rom指令
                ACALL WRITE
                MOV   A,    #44H          ;温度转换指令
                ACALL WRITE
                MOV   R2,   #6
DLY1:        MOV   R1,   #255
DLY2:        MOV   R0,   #255
        DJNZ  R0,   $
                DJNZ  R1,   DLY2
                DJNZ  R2,   DLY1          ;延时780ms
                ACALL RESET
                MOV   A,    #0CCH
                ACALL WRITE
                MOV   A,    #0BEH          ;读取寄存器指令
                ACALL WRITE
                ACALL READ                          ;读取温度
                RET



;*************************写入DS18B20程序***********************
WRITE:  MOV   R2,   #8                 ;一共8位数据
        CLR   C
WR1:        CLR   DQ
                MOV   R3,   #6
                DJNZ  R3,   $
                RRC   A                                 ;右移A将数据给C
                MOV   DQ,    C                 ;写入一个位
                MOV   R0,   #23
                DJNZ  R0,   $
                SETB  DQ
                NOP
                DJNZ  R2,   WR1                 ;循环8次
                SETB  DQ
                RET

;************************读DS18B20程序****************************
READ:   MOV   R4,   #2   
        MOV   R1,   #TEMPL   ;将25H,26H写入
RE0:    MOV   R2,   #8
RE1:    CLR   C
        SETB  DQ
                NOP
                NOP
                CLR   DQ
                NOP
                NOP
                NOP
                SETB  DQ                          ;拉高数据线
                MOV   R3,   #7
                DJNZ  R3,   $                  
                MOV   C,    DQ
                MOV   R3,   #23       
                DJNZ  R3,   $              ;等待50us
                RRC   A
                DJNZ  R2,   RE1                  ;读下个位
                MOV   @R1,  A
                INC   R1
                DJNZ  R4,   RE0
                RET                                                                          

;************************数据转化程序******************************
TURN:   ANL   26H,  #07H          ;取后3位
        ANL   25H,  #0F0H          ;取前4位
                MOV   A,    25H
                ORL   26H,  A
                MOV   A,    26H
                SWAP  A                           ;高低互换
                MOV   TEMP_ZH,  A
                RET

;*************************温度比较及报警**********************************
BJ:     MOV   A,    TEMP_TH         
        SUBB  A,    TEMP_ZH
                JC    TCL
                JNC   TCL1
                RET
TCL1:   CLR   BUZ
        RET
TCL:    SETB  BUZ
        RET
                                                                  
                  
                                                                                                               
;************************显示程序***************************************
DISPLAY:MOV   A,         TEMP_ZH
        MOV   B,    #100
                DIV   AB                       ;商送A,余送B
                MOV   BAI,   A
                MOV   A,     B
                MOV   B,    #10
                DIV   AB
                MOV   SHI,   A
                MOV   GEW,    B
                MOV   DPTR, #TAB
                MOV   A,     BAI
                MOVC  A,     @A+DPTR
                MOV   P0,    A
                SETB  P2.0
                ACALL DELAY
                CLR   P2.0
                MOV   A,     SHI
                MOVC  A,     @A+DPTR
                MOV   P0,    A
                SETB  P2.1
                ACALL DELAY
                CLR   P2.1
                MOV   A,     GEW
                MOVC  A,     @A+DPTR
                MOV   P0,    A
                SETB  P2.2
                ACALL DELAY
                CLR   P2.2
                MOV   P0,    #39H          ;显示c代码
                SETB  P2.3
                ACALL DELAY
                CLR   P2.3
                ACALL BJ       
                JB    K1,    LOOP3
                JB    K2,    JIAN
                JB    K3,    JIA                   
                SJMP  DISPLAY
LOOP3:  LJMP  LOOP2

;**********************显示段码(共阳)*********************
TAB:    DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;*****************************小延时程序***********************************
DELAY:  MOV   R0,    #25
A1:     MOV   R1,    #20
A2:     DJNZ  R1,         A2
        DJNZ  R0,    A1
                RET
                 
                 

;****************************键盘程序***************************************
KEY:    CJNE  R7,#00H,HD
               RET
JIAN:   DEC   TEMP_ZH                  ;TEMP_ZH位地址减一
        INC   R7
                ACALL DISPLAY
JIA:    INC   TEMP_ZH         ;TEMP_ZH位地址加一
        DEC   R7
                ACALL DISPLAY
                RET
HD:     INC   TEMP_ZH
        DJNZ  R7,    HD
                RET
                END               
求大佬指点,谢谢了

RA@9`]YMWR@79O%Y6BSGN[I.png (50.96 KB, 下载次数: 23)

RA@9`]YMWR@79O%Y6BSGN[I.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:415123 发表于 2019-5-31 20:51 | 只看该作者
你的DISPLAY是作为子程序调用的,你却在后面使用了不少跳转指令,是错误的。一句话,子程序最后必须是返回,不能跳转。好好理一下思路
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表