找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

求:单片机stc89c52用18b20测温、1602显示的程序

[复制链接]
admin 发表于 2012-9-2 05:52:59 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
自己用c写了一个文件,结果运行以后发现LCD不显示数只显示方格……求各位大神指出问题何在??

现在我手上有的是一个汇编写的18b20,但是显示的是“Hi Welcome You\(第一行)Temperature:**℃(第二行)”,我想要把英文都去掉,让后让温度显示到小数点后第四位,应该怎么修改程序???求各位大神指点啊……
汇编的那个程序如下:



TH EQU 38 ;高温报警点
TL EQU 10 ;低温报警点
TEMPH EQU 40H ;读出寄存器5个单元的内容
TEMPL EQU 41H
REG2 EQU 42H
REG3 EQU 43H
REG4 EQU 44H
CONFIG9 EQU 1FH ;9位精度的CONFIG数据
COMFIG10 EQU 3FH ;10位精度的CONFIG数据
CONFIG11 EQU 5FH ;11位精度的CONFIG数据
CONFIG12 EQU 7FH ;12位精度的CONFIG数据
CNT EQU 20H ;中断转换时间
DAT EQU P2.7;数据线
FLAG1 BIT 00H ;测试DS18B20的存在

RS BIT p2.0;液晶控制接口
RW BIT p2.1
E BIT p2.2
;/////////////程序开始///////////////////////////
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIM0 ;定时器0中断
ORG 0030H
MAIN:
MOV SP,#07H ;设定堆栈指针

LCALL RESET ;18b20复位
LCALL INIT ;初始化数码管

MOV TMOD,#21H ;定时器0设置
MOV TH0,#00H
MOV TL0,#00H

SETB ET0
SETB TR0

CALL INITDISP
SETB EA
;CALL LCDDISP
STAR: ;LCALL DISP ;显示温度值
;lcall lcddisp
LJMP STAR

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET:;18B20复位程序,11.0592Mz单周期1US
SETB DAT
NOP
CLR DAT
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
MOV R0,#0FFH
SETB DAT ;然后拉高数据线
TSR2: JNB DAT,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
CLR P1.7 ;检查到DS18B20就点亮P1.7LED
LJMP TSR5
TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在
CLR P1.0
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7: SETB DAT
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-------------------写DS18B20的程序
WRITE: ;18B20写入1个字节子程序
MOV R2,#8
CLR C
WR1: CLR DAT
MOV R3,#6
DJNZ R3,$
RRC A
MOV DAT,C
MOV R3,#23
DJNZ R3,$
SETB DAT
NOP
DJNZ R2,WR1
SETB DAT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;读出温度值的子程序RDTEMP
RDTEMP:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#TEMPL ; 低位存入41H(TEMPL),高位存入40H(TEMPH)

RE00: MOV R2,#8
RE01: CLR C
SETB DAT
NOP
NOP
CLR DAT
NOP
NOP
NOP
SETB DAT
MOV R3,#7
DJNZ R3,$
MOV C,DAT
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVV:;数据处理子程序DIVV
MOV A,41H
MOV B,#16
DIV AB
MOV 74H,A ;将41H的高4位右移4位,存入74H中
MOV A,B
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 73H,A;70 ;将41H的低4位X10/16得小数后1位数
MOV A,40H
MOV B,#16
MUL AB
ADD A,74H
MOV B,#10
DIV AB
MOV 72H,B;71 ;将个位数存入72H中
MOV B,#10
DIV AB
MOV 71H,B;72 ;将十位数存入71H中
MOV A,40H
MOV 70H,#10H;73 ;如果为负则符号位为#10H
JB ACC.7,SA
MOV 70H,#00H ;如果为正则符号位为#00H
SA:
RET
;------------------读出转换后的温度值
GET_TEMPER:
SETB DAT ; 定时入口
BCD: LCALL RESET
JB FLAG1,S22
LJMP BCD ; 若DS18B20不存在则返回

S22: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配------0CC
LCALL WRITE
MOV A,#44H ; 发出温度转换命令
LCALL WRITE
NOP
LCALL DELAY
LCALL DELAY
CBA: CALL RESET
JB FLAG1,ABC
LJMP CBA
ABC: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE
LCALL RDTEMP ;READ_1820
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------延时子程序
DELAY: MOV R7,#00H
MIN: DJNZ R7,YS500
RET
YS500: LCALL YS500US
LJMP MIN
YS500US:MOV R6,#00H
DJNZ R6,$
RET
DELAY1: MOV R7,#20H
DJNZ R7,$
RET


;*************************************************
;液晶显示程序
;*************************************************
INITDISP:
MOV R2,#38H ;0011 1000功能设置:采用8位数据总线,采用双行显示,采用5X7点陈
LCALL WRC ;写入指令
ACALL DELAY11 ;延时程序
MOV R2,#0CH ;0000 1100光标/显示移位:1为显示移位,0为光标移位
ACALL WRC
ACALL DELAY11
MOV R2,#06H ;0000 0110输入模式:1为AC增量模式,0为AC自减模式,显示整体不移动
ACALL WRC
ACALL DELAY11
MOV R2,#01H ;清屏
LCALL WRC
ACALL DELAY11

mov P0,#01h;清屏
call enrw
mov P0,#38h;设为8位,5*7字 型两行
call enrw
mov P0,#0Ch
call enrw
mov P0,#06h
call enrw
mov P0,#80h
call enrw
mov dptr,#yjtab
call rwram
mov P0,#0C0h
call enrw
mov dptr,#yjtab1
call rwram
RET
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;写入控制指令,数据放在R2中
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRC:
ACALL BUSY
CLR P2.0
CLR P2.1
CLR P2.2
MOV A,R2
MOV P0,A
NOP
SETB P2.2;E使用信号
NOP
CLR P2.2;E使用能下降沿触发
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;忙闲测试
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BUSY:
CLR P2.0;RS=0读寄存器 读BF
SETB P2.1; R/W 1为读,0为写
NOP
SETB P2.2;E
NOP
MOV A,P0;读取P0口
JB ACC.7,BUSY
CLR P2.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;写入数据
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRD:
ACALL BUSY
SETB P2.0
CLR P2.1
CLR P2.2
MOV A,R2
MOV P0,A
NOP
SETB P2.2
NOP
CLR P2.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;写入N个数据,R2为要显示的数据,R4为显示个数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRN:
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV R2,A
LCALL WRD
DJNZ R4,WRN
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序延时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY11: MOV R6,#01H
DL0: MOV R7,#250
DL1: NOP
NOP
DJNZ R7,DL1
DJNZ R6,DL0
RET
/*

*/
LCDDISP:

MOV DPTR,#ASCII ;显示第二行数据
MOV R2,#0CCH ;1100 0000 DDRAM地址设置为40h
LCALL WRC

;MOV R4,#16
;LCALL WRN

CLR A
MOV A,71H
MOVC A,@A+DPTR
;INC DPTR
MOV R2,A
LCALL WRD

MOV A,72H
MOVC A,@A+DPTR
;INC DPTR
MOV R2,A
LCALL WRD

RET
/******************/
MOV R1,#71

mov P0,#0CCh
call enrw
MOV DPTR,#ASCII
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
setb rs
clr rw
clr e
call delay
setb e

INC R1
MOV DPTR,#ASCII
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
setb rs
clr rw
clr e
call delay
setb e
RET
enrw:clr rs
clr rw
clr e
call delay
setb e
ret
rwram:mov r1,#00h
a1: mov a,r1
movc a,@a+dptr
call rwram2
inc r1
cjne a,#00h,a1
ret
rwram2:mov P0,a
setb rs
clr rw
clr e
call delay
setb e
ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/*DISP: ;数码管显示程序,此程序要注意的是P2.7口的DS18B20数据采集,不能影响此口
MOV R1,#70H
DISP1:
CLR P2.0;第一个数码管亮
SETB P2.1
SETB P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第二个数码管亮
CLR P2.1
SETB P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第三个数码管亮
SETB P2.1
CLR P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
ADD A,#80H;点亮小数点
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第四个数码管亮
SETB P2.1
SETB P2.2
CLR P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
RET*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE
MOV A,#7FH ; 选择12位温度分辨率
LCALL WRITE
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIM0: ;中断处理程序
CLR TR0
CLR EA
MOV A,CNT
INC A
MOV CNT,A
CJNE A,#10,TZ ;刷新时间到一定的时间,就采集温度,注意采集时间不能太快,太快就能时实显示
MOV CNT,#00H
LCALL GET_TEMPER
LCALL DIVV

LCALL LCDDISP

TZ: MOV TH0,#00H ;设定定时器0的参数
MOV TL0,#00H
SETB EA
SETB TR0
RETI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT: ;初始化70H---73H中的数据,使用R0,R1,R3

MOV 70H,#00H ;初始化数码管的显示内容
MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV CNT,#00H ;刷新时间初始化

LCALL RE_CONFIG ;配置DS18B20程序
LCALL GET_TEMPER ;获得温度值
LCALL DIVV ;温度值进行转换
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DLYS: MOV R6,#1 ;延时处理程序
DLYS0:MOV R5,#60
DJNZ R5,$
DJNZ R6,DLYS0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TAB:
DB 0C0H,0F9H,
 楼主| admin 发表于 2012-9-2 05:53:03 | 显示全部楼层
0A4H,0B0H; 0,1,2,3
DB 99H,92H,82H,0F8H;?,5,6,7
DB 80H,90H,88H,83H;?,9,A,B
DB 0C6H,0A1H,86H,8EH;C,D,E,F
DB 8CH,89H,07fh,0bFH;P,H,.,-11001011
yjtab: db 'Temperature:',00h
yjtab1:db '**`C',00h
ASCII: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
END
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 01:49 , Processed in 0.051067 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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