No.94158 作者:caroljzw 邮件:caroljzw@yahoo.com.cn ID:54672 登陆:1次 文章数:1篇 最后登陆IP:202.206.209.10 最后登陆:2006/6/4 20:46:09 注册:2006/6/4 16:06:05 财富:105 发帖时间:2006/6/4 16:12:07 发贴者IP:202.206.209.10 标题:caroljzw:新手求助~DS18B20测温程序编译错误太多~ 摘要:No.94158新手求助~DS18B20测温程序编译错误太多~ 用AT89C2051单片机。程序如下 ********************************** ;DS18B20 数字温度计 * ;采用4位LED共阳显示器显示测温值,显示精度0.1℃,测温范围-55~+125℃ * ;用AT89C2051 单片机,12MHZ 晶振 * ;************************************** ; ;************************************** ;常数定义 ;************************************** TIMEL EQU 0E0H ;20MS,定时器0时间常数 TIMEH EQU 0B1H TEMPHEAD EQU 36H ; ;************************************** ;工作内存定义 ;************************************** BITST DATA 20H TIME1SOK BIT BITST.1 TEMPONEOK BIT BITST.2 TEMPL DATA 26H TEMPH DATA 27H TEMPHC DATA 28H TEMPLC DATA 29H ; ;************************************** ;引脚定义 ;************************************** TEMPDIN BIT P3.7 ; ;************************************** ;中断向量区 ;************************************** ORG 0000H LJMP START ; ORG 00BH LJMP T0IT ; ;************************************** ;系统初始化 ;************************************** ORG 100H START: MOV SP,#60H CLSMEM: MOV R0,#20H MOV R1,#60H CLSMEM1: MOV @R0,#00H INC R0 DJNZ R1,CLSMEM1 ; MOV TMOD,#00100001B ;定时器0作方式1(16BIT) MOV TH0,#TIMEL MOV TL0,#TIMEH ;20MS SJMP INIT ; ERROR: NOP LJMP START ; NOP INIT: NOP SETB ET0 SETB TR0 SETB EA MOV PSW,#00H CLR TEMPONEOK LJMP MAIN ; ;************************************** ;定时器0中断服务程序 ;************************************** T0IT: PUSH PSW MOV PSW,#10H MOV TH0,#TIMEH MOV TL0,@TIMEL INC R7 CJNE R7,#32H,T0IT1 MOV R7,#00H SETB TIME1SOK ;1S定时到标志 T0IT1: POP PSE RETI ; ; ; ;************************************** ;主程序 ;************************************** MAIN: LCALL DISP1 ;调用显示子程序 JNB TIME1SOK,MAIN CLR TIME1SOK ;测温每1S一次 JNB TEMPONEOK,MAIN2 ;上电时先温度转换一次 LCALL READTEMP1 ;读出温度值子程序 LCALL CONVTEMP ;温度BCD码计算处理子程序 LCALL DISPBCD ;显示区BCD码温度值刷新子程序 LCALL DISP1 ;消闪烁,显示一次 MAIN2: LCALL READTEMP ;温度转换开始 SETB TEMPONEOK LJMP MAIN ; ;************************************** ;************************************** ;子程序区 ;************************************** ;RESET DS18B20 ;************************************** INITDS1820: SETB TEMPDIN NOP NOP CLR TEMPDIN MOV R6,#0A0H ;DELAY480US DJNZ R6,$ MOV R6,#0A0H DJNZ R6,$ SETB TEMPDIN MOV R6,#32H ;DELAY70US DJNZ R6,$ MOV R6,#3CH LOOP1820: MOV C,TEMPDIN JC INITDS1820OUT DJNZ R6,LOOP1820 MOV R6,#064H ;DELAY200US DJNZ R6,$ SJMP INITDS1820 RET ; INITDS1820OUT: SETB TEMPDIN RET ; ; ;************************************** ;读DS18B20的程序,从DS18B20中读出一个字节的数据 ;************************************** READDS1820: MOV R7,#08H SETB TEMPDIN NOP READDS1820LOOP: CLR TEMPDIN NOP NOP NOP SETB TEMPDIN MOV R6,#07H ;DELAY15US DJNZ R6,$ MOV C,TEMPDIN MOV R6,#3CH DJNZ R6,$ RRC A SETB TEMPDIN DJNZ R7,READDS1820LOOP MOV R6,#3CH ;DELAY120US DJNZ R6,$ RET ; ; ;************************************** ;写DS18B20的程序,从DS18B20种些一个字节的数据 ;************************************** WRETEDS1820: MOV R7,#08H SETB TEMPDIN NOP NOP WRITEDS1820LOP: CLR TEMPDIN MOV R6,#07H ;DELAY15US DJNZ R6,$ RRC A MOV TEMPDIN,C MOV R6,#34H ;DELAY104US DJNZ R6,$ SETB TEMPDIN DJNZ R7,WRITEDS1820LOP RET ; ; ;************************************** ;READ TEMP ;************************************** READTEMP: LCALL INITDS1820 MOV A,#0CCH LCALL WRITEDS1820 ;SKIP ROM MOV R6,#34H ;DELAY104US DJNZ R6,$ MOV A,#44H LCALL WRITEDS1820 ;START CONVERSION MOV R6,#34H ;DELAY104US DJNZ R6,$ RET ; READTEMP1: LCALL INITES1820 MOV A,#0CCH LCALL WRITEDS1820 ;SKIP ROM MOV R6,#34H ;DELAY104US DJNZ R6,$ MOV A,#0BEH LCALL WRITEDS1820 ;SCRATCHPAD MOV R6,#34H ;DELAY104US DJNZ R6,$ MOV R5,#09H MOV R0,#TEMPHEAD MOV B,#00H READTEMP2: LCALL READDS1820 MOV @R0,A INC R0 READTEMP21: LCALL CRC8CAL DJNZ R5,READTEMP2 ......
>>返回讨论的主题
|