;--------------程序信息-----------------
;文件名 : ex3-6.asm
;版本 : 1.0
;作者 :
;修改时间 :
;--------------程序说明------------------
;CHAP 3.6 LED动态显示实例
;-----------常量和变量声明---------------
LED EQU P1; 宏定义LED显示器
Dq BIT P2.0
ADDR EQU 30H; 显示的温度值地址
ADDREND EQU 33H;
;--------------预定义--------------------
ORG 0000H
LJMP START
;------------中断入口地址分配------------
;ORG 0003H
;LJMP INT0PRG
;ORG 000BH
;LJMP INT1PRG
;ORG 0013H;
;LJMP
;ORG 0030H
START:
;--------------初始化子程序--------------
MOV SP,60H;
;--------------主程序--------------------
MAIN: LCALL GETTEMP; 通过传感器获得温度值
LCALL DISP; 动态扫描显示温度值
LJMP MAIN
;----------------子程序------------------
DISP: ;动态液晶显示子程序
MOV R0,ADDR;
MOV DPTR,#LEDDB;
DISP1: MOVX A,@DPTR;
MOV R1,A;
MOV A,@R0;
ORL A,R1;;
MOV LED,A;
LCALL DELAY1MS;
INC R0;
INC DPTR;
MOV A,R0;
CJNE A,#ADDREND,DISP1;
RET;
;---------------------------------
; DS1820温度采集主程序
;---------------------------------
GETTEMP:
CLR PSW.4
SETB PSW.3 ;设置工作寄存器当前所在的区域
CLR EA ;使用ds1820一定要禁止任何中断产生
LCALL INT ;调用初使化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A, #44H
LCALL WRITE ;送入温度转换命令
LCALL INT ;温度转换完全,再次初使化ds1820
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A,#0BEH
LCALL WRITE ;送入读温度暂存器命令
LCALL READ
MOV R7,A ;读出温度值低字节存入R7
LCALL READ
MOV R6,A ; 读出谩度值高字节存入R6
;LCALL TEMPCHANGE;
;SETB EA
RET
INT: ;初始化ds1820子程序
CLR EA
L0: CLR dq ;ds1820总线为低复位电平
MOV R2,#200
L1: CLR dq
DJNZ R2,L1 ;总线复位电平保持400us
SETB dq ;释放ds1820总线
MOV R2,#30
L4: DJNZ R2,L4 ;释放ds1820总线保持60us
CLR C ;清存在信号
ORL C,dq
JC L0 ;存在吗?不存在则重新来
MOV R6,#80
L5: ORL C,dq
JC L3
DJNZ R6,L5
SJMP L0
L3: MOV R2,#240
L2: DJNZ R2,L2
RET
WRITE: ;向ds1820写操作命令子程序
CLR EA
MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
WR1: SETB dq
MOV R4,#8
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR dq ;开始写入ds1820总线要处于复位(低)状态
WR2: DJNZ R4,WR2 ;ds1820总线复位保持16us
MOV dq,C ;写入一个bit
MOV R4,#20
WR3: DJNZ R4,WR3 ;等待40us
DJNZ R3,WR1 ;写入下一个bit
SETB dq ;重新释放ds1820总线
RET
READ:
CLR EA
MOV R6,#8 ;连续读8个bit
RE1: CLR dq ;读前总线保持为低
MOV R4,#4
NOP
SETB dq ;开始读总线释放
RE2: DJNZ R4,RE2 ;持续8us
MOV C,dq ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
MOV R5,#30
RE3: DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一个bit
SETB dq ;重新释放ds1820总线
RET
;--------------中断子程序----------------
;---------------延时子程序---------------
DELAY1MS: MOV R5,#02H;
DELAY10: MOV R6,#00F4H;
DELAY11: MOV R7,#0FFH;
DELAY12: DJNZ R7,DELAY12;
DJNZ R6,DELAY11;
DJNZ R5,DELAY10;
RET;
LEDDB: DB 10H,20H,40H; 高位表示LED的片选端
END
;---------------注意事项-----------------