标题:
基于18b20温度带上限程序-LCD1602液晶显示篇
[打印本页]
作者:
51黑黑黑
时间:
2016-2-22 01:43
标题:
基于18b20温度带上限程序-LCD1602液晶显示篇
下图为图片:具体说明看前一篇的,这是用1602来显示的,程序是修改前面几个实验的,当温度<40度时电风扇不转,当>=40度时电风扇转动.下面实验做的截图,为参加电子比赛做的单片机系统实验.
全部程序:
ORG 0000H
;单片机内存分配申明!
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位
FLAG1 EQU 38H;是否检测到DS18B20标志位
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
RS EQU P3.7;确定具体硬件的连接方式
RW EQU P3.6 ;确定具体硬件的连接方式
E EQU P3.5 ;确定具体硬件的连接方式
;主程序
MAIN:
LCALL GET_TEMPER;调用读温度子程序
MOV A,29H
MOV C,40H;将28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
clr c
setb p3.0;zhelikais从这里开始是我填加的温度控制
CJNE A,#28H,FIT
SETB P3.0
AJMP DISLED
FIT:CPL C
MOV P3.0,C;jiesu到这里结束
DISLED:LCALL DISPLAY;调用数码管显示子程序
AJMP MAIN
;DS18B20复位初始化子程序
INIT_1820:SETB P2.2
NOP
CLR P2.2;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P2.2;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:JNB P2.2,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.1;未检查到DS18B20就点亮P1.1LED,与传感器通信失败
LJMP TSR7
TSR5:MOV R0,#117
TSR6:DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:SETB P2.2
RET
;读出转换后的温度值的子程序
GET_TEMPER:SETB P2.2
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
CLR P1.2
RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:CLR P1.3;DS18B20已经被检测到!
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
CLR P1.4
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:MOV R2,#8;一共8位数据
CLR C
WR1:CLR P2.2
MOV R3,#6
DJNZ R3,$
RRC A
MOV P2.2,C
MOV R3,#23
DJNZ R3,$
SETB P2.2
NOP
DJNZ R2,WR1
SETB P2.2
RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:MOV R2,#8;数据一共有8位
RE01:CLR C
SETB P2.2
NOP
NOP
CLR P2.2
NOP
NOP
NOP
SETB P2.2
MOV R3,#9
RE10:DJNZ R3,RE10
MOV C,P2.2
MOV R3,#23
RE20:DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;显示子程序
display: acall DL100MS
acall DL100MS
mov a,29H;将29H中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
add a,#00110000b
mov b_bit,a
mov a,b
add a,#00110000b
mov a_bit,a
MOV P1,#00000001B; ;清屏并光标复位
ACALL ENABLE;调用写入命令子程序
MOV P1,#00111000B ;;设置显示模式:8位2行5x7点阵
ACALL ENABLE ;调用写入命令子程序
MOV P1,#00001111B ;;显示器开、光标开、光标允许闪烁
ACALL ENABLE ;调用写入命令子程序
MOV P1,#00000110B ;;文字不动,光标自动右移
ACALL ENABLE ;调用写入命令子程序
MOV P1,#80H ;;写入显示起始地址(第二行第一个位置)
ACALL ENABLE ;调用写入命令子程序
MOV P1,b_bit ;;A十位送出去
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E ;;E=1 ;显示完成,程序停车
MOV P1,#00000110B ;;文字不动,光标自动右移
ACALL ENABLE ;调用写入命令子程序
MOV P1,#81H ;;写入显示起始地址(第二行第2个位置)
ACALL ENABLE ;调用写入命令子程序
MOV P1,a_bit;;字母A的代码
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E ;;E=1 ;显示完成,程序停车
ret
ENABLE:
CLR RS; ;写入控制命令的子程序
CLR RW
CLR E
ACALL DELAY
SETB E
RET
DELAY:
MOV P1,#0FFH ;;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,DELAY; ;如果P1.7为高电平表示忙就循环等待
RET
DL100MS: MOV R7,#02H
DL1: MOV R6,#0C8H
DL2: MOV R5,#0FAH
DJNZ R5,$
DJNZ R6,DL2
DJNZ R7,DL1
RET
end
复制代码
作者:
2855177040
时间:
2016-2-24 20:16
求此电路图。。。谢谢。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1