全部程序: ORG 0000H ;单片机内存分配申明! TEMPER_L EQU 29H;用于保存读出温度的低8位 TEMPER_H EQU 28H;用于保存读出温度的高8位 FLAG1 EQU 38H;是否检测到DS18B20标志位 a_bit equ 20h ;数码管个位数存放内存位置 b_bit equ 21h ;数码管十位数存放内存位置 RS EQU P3.7;确定具体硬件的连接方式 RW EQU P3.6 ;确定具体硬件的连接方式 E EQU P3.5 ;确定具体硬件的连接方式 ;主程序 MAIN: LCALL GET_TEMPER;调用读温度子程序 MOV A,29H MOV C,40H;将28H中的最低位移入C RRC A MOV C,41H RRC A MOV C,42H RRC A MOV C,43H RRC A MOV 29H,A clr c setb p3.0;zhelikais从这里开始是我填加的温度控制 CJNE A,#28H,FIT SETB P3.0 AJMP DISLED FIT:CPL C MOV P3.0,C;jiesu到这里结束 DISLED:LCALL DISPLAY;调用数码管显示子程序 AJMP MAIN ;DS18B20复位初始化子程序 INIT_1820:SETB P2.2 NOP CLR P2.2;主机发出延时537微秒的复位低脉冲 MOV R1,#3 TSR1:MOV R0,#107 DJNZ R0,$ DJNZ R1,TSR1 SETB P2.2;然后拉高数据线 NOP NOP NOP MOV R0,#25H TSR2:JNB P2.2,TSR3;等待DS18B20回应 DJNZ R0,TSR2 LJMP TSR4 ; 延时 TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在 CLR P1.7;检查到DS18B20就点亮P1.7LED,与传感器通信成功 LJMP TSR5 TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在 CLR P1.1;未检查到DS18B20就点亮P1.1LED,与传感器通信失败 LJMP TSR7 TSR5:MOV R0,#117 TSR6:DJNZ R0,TSR6 ; 时序要求延时一段时间 TSR7:SETB P2.2 RET ;读出转换后的温度值的子程序 GET_TEMPER:SETB P2.2 LCALL INIT_1820;先复位DS18B20 JB FLAG1,TSS2 CLR P1.2 RET ; 判断DS1820是否存在?若DS18B20不存在则返回 TSS2:CLR P1.3;DS18B20已经被检测到! MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A,#44H ; 发出温度转换命令 LCALL WRITE_1820 LCALL DISPLAY;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒 LCALL INIT_1820;准备读温度前先复位 MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A,#0BEH ; 发出读温度命令 LCALL WRITE_1820 LCALL READ_18200; 将读出的温度数据保存到35H/36H CLR P1.4 RET[page] ;写DS18B20的子程序(有具体的时序要求) WRITE_1820:MOV R2,#8;一共8位数据 CLR C WR1:CLR P2.2 MOV R3,#6 DJNZ R3,$ RRC A MOV P2.2,C MOV R3,#23 DJNZ R3,$ SETB P2.2 NOP DJNZ R2,WR1 SETB P2.2 RET ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据 READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出 MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H) RE00:MOV R2,#8;数据一共有8位 RE01:CLR C SETB P2.2 NOP NOP CLR P2.2 NOP NOP NOP SETB P2.2 MOV R3,#9 RE10:DJNZ R3,RE10 MOV C,P2.2 MOV R3,#23 RE20:DJNZ R3,RE20 RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET ;显示子程序 display: acall DL100MS acall DL100MS mov a,29H;将29H中的十六进制数转换成10进制 mov b,#10 ;10进制/10=10进制 div ab mov b_bit,a ;十位在a mov a_bit,b ;个位在b add a,#00110000b mov b_bit,a mov a,b add a,#00110000b mov a_bit,a MOV P1,#00000001B; ;清屏并光标复位 ACALL ENABLE;调用写入命令子程序 MOV P1,#00111000B ;;设置显示模式:8位2行5x7点阵 ACALL ENABLE ;调用写入命令子程序 MOV P1,#00001111B ;;显示器开、光标开、光标允许闪烁 ACALL ENABLE ;调用写入命令子程序 MOV P1,#00000110B ;;文字不动,光标自动右移 ACALL ENABLE ;调用写入命令子程序 MOV P1,#80H ;;写入显示起始地址(第二行第一个位置) ACALL ENABLE ;调用写入命令子程序 MOV P1,b_bit ;;A十位送出去 SETB RS; ;RS=1 CLR RW; ;RW=0 ;准备写入数据 CLR E; ;E=0 ;执行显示命令 ACALL DELAY ;判断液晶模块是否忙? SETB E ;;E=1 ;显示完成,程序停车 MOV P1,#00000110B ;;文字不动,光标自动右移 ACALL ENABLE ;调用写入命令子程序 MOV P1,#81H ;;写入显示起始地址(第二行第2个位置) ACALL ENABLE ;调用写入命令子程序 MOV P1,a_bit;;字母A的代码 SETB RS; ;RS=1 CLR RW; ;RW=0 ;准备写入数据 CLR E; ;E=0 ;执行显示命令 ACALL DELAY ;判断液晶模块是否忙? SETB E ;;E=1 ;显示完成,程序停车 ret ENABLE: CLR RS; ;写入控制命令的子程序 CLR RW CLR E ACALL DELAY SETB E RET DELAY: MOV P1,#0FFH ;;判断液晶显示器是否忙的子程序 CLR RS SETB RW CLR E NOP SETB E JB P1.7,DELAY; ;如果P1.7为高电平表示忙就循环等待 RET DL100MS: MOV R7,#02H DL1: MOV R6,#0C8H DL2: MOV R5,#0FAH DJNZ R5,$ DJNZ R6,DL2 DJNZ R7,DL1 RET END
上一篇:基于C8051F020的示波器监控程序的设计
下一篇:基于NRF24L01无线模块的STC89C52单片机发射
推荐阅读最新更新时间:2024-03-16 14:23