本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
我本来是要做一个数码管显示,再加定时的程序,但因为数据管显示网上有很多资料我就拿了现成然后自己改了下,再接着自己定了个定时30秒的。在自己分开写的时候定时还能成功的,但不知道为什么放到断码管显示程序里面时就没用了。麻烦高手帮我看下,我把两个程序都放出来。
首先这个是单单定时的:
ORG 00H
AJMP START0
ORG 0BH
AJMP START1
STAR0:
MOV 40,#60
MOV 41,#10
ANL TMOD,#0F0H
ORL TMOD,#01H
MOV P1,#0F0H
MOV TH0,#03CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
SJMP $
START1:
MOV P1,#0FH
MOV TH0,#03CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
DJNZ 40,PA
DJNZ 41,PB
AJMP PZ
PB: MOV R0,#60
PA: RETI
PZ:
MOV P1,0FFH
END
再有全部的,其实里面很多 内容不用看的,就想说麻烦帮我看下定时部分为什么没有作用的 。
TEMPL DATA 26H
TEMPH DATA 27H
TEMP_TH DATA 28H
TEMP_TL DATA 29H
TEMPHC DATA 2AH
TEMPLC DATA 2BH
TEMP_ZH DATA 2CH
DATA_LINE EQU P3.3
RELAY EQU P3.2
FLAG1 EQU 20H.0
FLAG2 EQU 20H.1
;=================================================
ORG 0
JMP START0
ORG 0BH
JMP START1
;--------------------------------------------------
;定时程序
START0:
MOV 40,#60
MOV 41,#3
ANL TMOD,#0F0H
ORL TMOD,#01H
MOV P1,#0F0H
MOV TH0,#03CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
MAIN:
MOV 20H,#00H
MOV 7FH,#0AH ;熄灭符
CALL RESET ;复位与检测DS18B20
JNB FLAG1,MAIN1 ;FLAG1=0,DS18B20不存在
JMP START
MAIN1: CALL RESET
JB FLAG1,START
JMP MAIN1
START:
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#044H ; 发出温度转换命令
CALL WRITE
CALL RESET
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#0BEH ; 发出读温度命令
CALL WRITE
CALL READ ;读温度数据
CALL CONVTEMP
CALL DISPBCD
CALL DISP1
JMP MAIN1
START1:
MOV P1,#0FH
MOV TH0,#03CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
DJNZ 40,PA
LJMP PZ
PB: MOV R0,#60
PA: RETI
PZ:
MOV P1,0FFH
;=====================================================
;DS18B20 复位与检测子程序
;FLAG1=1 OK, FLAG1=0 ERROR
;======================================================
RESET:
SETB DATA_LINE
NOP
CLR DATA_LINE
MOV R0,#64H ;主机发出延时600微秒的复位低脉冲
MOV R1,#03H
RESET1: DJNZ R0,$
MOV R0,#64H
DJNZ R1,RESET1
SETB DATA_LINE ;然后拉高数据线
NOP
MOV R0,#25H
RESET2: JNB DATA_LINE,RESET3 ;等待DS18B20回应
DJNZ R0,RESET2
JMP RESET4 ; 延时
RESET3: SETB FLAG1 ; 置标志位,表示DS1820存在
JMP RESET5
RESET4: CLR FLAG1 ; 清标志位,表示DS1820不存在
JMP RESET6
RESET5: MOV R0,#064H
DJNZ R0,$ ; 时序要求延时一段时间
RESET6: SETB DATA_LINE
RET
;===========================================================
;
;===========================================================
WRITE: MOV R2,#8 ;一共8位数据
CLR CY
WR1:
CLR DATA_LINE ;开始写入DS18B20总线要处于复位(低)状态
MOV R3,#09
DJNZ R3,$ ;总线复位保持18微妙以上
RRC A ;把一个字节DATA 分成8个BIT环移给C
MOV DATA_LINE,C ;写入一个BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
SETB DATA_LINE ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个BIT
SETB DATA_LINE
RET
;============================================================
;从DS18B20中读出温度低位、高位和报警值TH、TL
;存入26H、27H、28H、29H
;============================================================
READ: MOV R4,#4 ; 将温度高位和低位从DS18B20中读出
MOV R1,#26H ; 存入26H、27H、28H、29H
RE00: MOV R2,#8
RE01: CLR C
SETB DATA_LINE
NOP
NOP
CLR DATA_LINE ;读前总线保持为低
NOP
NOP
NOP
SETB DATA_LINE ;开始读总线释放
MOV R3,#09 ;延时18微妙
DJNZ R3,$
MOV C,DATA_LINE ;从DS18B20总线读得一个BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
RRC A ;把读得的位值环移给A
DJNZ R2,RE01 ;读下一个BIT
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
;--------------------------------------------
;200ms对闪动标记取反一次
;--------------------------------------------
;*****************************************************
; 处理温度 BCD 码子程序
;****************************************************
CONVTEMP: MOV A,TEMPH ;判温度是否零下
ANL A,#80H
JZ TEMPC1 ;温度零上转
CLR C
MOV A,TEMPL ;二进制数求补(双字节)
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH ;-
CPL A
ADDC A,#00H
MOV TEMPH,A ;TEMPHC HI =符号位
MOV TEMPHC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;
TEMPC11: MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC LOW=小数部分 BCD
MOV A,TEMPL ;整数部分
ANL A,#0F0H
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH
SWAP A
ORL A,TEMPL
MOV TEMP_ZH,A ;组合后的值存入TEMP_ZH
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H
SWAP A
ORL A,TEMPHC ;TEMPHC LOW = 十位数 BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
SWAP A ;TEMPLC HI = 个位数 BCD
ORL A,TEMPLC
MOV TEMPLC,A
MOV A,R7
JZ TEMPC12
ANL A,#0FH
SWAP A
MOV R7,A
MOV A,TEMPHC ;TEMPHC HI = 百位数 BCD
ANL A,#0FH
ORL A,R7
MOV TEMPHC,A
TEMPC12: RET
;-----------------------------------------------------------
; 小数部分码表
;-----------------------------------------------------------
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;===========================================================
;显示区 BCD 码温度值刷新子程序
;===========================================================
DISPBCD: MOV A,TEMPLC
ANL A,#0FH
MOV 70H,A ;小数位
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV 71H,A ;个位
MOV A,TEMPHC
ANL A,#0FH
MOV 72H,A ;十位
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,A ;百位
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#010H,DISPBCD0
SJMP DISPBCD2
DISPBCD0: MOV A,TEMPHC
ANL A,#0FH
JNZ DISPBCD2 ;十位数是0
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,#0AH ;符号位不显示
MOV 72H,A ;十位数显示符号
DISPBCD2: RET
;***************************************************************
; 温度显示子程序
;***************************************************************
;显示数据在70H - 73H 单元内,用4位共阳数码管显示,P0口输出段码数据,
;P2 口作扫描控制,每个 LED 数码管亮 2MS 时间再逐位循环。
DISP1: MOV R1,#70H ;指向显示数据首址
MOV R5,#7FH ;扫描控制字初值
PLAY: MOV P0,#0FFH
MOV A,R5 ;扫描字放入A
MOV P2,A
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P0口
MOV A,R5
JB ACC.6,LOOP5 ;小数点处理
CLR P0.7
LOOP5: LCALL DL_MS ;显示2MS
INC R1 ;指向下一个地址
MOV A,R5 ;放回 R5 内
JNB ACC.3,ENDOUT ;ACC.3=0时一次显示结束
RR A ;A 中数据循环左移
MOV R5,A ;放入 R5 中
AJMP PLAY ;跳回 PLAY 循环
ENDOUT: MOV P0,#0FFH ;一次显示结束,P0口复位
MOV P2,#0FFH ;P2口复位
RET
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H
; “0" “1" “2" “3" “4"“5"“6"“7"“8"“9"“灭" “-" “L”“H"
DL_MS: MOV R6,#0AH ;2MS延时程序,LED 显示程序用
DL1: MOV R7,#64H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;******************************************************
;单字节十六进制转 BCD
;******************************************************
HEX2BCD1: MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
;===============================================
DELAY: ;(R5)*延时10MS
MOV R6,#50
DEL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
DJNZ R5,DELAY
RET
;======== ==========================================
END
感激不尽 |
|