📄 mcu.asm
字号:
cjne a,#30h,FUNCTION2_3 ;如果原来的次高位也是零,继续灭掉。
;因为本电路要求待测电阻小于999R,那
;么最多灭两个零就够了。
mov a,RESULT2 ;
mov RESULT1,a ;
mov a,RESULT3 ;
mov RESULT2,a ;
mov a,RESULT4 ;
mov RESULT3,a ;
FUNCTION2_3: mov a,#LCD_CLS ;清屏。
call WRCMD ;
call WRRESULT ;调用写结果字符串子程序。
jmp FUNCTION2_1 ;
;;;;;;;;;;;;;;;;测量电阻功能子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;DS18B20子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,b,c,dptr,bank0区r2~r6
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FUNCTION3: mov a,RETURNFLAG ;检查返回标志,决定是否返回。
jz FUNCTION3_CON ;
jmp main ;
FUNCTION3_CON: call GET_TEMPERATURE ;
mov r2,#04h ;为简化程序编写,温度精确到“度”。
FUNCTION3_1: clr c ;DS18B20HIGH,DS18B20LOW联合左移位
;4次将温度值全部移入DS18B20HIGH,
;最高bit为符号位,补码格式。
mov a,DS18B20LOW ;
rlc a ;
mov DS18B20LOW,a ;
mov a,DS18B20HIGH ;
rlc a ;
mov DS18B20HIGH,a ;
djnz r2,FUNCTION3_1 ;
mov r2,#00h ;
mov a,DS18B20HIGH ;
jnb acc.7,FUNCTION3_2 ;如果温度是负值,求反加1。
mov r2,#0FFh ;设定负值比标志。
cpl a ;
inc a ;
FUNCTION3_2: mov b,#0Ah ;以下显示数据
div ab ;
mov r6,b ;
mov b,#0Ah ;
div ab ;
mov r4,a ;
mov r5,b ;
mov a,r6 ;最低位。
mov dptr,#LCD0 ;
movc a,@a+dptr ;
mov RESULT4,a ;
mov a,r5 ;次低位。
movc a,@a+dptr ;
mov RESULT3,a ;
mov a,r4 ;最高位。
movc a,@a+dptr ;
mov RESULT2,a ;
mov a,#12h ;℃符号。
movc a,@a+dptr ;
mov RESULT5,a ;
mov a,#00h ;
mov RESULT6,a ;
mov a,r2 ;
jz FUNCTION3_3 ;
mov a,#13h ;-符号。
movc a,@a+dptr ;
mov RESULT1,a ;
jmp FUNCTION3_4 ;
FUNCTION3_3: mov a,#14h ;+符号。
movc a,@a+dptr ;
mov RESULT1,a ;
FUNCTION3_4: mov a,#LCD_CLS ;
call WRCMD ;
call WRRESULT ;
mov r4,#010h ;这部分程序有两个作用。
D15: mov r5,#0FFh ;1:设定2次温度采集的间隔。
D16: mov r6,#0FFh ;2:如果要返回主菜单,请在LCD
;显示结果后约2秒内按下键盘任意
;键。(约2秒是这里设定的时间)
D17: djnz r6,D17 ;
djnz r5,D17 ;
djnz r4,D17 ;
jmp FUNCTION3 ;
;;;;;;;;;;;;;;;;DS18B20子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;一组DS18B20操作子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;===============读取温度子程序==================================================================
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GET_TEMPERATURE:clr EA ;使用DS18B20一定要禁止任何
;中断产生。
call INITDS18B20 ;调用初使化DS18B20子程序。
mov a,#0CCH ;
call WRITEDS18B20 ;送入跳过ROM命令。
mov a,#44H ;
call WRITEDS18B20 ;送入温度转换命令。
call INITDS18B20 ;温度转换完全,再次初使化
;DS18B20。
mov a,#0CCH ;
call WRITEDS18B20 ;送入跳过ROM命令。
mov a,#0BEH ;
call WRITEDS18B20 ;送入读温度暂存器命令。
call READDS18B20 ;
mov DS18B20LOW,a ;读出温度值低字节存入DS18B20LOW。
call READDS18B20 ;
mov DS18B20HIGH,a ;读出谩度值高字节存入DS18B20HIGH。
setb EA ;开启中断。
ret ;
;===============读取温度子程序结束==============================================================
;===============初始化DS18B20子程序=============================================================
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用bank0区r6,r7
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INITDS18B20: clr EA ;
L0: clr p3.4 ;置DS18B20总线低复位状态。
mov r7,#0C8h ;
L1: clr p3.4 ;
djnz r7,L1 ;总线复位电平保持400us。
setb p3.4 ;释放DS18B20总线。
mov r7,#1Eh ;
L4: djnz r7,L4 ;释放DS18B20总线状态,保持
;60us。
clr c ;清存在信号。
orl c,p3.4 ;
jc L0 ;存在吗?不存在则重新来。
mov r6,#50h ;
L5: orl c,p3.4 ;存在脉冲之后,要变为高电平。
jc L3 ;否则DS18B20出现异常错误,要
djnz r6,L5 ;重新初始化。详细时序请参考
jmp L0 ;技术文档。
L3: mov r7,#0F0h ;
L2: djnz r7,L2 ;
ret
;===============初始化DS18B20子程序结束=========================================================
;===============写DS18B20子程序=================================================================
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,bank0区r3,r4
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WRITEDS18B20: clr EA ;
mov r3,#08h ;写入DS18B20的bit数。
WR1: setb p3.4 ;
mov r4,#08h ;
rrc a ;把一个字节分成8个bit移入C。
clr p3.4 ;开始写入DS18B20,总线要处于
;低复位状态 。
WR2: djnz r4,WR2 ;DS18B20总线复位保持16us。
mov p3.4,c ;写入一个bit。
mov r4,#14h ;
WR3: djnz r4,WR3 ;等待40us
djnz r3,WR1 ;写入下一个bit 。
setb p3.4 ;重新释放DS18B20总线 。
ret ;
;===============写DS18B20子程序结束=============================================================
;===============读DS18B20子程序=================================================================
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,bank0区r4,r5,r6
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
READDS18B20: clr EA ;
mov r6,#08h ;连续读8个bit。
RE1: clr p3.4 ;读前总线保持为低 。
mov r4,#04h ;
nop ;
setb p3.4 ;开始读总线释放 。
RE2: djnz r4,RE2 ;持续8us。
mov c,p3.4 ;从DS18B20总线读得一个bit。
rrc a ;把读得的位值环移给a。
mov r5,#1Eh ;
RE3: djnz r5,RE3 ;持续60us。
djnz r6,RE1 ;读下一个bit。
setb p3.4 ;重新释放DS18B20总线。
ret ;
;===============读DS18B20子程序=================================================================
;;;;;;;;;;;;;;;;一组DS18B20操作子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;自动计数子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,b,dptr,bank0区r4~r7
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FUNCTION4: mov a,#00h ;初始赋值。
mov AUTOCOUNTER,a ;保存在34h中。
FUNCTION4_1: mov a,RETURNFLAG ;检查返回标志,决定是否返回。
jz FUNCTION4_CON ;
jmp main ;
FUNCTION4_CON: mov a,AUTOCOUNTER ;恢复计数值。
inc a ;加一。
cjne a,#64h,NO_ROUND1 ;如果超过99,那么返回00。
mov a,#00h ;
NO_ROUND1: mov AUTOCOUNTER,a ;
mov b,#0Ah ;
div ab ;除以10,高位(商)在a中。
;低位(余数)在b中。
mov r4,a ;
mov a,b ;先显示低位。
mov dptr,#SEGMENT7 ;
movc a,@a+dptr ;取得该数字对应的7段数码管的数值。
cpl a ;注意数码管采用共阳极电路,所以求反。
mov dptr,#8500h ;7段数码管B对应低位。
movx @dptr,a ;显示。
mov a,r4 ;再显示高位。
mov dptr,#SEGMENT7 ;
movc a,@a+dptr ;
cpl a ;
mov dptr,#8400h ;
movx @dptr,a ;
mov r5,#05h ;以下延迟一段时间,可自行调整。
D6: mov r6,#80h ;
D7: mov r7,#80h ;
D8: djnz r7,D8 ;
djnz r6,D7 ;
djnz r5,D6 ;
jmp FUNCTION4_1 ;循环计数。
SEGMENT7: db 3Fh ;7段数码管字符0的abcdefg的值,
;a在最低位,最高位始终保留为0。
db 06h ;7段数码管字符1的abcdefg的值。
db 5Bh ;7段数码管字符2的abcdefg的值。
db 4Fh ;7段数码管字符3的abcdefg的值。
db 66h ;7段数码管字符4的abcdefg的值。
db 6Dh ;7段数码管字符5的abcdefg的值。
db 7Dh ;7段数码管字符6的abcdefg的值。
db 07h ;7段数码管字符7的abcdefg的值。
db 7Fh ;7段数码管字符8的abcdefg的值。
db 6Fh ;7段数码管字符9的abcdefg的值。
; a
; ■■■■■
; ■ ■
; f■ ■b
; ■ g ■
; ■■■■■
; ■ ■
; e■ ■c
; ■ ■
; ■■■■■
; d
;;;;;;;;;;;;;;;;自动计数子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;LED显示子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,c,dptr,bank0区r4~r7
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FUNCTION5: mov a,RETURNFLAG ;检查返回标志,决定是否返回。
jz FUNCTION5_CON ;这段程序返回主菜单时可能反应比较慢,
jmp main ;原因是必须完成一次显示循环才判断是
;否返回。所以请耐心等待。
FUNCTION5_CON: mov dptr,#8600h ;没有什么可以解释的,就是让LED阵列闪,
FUNCTION5_1: setb c ;烁,有一种漂亮的效果。您可以发挥自己
mov a,#00h ;的想象力,随意创作。作者只是给出一个
mov r4,#08h ;简单的例子。
FUNCTION5_2: movx @dptr,a ;
call F5DELAY ;
rlc a ;
djnz r4,FUNCTION5_2 ;
setb c ;
mov a,#00h ;
mov r4,#08h ;
FUNCTION5_3: movx @dptr,a ;
call F5DELAY ;
rrc a ;
djnz r4,FUNCTION5_3 ;
clr c ;
mov a,#0FFh ;
mov r4,#08h ;
FUNCTION5_4: movx @dptr,a ;
call F5DELAY ;
rlc a ;
djnz r4,FUNCTION5_4 ;
clr c ;
mov a,#0FFh ;
mov r4,#08h ;
FUNCTION5_5: movx @dptr,a ;
call F5DELAY ;
rrc a ;
djnz r4,FUNCTION5_5 ;
jmp FUNCTION5 ;
F5DELAY: mov r5,#05h ;在此调整时间间隔。
D9: mov r6,#80h ;
D10: mov r7,#80h ;
D11: djnz r7,D11 ;
djnz r6,D10 ;
djnz r5,D9 ;
ret ;
;;;;;;;;;;;;;;;;LED显示子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;虚拟串口通信子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,dptr,bank0区r5~r7
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;'''''''''''''''友情提示''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
;1:使用此功能,您需要有两个必备软件:虚拟串口软件和串口调试软件。
;2:请连接http://siwawa9000.gbaopan.com,获得相关软件和使用指南。
;'''''''''''''''提示完毕''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
FUNCTION6: call COMMINITIALIZATION ;调用串口初始化子程序。
FUNCTION6_1: mov a,RETURNFLAG ;检查返回标志,决定是否返回。
jz FUNCTION6_CON ;
clr TR1 ;关闭定时器1。
jmp main ;
FUNCTION6_CON: clr ES ;禁止串行中断。
clr RI ;清除接收标志位。
mov dptr,#SERIAL ;
mov a,COMINDEX ;
movc a,@a+dptr ;
jz FUNCTION6_3 ;
mov SBUF,a ;发送。这段程序的功能就是把可打
;印的ASCII字符显示出来。
FUNCTION6_2: jnb TI,FUNCTION6_2 ;等待发送完毕。
clr TI ;清除发送中断标志。
setb ES ;允许串行中断。
mov a,COMINDEX ;
inc a ;
mov COMINDEX,a ;
call F6DELAY ;
jmp FUNCTION6_1 ;
FUNCTION6_3: mov COMINDEX,#00h ;
setb ES ;
jmp FUNCTION6_1 ;
F6DELAY: mov r5,#02h ;在此调整时间间隔。
D23: mov r6,#80h ;
D24: mov r7,#80h ;
D25: djnz r7,D25 ;
djnz r6,D24 ;
djnz r5,D23 ;
ret ;
;;;;;;;;;;;;;;;;虚拟串口通信子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;初始化串口子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COMMINITIALIZATION:
mov TMOD,#20h ;设置定时器T1工作方式2。
mov TL1,#0F3h ;定时器计数初值,波特率2400。
mov TH1,#0F3h ;定时器重装值。
setb EA ;允许总的中断。
setb ES ;允许串行中断。
mov PCON,#00h ;波特率不倍增。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -