求单片机(AT89c51和DS18B20)做数字温度计程序和仿真硬件截图!!!!

全部回答2
默认 最新
  • 我给你找找 我这里有proteus仿真+程序 找我 我给你发
    0 点赞
  • 18B20数字温度显示系统 综合实验:用18B20(数字温度采集)74LS47(数码管译码)74LS138(三八译码) DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出. 主机控制DS18B20完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。必须先启动DS18B20开始转换,再读出温度转换值。本程序仅挂接一个芯片,使用默认的12位转换精度,外接供电电源,读取的温度值高位字节送WDMSB单元,低位字节送WDLSB单元,再按照温度值字节的表示格式及其符号位,经过简单的变换即可得到实际温度值。 DS18B20的引脚:18b20原理图 在本系统中:为了简化程序, 采用了74LS47(数码管译码)74LS138(三八译码)。即P0口的P0.0,P0.1,P0.2,P0.3 四个端口接到74LS47进行硬件数码管译码,然后输出到数码管部分的数据口JP5。 P0.4,P0.5,P.0.6三个端口接到74LS138进行38译码,然后输出到数码管的位控制JP8. 系统综合原理图: ;本程序测量温度范围:0~125度,精确到0.06; DAT BIT P3.0 ;数据通信口 WDLSB DATA 30H ;读出的温度低字节 WDMSB DATA 31H ;读出的温度高字节 ;*************************************************************** ORG 0000H LJMP MAIN ORG 000BH SJMP TIMER0 ;定时显示 ;**************************************************************** ;定时显示子程序,采用循环扫描方式 ;显示缓冲区40H~47H ORG 0040H TIMER0: MOV P0,40H ;最后一位值送p0 ORL P0,#70H; 点亮最后一位 CALL T1MS MOV P0,41H ORL P0,#60H CALL T1MS MOV P0,42H ORL P0,#50H CALL T1MS MOV P0,43H ORL P0,#40H MOV TH0,#LOW(65536-10000) ;定时器10MS中断 MOV TL0,#HIGH(65536-10000) RETI T1MS: movr5,#00h;延时子程序 tt:movr6,#9 djnzr6,$ djnzr5,tt ret ;********************************************************* ;主程序: MAIN: MOV SP,#60H MOV P2,#0FFH MOV R2,#8 MOV R0,#40H ; OVER: MOV @R0,#00H INC R0 DJNZ R2,OVER MOV TMOD,#01H MOV TH0,#LOW(65536-10000) MOV TL0,#HIGH(65536-10000) SETB EA SETB ET0 SETB TR0 LOOP: LCALL DSWD ;调用读出DS18B20温度程序 SJMP LOOP ; 读出DS18B20温度程序 DSWD: CLR EA LCALL RST JNB F0,KEND ;如果没有应答,返回主程序 MOV R0,#0CCH LCALL SEND_BYTE ;跳过ROM匹配 MOV R0,#44H ;发出温度转换命令 LCALL SEND_BYTE SETB EA MOV P1,#00001111B MOV 48H,#1 ;廷时75ms以上准备读 SS2: MOV 49H,#255 SS1: MOV 4AH,#255 SS0: DJNZ 4AH,SS0 DJNZ 49H,SS1 DJNZ 48H,SS2 MOV P1,#11111100B CLR EA LCALL RST JNB F0,KEND MOV R0,#0CCH ;跳过ROM匹配 LCALL SEND_BYTE MOV R0,#0BEH ;发出读温度命令 LCALL SEND_BYTE LCALL READ_BYTE MOV WDLSB,A LCALL READ_BYTE MOV WDMSB,A LCALL TRANS12 KEND: mov p1,#01010101b SETB EA RET ;********************************************************** ;温度转换程序:精确到:0.06 ; TRANS12:MOV A,30H ANL A,#0F0H MOV 3AH,A MOV A,31H ANL A,#0FH ORL A,3AH SWAP A MOV B,#10 DIV AB MOV 43H,A MOV 42H,B ; MOV DPTR,#TABB MOV A,30H ANL A,#0FH MOV B,#2 MUL AB MOVC A,@A+DPTR MOV 41H,A MOV A,30H ANL A,#0FH MOV B,#2 MUL AB INC A MOVC A,@A+DPTR MOV 40H,A RET TABB: DB 0,0,0,6,1,2,1,8,2,5,3,1,3,7,4,3,5,0 DB 5,6,6,2,6,8,7,5,8,1,8,7,9,3 ;************************************************* SEND_BYTE: ;发送一个字节程序 MOV A,R0 MOV R5,#8 SEN3: CLR C RRC A JC SEN1 LCALL WRITE_0 SJMP SEN2 SEN1: LCALL WRITE_1 SEN2: DJNZ R5,SEN3 ; 循环8次,写一个字节 RET READ_BYTE: ;读一个字节程序 MOV R5,#8 READ1: LCALL READ RRC A DJNZ R5,READ1 ; 循环8次,读一个字节 MOV R0,A RET ;复位程序,如果复位置位F0,没有就复位F0 RST: SETB DAT NOP NOP CLR DAT MOV R6,#250 ;主机发复位脉冲持续3μs×200=600μs DJNZ R6,$ MOV R6,#50 DJNZ R6,$ SETB DAT ;主机释放总线,口线改为输入 MOV R6,#15 DJNZ R6,$ CALL CHCK ;调用应答检查程序 MOV R6,#60 DJNZ R6,$ SETB DAT RET CHCK: MOV C,DAT JC RST0 SETB F0 ;检测到信号,置位F0 SJMP CHCK0 RST0: CLR F0 ;未准备好F0复位 CHCK0: RET WRITE_0: ;写0 CLR DAT MOV R6,#30 DJNZ R6,$ SETB DAT RET WRITE_1:CLR DAT ;写1 NOP NOP NOP NOP NOP SETB DAT MOV R6,#30 DJNZ R6,$ RET ;读一位数据程序 READ: SETB DAT ;先复位至少1US产生读起始信号 NOP NOP CLR DAT NOP NOP SETB DAT ;置位DAT准备接收数据 NOP NOP NOP NOP NOP NOP NOP MOV C,DAT MOV R6,#23 DJNZ R6,$ RET END
    0 点赞

没有更多内容了

返回顶部
产品求购 求购