微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于ds18b20温度带上限程序--LCD1602液晶显示

基于ds18b20温度带上限程序--LCD1602液晶显示

时间:11-30 来源:互联网 点击:
这是用1602来显示的,程序是修改前面几个实验的,当温度<40度时电风扇不转,当>=40度时电风扇转动,为参加电子比赛做的单片机系统实验。程序为汇编语言(ASM),带详细注释,值得新手朋友参考!
全部程序: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,29HMOV C,40H;将28H中的最低位移入CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,Aclr csetb p3.0;zhelikais从这里开始是我填加的温度控制CJNE A,#28H,FITSETB P3.0AJMP DISLEDFIT:CPL CMOV P3.0,C;jiesu到这里结束DISLED:LCALL DISPLAY;调用数码管显示子程序AJMP MAIN;DS18B20复位初始化子程序INIT_1820:SETB P2.2NOPCLR P2.2;主机发出延时537微秒的复位低脉冲MOV R1,#3TSR1:MOV R0,#107DJNZ R0,$DJNZ R1,TSR1SETB P2.2;然后拉高数据线NOPNOPNOPMOV R0,#25HTSR2:JNB P2.2,TSR3;等待DS18B20回应DJNZ R0,TSR2LJMP TSR4 ; 延时TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在CLR P1.7;检查到DS18B20就点亮P1.7LED,与传感器通信成功LJMP TSR5TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在CLR P1.1;未检查到DS18B20就点亮P1.1LED,与传感器通信失败LJMP TSR7TSR5:MOV R0,#117TSR6:DJNZ R0,TSR6 ; 时序要求延时一段时间TSR7:SETB P2.2RET;读出转换后的温度值的子程序GET_TEMPER:SETB P2.2LCALL INIT_1820;先复位DS18B20JB FLAG1,TSS2CLR P1.2RET ; 判断DS1820是否存在?若DS18B20不存在则返回TSS2:CLR P1.3;DS18B20已经被检测到!MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820LCALL DISPLAY;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒LCALL INIT_1820;准备读温度前先复位MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200; 将读出的温度数据保存到35H/36HCLR P1.4RET				   ;写DS18B20的子程序(有具体的时序要求)WRITE_1820:MOV R2,#8;一共8位数据CLR CWR1:CLR P2.2MOV R3,#6DJNZ R3,$RRC AMOV P2.2,CMOV R3,#23DJNZ R3,$SETB P2.2NOPDJNZ R2,WR1SETB P2.2RET; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)RE00:MOV R2,#8;数据一共有8位RE01:CLR CSETB P2.2NOPNOPCLR P2.2NOPNOPNOPSETB P2.2MOV R3,#9RE10:DJNZ R3,RE10MOV C,P2.2MOV R3,#23RE20:DJNZ R3,RE20RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;显示子程序display: acall DL100MSacall DL100MSmov a,29H;将29H中的十六进制数转换成10进制mov b,#10 ;10进制/10=10进制div abmov b_bit,a ;十位在amov a_bit,b ;个位在badd a,#00110000bmov b_bit,amov a,badd a,#00110000bmov a_bit,aMOV 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=1CLR 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=1CLR RW; ;RW=0 ;准备写入数据CLR E; ;E=0 ;执行显示命令ACALL DELAY ;判断液晶模块是否忙?SETB E ;;E=1 ;显示完成,程序停车retENABLE:CLR RS; ;写入控制命令的子程序CLR RWCLR EACALL DELAYSETB ERETDELAY:MOV P1,#0FFH ;;判断液晶显示器是否忙的子程序CLR RSSETB RWCLR ENOPSETB EJB P1.7,DELAY; ;如果P1.7为高电平表示忙就循环等待RETDL100MS:      MOV R7,#02HDL1:          MOV R6,#0C8HDL2:          MOV R5,#0FAHDJNZ R5,$DJNZ R6,DL2DJNZ R7,DL1RETEND

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top