51单片机+LCD1602+ds18b20做温度显示报警器电路图

合集下载

DS18B20+LCD(原理图+汇编程序)

DS18B20+LCD(原理图+汇编程序)

;****************************************************************************** ***;****************************************************************************** **;* 描述: *;* DS18B20温度控制1602LCD显示*;**;* 使用方法参考readme.txt文档*;**;**;****************************************************************************** ***;****************************************************************************** **TEMP_ZH DATA 24H ;实时温度值存放单元TEMPL DATA 25H ;TEMPH DATA 26H ;TEMP_TH DATA 27H ;高温报警值存放单元TEMP_TL DATA 28H ;低温报警值存放单元TEMPHC DATA 29H ;TEMPLC DATA 2AHK1 EQU P1.4K2 EQU P1.5K3 EQU P1.6K4 EQU P1.7BEEP EQU P3.7RELAY EQU P1.3LCD_X EQU 2FH ;LCD 地址变量LCD_RS EQU P2.0LCD_RW EQU P2.1LCD_EN EQU P2.2flag1 equ 20H.0 ;DS18B20是否存在标记KEY_UD EQU 20H.1 ;设定KEY 的UP与DOWN 标记date_line equ p3.3;=====================================================ORG 0000HJMP MAINORG 0030HMAIN: MOV SP,#60HMOV A,#00HMOV R0,#20H ;将20H-2FH 单元清零MOV R1,#10HCLEAR: MOV @R0,AINC R0DJNZ R1,CLEARCALL SET_LCDCALL RE_18B20start: CALL RESET ;18B20复位子程序JNB FLAG1,START1 ;DS1820不存在CALL MENU_OKCALL READ_E2CALL TEMP_BJ ;显示温度标记JMP START2START1: CALL MENU_ERRORCALL TEMP_BJ ;显示温度标记JMP $START2:CALL RESETJNB FLAG1,START1 ;DS1820不存在MOV A,#0CCH ; 跳过ROM匹配CALL WRITEMOV A,#44H ; 发出温度转换命令CALL WRITECALL RESETMOV A,#0CCH ; 跳过ROM匹配CALL WRITEMOV A,#0BEH ; 发出读温度命令CALL WRITECALL READcall CONVTEMPCall DISPBCDCALL CONVCALL TEMP_COMPCALL PROC_KEY ; 键扫描SJMP START2;-----------------------------------------------------PROC_KEY:JB K1,PROC_K1 ; 按键K1处理CALL BEEP_BLJNB K1,$MOV DPTR,#M_ALAX1MOV A,#1CALL LCD_PRINTCALL LOOK_ALARMJB K3,$CALL BEEP_BLJMP PROC_K2PROC_K1: ; 按键K2处理JB K2,PROC_ENDCALL BEEP_BLJNB K2,$MOV DPTR,#RESET_A1MOV A,#1CALL LCD_PRINTCALL SET_ALARMCALL RE_18B20 ;将设定的TH,TL值写入DS18B20内CALL WRITE_E2PROC_K2:CALL MENU_OKCALL TEMP_BJPROC_END:RET;============================================;设定报警值TH、TL;============================================SET_ALARM:;CALL RESET_ALARMCALL LOOK_ALARMAS0:JB K1,AS00CALL BEEP_BLJNB K1,$CPL 20H.1 ;UP/DOWN 标记AS00: JB 20H.1,ASZ01 ;20H.1=1,UPJMP ASJ01 ;20H.1=0,DOWNASZ01: JB K2,ASZ02 ;TH值调整(增加)CALL BEEP_BLINC TEMP_THMOV A,TEMP_THCJNE A,#120,ASZ011MOV TEMP_TH,#0ASZ011: CALL LOOK_ALARMMOV R5,#10CALL DELAYJMP ASZ01ASZ02: JB K3,ASZ03 ;TL值调整(增加)CALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#99,ASZ021MOV TEMP_TL,#00HASZ021: CALL LOOK_ALARM ;MOV R5,#10CALL DELAYJMP ASZ02ASZ03: JB K4,AS0 ;确定调整OKCALL BEEP_BLJNB K4,$RETASJ01:JB K2,ASJ02 ;TH值调整(减少)CALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ011JMP ASJ022ASJ011: CALL LOOK_ALARMMOV R5,#10CALL DELAYJMP AS0ASJ02: JB K3,ASJ03 ;TL值调整(减少)CALL BEEP_BLDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,ASJ021JMP ASJ022ASJ021: CALL LOOK_ALARM ;MOV R5,#10CALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRESET_ALARM:MOV DPTR,#RESET_A1 ;指针指到显示信息区MOV A,#1 ;显示在第一行CALL LCD_PRINTRETRESET_A1:DB "RESET ALERT CODE";==================================================== ;实际温度值与标记温度值比较子程序;==================================================== TEMP_COMP:MOV A,TEMP_THSUBB A,TEMP_ZH ;减数>被减数,则JC CHULI1 ;借位标志位C=1,转MOV A,TEMP_ZHSUBB A,TEMP_TL ;减数>被减数,则JC CHULI2 ;借位标志位C=1,转MOV DPTR,#BJ5CALL TEMP_BJ3CLR RELAY ;继电器吸合RETCHULI1:MOV DPTR,#BJ3CALL TEMP_BJ3SETB RELAY ;继电器关闭CALL BEEP_BLRETCHULI2:MOV DPTR,#BJ4CALL TEMP_BJ3CALL BEEP_BLRET;-----------------------------------------TEMP_BJ3:MOV A,#0CEHCALL WCOMMOV R1,#0MOV R0,#2BBJJ3: MOV A,R1MOVC A,@A+DPTRCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3:DB ">H"BJ4:DB "<L"BJ5:DB " !";================================================== ;显示温度标记子程序;================================================== TEMP_BJ:MOV A,#0CBHCALL WCOMMOV DPTR,#BJ1 ;指针指到显示消息MOV R1,#0MOV R0,#2BBJJ1: MOV A,R1MOVC A,@A+DPTRCALL WDATAINC R1DJNZ R0,BBJJ1RETBJ1:DB 00H,"C";================================================= MENU_OK:MOV DPTR,#M_OK1 ;指针指到显示消息MOV A,#1 ;显示在第一行CALL LCD_PRINTMOV DPTR,#M_OK2 ;指针指到显示消息MOV A,#2 ;显示在第一行CALL LCD_PRINTRETM_OK1:DB " DS18B20 OK ",0M_OK2:DB " TEMP: ",0;-----------------------------------------------MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息1MOV A,#1 ;显示在第一行CALL LCD_PRINTMOV DPTR,#M_ERROR2 ;指针指到显示消息1MOV A,#2 ;显示在第一行CALL LCD_PRINTRETM_ERROR1:DB " DS18B20 ERROR ",0M_ERROR2:DB " TEMP: ---- ",0;==================================================== reset: setb date_linenopclr date_linemov r0,#6bh ;主机发出延时复位低脉冲mov r1,#04htsr1: djnz r0,$mov r0,#6bhdjnz r1,tsr1setb date_line ;然后拉高数据线nopnopnopmov r0,#32htsr2: jnb date_line,tsr3 ;等待DS18B20回应djnz r0,tsr2jmp tsr4 ; 延时tsr3: setb flag1 ; 置标志位,表示DS1820存在jmp tsr5tsr4: clr flag1 ; 清标志位,表示DS1820不存在jmp tsr7tsr5: mov r0,#06bhtsr6: djnz r0,$ ; 时序要求延时一段时间tsr7: setb date_lineret;=======================================================RE_18B20:JB FLAG1,RE_18B20ARETRE_18B20A:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#4EH ;写暂存寄存器LCALL WRITEMOV A,TEMP_TH ;TH(报警上限)LCALL WRITEMOV A,TEMP_TL ;TL(报警下限)LCALL WRITEMOV A,#7FH ;12位精确度LCALL WRITERET;------------------------------------------------------------WRITE_E2:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#48H ;把暂存器里的温度报警值拷贝到EEROMLCALL WRITERET;--------------------------------------------------------------READ_E2:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器CALL WRITERET;--------------------------------------------------------------;将自定义字符写入LCD1602的CGRAM中;--------------------------------------------------------------STORE_DATA:MOV A,#40HCALL WCOMMOV R2,#08HMOV DPTR,#D_DATAMOV R3,#00HS_DATA:MOV A,R3MOVC A,@A+DPTRCALL WDATA ;写入数据INC R3DJNZ R2,S_DATARETD_DATA:DB 0CH,12H,12H,0CH,00H,00H,00H,00H;============================================================== write: mov r2,#8 ;一共8位数据CLR Cwr1:clr date_line ;开始写入DS18B20总线要处于复位(低)状态mov r3,#07djnz r3,$ ;总线复位保持16微妙以上rrc a ;把一个字节DATA 分成8个BIT环移给Cmov date_line,c ;写入一个BITmov r3,#3CHdjnz r3,$ ;等待100微妙setb date_line ;重新释放总线nopdjnz r2,wr1 ;写入下一个BITsetb date_lineret;--------------------------------------------------------------------read: mov r4,#4 ; 将温度低位、高位、TH、TL从DS18B20中读出mov r1,#TEMPL ; 存入25H、26H、27H、28Hre00: mov r2,#8re01: clr cysetb date_linenopnopclr date_line ;读前总线保持为低nopnopnopsetb date_line ;开始读总线释放mov r3,#09 ;延时18微妙djnz r3,$mov c,date_line ;从DS18B20总线读得一个BITmov r3,#3CHdjnz r3,$ ;等待100微妙rrc a ;把读得的位值环移给Adjnz r2,re01 ;读下一个BITmov @r1,ainc r1djnz r4,re00ret;*****************************************************; 处理温度BCD 码子程序;**************************************************** CONVTEMP: MOV A,TEMPH ;判温度是否零下ANL A,#80HJZ TEMPC1 ;温度零上转CLR CMOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,ASJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH ;+TEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;乘0.0625MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分BCDMOV A,TEMPL ;整数部分ANL A,#0F0H ;取出高四位SWAP AMOV TEMPL,AMOV A,TEMPH ;取出低四位ANL A,#0FHSWAP AORL A,TEMPL ;重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHC LOW = 十位数BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI = 个位数BCDORL A,TEMPLCMOV TEMPLC,AMOV A,R4JZ TEMPC12ANL A,#0FHSWAP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI = 百位数BCDANL A,#0FHORL A,R4MOV TEMPHC,ATEMPC12: RET;---------------------------------------------------------------HEX2BCD1:MOV B,#064H ;十六进制-> BCDDIV AB ;B= A % 100MOV R4,A ;R7 = 百位数MOV A,#0AHXCH A,BDIV AB ;B = A % BSWAP AORL A,BRET;-------------------------------------------------------------; 小数部分码表;------------------------------------------------------------- TEMPDOTTAB:DB 00H,00H,01H,01H,02H,03H,03H,04HDB 05H,05H,06H,06H,07H,08H,08H,09H;===================================================== LOOK_ALARM:MOV DPTR,#M_ALAX2 ;指针指到显示信息区MOV A,#2 ;显示在第二行CALL LCD_PRINTMOV A,#0C6HCALL TEMP_BJ1MOV A,TEMP_TH ;加载TH数据MOV LCD_X,#3 ;设置位置CALL SHOW_DIG2H ;显示数据MOV A,#0CEHCALL TEMP_BJ1MOV A,TEMP_TL ;加载TL数据MOV LCD_X,#12 ;设置位置CALL SHOW_DIG2L ;显示数据RET;--------------------------------------------M_ALAX1:DB " LOOK ALERT CODE",0M_ALAX2:DB "TH: TL: ",0;--------------------------------------------TEMP_BJ1:CALL WCOMMOV DPTR,#BJ2 ;指针指到显示信息区MOV R1,#0MOV R0,#2BBJJ2: MOV A,R1MOVC A,@A+DPTRCALL WDATAINC R1DJNZ R0,BBJJ2RETBJ2:DB 00H,"C";---------------------------------------------------SHOW_DIG2H: ;在LCD 的第二行显示数字MOV B,#100DIV ABADD A,#30HPUSH BMOV B,LCD_XCALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC LCD_XPUSH BMOV B,LCD_XCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HCALL LCDP2RETSHOW_DIG2L: ;在LCD 的第二行显示数字MOV B,#100DIV ABMOV A,#0AHXCH A,BDIV ABADD A,#30HPUSH BMOV B,LCD_XCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HCALL LCDP2RET;-------------------------------------------------------------;显示区BCD 码温度值刷新子程序;-------------------------------------------------------------DISPBCD:MOV A,TEMPLCANL A,#0FHMOV 70H,A ;小数位MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ;个位MOV A,TEMPHCANL A,#0FHMOV 72H,A ;十位MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,A ;百位MOV A,TEMPHCANL A,#0F0HCJNE A,#010H,DISPBCD0SJMP DISPBCD2DISPBCD0: MOV A,TEMPHCANL A,#0FHJNZ DISPBCD2 ;十位数是0MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,#0AH ;符号位不显示MOV 72H,A ;十位数显示符号DISPBCD2: RET;========================================================== ; LCD 1602 显示子程序;========================================================== CONV:MOV A,73H ;加载百位数据MOV LCD_X,#6 ;设置位置CJNE A,#1,CONV1JMP CONV2CONV1: MOV A,#" "MOV B,LCD_XCALL LCDP2JMP CONV3CONV2: CALL SHOW_DIG2 ;显示数据CONV3: INC LCD_X ;mov a,72h ;十位CALL SHOW_DIG2inc LCD_Xmov a,71h ;个位CALL SHOW_DIG2inc LCD_XMOV A,#'.'MOV B,LCD_XCALL LCDP2MOV A,70h ;加载小数点位INC LCD_X ;设置位置CALL SHOW_DIG2 ;显示数据RET;-------------------------------------------------------SHOW_DIG2: ;在LCD 的第二行显示数字ADD A,#30HMOV B,LCD_XCALL LCDP2RET;---------------------------------------------------------LCDP2: ;在LCD的第二行显示字符PUSH ACC ;MOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址CALL WCOM ;写入命令POP ACC ;由堆栈取出ACALL WDATA ;写入数据RET;---------------------------------------------------------SET_LCD: ;对LCD 做初始化设置及测试CLR LCD_ENCALL INIT_LCD ;初始化LCDCALL STORE_DATA ;将自定义字符存入LCD的CGRAMRETINIT_LCD: ;8位I/O控制LCD 接口初始化MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMcall delay1MOV A,#38HCALL WCOMcall delay1MOV A,#38HCALL WCOMcall delay1MOV A,#0CH ;开显示,显示光标,光标不闪烁CALL WCOMcall delay1MOV A,#01H ;清除LCD 显示屏CALL WCOMcall delay1RET;==================================================CLR_LINE1: ;清除LCD的第一行字符MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;MOV R0,#24 ;设置计数值C1: MOV A,#' ' ;载入空格符至LCDCALL WDATA ;输出字符至LCDDJNZ R0,C1 ;计数结束RET;==================================================LCD_PRINT: ;在LCD的第一行或第二行显示字符CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置LCD 的第二行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置LCD 的第二行地址CALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: CALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;=========================================CLR_LINE: ;清除该行LCD 的字符MOV R0,#24CL1: MOV A,#' 'CALL WDATADJNZ R0,CL1RETDE: MOV R7,#250DJNZ R7,$RET;============================================WCOM: ;以8位控制方式将命令写至LCD MOV P0,A ;写入命令CLR LCD_RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲CLR LCD_RWSETB LCD_ENACALL DELAY1CLR LCD_ENRET;=============================================WDATA: ;以8位控制方式将数据写至LCD MOV P0,A ;写入数据SETB LCD_RSCLR LCD_RWSETB LCD_ENCALL DECLR LCD_ENCALL DERET;=============================================;PRINT A CHAR ON LINE 1;A=ASC DATA, B=LINE X POS;==============================================LCDP1: ;在LCD的第一行显示字符PUSH ACC ;MOV A,B ;设置显示地址ADD A,#80H ;设置LCD的第一行地址CALL WCOM ;写入命令POP ACC ;由堆栈取出ACALL WDATA ;写入数据RET;============================================== BEEP_BL:MOV R6,#100BL2: CALL DEX1CPL BEEPDJNZ R6,BL2MOV R5,#10CALL DELAYRETDEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RETDELAY: ;(R5)*延时10MSMOV R6,#50DL1: MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R5,DELAYRETDELAY1: ;延时5MSMOV R6,#25DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RET;================================================ END。

51单片机+1602+DS18B20的温度报警程序+实物设计(按键可调温度阈值)

51单片机+1602+DS18B20的温度报警程序+实物设计(按键可调温度阈值)

51单片机+1602+DS18B20的温度报警程序+实物设计(按键可调温度阈值)实现功能:51单片机做的温度显示,温度显示在LCD1602液晶屏上。

然后按键可以调整温度阈值,温度高于或低于所设温度,蜂鸣器就会响……单片机源程序如下:1./**************************************************************************************2.3.* 基于单片机的实时温度报警系统设计*4.5.(1)DS18b20采集到的温度可以实时地在数码管或者在液晶上显示出来;6.(2)用三个独立键盘设置阀值,包括设置键,加键,减键和确认键;7.(3)按下设置键时,数码管或者液晶上显示2S“H”字,随后温度闪烁显示,进入设置阀值最大值状态;8.再次按下设置键,数码管或者液晶上显示2S“L”字,随后温度闪烁显示,进入设置阀值最小值状态,9.第三次按下设置键(此时相当于确认键),系统保存设置好的阀值并进入正常的温度显示状态;10.(此程序功能与第三点有出入)11.(4)当采集到的温度大于阀值最大值或者小于阀值最小值时蜂鸣器发出声音报警。

12.13.注释:k1:温度加 k2:温度减 k3:低温度阈值设置 k4:高温度阈值设置14.15.适用单片机:STC89C52RC 适用开发板:普中科技 CH—6800ES V2.0 晶振:12MHZ16.17.***************************************************************************************/18.19.#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器20.#include "lcd.h"21.#include "temp.h"22.#include "intrins.h"23.#include "key.h"24.25.typedef unsigned int u16; //对数据类型进行声明定义26.typedef unsigned char u8;27.28.u8 Disp[]= "Temp: ";29.u8 Disp2[]= "Xiaoliyu Design ";30.31.extern unsigned int LTemp; //低阈值温度32.extern unsigned int LLTemp;33.unsigned int DTemp; //高阈值温度34.unsigned int DLTemp;35.36.u16 NowTemp=35; //当前温度37.u16 IntFlag1=0; //外部中断1标志位38.u16 IntFlag0=0; //外部中断0标志位39.40.sbit Beep=P1^5; //设置蜂鸣器引脚41.sbit LA=P2^2;42.sbit LB=P2^3;43.sbit LC=P2^4;44.45.void delay10us(void);46.void delay100us(void);47.void delay10ms(void);48.void delay1s(void);49.void Int1Init();50.void Int0Init();51.void Timer0Init();52.53./*******************************************************************************54.* 函数名 : main55.* 函数功能 : 主函数56.* 输入 : 无57.* 输出 : 无58.*******************************************************************************/59.void main(void)60.{61. u8 i;62. Int1Init(); //外部中断1初始化63. Int0Init(); //外部中断0初始化64. LcdInit(); //LCD1602初始化65. Timer0Init(); //定时器0初始化66.67. LA =1;68. LB =0;69. LC =0;70.71.////////////////////////////////////////////////////////////////////////////////72.73. for(i=0;i<16;i++) //初始化LCD屏(第一行)74. {75. LcdWriteData(Disp[i]);76. }77.78. delay100us();79. LcdWriteCom(0xC0); //初始化LCD屏(第二行)80.81. for(i=0;i<16;i++)82. {83. LcdWriteData(Disp2[i]);84. }85.86. /////////////////////////////////////////////////////////////////////87.88. while(1)89. {90.91. LcdWriteCom(0x85);92. datapros(Ds18b20ReadTemp()); //获取DS18B20温度93. for(i=0;i<11;i++) //温度信息写入160294. {95. LcdWriteData(DisplayData[i]);96. }97.98.99. if(IntFlag1==1) //若外部中断1标志位为1,则进入高温度阈值设置界面100. {101. LcdMenu();102. if(IntFlag1==0) //若外部中断1标志位为0,则退出高温度阈值设置界面103. { //重载温度显示页面参数104. LcdInit();105. for(i=0;i<16;i++)106. {107. LcdWriteData(Disp[i]);108. }109. delay100us();110.111. LcdWriteCom(0xC0);112. for(i=0;i<16;i++)113. {114. LcdWriteData(Disp2[i]);115. }116.117. }118. delay10ms();119.120. }121.122.123. if(IntFlag0==1) //若外部中断0标志位为1,则进入低温度阈值设置界面124. {125.126. LcdMenuL();127. if(IntFlag0==0) //若外部中断0标志位为0,则退出低温度阈值设置界面128. { //重载温度显示页面参数129. LcdInit();130. for(i=0;i<16;i++)131. {132. LcdWriteData(Disp[i]);133. }134. delay100us();135.136. LcdWriteCom(0xC0);137. for(i=0;i<16;i++)138. {139. LcdWriteData(Disp2[i]);140. }141.142. }143. delay10ms();144. }145.146.147. NowTemp=dataReturn(Ds18b20ReadTemp()); //获取当前温度148. DTemp=(LTemp/100); //获取高温度阈值149. DLTemp=(LLTemp/100); //获取低温度阈值150.151. if((NowTemp>=DTemp)|(NowTemp<=DLTemp)) //如果当前温度大于高温度阈值或小于低温度阈值,则打开定时器0启动蜂鸣器152. {153. ET0=1; //打开定时器0中断允许154. led=~led;155. delay10us();156. }157. else158. {159. ET0=0; //关闭定时器0中断允许160. delay10us();161. }162.163. }164.165./////////////////////////////////////////////////////////////////////////// /////166.167.}168.169./************************************************************************** *****170.* 函数名 : delay10ms171.* 函数功能 : 延时函数10ms172.* 输入 : 无173.* 输出 : 无174.*************************************************************************** ****/175.176.void delay10ms(void)177.{178. unsigned char a,b,c;179. for(c=1;c>0;c--)180. for(b=38;b>0;b--)181. for(a=130;a>0;a--);182.}183.184./************************************************************************** *****185.* 函数名 : delay100us186.* 函数功能 : 延时函数100us187.* 输入 : 无188.* 输出 : 无189.*************************************************************************** ****/190.191.void delay100us(void)192.{193. unsigned char a,b;194.for(b=1;b>0;b--)195. for(a=47;a>0;a--);196.}197.198./************************************************************************** *****199.* 函数名 : delay10us200.* 函数功能 : 延时函数10us201.* 输入 : 无202.* 输出 : 无203.*************************************************************************** ****/204.205.void delay10us(void)206.{207. unsigned char a,b;208. for(b=1;b>0;b--)209. for(a=2;a>0;a--);210.}211.212./************************************************************************** *****213.* 函数名 : Int1Init214.* 函数功能 : 延时函数10us215.* 输入 : 无216.* 输出 : 无217.*************************************************************************** ****/218.219.void Int1Init()220.{221. //设置INT1222. IT1=1;//跳变沿出发方式(下降沿)223. EX1=1;//打开INT1的中断允许。

DS18B20温度传感器LCD1602显示

DS18B20温度传感器LCD1602显示

DS18B20温度传感器LCD1602显示#include < reg51.h >#include < intrins.h >#define uchar unsigned char#define uint unsigned intsbit DQ = P3^3 ; //定义DS18B20端口DQbit presence ; //检测18b20是否插好sbit RS = P2^4 ;sbit RW = P2^5 ;sbit EN = P2^6 ;uchar code cdis1[ ] = {" The third group"} ;uchar code cdis2[ ] = {" TEMP: . C "} ;uchar code cdis3[ ] = {" DS18B20 ERR0R "} ;uchar code cdis4[ ] = {" PLEASE CHECK "} ;unsigned char data temp_data[2] = {0x00,0x00} ; //读出温度暂放unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00} ; //显示单元数据,共4个数据和一个运算暂用unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //自定义字符#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;void delay1(int ms){unsigned char y ;while(ms--){for(y = 0 ; y<250 ; y++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;}}}bit Lcd_BusyTest() //lcd_busy为1时,忙,等待。

DS18b20传感器利用1602显示温度电路图

DS18b20传感器利用1602显示温度电路图

DS18b20传感器利用1602显示温度电路图(附代码)*重要注:图中没有画出单片机最小系统,另外在实际焊接中1602 的1,2,3,15,16引脚要按下图焊接,其他引脚看上图,另外要加排阻;其次ds18b20焊接时要注意引脚,不要焊反。

下面说明书中给出的是bottom view,分清引脚后18b20直接按上图焊即可。

Ds18b20说明书:代码:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit rs=P3^5;sbit wr=P3^6;sbit lcden=P3^4;uint temp;bit flag;uchar code table1[]="temperature is:"; void delay(uchar x)//延时函数_ms{uchar a,b;for(a=x;a>0;a--)for(b=120;b>0;b--);}/* 18b20 */void delayus(uint t)//延时函数_us{while(t--);}void z_reset()//单总线复位{ds=1;delayus(5);ds=0;delayus(80);ds=1;delayus(14);if(ds==0)flag=1;elseflag=0;delayus(20);}bit z_bit_read()//总线读一位{bit dat;ds=0;_nop_();_nop_();ds=1;_nop_();dat=ds;delayus(10);return dat;}uchar ds_read_byte()//18b20读一字节{uchar i,k,j;for(i=0;i<8;i++){j=z_bit_read();k=(k>>1)|(j<<7);}return k;}void ds_write_byte(uchar dat)//18b20写一字节{uchar i;for(i=0;i<8;i++){ds=0;_nop_();ds=dat&0x01;delayus(6);ds=1;dat=dat>>1;}delayus(6);}uint ds_read_temperature()//从18b20读温度{uchar a,b;z_reset();ds_write_byte(0xcc);ds_write_byte(0xbe);a=ds_read_byte();b=ds_read_byte();temp=b;temp=temp<<8;temp=temp|a;temp=temp*0.0625*10;return temp;}/* 1602 */void write_com(uchar com)//1602写命令{rs=0;wr=0;lcden=0;P0=com;lcden=1;delay(5);lcden=0;}void write_data(uchar dat)//1602写数据{rs=1;wr=0;lcden=0;P0=dat;lcden=1;delay(5);lcden=0;}void init()//1602初始化{write_com(0x38);write_com(0x08);write_com(0x01);write_com(0x06);write_com(0x0f);}main(){uint c,num;uchar i,j,k,z;P0=0;init();for(num=0;num<15;num++) //1602静态显示第一行{write_data(table1[num]);delay(300);}while(1){z_reset();ds_write_byte(0xcc);ds_write_byte(0x44);c=ds_read_temperature(); //读到温度write_com(0x80+0x40); //从第二行写i=c/100;//得十位j=c/10-c/100*10;//得各位k=c%10;//得十分位z='.';write_data(0x30+i);//1602显示数字只能输入ASCII码write_data(0x30+j);write_data(z);write_data(0x30+k);delay(300);}}。

基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释

基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释

基于51单片机及DS18B20温度传感器的数字温度计程序(详细注释)电路实物图如下图所示:C语言程序如下所示:/********************************************************************zicreate----------------------------- Copyright (C) --------------------------* 程序名; 基于DS18B20的测温系统* 功能:实时测量温度,超过上下限报警,报警温度可手动调整。

K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。

在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除* 按键音,再按一下启动按键音。

在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。

* 编程者:Jason* 编程时间:2009/10/2*********************************************************************/#include<AT89X52.h> //将AT89X52.h头文件包含到主程序#include<intrins.h> //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)uchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; //s1标志位用于上下限查看时的显示void display1(uint z); //声明display1()函数#include"ds18b20.h" //将ds18b20.h头文件包含到主程序#include"keyscan.h" //将keyscan.h头文件包含到主程序#include"display.h" //将display.h头文件包含到主程序/***********************主函数************************/void main(){beer=1; //关闭蜂鸣器led=1; //关闭LED灯timer1_init(0); //初始化定时器1(未启动定时器1)get_temperature(1); //首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)while(1) //主循环{keyscan(); //按键扫面函数get_temperature(0); //获取温度函数keyscan(); //按键扫面函数display(temp,temp_d*0.625);//显示函数alarm(); //报警函数keyscan(); //按键扫面函数}}/********************************************************************* 程序名; __ds18b20_h__* 功能:DS18B20的c51编程头文件* 编程者:ZPZ* 编程时间:2009/10/2* 说明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d* (测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表* 示“负温度”),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位w(报警标志位‘1’启动报警‘0’关闭报警)。

温度显示

温度显示

目录一、DS18B20的原理和功能二、AT89C51单片机介绍三、74ls373介绍四、LCD1602的工作原理五、程序代码六、电路图和仿真图1、电路原理图2、温度显示真图3、温度报警图心得体会一、DS18B20的原理和功能功能:使用DS18B20测量温度,LCD1602显示,测量精度为0.1度可以显示测量地区的地名,当温度超过30度或者小于-10度的时候二极管发光同时蜂鸣器发出报警声音。

工作原理:DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。

与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

可以分别在93.75ms和750ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。

因而使用DS18B20可使系统结构更趋简单,可靠性更高。

他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。

1.DS18B20简介(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

(2)在使用中不需要任何外围元件。

(3)可用数据线供电,电压范围:+3.0~+5.5V。

(4)测温范围:-55~+125℃。

固有测温分辨率为0.5℃。

(5)通过编程可实现9~12位的数字读数方式。

(6)用户可自设定非易失性的报警上下限值。

(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。

(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

DS18B20的测温原理DS18B20的测温原理如图2所示,图中低温度系数晶振的振荡频率受温度的影响很小〔1〕,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。

DS18B20与LCD1602结合显示温度汇总

DS18B20与LCD1602结合显示温度汇总
提示:DS18B20外形酷似三极管,分辨引脚时,面对着扁平的那一面,左负右正,一旦接反就会立刻发热,甚至有可能烧毁。
二、DS18B20存储器结构
DS18B20的内部有64位的ROM单元,和9字节的暂存器单元。
1、64位(激)光刻只读存储器
每只DS18B20都有一个唯一存储在ROM中的64位编码(跟人的身份证号类似,一人一个身份证号),这是出厂时被光刻好的。最前面8位是单线系列编码:28h。接着的48位是一个唯一的序列号。最后8位是以上56位的CRC编码。64-位的光刻ROM又包括5个ROM的功能命令:读ROM,匹配ROM,跳跃ROM,查找ROM和报警查找。ROM的作用是使每个DS18B20各不相同,这样就可以实现一根总线上挂接多个DS18B20以实现多点监测。
图3
表2
4)、CRC发生器
CRC字节作为DS18B2064位ROM的一部分存储在存储器中。CRC码由ROM的前56位计算得到,被包含在ROM的重要字节当中的数据发生改变时,CRC的值也随之改变。
CRC能够在总线控制器读取DS18B20时进行数据校验。为校验数据是否被正确读取,总线控制器必须用接受到的数据计算出一个CRC值,和存储在DS18B20的64位ROM中的值(读ROM时)或DS18B20内部计算出的8位CRC值(读存储器时)进行比较。如果计算得到的CRC值和读取出来的CRC值相吻合,数据被无错传输。CRC值的比较以及是否进行下一步操作完全由总线控制器决定。当在DS18B20中存储的或由其计算到CRC值和总线控制器计算的值不相符时,DS18B20内部并没有一个能阻止命令序列进行的电路。
2)、非挥发的温度报警触发器TH和TL
位于第2和第3字节,用于写入温度报警值,实际上就是设定温度的最高和最低界限。

DS18B20温度计 c程序 lcd1602显示

DS18B20温度计 c程序 lcd1602显示

2007-12-14 19:05温度值精确到0.1度,lcd1602显示仿真电路图如下c程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;unsigned char code str1[]={"temperature: "};unsigned char code str2[]={" "};uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820程序***************************************/ void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat);//显示符号位wr_com(0xc1);wr_dat(disdata[0]);//显示百位wr_com(0xc2);wr_dat(disdata[1]);//显示十位wr_com(0xc3);wr_dat(disdata[2]);//显示个位wr_com(0xc4);wr_dat(0x2e);//显示小数点wr_com(0xc5);wr_dat(disdata[3]);//显示小数位}/********************主程序***********************************/void main(){ init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档