我的仿真图也改了下,用的共阳极数码管,自己也用了别的显示程序测了,没得问题。但是我程序一仿真数码管就没得动静
- 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, #0FFH
- 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
- JNB FLAG, ZXD
- ACALL RESET
- 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, #9
- DJNZ R3, [ DISCUZ_CODE_1 ]nbsp;
- MOV C, DQ
- MOV R3, #23
- DJNZ R3, [ DISCUZ_CODE_1 ]nbsp; ;等待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
- CLR P2.0
- ACALL DELAY
- SETB P2.0
- MOV A, SHI
- MOVC A, @A+DPTR
- MOV P0, A
- CLR P2.1
- ACALL DELAY
- SETB P2.1
- MOV A, GEW
- MOVC A, @A+DPTR
- MOV P0, A
- CLR P2.2
- ACALL DELAY
- SETB P2.2
- MOV P0, #39H ;显示c代码
- CLR P2.3
- ACALL DELAY
- SETB 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
复制代码
|