DS18B20温度显示程序
- 格式:docx
- 大小:17.27 KB
- 文档页数:3
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温度监测与控制系统程序作者: 嵌入式应用软件园目录第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章程序代码我们的辛勤付出,需要您的肯定,请访问: 嵌入式应用软件园。
这个是我自己制作的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;}。
;---------------------------------------------------------------------;数字温度计;晶振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 ;显示在最高位的数码管上。
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。
//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]; // 两字节合成一个整型变量。
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传感器温度数码管显示#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;}}}。
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<math.h>#include<INTRINS.H>#define uchar unsigned char#define uint unsigned int;/******************************************************************//* 定义端口*//******************************************************************/sbit s=P1^0;sbit seg1=P2^0;sbit seg2=P2^1;sbit seg3=P2^2;sbit DQ=P1^3;//ds18b20 端口sbit KEY1 = P3^0; //定义调速按键sbit KEY2 = P3^1;sbit SPK=P1^2; //定义喇叭端口sbit PWM = P1^0;unsigned char CYCLE; //定义周期该数字X基准定时时间如果是10 则周期是10 x 0.1ms unsigned char PWM_ON ;//定义高电平时间sfr dataled=0x80;//显示数据端口/******************************************************************//* 全局变量*//******************************************************************/uint temp;uchar flag_get,count,num,minute,second;uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管段码表共阳uchar str[6];/******************************************************************//* 函数声明*//******************************************************************/unsigned int ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);/******************************************************************//* 主函数*//******************************************************************/main(){unsigned char TempH,TempL,i,x;TMOD|=0x11;//定时器设置TH0=0xef;TL0=0xf0;IE=0x82;TR0=1;P2=0x00;count=0;while(1){SPK=1;if(!KEY1){delay(10000);if(!KEY1){delay(10000);PWM=0;}}if(!KEY2){delay(10000);if(!KEY2){delay(10000);PWM=1;}}str[5]=0x39; //显示C符号str[1]=tab[TempH/100]; //百位温度str[2]=tab[(TempH%100)/10]; //十位温度str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点str[4]=tab[TempL];if(flag_get==1) //定时读取当前温度{temp=ReadTemperature();str[0]=0;TempH=temp>>4;TempL=temp&0x0F;TempL=TempL*6/10;//小数近似处理flag_get=0;}x=(TempH%100)/10;if(x>=5||x<2){for(i=0;i<3;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短{delay(80); //参数决定发声的频率,估算值,可以自行更改参数并SPK=!SPK;}SPK=1;}}}/******************************************************************//* 定时器中断*//******************************************************************/ void tim(void) interrupt 1 //using 1//中断,用于数码管扫描和温度检测间隔{TH0=0xef;//定时器重装值TL0=0xf0;num++;if (num==50){num=0;flag_get=1;//标志位有效second++;if(second>=60){second=0;minute++;}}count++;if(count==1){P2=0;dataled=str[0];}//数码管扫描if(count==2){P2=1;dataled=str[1];}if(count==3){ P2=2;dataled=str[2];}if(count==4){ P2=3;dataled=str[3];}if(count==5){ P2=4;dataled=str[4];}if(count==6){ P2=5;dataled=str[5];count=0;}}/******************************************************************/ /* 延时函数*/ /******************************************************************/ void delay(unsigned int i)//延时函数{while(i--);}/******************************************************************/ /* 初始化*/ /******************************************************************/ void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(10);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(5);}/******************************************************************/ /* 读一个字节*/ /******************************************************************/ unsigned char ReadOneChar(void){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(5);}return(dat);}/******************************************************************//* 写一个字节*//******************************************************************/ void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}delay(5);}/******************************************************************//* 读取温度*//******************************************************************/ unsigned int ReadTemperature(void){unsigned char a=0;unsigned int b=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay(200);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar(); //低位b=ReadOneChar(); //高位b<<=8; t=a+b;return(t); }。
;单片机DS18B20温度计C语言程序; 有程序#include<reg51.h>#include<intrins.h>#include <math.H> //要用到取绝对值函数abs()//通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55~ +125度sbit wela = P2^7; //数码管位选sbit dula = P2^6; //数码管段选sbit ds = P2^2;int tempValue;//0-F数码管的编码(共阳极)unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0-9数码管的编码(共阳极), 带小数点unsigned char code tableWidthDot[]={0x40, 0x79, 0x24, 0x30,0x19, 0x12, 0x02,0x78, 0x00, 0x10};//延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.void delay(unsigned int i){unsigned int j;while(i--){for(j = 0; j < 125; j++);}}//初始化DS18B20//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动 void dsInit(){//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于?us unsigned int i;ds = 0;i = 100; //拉低约800us, 符合协议要求的480us以上while(i>0) i--;ds = 1; //产生一个上升沿, 进入等待应答状态i = 4;while(i>0) i--;}void dsWait(){unsigned int i;while(ds);while(~ds); //检测到应答脉冲i = 4;while(i > 0) i--;}//向DS18B20读取一位数据//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,//之后DS18B20则会输出持续一段时间的一位数据bit readBit(){unsigned int i;bit b;ds = 0;i++; //延时约8us, 符合协议要求至少保持1usds = 1;i++; i++; //延时约16us, 符合协议要求的至少延时15us以上b = ds;i = 8;while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求return b;}//读取一字节数据, 通过调用readBit()来实现unsigned char readByte(){unsigned int i;unsigned char j, dat;dat = 0;for(i=0; i<8; i++){j = readBit();//最先读出的是最低位数据dat = (j << 7) | (dat >> 1);}return dat;}//向DS18B20写入一字节数据void writeByte(unsigned char dat){unsigned int i;unsigned char j;bit b;for(j = 0; j < 8; j++){b = dat & 0x01;dat >>= 1;//写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1if(b){ds = 0;i++; i++; //拉低约16us, 符号要求15~60us内ds = 1;i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求}else //写"0", 将DQ拉低60us~120usds = 0;i = 8; while(i>0) i--; //拉低约64us, 符号要求ds = 1;i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us 了}}//向DS18B20发送温度转换命令void sendChangeCmd(){dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化dsWait(); //等待DS18B20应答delay(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号writeByte(0xcc); //写入跳过序列号命令字Skip RomwriteByte(0x44); //写入温度转换命令字Convert T}//向DS18B20发送读取数据命令void sendReadCmd(){dsInit();dsWait();delay(1);writeByte(0xcc); //写入跳过序列号命令字Skip RomwriteByte(0xbe); //写入读取数据令字Read Scratchpad}//获取当前温度值int getTmpValue(){unsigned int tmpvalue;int value; //存放温度数值float t;unsigned char low, high;sendReadCmd();//连续读取两个字节数据low = readByte();high = readByte();//将高低两个字节合成一个整形变量//计算机中对于负数是利用补码来表示的//若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的valuetmpvalue = high;tmpvalue <<= 8;tmpvalue |= low;value = tmpvalue;//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度t = value * 0.0625;//将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入//如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度//如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5return value;}unsigned char const timeCount = 3; //动态扫描的时间间隔//显示当前温度值, 精确到小数点后一位//若先位选再段选, 由于IO口默认输出高电平, 所以当先位选会使数码管出现乱码void display(int v){unsigned char count;unsigned char datas[] = {0, 0, 0, 0, 0};unsigned int tmp = abs(v);datas[0] = tmp / 10000;datas[1] = tmp % 10000 / 1000;datas[2] = tmp % 1000 / 100;datas[3] = tmp % 100 / 10;datas[4] = tmp % 10;if(v < 0){//关位选, 去除对上一位的影响P0 = 0xff;wela = 0;//段选P0 = 0x40; //显示"-"号dula = 1; //打开锁存, 给它一个下降沿量dula = 0;//位选P0 = 0xfe;wela = 1; //打开锁存, 给它一个下降沿量wela = 0;delay(timeCount);}for(count = 0; count != 5; count++){//关位选, 去除对上一位的影响P0 = 0xff;wela = 1; //打开锁存, 给它一个下降沿量wela = 0;//段选if(count != 2){P0 = table[datas[count]]; //显示数字}else{P0 = tableWidthDot[datas[count]]; //显示带小数点数字}dula = 0;//位选P0 = _crol_(0xfd, count); //选择第(count + 1) 个数码管wela = 1; //打开锁存, 给它一个下降沿量wela = 0;delay(timeCount);}}void main(){unsigned char i;while(1){//启动温度转换sendChangeCmd();//显示5次for(i = 0; i < 40; i++){display(tempValue);}tempValue = getTmpValue();}以下是我编的程序,可用#include <reg52.h>#include <intrins.h>//-----------------------------------------------------------sbit DQ=P1^5;//-----------------------------------------------------------unsigned char number[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//数字0~9unsigned char wei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //数码管位循环unsigned char Flag;unsigned char Templ,Temph;unsigned int temp;//-----------------------------------------------------------//函数声明//-----------------------------------------------------------void delay(unsigned char i); //延时程序//----------------------------------void Int18b20(void); //18b20初始化void Write18b20(unsigned char dat); //向18b20写一字节unsigned char Read18b20(void); //从18b20读一字节void Start18b20(void); //开始转换温度void Get18b20(void); //读出温度void chinT(void); //数据转换//----------------------------------void display(void); //显示程序//-----------------------------------------------------------//函数功能:延时//-----------------------------------------------------------/*************精确延时函数*****************/void delay(unsigned char i){while(--i);}/*此延时函数针对的是12Mhz的晶振delay(0); //延时518us 误差:518-2*256=6delay(1); //延时7us (原帖写"5us"是错的)delay(10); //延时25us 误差:25-20=5delay(20); //延时45us 误差:45-40=5delay(100); //延时205us 误差:205-200=5delay(200); //延时405us 误差:405-400=5*///-----------------------------------------------------------//DS18b20的相关程序//-----------------------------------------------------------//初始化//-----------------------------------------------------------void Int18b20(void){DQ=1;_nop_();_nop_();DQ=0; //拉低delay(100); //延时205usdelay(200); //延时405us //等待400~960微秒,最短为480us DQ=1;delay(1); //延时7usdelay(20); //延时45us //等待15~60微秒(等待回复)if(DQ==1) //判断初始化的情况是否成功{Flag=0; //复位失败}else{Flag=1;while(!DQ); //等待回复完成}delay(200); //延时405us //等待完成初始化}//-----------------------------------------------------------//写一字节//-----------------------------------------------------------void Write18b20(unsigned char dat){unsigned char i;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;delay(1); //延时7us //拉低后延时小于15usif(dat&0x01){DQ=1;}else{DQ=0;}dat=dat>>1;delay(20); //延时45usdelay(10); //延时25us //延时大于60usDQ=1;delay(1); //延时7us //延时大于1us}}//-----------------------------------------------------------//读一字节//-----------------------------------------------------------unsigned char Read18b20(void){unsigned char i,dat=0;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;delay(1); //延时7usdat=dat>>1;DQ=1;delay(1); //延时7us //确保在15us后60us前读数据if(DQ){dat|=0x80;}delay(20); //延时45us //确保读时续大于60us}return dat;}//-----------------------------------------------------------//开始转换温度//-----------------------------------------------------------void Start18b20(void){Int18b20();Write18b20(0xcc); //跳过ROM指令Write18b20(0x44); //温度转换指令}//-----------------------------------------------------------//读出温度//-----------------------------------------------------------void Get18b20(void){Int18b20();Write18b20(0xcc); //跳过ROM指令Write18b20(0xbe); //读暂存器指令Templ=Read18b20();Temph=Read18b20();}//-----------------------------------------------------------//数据转换//-----------------------------------------------------------void chinT(void){float Tt;temp=Temph; //先把高八位有效数据赋于temptemp=(temp<<8); //将数据从temp低八位移到高八位temp=temp|Templ; //将两字节合成一个整型变量Tt=temp*0.0625; //得到真实十进制温度值(因为DS18B20可以精确到0.0625度) temp=Tt*10+0.5; //放大十倍(将小数点后一位变成个位,个位变成十位,十位变成百位,并四舍五入)}//-----------------------------------------------------------//显示程序//-----------------------------------------------------------void display(void){unsigned int i;unsigned char A1,A2,A3;A1=temp/100; //百位(温度的十位)A2=temp%100/10; //十位(温度的个位)A3=temp%10; //个位(温度的小数点后一位)for(i=0;i<20;i++){P0=0x00;P2=0x00;P0=number[A1];P2=wei[0];delay(220);P0=0x00;P2=0x00;P0=number[A2];P2=wei[1];delay(220);P0=0x00;P2=0x00;P0=number[A3];P2=wei[2];delay(220);P0=0x00;P2=0x00;P0=0x80;P2=wei[1];delay(220);}}//-----------------------------------------------------------//----------------------------------------------------------- void main(void){while(1){Int18b20();if(Flag){Start18b20(); //开始转换温度Get18b20(); //得到温度chinT(); //数据转换display(); //显示}else P3=0x01;}}。
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;
}
}
}。