DS18B20温度显示程序
DS18B20温度采集与1602显示程序

DS18B20温度采集与1602显示程序#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P1^4; //DS18B20口sbit LCD_RS=P2^7;sbit LCD_RW=P2^6;sbit LCD_EN=P2^5; //液晶有关控制位//unsigned char code str1[]={"welcome "};unsigned char code str2[]={"temp and 1602:"};unsigned char code str3[]={"temp: "};unsigned char data temp_data[2] = {0x00,0x00} ;unsigned char code mytab[8]= {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;uchar data disdata[5] = {0x00,0x00,0x00,0x00,0x00} ;uint tvalue;//温度值/*************延时程序***************/void delay1(int ms){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<250;j++);}void delay2( unsigned int k){unsigned int n;n=0;while(n < k){n++;}return;}/***********************************//***********lcd1602程序*************//***********************************//*************写指令****************/void lcd_wcmd(unsigned char cmd){delay1(1);LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=cmd;delay1(1);LCD_EN=1;delay1(1);LCD_EN=0;}/*************写数据****************/void lcd_wdat(unsigned char dat){delay1(1);LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delay1(1);LCD_EN=1;delay1(1);LCD_EN=0;}/*************初始化****************/void lcd_init(){delay1(15) ;lcd_wcmd(0x01) ; //清除LCD的显示内容lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据delay1(5) ;lcd_wcmd(0x38) ;delay1(5) ;lcd_wcmd(0x38) ;delay1(5) ;lcd_wcmd(0x0c) ; //显示开,关光标delay1(5) ;lcd_wcmd(0x06) ; //移动光标delay1(5) ;lcd_wcmd(0x01) ; //清除LCD的显示内容delay1(5) ;}/**********设定显示位置*************/void lcd_pos(uchar pos){lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量}/***********************************//************DS18B20程序************//***********************************//***********ds1820初始化************/Init_DS18B20(void){DQ = 1 ; //DQ复位delay2(8) ; //稍做延时DQ = 0 ; //单片机将DQ拉低delay2(85) ; //精确延时大于480usDQ = 1 ; //拉高总线delay2(18) ;}/**********读一个字节数据*************/ ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ=1;delay2(1);DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay2(4);}return(dat);}/**********写一个字节数据*************/ WriteOneChar(unsigned char dat){unsigned char i = 0 ;for (i=8;i>0;i--){DQ = 0 ;DQ = dat&0x01 ;delay2(5) ;DQ = 1 ;dat>>=1 ;}delay2(4);}/*************读取温度值**************/Read_Temperature(void){Init_DS18B20() ;WriteOneChar(0xCC) ; // 跳过读序号列号的操作WriteOneChar(0x44) ; // 启动温度转换delay2(125);Init_DS18B20() ;WriteOneChar(0xCC) ; //跳过读序号列号的操作WriteOneChar(0xBE) ; //读取温度寄存器temp_data[0] = ReadOneChar() ; //温度低8位temp_data[1] = ReadOneChar() ; //温度高8位tvalue=((temp_data[1]*256)+temp_data[0])*0.625;//return(tvalue);}/*************温度转换**************/Disp_Temperature()//温度值显示{disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(disdata[0]==0x30){disdata[0]=0x20; //如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20; //如果百位为0,十位为0也不显示}}lcd_pos(0x48);lcd_wdat(disdata[0]);//显示百位lcd_pos(0x49);lcd_wdat(disdata[1]);//显示十位lcd_pos(0x4a);lcd_wdat(disdata[2]);//显示个位lcd_pos(0x4b);lcd_wdat(0x2e); //显示小数点lcd_pos(0x4c);lcd_wdat(disdata[3]);//显示小数位}/**************显示函数***************/void dis_play(){uchar m ;lcd_init() ; //初始化LCDlcd_pos(0) ; //设置显示位置为第一行的第1个字符m = 0 ;while(str1[m] != '\0'){ //显示字符lcd_wdat(str1[m]) ;m++ ;}lcd_pos(0x40); //设置显示位置为第二行第1个字符m = 0 ;while(str2[m] != '\0'){lcd_wdat(str2[m]); //显示字符m++ ;}delay1(3000);lcd_init() ; //初始化LCDlcd_pos(0) ; //设置显示位置为第一行的第1个字符m = 0 ;while(str3[m] != '\0'){ //显示字符lcd_wdat(str3[m]) ;m++ ;}/***************主函数****************/ void main(){dis_play();//初始化显示while(1){Read_Temperature() ;//读取温度Disp_Temperature() ;//显示温度}。
DS18B20温度监控系统程序

DS18B20温度监测与控制系统程序作者: 嵌入式应用软件园目录第1章程序功能 (3)1.1 温度监控系统原理图 (3)1.2 程序功能 (4)第2章程序代码 (5)第3章DS18B20简介 (19)3.1 DS18B20概述 (19)3.2 DS18B20的内部结构 (19)3.3 DS18B20温度传感器的存储器 (20)3.4 DS18B20使用中注意事项 (21)3.4 DS18B20常用命令详述 (22)第1章程序功能1.1 温度监控系统原理图1.继电器:用于接通和断开加热装置。
2.峰鸣器:发出按键声,以及温度过高或过低时发出报警声。
3.按键:K1: 查看高温和低温报警值。
K2: 进入设定高温和低温报警值操作状态,增加/减小高温报警值。
K3: 确认键。
K4: 增加/减小低温报警值。
操作过程1:a. 按一下K1的,LCD显示高低温报警值。
b. 按一下K3键,确认,系统进入正常工作。
操作过程2:a. 按一下K2键,进入设定高温和低温报警值操作状态。
b. 按一下K1键,选择增加高低温度报警值。
c. 按一次K2键,高温报警值增加1度。
d. 按一次K4键,低温报警值增加1度。
e. 按一下K1键,选择减小高低温度报警值。
f. 按一次K2键,高温报警值增加1度。
g. 按一次K4键,低温报警值增加1度。
b~g步骤可重复。
h. 按一下K3键,确认,系统进入正常工作。
4.LCD:显示温度、高温、低温和加热信息。
1.2 程序功能对温度进行实时监测与控制。
由温度传感器DS18B20对温度进行采样和转换成数字信号送入单片机,并与设定的报警温度上、下限值进行比较,信息通过LCD显示出来。
如实时温度超过设定的上、下限值,一方面由LCD显示信息,并发出警报声;另一方面自动控制继电器(Relay)开接通或断开,从而控制加热源的开与断,达到对温度进行实时控制的目的。
第2章程序代码我们的辛勤付出,需要您的肯定,请访问: 嵌入式应用软件园。
DS18B20温度采集和显示程序

这个是我自己制作的51单片机板上的DS18B20温度采集和显示程序,你如果有现成的51板稍微修改一下可以用,在我这里是可以用没问题的。
环境是KEIL。
我这个51板也完全符合你的要求。
#pragma db code#include<AT89X52.H>//#include "reg52.h"#include "INTRINS.H"// 此实验是使用18B20检测温度,然后在数码管上显示#define uchar unsigned char#define uint unsigned int#define BUSY1 (DQ1==0)sbit LED_0=P1^0;sbit LED_1=P1^1;sbit LED_2=P1^2;sbit LED_3=P1^3;sbit DQ1=P1^6;//void delay(uint x);void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);void ds_reset_1(void);void wr_ds18_1(char dat);void time_delay(unsigned char time);int get_temp_1(void);void delay(unsigned int x);void read_ROM(void);int get_temp_d(void);/*=====0-9=====A-G=====*/uchar a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82}; unsigned char ResultSignal;int ResultTemperatureLH,ResultT emperatureLL,ResultTemperatureH; unsigned char ROM[8];unsigned char idata TMP;unsigned char idata TMP_d;unsigned char f;unsigned char rd_ds18_1();unsigned int TemH,TemL;void main(){unsigned int TemH,TemL,k=0;ds_reset_1();ds_reset_1(); //resetwr_ds18_1(0xcc); //skip rom_nop_();wr_ds18_1(0x7f);ds_reset_1();wr_ds18_1(0xcc);_nop_();wr_ds18_1(0x44);for(k=0;k<11000;k++)time_delay(255);ds_reset_1();while(1){wr_ds18_1(0xcc);wr_ds18_1(0xbe);TemH=get_temp_1();TemL=get_temp_d();TemH&=0x00ff;TemL&=0x00ff;display((TemH/10),(T emH%10),(TemL/10),(TemL%10));}}/***************延时程序,单位us,大于10us*************/ void time_delay(unsigned char time){time=time-10;time=time/6;while(time!=0)time--;}/*****************************************************//* reset ds18b20 */ /*****************************************************/void ds_reset_1(void){unsigned char idata count=0;DQ1=0;time_delay(240);time_delay(240);DQ1=1;return;}void check_pre_1(void){while(DQ1);while(~DQ1);time_delay(30);}void read_ROM(void){int n;check_pre_1();wr_ds18_1(0x33);for(n=0;n<8;n++){ROM[n]=rd_ds18_1();}}/*****************************************************//* Read a bit from 1820 位读取*/ /*****************************************************/bit tmrbit_1(void){idata char i=0;bit dat;DQ1=0;_nop_();DQ1=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();dat = DQ1;time_delay(50);return dat;}/*****************************************************//* read a bety from ds18b20 字节读取*/ /*****************************************************/unsigned char rd_ds18_1(){unsigned char idata i,j,dat=0;for(i=1;i<=8;i++){j=tmrbit_1();dat=(j<<(i-1))|dat;}return dat;}/*****************************************************//* write a bety from ds18b20 写字节*/ /****************************************************/void wr_ds18_1(char dat){signed char idata i=0;unsigned char idata j;bit testb;for(j=1;j<=8;j++){testb=dat & 0x01;dat = dat>>1;if(testb){DQ1=0;_nop_();_nop_();DQ1=1;time_delay(60);}else{DQ1=0;time_delay(50);DQ1=1;_nop_();_nop_();}}}int get_temp_1(void){unsigned char idata a=0,b=0; unsigned char idata i;EA=0;ds_reset_1();check_pre_1();wr_ds18_1(0xcc);wr_ds18_1(0x44);while(BUSY1);ds_reset_1();check_pre_1();wr_ds18_1(0xcc);wr_ds18_1(0xbe);a=rd_ds18_1();b=rd_ds18_1();i=b; /*若b为1则为负温*/ i=(i>>4);if(i==0){f=0;TMP=((a>>4)|(b<<4));a=(a&0x0f);if (a>8){TMP=(TMP+1);}}else{f=1;a=a>>4;b=b<<4;TMP=(a|b);TMP=~TMP;TMP=(TMP+1);}EA=1;return(TMP);}int get_temp_d(void){unsigned char idata a=0,b=0; unsigned char idata i,m;EA=0;ds_reset_1();//复位check_pre_1();wr_ds18_1(0xcc);wr_ds18_1(0x44);while(BUSY1);ds_reset_1();check_pre_1();wr_ds18_1(0xcc);wr_ds18_1(0xbe);a=rd_ds18_1();b=rd_ds18_1();i=b; /*若b为1则为负温*/ i=(i>>4);if(i==0){f=0;TMP=((a>>4)|(b<<4)); a=(a&0x0f);TMP_d=a;}else{f=1;a=~a;a=(a+1);b=~b;b=(b+1);m=a;a=a>>4;b=b<<4;TMP=(a|b);m=(m&0x0f);TMP_d=m;}EA=1;return(TMP_d);}void delay(unsigned int x) {unsigned int i;for(i=0;i<x;i++);}void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4) {P2=a[d1];LED_0=0;delay(100);LED_0=1;P2=a[d2];LED_1=0;delay(100);LED_1=1;P2=a[d3];LED_2=0;delay(100);LED_2=1;P2=a[d4];LED_3=0;delay(100);LED_3=1;}。
ds18b20温度程序

;---------------------------------------------------------------------;数字温度计;晶振12MHz;用数字温度传感器DS18B20测量温度、显示温度。
;显示段码接P0口,显示位码接P2.2、P2.3、P2.4。
;数字温度传感器DS18B20的数据引脚接单片机的P3.7口。
;显示格式是:百十个.小数c;设计:;日期:2009年12月26日;----------------------------------------------------------------------- DAT BIT p3.7 ;数据通信口TEMPER_L DATA 30H ;读出的温度低字节TEMPER_H DATA 31H ;读出的温度高字节TEMPER EQU 32H ;温度的整数单元T_DOT EQU 33H ;温度的小数点单元ORG 0000HLJMP MAINORG 000BHSJMP TIMER0 ;定时显示;主程序:ORG 0030HMAIN:LCALL INITIAL ;初始化模块LOOP: LCALL DSWD ;调用读出DS18B20温度程序SJMP LOOP ;读出DS18B20温度程序;----------------------------------------------------------------;定时显示子程序,采用循环扫描方式;显示缓冲区40H~47H;----------------------------------------------------------------TIMER0:push acc ;入栈mov dptr,#tabmov a,TEMPER ;将温度的百位分离出来。
mov b,#100div abmovc a,@a+dptr ;查百位的段码。
mov p0,a ;显示在最高位的数码管上。
ds18b20温度计程序

ORG 0000HAJMP MAINORG 0030HMAIN: MOV R5,#0FFHMAIN1:MOV P0,#00H ;系统自检。
自高位向低位带小数点显示8扫描256次CLR P2.4LCALL DELAYSETB P2.4CLR P2.5LCALL DELAYSETB P2.5CLR P2.6LCALL DELAYSETB P2.6CLR P2.7LCALL DELAYSETB P2.7DJNZ R5,MAIN1SETB P2.4 ;关显示SETB P2.5SETB P2.6SETB P2.7SJMP MAIN2DELAY:MOV R7 ,#05H //;延时LP8: MOV R6,#19HLP7:DJNZ R6,LP7DJNZ R7,LP8RET; DS18B20初始化汇编程序;*****************************************//MAIN2:LCALL DISP //;主程序SETB P3.2 // ;18B20DQ置1拉高LCALL INIT // ;调初始化MOV A,#0CCH //;跳过ROM匹配------0CCLCALL WRITE // ;调写DS18B20的程序MOV A,#44H // ;发出温度转换命令LCALL WRITE // ;调写DS18B20的程序MOV R6,#34H //;延时136微秒转换时间,写一个字约需70微秒。
DJNZ R6,$LCALL DISPLCALL INITMOV A,#0CCHLCALL WRITEMOV A,#0BEH // ;发出读温度命令LCALL WRITELCALL READCLR CLCALL CONVTEMPLCALL DISPBCDLCALL DISPSJMP MAIN2WRITE:MOV R0,#8 // ;写子程序CLR CWR1: CLR P3.2MOV 20H,#3 // ;延时17微秒DJNZ 20H,$RRC AMOV P3.2,CMOV 21H,#10 // ;发送后延时45微秒DJNZ 21H,$SETB P3.2NOPDJNZ R0,WR1 // ;8位未发送完转SETB P3.2RETREAD: MOV R6,#2 // ;读子程序CLR PSW.5 // ;清清标志F0RE0:MOV R2,#8RE1:CLR CSETB P3.2 // ;拉高DQNOP // ;延时2微秒CLR P3.2 // ;拉低DQSETB P3.2MOV 22H,#3RE2:DJNZ 22H,RE2MOV C,P3.2MOV 23H,#10RE3:DJNZ 23H,RE3RRC ADJNZ R2,RE1 //;8位未读完继续读CPL PSW.5JNB PSW.5,RE4 // ;高8位保存至28HMOV 29H,A // ;低8位及小数保存至29HRE4:MOV 28H,ADJNZ R6,RE0 //;高8位未读继续RETINIT:SETB P3.2 // ;初始化开始DQ置1(整个时隙和理论值不是很准确)NOP //;延时L0:CLR P3.2 // ;DQ拉低MOV 24H,#100 // ;延时400微秒DJNZ 24H,$SETB P3.2 // ;DQ拉高MOV 25H,#10 // ;置40微秒延时常数L01:JNB P3.2,L2 // ;有18B20响应转L2DJNZ 25H,L01 // ;无18B20响应等待40微秒SJMP L0 // ;无18B20重新初始化L2:MOV R7,#60 // ,延时240微秒L3:DJNZ R7,L3SETB P3.2 //;DQ拉高、退出RETCONVTEMP:MOV A,28H //;温度转换ANL A,#80H //;温度正负判别JZ TEMPC1 //;温度为正转CLR C // ;温度为负调整MOV A,29HCPL AADD A,#01HMOV 29H,AMOV A,28HCPL AADDC A,#00HMOV 28H,AMOV 26H,#0BH // ;温度为负26H内送#0BHSJMP TEMPC11TEMPC1:MOV 26H,#0AH //;温度为正26H内送#0AHTEMPC11:MOV A,26HSWAP AMOV 26H,A // ;26H高4位为温度符号MOV A,29H // ;取温度小数部分ANL A,#0FH ;去整数个位MOV DPTR,#DOTTABMOVC A,@A+DPTRMOV 27H,A // ;查表得小数值,并保存至27H单元MOV A,29H // ;温度整数部分拼装后暂时存入AANL A,#0F0H // ;留下整数个位SWAP AMOV 29H,AMOV A,28HANL A,#0FHSWAP AHEX2BCD1:MOV B,#64H // ;温度整数部分除100得整数百位,并存入R7中DIV ABMOV R7,A // ;R7中为百位,B中为十位和个位MOV A,#0AH // ;温度整数部分除10得整数十位和个位XCH A,B // ;除数与被除数交换DIV ABSWAP AORL A,BTEMPC10:MOV 29H,A // ;温度十位和个位存入29H单元中,十位在高4位,个位在低4位ANL A,#0F0H // ;取温度十位SWAP AORL A,26H //;十位加温度符号存入26H单元;高4位为符号MOV 26H,AMOV A,29HANL A,#0FH // ;取温度个位SWAP AORL A,27HMOV 27H,A // ;27H单元中高4位为个位,低4位为小数MOV A,R7JZ TEMPC12 // ;百位为0退出ANL A,#0FH // ;百位不为0即温度为正和十位重新拼装后存入26H,高4位为百位SWAP A // ;MOV R7,AMOV A,26HANL A,#0FH ; // ;去除26H单元的符号ORL A,R7 //;百位和十位拼装,放入26H单元高4位为百位MOV 26H,A // ;低4位为十位TEMPC12:RETDOTTAB:DB 00H,01H,01H,02H,03HDB 03H,04H,04H,05H,06HDB 06H,07H,08H,08H,09H,09HDISPBCD:MOV A,27H // ;BCD码转换ANL A,#0FHMOV 70H,A // ;取小数,并保存在70H中SWAP AANL A,#0FHMOV 71H,A // ;取整数个位,并保存在71H中MOV A,26HANL A,#0FHMOV 72H,A //;取整数十位,并保存在72H中MOV A,26HSWAP AANL A,#0FHMOV 73H,A // ;取整数百位,并保存在73H中MOV A,72H //;取整数十位ANL A,#0F0HCJNE A,#00H,DISPBCD2SJMP DISPBCD2DISPBCD0:MOV A,26H // ;取整数百位ANL A,#0F0HCJNE A,#00H,DISPBCD2 //;百位不等于0退出MOV A,26HSW AP AANL A,#0FH //;十位保留符号MOV 73H,#0AHMOV 72H,ADISPBCD2:RETDISP:MOV R1,#70H // ;显示子程序MOV R5,#11101111B // ;送Y4位码PLAY:MOV P0,#0FFH // ;关段码MOV A,R5 // ;取Yn位码MOV P2,A // ;送位码MOV A,@R1 //;取段码MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,A // ;送段码MOV A,R5JB ACC.5,LOOP1 // ;位码未指向Y2(整数个位)转CLR P0.7 ;;开小数点LOOP1:LCALL DL1MS //;调显示延时INC R1 // ;指向下一位显示段码MOV A,R5 ;取显示位码JNB ACC.7,ENDOUTRL A // ;向下一位位码MOV R5,AAJMP PLAYENDOUT:MOV P0,#0FFHMOV P3,#0FFHRETTAB: DB 0C0H,0F9H,0A4H,0B0HDB 99H,92H,82H,0F8HDB 80H,90H,0FFH,0BFHDL1MS:MOV R6,#14H // ;延时1mS DL1: MOV R7,#19HDL2: DJNZ R7,DL2DJNZ R6,DL1RETEND。
51单片机 18b20显示温度(另一型号程序)

//DS18B20的读写程序,数据脚P2.7 ////温度传感器18B20汇编程序,采用器件默认的12位转化////最大转化时间750微秒,显示温度-55到+125度,显示精度////为0.1度,显示采用4位LED共阳显示测温值////P0口为段码输入,P34~P37为位选///***************************************************/#include <reg51.h>#include <intrins.h> //_nop_();延时函数用#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7; //温度输入口sbit P07=P0^7; //LED小数点控制uint h;uint temp;//////**************温度小数部分用查表法***********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//共阳LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"uchar data temp_data[2]={0x00,0x00}; //读出温度暂放uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用///////*****************11us延时函数*************************///void delay(uint t){for (;t>0;t--);}///****************显示扫描函数***************************/scan(){char k;for(k=0;k<4;k++) //4位LED扫描控制{P0=dis_7[display[k]]; //数据显示if (k==1){P07=0;} //小数点显示P2=k; //位选delay(300);}}/////****************DS18B20复位函数************************/ ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;delay(50); //550 usDQ=1;delay(6); //66 uspresence=DQ; //presence=0 复位成功,继续下一步}delay(45); //延时500 uspresence=~DQ;}DQ=1; //拉高电平}/////****************DS18B20写命令函数************************/ //向1-WIRE 总线上写1个字节void write_byte(uchar val){uchar i;for(i=8;i>0;i--){DQ=1;_nop_();_nop_(); //从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 usDQ=val&0x01; //最低位移出delay(6); //66 usval=val/2; //右移1位}DQ=1;delay(1);}///****************DS18B20读1字节函数************************/ //从总线上取1个字节uchar read_byte(void){uchar i;uchar value=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 usDQ=1;_nop_();_nop_();_nop_();_nop_(); //4 usif(DQ)value|=0x80;delay(6); //66 us}DQ=1;return(value);}///****************读出温度函数************************///uint read_temp(){ow_reset(); //总线复位delay(200);write_byte(0xcc); //发命令write_byte(0x44); //发转换命令ow_reset();delay(1);write_byte(0xcc); //发命令write_byte(0xbe);temp_data[0]=read_byte(); //读温度值的第字节temp_data[1]=read_byte(); //读温度值的高字节temp=temp_data[1];temp<<=8;temp=temp|temp_data[0]; // 两字节合成一个整型变量。
DS18B20程序

Lesson11-1:数字温度传感器DS18B20,采用3位数码管显示,仿真通过#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit DS=P2^2; // 定义DS18B20接口uchar time=100;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点编码。
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点编码。
void mdelay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}///////功能:串口初始化,波特率9600,方式1///////void Init_Com(void){TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;}void dsreset(void) // DS18B20初始化{uint i;DS=0; // 首先拉低,要求480usi=103;while(i>0)i--;DS=1; // 上升沿,要求15~60usi=4;while(i>0)i--;}void rxwait()//等待应答脉冲{uint i;while(DS);while(~DS);i=8;while(i>0)i--;}bit tmpreadbit(void) //读一位{uint i;bit dat;DS=0;i++; //1us延时DS=1;//15us内,主机必须停止将DS引脚置低i++;i++; //15us延时dat=DS;i=8;while(i>0)i--;//读时隙不低于60us延时return (dat);}uchar tmpread(void) // 读一个字节{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DA T里}return(dat); //将一个字节数据返回}void tmpwritebyte(uchar dat) //写一个字节到DS18B20里{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //写1部分{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0; //写0部分i=8;while(i>0)i--;DS=1;i++;i++;}}}void tmpchange(void) //发送温度转换命令{dsreset();//初始化DS18B20rxwait(); //等待应答脉冲mdelay(1); //延时tmpwritebyte(0xcc); // 跳过序列号命令tmpwritebyte(0x44); //发送温度转换命令}uint tmp() //获得温度{float tt;uchar a,b;uint temp; // 存放温度值dsreset();rxwait();//等待应答脉冲mdelay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe); //发送读取数据命令a=tmpread(); //连续读两个字节数据b=tmpread();temp=b;temp<<=8; //出厂默认设置为12位分辨率temp=temp|a; //两字节合成一个整型变量。
DS18B20温度显示程序

DS18B20传感器温度数码管显示#include<reg51.h>#include<1820twj.h> //传感器DS18B20#include<intrins.h> //字符操作库sbit g1=P2^7;sbit g2=P2^6;sbit g3=P2^5;sbit g4=P2^4;sbit lv=P2^2;sbit jin=P3^3; //进sbit jia=P3^4; //加sbit jian=P3^5; //减uint shiwen;uint zuigao=30; //最高30度uint zuidi=20; //最低20度//*键盘调节/uchar flag=0; //记录第一个按键次数flag=0正常1最高2最低uchar flag2=0; //记录第四个按键次数flag2=0正常1调节小时2调节分钟uchar tableshu[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xe0,0xff ,0xf7 }; uchar tableshudi[]={0x08,0xcb,0x12,0x82,0xc1,0x84,0x04,0xca,0x00,0xc0,0xff };void main(){uchar TL; //储存暂存器的温度低位uchar TH; //储存暂存器的温度高位uint TN; //储存温度的整数部分uchar TD; //储存温度的小数部分uchar ba,sh,ge,di,ba1,sh1,ge1,di1;bit flag1; //判断显示正负0负1正delay1(5); //延时5ms给硬件一点反应时间while(1) //不断检测并显示温度{ init();//读温度准备if(flag1==1) dis(ba,sh,ge,di);else dis(11,sh,ge,di);TL=ReadOneChar(); //先读的是温度值低位TH=ReadOneChar(); //接着读的是温度值高位if((TH&0xf8)!=0x00)//判断高五位得到温度是负{ flag1=0; TL=~TL; //取反TH=~TH; //取反TL=TL+1; //低位加1TN=(TH*256+TL)*0.625; //实际温度值10倍=(TH*256+TL)*0.625,if(TN%160==0) TN=TN+160;sh=TN/100%10; ge=TN/10%10; di=TN%10;dis(ba,sh,ge,di); //显示温度}else//判断高五位得到温度是正{ flag1=1;TN=(TH*256+TL)*0.625; //实际温度值10倍=(TH*256+TL)*0.625, //这样前几位是温度的整数部分,最后一位是温度的小数部分ba=TN/1000; sh=TN/100%10; ge=TN/10%10; di=TN%10;dis(ba,sh,ge,di); //显示温度的整数部分}shiwen=TN; biaozhun(); tfz();if(flag1==1)dis(ba,sh,ge,di);else dis(11,sh,ge,di);kongzhi()//温度调整驱动程序}void kongzhi(){if((shiwen<zuigao)&&(shiwen>zuidi))lv=0; //控制P2口输出电平elselv=1;}void dis(uchar ba,uchar sh,uchar ge,uchar di){ g1=0;P0=tableshu[ba];delay1(5);g1=1;P0=tableshu[10];g2=0;P0=tableshu[sh];delay1(5);g2=1;P0=tableshu[10];g3=0;P0=tableshudi[ge];delay1(5);g3=1;P0=tableshudi[10];g4=0;P0=tableshu[di];delay1(5);g4=1;P0=tableshu[10];}void disdi(uchar ba,uchar sh,uchar ge,uchar di){ g1=0;P0=tableshudi[ba];delay1(5); g1=1;P0=tableshu[10]; g2=0;P0=tableshudi[sh];delay1(5); g2=1;P0=tableshu[10]; g3=0;P0=tableshudi[ge];delay1(5); g3=1;P0=tableshudi[10]; g4=0;P0=tableshudi[di];delay1(5); g4=1;P0=tableshu[10];}void biaozhun(){ if(jin==0){ delay1(5);if(jin==0){ while(!jin);flag++; if(flag==3) flag=0;} } } /*调幅值*/void tfz(){ uchar ba,sh,ge,di; if(flag==1){ while(1){ ba=zuigao/1000; sh=zuigao/100%10; ge=zuigao/10%10; di=zuigao%10; dis(ba,sh,ge,di); if(jia==0) delay1(5);if(jia==0) { zuigao=zuigao+10;while(!jia); dis(ba,sh,ge,di); }if(jian==0){ zuigao=zuigao-10;while(!jian);dis(11,sh,ge,di); }biaozhun();if(flag!=1) break; } }if(flag==2){ while(1){ ba=zuidi/1000; sh=zuidi/100%10; ge=zuidi/10%10; di=zuidi%10;dis(ba,sh,ge,di);if(jia==0) delay1(5);if(jia==0){ zuidi=zuidi+10; while(!jia); }if(jian==0) { zuidi=zuidi-10; while(!jian); }biaozhun();if(flag!=2)break;}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS18B20传感器温度数码管显示
#include<reg51.h>
#include<1820twj.h> //传感器DS18B20
#include<intrins.h> //字符操作库
sbit g1=P2^7;
sbit g2=P2^6;
sbit g3=P2^5;
sbit g4=P2^4;
sbit lv=P2^2;
sbit jin=P3^3; //进
sbit jia=P3^4; //加
sbit jian=P3^5; //减
uint shiwen;
uint zuigao=30; //最高30度
uint zuidi=20; //最低20度
//*键盘调节/
uchar flag=0; //记录第一个按键次数flag=0正常1最高2最低
uchar flag2=0; //记录第四个按键次数flag2=0正常1调节小时2调节分钟uchar tableshu[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xe0,0xff ,0xf7 }; uchar tableshudi[]={0x08,0xcb,0x12,0x82,0xc1,0x84,0x04,0xca,0x00,0xc0,0xff };
void main()
{uchar TL; //储存暂存器的温度低位
uchar TH; //储存暂存器的温度高位
uint TN; //储存温度的整数部分
uchar TD; //储存温度的小数部分
uchar ba,sh,ge,di,ba1,sh1,ge1,di1;
bit flag1; //判断显示正负0负1正
delay1(5); //延时5ms给硬件一点反应时间
while(1) //不断检测并显示温度
{ init();//读温度准备
if(flag1==1) dis(ba,sh,ge,di);
else dis(11,sh,ge,di);
TL=ReadOneChar(); //先读的是温度值低位
TH=ReadOneChar(); //接着读的是温度值高位
if((TH&0xf8)!=0x00)//判断高五位得到温度是负
{ flag1=0; TL=~TL; //取反
TH=~TH; //取反
TL=TL+1; //低位加1
TN=(TH*256+TL)*0.625; //实际温度值10倍=(TH*256+TL)*0.625,
if(TN%160==0) TN=TN+160;
sh=TN/100%10; ge=TN/10%10; di=TN%10;
dis(ba,sh,ge,di); //显示温度
}
else//判断高五位得到温度是正
{ flag1=1;
TN=(TH*256+TL)*0.625; //实际温度值10倍=(TH*256+TL)*0.625, //这样前几位是温度的整数部分,最后一位是温度的小数部分
ba=TN/1000; sh=TN/100%10; ge=TN/10%10; di=TN%10;
dis(ba,sh,ge,di); //显示温度的整数部分
}
shiwen=TN; biaozhun(); tfz();
if(flag1==1)
dis(ba,sh,ge,di);
else dis(11,sh,ge,di);
kongzhi()//温度调整驱动程序
}
void kongzhi()
{
if((shiwen<zuigao)&&(shiwen>zuidi))
lv=0; //控制P2口输出电平
else
lv=1;
}
void dis(uchar ba,uchar sh,uchar ge,uchar di)
{ g1=0;P0=tableshu[ba];
delay1(5);
g1=1;P0=tableshu[10];
g2=0;P0=tableshu[sh];
delay1(5);
g2=1;P0=tableshu[10];
g3=0;P0=tableshudi[ge];
delay1(5);
g3=1;P0=tableshudi[10];
g4=0;P0=tableshu[di];
delay1(5);
g4=1;P0=tableshu[10];}
void disdi(uchar ba,uchar sh,uchar ge,uchar di)
{ g1=0;P0=tableshudi[ba];
delay1(5); g1=1;P0=tableshu[10]; g2=0;P0=tableshudi[sh];
delay1(5); g2=1;P0=tableshu[10]; g3=0;P0=tableshudi[ge];
delay1(5); g3=1;P0=tableshudi[10]; g4=0;P0=tableshudi[di];
delay1(5); g4=1;P0=tableshu[10];
}
void biaozhun()
{ if(jin==0)
{ delay1(5);
if(jin==0)
{ while(!jin);
flag++; if(flag==3) flag=0;
} } } /*调幅值*/
void tfz()
{ uchar ba,sh,ge,di; if(flag==1)
{ while(1)
{ ba=zuigao/1000; sh=zuigao/100%10; ge=zuigao/10%10; di=zuigao%10; dis(ba,sh,ge,di); if(jia==0) delay1(5);
if(jia==0) { zuigao=zuigao+10;
while(!jia); dis(ba,sh,ge,di); }
if(jian==0)
{ zuigao=zuigao-10;
while(!jian);
dis(11,sh,ge,di); }
biaozhun();
if(flag!=1) break; } }
if(flag==2)
{ while(1)
{ ba=zuidi/1000; sh=zuidi/100%10; ge=zuidi/10%10; di=zuidi%10;
dis(ba,sh,ge,di);
if(jia==0) delay1(5);
if(jia==0)
{ zuidi=zuidi+10; while(!jia); }
if(jian==0) { zuidi=zuidi-10; while(!jian); }
biaozhun();
if(flag!=2)
break;
}
}
}。