本汇编程序仅适合单个ds18b20和51单片机的连接,晶振为12mhz左右
dq:ds18b20的数据总线接脚
flag1:标志位,为“1”时表示检测到ds18b20
temper_num:保存读出的温度数据
temper_lequ36h
temper_hequ35h
dqbitp1.7
; ds18b20初始化汇编程序
;//*****************************************//
init_1820:
setbdq
nop
clrdq
movr0,#06bh
tsr1:
djnzr0,tsr1; 延时
setbdq
movr0,#25h
tsr2:
jnbdq,tsr3
djnzr0,tsr2
ljmptsr4; 延时
tsr3:
setbflag1; 置标志位,表示ds1820存在
ljmptsr5
tsr4:
clrflag1; 清标志位,表示ds1820不存在
ljmptsr7
tsr5:
movr0,#06bh
tsr6:
djnzr0,tsr6; 延时
tsr7:
setbdq
ret
;//*****************************************//
; 重新写ds18b20暂存存储器设定值
;//*****************************************//
re_config:
jbflag1,re_config1; 若ds18b20存在,转re_config1
ret
re_config1:
mova,#0cch; 发skip rom命令
lcallwrite_1820
mova,#4eh; 发写暂存存储器命令
lcallwrite_1820
mova,#00h; th(报警上限)中写入00h
lcallwrite_1820
mova,#00h; tl(报警下限)中写入00h
lcallwrite_1820
mova,#1fh; 选择9位温度分辨率
lcallwrite_1820
ret
;//*****************************************//
; 读出转换后的温度值
;//*****************************************//
get_temper:
setbdq; 定时入口
lcallinit_1820
jbflag1,tss2
ret; 若ds18b20不存在则返回
tss2:
mova,#0cch; 跳过rom匹配
lcallwrite_1820
mova,#44h; 发出温度转换命令
lcallwrite_1820
lcallinit_1820
mova,#0cch; 跳过rom匹配
lcallwrite_1820
mova,#0beh; 发出读温度命令
lcallwrite_1820
lcallread_1820
movtemper_num,a; 将读出的温度数据保存
ret
;//*****************************************//
; 读ds18b20的程序,从ds18b20中读出一个字节的数据
;//*****************************************//
read_1820:
movr2,#8
re1:
clrc
setbdq
nop
nop
clrdq
nop
nop
nop
setbdq
movr3,#7
djnzr3,$
movc,dq
movr3,#23
djnzr3,$
rrca
djnzr2,re1
ret
;//*****************************************//
; 写ds18b20的程序
;//*****************************************//
write_1820:
movr2,#8
clrc
wr1:
clrdq
movr3,#6
djnzr3,$
rrca
movdq,c
movr3,#23
djnzr3,$
setbdq
nop
djnzr2,wr1
setbdq
ret
;//*****************************************//
; 读ds18b20的程序,从ds18b20中读出两个字节的温度数据
;//*****************************************//
read_18200:
movr4,#2; 将温度高位和低位从ds18b20中读出
movr1,#36h; 低位存入36h(temper_l),高位存入35h(temper_h)
re00:
movr2,#8
re01:
clrc
setbdq
nop
nop
clrdq
nop
nop
nop
setbdq
movr3,#7
djnzr3,$
movc,dq
movr3,#23
djnzr3,$
rrca
djnzr2,re01
mov@r1,a
decr1
djnzr4,re00
ret
;//*****************************************//
; 将从ds18b20中读出的温度数据进行转换
;//*****************************************//
temper_cov:
mova,#0f0h
anla,temper_l; 舍去温度低位中小数点后的四位温度数值
swapa
movtemper_num,a
mova,temper_l
jnbacc.3,temper_cov1; 四舍五入去温度值
inctemper_num
temper_cov1:
mova,temper_h
anla,#07h
swapa
orla,temper_num
movtemper_num,a; 保存变换后的温度数据
lcallbin_bcd
ret
;//*****************************************//
; 将16进制的温度数据转换成压缩bcd码
;//*****************************************//
bin_bcd:
movdptr,#temp_tab
mova,temper_num
movca,@a+dptr
movtemper_num,a
ret
temp_tab:
db00h,01h,02h,03h,04h,05h,06h,07h
db08h,09h,10h,11h,12h,13h,14h,15h
db16h,17h,18h,19h,20h,21h,22h,23h
db24h,25h,26h,27h,28h,29h,30h,31h
db32h,33h,34h,35h,36h,37h,38h,39h
db40h,41h,42h,43h,44h,45h,46h,47h
db48h,49h,50h,51h,52h,53h,54h,55h
db56h,57h,58h,59h,60h,61h,62h,63h
db64h,65h,66h,67h,68h,69h,70h
;//*****************************************//
下面还介绍一个ds18b20汇编程序
;**********************************
flag1 bit f0 ;ds18b20存在标志位
dq bit p1.7
temper_l equ 29h
temper_h equ 28h
a_bit equ 35h
b_bit equ 36h
;************ds18b20汇编程序起始********************
org 0000h
ajmp main
org 0100h
;**************主程序开始************
main:
lcall init_18b20
;lcall re_config
lcall get_temper
ajmp change
;**********ds18b20复位程序*****************
init_18b20: setb dq
nop
clr dq
mov r0,#0fbh
tsr1: djnz r0,tsr1 ;延时
setb dq
mov r0,#25h
tsr2: jnb dq ,tsr3
djnz r0,tsr2
tsr3: setb flag1 ;置标志位,表明ds18b20存在
clr p2.0 ;二极管指示
ajmp tsr5
tsr4: clr flag1
ljmp tsr7
tsr5: mov r0,#06bh
tsr6: djnz r0,tsr6
tsr7:setb dq ;表明不存在
ret
;********************设定ds18b20暂存器设定值**************
;re_config:
;jb flag1,re_config1
;ret
;re_config1: mov a,#0cch ;放跳过rom命令
;lcall write_18b20
;mov a,#4eh
;lcall write_18b20 ;写暂存器命令
;mov a,#00h ;报警上限中写入00h
;lcall write_18b20
;mov a,#00h ;报警下限中写入00h
; lcall write_18b20
;mov a,#1fh ;选择九位温度分辨率
; lcall write_18b20
; ret
;*****************读转换后的温度值****************
get_temper:
setb dq
lcall init_18b20
jb flag1,tss2
ret ;若不存在则返回
tss2: mov a,#0cch ;跳过rom
lcall write_18b20
mov a,#44h ;发出温度转换命令
lcall write_18b20
lcall display ;延时
lcall init_18b20
mov a,#0cch ;跳过rom
lcall write_18b20
mov a,#0beh ;发出读温度换命令
lcall write_18b20
lcall read2_18b20 ;读两个字节的温度
ret
;***************写ds18b20汇编程序************
write_18b20:
mov r2,#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
;***********读18b20程序,读出两个字节的温度*********
read2_18b20:
mov r4,#2 ;低位存在29 h,高位存在28h
mov r1,#29h
re00: mov r2,#8
re01: clr c
setb c
nop
nop
clr dq
nop
nop
nop
setb dq
mov r3,#7
djnz r3,$
mov c,dq
mov r3,#23
djnz r3,$
rrc a
djnz r2,re01
mov @r1,a
dec r1
djnz r4,re00
ret
;************读出的温度进行数据转换**************
change: mov a,29h
mov c,28h.0 ;将28h中的最低位移入c
rrc a
mov c,28h.1
rrc a
mov c,28h.2
rrc a
mov c,28h.3
rrc a
mov 29h,a
;setb p2.0
lcall display ;调用数码管显示子程序
; setb p2.0
ljmp main
;*******************display******
display: mov a,29h;将29h中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#tab ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;显示1000次
dplop: mov a,a_bit ;取个位数
movc a,@a+dptr ;查个位数的7段代码
mov p0,a ;送出个位的7段代码
clr p2.5;开个位显示
acall d1ms ;显示1ms
setb p2.5
mov a,b_bit ;取十位数
movc a,@a+dptr ;查十位数的7段代码
mov p0,a ;送出十位的7段代码
clr p2.4;开十位显示
acall d1ms ;显示1ms
setb p2.4
djnz r1,dplop ;100次没完循环
djnz r0,dpl1 ;4个100次没完循环
ret
;***********************************
d1ms: mov r7,#80 ;1ms延时(按12mhz算)
djnz r7,$
ret
;*************************
tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h
二进制数及其他
超高速光传送应对移动互联驱动的带宽激增
精准看护 智慧养老院三维可视化管理系统
荣耀9与小米note2对比评测:冰川银小米note2和海鸥灰荣耀9,你喜欢谁?
关于GDT陶瓷气体放电管的几点选型注意事项
DS18B20和51单片机连接的汇编程序免费下载
华为携手合伙伙伴共同推进数据中心行业走向绿色低碳
一周芯闻:全球首条全自动化天车系统先进封装线在华天科技投运
小蚁4K+运动相机评测 小身材大味道
NBIOT的省电技术和工作状态
闪极推出140W多口氮化镓充电器,率先进入PD3.1快充时代
51单片机编程环境搭建方法
摒弃表象从技术上解决问题:LED驱动设计的五大心得
集邦咨询2020存储产业趋势峰会圆满落幕!
vivo商城手机大降价,vivoX9、vivoX9plus和vivoXplay6最多直降600
多层陶瓷基板及其在车载领域的应用
详解MEMS的几种RF相关应用产品SAW,BAW,FBAR filter
华为提出的光网络2.0概念将会为企业网带来哪些新的变化
环保捕蚊黑科技,灭蚊灯真的有用吗?
Algorized与Qorvo建立合作伙伴关系