本帖最后由 C鬼厉 于 2019-6-19 10:36 编辑
检查了几次 电路图跟程序,也修改了几次, 仿真的时候数码管还是无法正常显示,一直乱跳。本人刚刚接触 单片机有些地方不懂,求各位大佬帮忙看看我哪里出错了。
- ORG 0000H
- TEMPER_L EQU 41H;用于保存读出温度的低8位
- TEMPER_H EQU 40H;用于保存读出温度的高8位
- FLAG1 EQU 38H;是否检测到DS18B20标志位
- A_BIT1 EQU 31H;数码管个位数存放内存位置
- B_BIT1 EQU 32H;数码管十位数存放内存位置
- D_BIT1 EQU 35H;数码管百位数存放内存位置
- DQ EQU P2.7;30H,31H,32H,33H:X个位十位X
- MOD7: MOV SP,#60H
- LCALL GET_TEMPER;调用读温度子程序
- LCALL TEMPCOV
- LCALL DISPLAY;调用数码管显示子程序
- AJMP MOD7
- TEMP0: INC A
- AJMP TEMP1
- TEMPCOV: MOV A,TEMPER_L;数据处理子程序TEMPCOV
- MOV B,#16
- DIV AB
- JB B. 3,TEMP0
- TEMP1: MOV 34H,A;将TEMPER_L的高四位右移,存入34H中(温度值)
- MOV A,B;将TEMPER_L的低四位X10/16得小数后一位数
- MOV B,#10
- MUL AB
- MOV B,#16
- DIV AB
- MOV 30H,A;将小数后一位数.存入30H中
- MOV A,TEMPER_H;TEMPER_H中存放高8位数,权重16
- MOV B,#16
- MUL AB
- ADD A,34H;34H中存入温度值的整数部分
- MOV B,#10
- DIV AB
- MOV 31H,B;个位存入31H
- MOV B,#10
- DIV AB
- MOV 32H,B;十位存入32H
- MOV B,#10
- DIV AB
- MOV 35H,B;百位存入35H
- MOV A,TEMPER_H
- MOV 33H,#10H
- JB ACC.7,EXIT7
- MOV 33H,#00H
- EXIT7: RET
- INIT_1820: ;这是DS18B20复位初始化子程序
- SETB DQ
- NOP
- CLR DQ;主机发出延时537微秒的复位低脉冲
- MOV R1,#3
- TSR1: MOV R0,#107
- DJNZ R0,$
- DJNZ R1,TSR1
- SETB DQ;然后拉高数据线
- NOP
- NOP
- NOP
- MOV R0,#25H
- TSR2: JNB DQ,TSR3;等待DS18B20回应
- DJNZ R0,TSR2
- LJMP TSR4;延时
- TSR3: SETB FLAG1;置标志位,表示DS1820存在
- LJMP TSR5
- TSR4: CLR FLAG1;清除标志,表示DS1820不存在
- LJMP TSR7
- TSR5: MOV R0,#117
- TSR6: DJNZ R0,TSR6;时序要求延时一段时间
- TSR7: SETB DQ
- RET
- GET_TEMPER: ;读出转换后的温度值
- SETB DQ
- LCALL INIT_1820;先复位DS18B20
- JB FLAG1,TSS2
- RET;判断DS1820是否存在?若DS18B20不存在则返回
- TSS2: MOV A,#0CCH;跳过ROM匹配
- LCALL WRITE_1820
- MOV A,#44H;发出温度转换指令
- LCALL WRITE_1820
- LCALL DISPLAY;等待AD转换结束,12位的话750微秒
- LCALL INIT_1820;准备读温度前先复位
- MOV A,#0CCH;跳过ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH;发出读温度命令
- LCALL WRITE_1820
- LCALL READ_18200;将读出的温度数据保存到35H/36H
- RET
- ;写DS18B20的子程序
- WRITE_1820:
- MOV R2,#8;一共8位数据
- CLR C
- WR1: CLR DQ
- MOV R3,#6
- DJNZ R3,$
- RRC A
- MOV DQ,C
- MOV R3,#23
- DJNZ R3,$
- SETB DQ
- NOP
- DJNZ R2,WR1
- SETB DQ
- RET
- ;读DS18B20程序,从DS18B20中读出两个字节的温度数据
- READ_18200:
- MOV R4,#2;将温度高位和低位从DS18B20中读出
- MOV R1,#TEMPER_L;低位存入TEMPER_L(TEMPER_L),高位存入(TEMPER_H)
- RE00: MOV R2,#8;数据一共有8位
- RE01: CLR C
- SETB DQ
- NOP
- NOP
- CLR DQ
- NOP
- NOP
- NOP
- SETB DQ
- MOV R3,#9
- RE10: DJNZ R3,RE10
- MOV C,DQ
- MOV R3,#23
- RE20: DJNZ R3,RE20
- RRC A
- DJNZ R2,RE01
- MOV @R1,A
- DEC R1
- DJNZ R4,RE00
- RET
- ;显示子程序
- DISPLAY: MOV DPTR,#TAB;指定查表起始地址
- MOV R0,#4
- DPL1: MOV R1,#250;显示100次
- DPLOP: MOV A,A_BIT1;取个位
- MOVC A,@A+DPTR;查个位数的7段代码
- MOV P0,A;送出个位数的7段代码
- SETB P2.3;开个位显示
- ACALL D1MS;显示1MS
- CLR P2.3
- MOV A,B_BIT1;取十位
- MOVC A,@A+DPTR;查十位数的7段代码
- MOV P0,A;送出十位数的7段代码
- SETB P2.2;开十位显示
- ACALL D1MS;显示1MS
- CLR P2.2
- MOV A,D_BIT1;取百位数
- MOVC A,@A+DPTR;查百位数的7段代码
- MOV P0,A;送出百位的7段代码
- SETB P2.1;开百位显示
- ACALL D1MS;显示1MS
- CLR P2.1
- MOV P0,#00H
- DJNZ R1,DPLOP;100次没完循环
- DJNZ R0, DPL1;4个100次没完循环
- RET
- ;1MS延时
- D1MS: MOV R7,#0FFH
- DJNZ R7,$
- DJNZ R7,$
- RET
- ;
- TAB: DB 03FH;0
- DB 006H;1
- DB 05BH;2
- DB 04FH;3
- DB 066H;4
- DB 06DH;5
- DB 07DH;6
- DB 007H;7
- DB 07FH;8
- DB 06FH;9
复制代码
0
|
-
2019-8-19 16:04
如果还不行的话 可以换一下DS18B20试试看 有需要74HC245直插 可以找我 QQ:3005395121
4个回答
|
|
|