含DS18B20的测温显示程序
DS18B20与LCD1602的测温显示程序
ds18B20_data = 1; // 拉高总线,延时 15us-60us 后等待ds18B20 响应
delay_15us(2); // 15us-60us
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
uchar Minus_Flag=0;
uchar code Temp_Disp_Title[]={"Current Temp : "};
uchar Current_Temp_Display_Buffer[]={"TEMP: "};
LCD_RS = 0;
LCD_RW = Байду номын сангаас;
LCD_EN = 0;
_nop_();
_nop_();
LCD_Data = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void Write_LCD_Data(uchar dat)
#define ds18B20_ALARM_SEARCH 0xEC // 报警搜索指令
#define ds18B20_WRITE_SCRATCHPAD 0x4E // 写暂存寄存器指令
#define ds18B20_READ_SCRATCHPAD 0xBE // 读暂存寄存器指令
{
while(LCD_Busy_Check());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
DS18B20温度检测程序
(1)先将数据线置高电平“1”。
(2)延时(该时间要求的不是很严格,但是尽可能的短一点)(3)数据线拉到低电平“0”。
(4)延时750微秒(该时间的时间范围可以从480到960微秒)。
(5)数据线拉到高电平“1”。
(6)延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。
据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
(8)将数据线再次拉高到高电平“1”后结束。
(1)数据线先置低电平“0”。
(2)延时确定的时间为15微秒。
(3)按从低位到高位的顺序发送字节(一次只发送一位)。
(4)延时时间为45微秒。
(5)将数据线拉到高电平。
(6)重复上(1)到(6)的操作直到所有的字节全部发送完为止。
(7)最后将数据线拉高。
DS18B20的写操作时序图如图DS18B20的读操作(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时15微秒。
(5)将数据线拉高“1”。
(6)延时15微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时30微秒。
DS18B20的读操作时序图如图所示。
DS18B20的Protues仿真图源程序代码:#include "reg51.h"#include "intrins.h" // 此头文件中有空操作语句NOP 几个微秒的延时可以用NOP 语句,但本人没用NOP,直接用了I++来延时#define uchar unsigned char#define uint unsigned intuchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};sbit ds18b20_io=P2^0; //单片机与DS18B20的连接口sbit lcdrs=P2^6; //1602与单片机的接口sbit lcden=P2^7;unsigned char flag,tflag,i;unsigned int temper0,temper1,tvalue;float temperature;void delay() //6us 在KEIL中仿真出来的时间,这是调用DELAY所用的时间{i++;i++;}void Delay_50us(unsigned char t) //50us延时程序{unsigned char j;for(;t>0;t--)for(j=20;j>0;j--);}void delay1(uint z) //这个延时主要用在1602中,1602的读写时序没有//DS18B20那么严格{uint x,y;for(x=0;x<z;x++){ for(y=0;y<121;y++){;};};}uchar ds18b20_rst(){unsigned char j;ds18b20_io=1;i++; //1usds18b20_io=0;for(j=0;j<60;j++) //543us{delay();}ds18b20_io=1;for( j=0;j<7;j++) //65us{delay();}if(!ds18b20_io) //如果读到低电平,即复位成功{flag=1;}else flag=0; //如果没有读到低电平,则复位失败Delay_50us(9); //450usds18b20_io=1;return flag;}void ds18b20_writebyte(unsigned char byte){unsigned char j;for(j=0;j<8;j++){ds18b20_io=1;i++;ds18b20_io=0;delay(); //15usdelay();i++;i++;i++;ds18b20_io=byte&0x01;delay(); delay();delay();delay(); //48usdelay(); delay();delay();byte>>=1;ds18b20_io=1;delay();}ds18b20_io=1;}unsigned char ds18b20_readbyte() {unsigned char k,jj,i;jj=0;for(k=0;k<8;k++){ds18b20_io=1;i++; i++;ds18b20_io=0;delay(); //15usdelay(); i++;i++;i++;ds18b20_io=1;delay(); //15usdelay(); i++; i++;i++;if(ds18b20_io) //17us jj=(jj>>1)|0x80;elsejj>>=1;delay();delay(); delay(); //18us }return jj;}void write_com(uchar com){lcdrs=0;P1=com;delay1(5);lcden=1;delay1(5);lcden=0;}void write_data(uchar date){lcdrs=1;P1=date;delay1(5);lcden=1;delay1(5);lcden=0;}void init(){lcden=0;write_com(0x38);write_com(0x0C);write_com(0x06);write_com(0x01);}float read_temp()/*读取温度值并转换*/{if(ds18b20_rst()==1);{ds18b20_writebyte(0xcc);//*跳过读序列号*/ ds18b20_writebyte(0x44);//*启动温度转换*/ Delay_50us(30);}if(ds18b20_rst()==1);{ds18b20_writebyte(0xcc);//*跳过读序列号*/ds18b20_writebyte(0xbe);//*读取温度*/temper0 =ds18b20_readbyte();temper1 =ds18b20_readbyte();Delay_50us(20);}if(temper1&0xf8) //判断是正温度还是负温度{ //如果是高5位是0 为正温度,反则为负温度tflag=1;tvalue=(temper1<<8)|temper0;tvalue=((~tvalue)+1);temperature=tvalue*(0.0625);}else{tflag=0;tvalue=(temper1<<8)|temper0;temperature=tvalue*0.0625; //不用把tvalue进行转换,直接乘0.0625//的精度}return(temperature);}void write_xian(float date){uint bai,shi,ge,xiaozheng,xqian,xbai,xshi,xge;float k,m; //把浮点的DATA转换为整数,得到浮点娄的整数部分bai=(int)(date)/100; //把得到的整数部分拆开分别存在BAI SHI GE 中shi=((int)(date)%100)/10;ge=(int)(date)%10;if (bai!=0) //如果百不为0 则把整数部分全部显示{write_data(0x30+bai);write_data(0x30+shi);write_data(0x30+ge);}else if (shi!=0) //如果十不为0 则把十位和个位显示{write_data(0x30+shi);write_data(0x30+ge);}else write_data(0x30+ge);//如果百和十位都为0 ,则只显示个位数write_data(0x2e);k=date-(int)date; //取浮点娄的小数部分m=k*10000; //把得到的小数变为整数并显示xiaozheng=(int)m;xqian=(xiaozheng)/1000;xbai=((xiaozheng)%1000)/100;xshi=((xiaozheng)%100)/10;xge=(xiaozheng)%10;write_data(0x30+xqian);write_data(0x30+xbai);write_data(0x30+xshi);write_data(0x30+xge);}void main(){temperature=0.0;flag=0;tflag=0;tvalue=0;init();while(1){read_temp();if(tflag==0){write_xian(temperature); write_data(' '); write_data(' '); }if(tflag==1){write_data('-');write_xian(temperature); write_data(' '); write_data(' '); }write_com(0x80);}}。
51单片机DS18B20测温1602a显示
/*******************************************************************/
void beep()
{
unsigned char y ;
for (y=0 ;y<100 ;y++)
{
Delay(60) ;
BEEP=!BEEP ; //BEEP取反
void lcd_wdat(uchar dat)
{
while(lcd_busy()) ;
LCD_RS = 1 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
P0 = dat ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}
/* LCD初始化设定*/
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。*/
/*******************************************************************/
Disp_Temperature()
{
display[4]=temp_data[0]&0x0f ;
display[0]=ditab[display[4]]+0x30 ; //查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
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测温程序
DS18B20测温程序(数码显示)*;************************************************************************** ;*接线方法: *;* 1、用一8P的数据线,一头插在J1,另一头插在J5,接通数码管的段选*;* 2、用一8P的数据线,一头插在J4,另一头插在J6,接通数码管的位选*;* 3、将DS18B20插在主机上的测温部份 *;* 4、用一根单根的数据线,一头插在DS18B20所在数据插针,另一头插到P2.7 * ;**************************************************************************TEMPER_L EQU 36H ;从DS18B20中读回高位,低位暂存区TEMPER_H EQU 35H ;TEMPER_NUM EQU 60H;温度值存储TEMPER_GE EQU 61HTEMPER_SHI EQU 62HTEMPER_SAVE EQU 63HFLAG1 BIT 00HFLAG2 BIT 01HRS BIT p3.0;液晶控制接口RW BIT p3.1E BIT p3.2DQ BIT P2.7;单总线口ORG 0000HA JMP MAINORG 0030HMAIN: MOV SP,#70HLCALL GET_TEMPERLCALL TEMPER_COVLCALL DISPLAYLJMP MAINNOP;**************************************************;读出转换后的温度值;**************************************************GET_TEMPER:SETB DQ ; 定时入口BCD: LCALL INIT_1820JB FLAG1,S22LJMP BCD ;若DS18B20不存在则返回S22: LCALL DELAY1MO V A,#0CCH ; 跳过ROM匹配------0CC命令LCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820LCALL DELAYCBA CALL INIT_1820JB FLAG1,ABCLJMP CBAABC CALL DELA Y1MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200 ;READ_1820RET;************************************************************** ;读DS18B20的程序,从DS18B20中读出一个字节的数据;************************************************************** READ_1820:MOV R2,#8RE1:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE1RET;******************************************************;写DS18B20的程序;******************************************************WRITE_1820:MOV R2,#8CLR CWR1:MOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRET;****************************************************;读DS18B20的程序,从DS18B20中读出两个字节的温度数据;****************************************************READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H) RE00:MOV R2,#8RE01:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;;****************************************************;将从DS18B20中读出的温度数据进行转换;;****************************************************TEMPER_COV:MOV A,#0F0HANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值SWAP AMOV TEMPER_NUM,A ;得到低四位MOV A,TEMPER_LJNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值INC TEMPER_NUMTEMPER_COV1:MOV A,TEMPER_HANL A,#07HSWAP AORL A,TEMPER_NUM ;得到高四位,再与低四位相或得到值MOV TEMPER_NUM,A ; 保存变换后的温度数据LCALL BIN_BCDRET;;**************************************************** ;将16进制的温度数据转换成压缩BCD码;;**************************************************** BIN_BCD:MOV A,TEMPER_NUMMOV B,#10DIV ABMOV TEMPER_SHI,AMOV TEMPER_GE,BMOV A,TEMPER_SAVECJNE A,TEMPER_GE,ZWFHRET:MOV TEMPER_SAVE,TEMPER_GERETZW:CALL LCDDISPAJMP FHRET;**************************************************** ;DS18B20初始化程序;;**************************************************** INIT_1820:SETB DQNOPCLR DQMOV R0,#250TSR1:DJNZ R0,TSR1 ; 延时520usSETB DQMOV R0,#25H ;96US-25HTSR2:DJNZ R0,TSR2JNB DQ,TSR3;如D0为低则复位成功,DS18B20存在LJMP TSR4 ; 延时TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在LJMP TSR5TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在LJMP TSR7TSR5:MOV R0,#06BH ;200USTSR6:DJNZ R0,TSR6 ; 延时TSR7:SETB DQ ;拉高总线RET;************************************************* ;数码显示程序;************************************************* Display:MOV DPTR,#disptabMOV A,TEMPER_GEMOVC A,@A+DPTRMOV P1,ACLR P2.2CALL DELAYCALL DELAYSETB P2.2MOV DPTR,#disptabMOV A,TEMPER_SHIMOVC A,@A+DPTRMOV P1,ACLR P2.3CALL DELAYCALL DELAYSETB P2.3RET;************************************************* ;液晶显示程序;*************************************************mov p0,#01h;清屏call enrwmov p0,#38h;设为8位,5*7字型两行 call enrwmov p0,#0Chcall enrwmov p0,#06hcall enrwmov p0,#80hcall enrwmov dptr,#yjtabcall rwrammov p0,#0C0hcall enrwmov dptr,#yjtab1call rwramW_TEM:mov p0,#0CChcall enrwMO V DPTR,#ASCIIMO V A,TEMPER_SHIMO VC A,@A+DPTRMO V P0,Asetb rsclr rwclr ecall delaysetb eMO V DPTR,#ASCIIMO V A,TEMPER_GEMO VC A,@A+DPTRMO V P0,Asetb rsclr rwclr ecall delaysetb eRE Tenrw:clr rsclr rwclr esetb eretrwram:mov r1,#00ha1: mov a,r1movc a,@a+dptrcall rwram2inc r1cjne a,#00h,a1retrwram2:mov p0,asetb rsclr rwclr ecall delaysetb eret;*************************************************;延时子程序;*************************************************DELAY:MOV R6,#250;延时500usDJNZ R6,$RETDELAY1:MOV R7,#20HDJNZ R7,$RETdisptab:db 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;字形代码表 ;0 1 2 3 4 5 6 7 8 9yjtab: db 'HTTP// ',00hyjtab1:db 'CHENZHOU_TE:**`C',00hASCII: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39Hend。
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。
温度传感器DS18B20检测程序说明
DS18B20美国达拉斯公司生产的单总线协议的数字温度检测芯片,数据的写入与读取都在一根总线上进行操作,在总线上可以连接多个DS18B20,因为每个DS18B20都有唯一的光刻ROM序列号,所以可以进行ROM匹配,搜索指令进行选择相应的从机序列号。
编写DS18B20的检测程序主要包括:初始化函数(复位脉冲+存在脉冲),写数据函数,读取数据的函数。
对DS18B20的操作包括:初始化函数,ROM指令,RAM指令这三个部分。
接下来我先说一下这三个部分所对应的时序图的理解吧。
初始化:由于上拉电阻的存在,总线默认状态是高电平,接着主机将总线拉低,维持480us 到960us的时间,再接着就是释放总线,维持时间为15us到60us,接着就由从机发出一个低电平信号,将总线拉低,表示该DS18B20是正常地,或者说是存在的,其维持时间为60us 到240us。
上面一图是写入数据的时序图。
写时序:默认状态为高电平,先将总线拉低,至少维持1us 的延时时间,接着就往总线上进行写数据操作,接着DS18B20就开始采样数据了,整个过程时间为60us到120us。
下面一图是读取数据的时序图。
读时序:默认状态为高电平,先将总线拉低,接着在15us 之前,主机进行数据采样,其维持时间也为60us到120us。
下面是我在理解了DS18B20的原理之后所写的程序,调试成功了,且能实时读取外界温度的功能,这里是不读取小数部分的温度,只读取温度的正数值。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit DQ=P2^2;sbit duan=P2^6;sbit wei=P2^7;//是在11.0592M赫兹的频率下void delay_ms(uint t){uint i;for(;t>0;t--)for(i=110;i>0;i--);} //约为tms的延时程序void delay(uint x){while(x--);}void init_ds18b20(){uchar n;DQ=1;delay(2); //约为38usDQ=0;delay(80); //约为800usDQ=1;delay(4); //约为58usn=DQ;delay(10); //约为110us}void write_byte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0; //无论是写0或写1都要有至少1us的低电平DQ=dat&0x01;//总线直接等于写入的数据(低位在前,高位在后)delay(4); //约为58usDQ=1; //释放总线,为下一步的数据变换做准备dat>>=1;//数据进行移位操作}delay(4);}uchar read_byte(){uchar i,value;for(i=0;i<8;i++){DQ=0;value>>=1; //移位7次DQ=1; //先要释放总线,那样才能采样到有效数据if(DQ) //判断8次{value|=0x80;}delay(6); //约为78us}return value;}uchar read_temperature(){uchar a,b;init_ds18b20(); //每次操作指令前,都必须进行初始化设置write_byte(0xcc);//跳过ROM指令write_byte(0x44);//进行温度转换处理delay(300);//进行一定地延时约为3ms左右init_ds18b20();write_byte(0xcc);//跳过ROM操作write_byte(0xbe);//读取温度a=read_byte();//温度低字节b=read_byte();//温度高字节b<<=4;//b左移四位,低四位为0000b=b+(a&0xf0)>>4;//将a的低四位屏蔽,不取小数点,进行右移四位,合并成一个字节的数据return b;}void display(uchar aa,uchar bb) {duan=1;P0=table[aa];duan=0;P0=0xff;wei=1;P0=0xfe;wei=0;delay_ms(5);duan=1;P0=table[bb];duan=0;P0=0xff;wei=1;P0=0xfd;wei=0;delay_ms(5);}void main(){uchar num,shi,ge;while(1){num=read_temperature();shi=num/10; //分离出十位ge=num%10; //分离出个位display(shi,ge);}}。
DS18B20 PIC测温用1602显示温度C程序
DS18B20+PIC测温用1602显示温度C程序//熟悉使用单片机运用DS18B20温度传感器测试温度,并用1602显示屏显示温度//1、第一行显示:Temperature//2、第二行显示:实测温度值//*********************************************** ***//*********************************************** ***//硬件设置://1、SW2,SW4开关全部断开//2、插上DS18B20温度传感器//*********************************************** ***//*********************************************** ***//*****************定义头文件**********************//**************************************************#include;#include "delay.h"//*********************************************** ***//******************定义配置位*********************//*********************************************** ***__CONFIG(0x3545);//FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护//RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器//*********************************************** ***//******************定义常量***********************//*********************************************** ***#define uchar unsigned char#define uint unsigned int//*********************************************** ***//***************定义DS18B20引脚*******************//*********************************************** ***#define DQRE0#define DQ_IO TRISE0//*********************************************** ***//******************定义LCD引脚*********************//*********************************************** ***#define RS RA1#define RW RA2#define E RA3//*********************************************** ***//******************定义变量***********************//*********************************************** ***uchar lowtemp,hightemp; //低8位温度变量,高8位温度变量uchar zhengshu,xiaoshu; //温度整数变量,温度小数变量uint temperature;//转换后的温度值BCD码形式uchar temp[7];//转换后温度存放变量//*********************************************** ***//******************定义数据***********************//**************************************************//显示: Temperature//显示:WWW*PICAVR*COMconst uchar name[16]=//{0x20,0x20,0x20,0x54,0x65,0x6d,0x70,0x65,0x72,0x61,0x74,0x75,0x72,0x65,0x20,0x20};{0x20,0x57,0x57,0x57,0x2E,0x50,0x49,0x43,0x41,0x5 6,0x52,0x2E,0x43,0x4F,0x4D,0x20};//*********************************************** //函数名:delayms(uchar time);//入口参数:time//出口参数:无//函数作用:毫秒延时//说明://*********************************************** void delayms(uchar time){uint i;while(time--){for(i=93;i>;0;i--){;}}}//*********************************************** //函数名:port_init();//入口参数:无//出口参数:无//函数作用:端口初始化//说明://*********************************************** void port_init(void){ADCON1=0X07;//设置RA,RE口为数字口TRISA=0X00;//设置RA口为输出口TRISD=0X00;//设置RD口为输出口TRISE=0X00;//设置RE口为输出口OPTION=0X8F;//分频给WDT,分频比为128}//*********************************************** //函数名:lcd_enable();//入口参数:无//出口参数:无//函数作用:LCD写使能//说明://*********************************************** void lcd_enable(void){RS=0;//写命令RW=0;//写操作E=0;//低电平信号delayms(10); //低电平信号保持E=1;//拉高电平信号}//*********************************************** //函数名:lcd_writebyte(uchar data);//入口参数:data//出口参数:无//函数作用:LCD写一个字节数据//说明://*********************************************** void lcd_writebyte(uchar data){PORTD=data;//向RD口写数据RS=1;//写数据RW=0;//写操作E=0;//低电平信号delayms(10); //低电平信号保持E=1;//拉高电平信号}//*********************************************** //函数名:lcd_writedata(const uchar *ptt);//入口参数:*ptt//出口参数:无//函数作用:LCD写数据块函数//说明://*********************************************** void lcd_writedata(const uchar *ptt){uchar i;for(i=0;i;0;i--)//写8位数据{temp=data&0x01;//先写低位数据DQ_IO=0;//设置RE0为输出口DQ=0;//RE0输出低电平DelayUs(1);//延时6us(15us之内把数据送到总线上)if(temp){DQ_IO=1;} //设置RE0为输入口(写1时序) DelayUs(25);//延时61us(总线采样时间15-60us)DQ_IO=1;//设置RE0为输入口(写0时序)DelayUs(1);//延时6us(写第二位时间间隙大于1us)data=data>;>;1;//右移一位}}//*********************************************** //函数名:ds18b20_readbyte();//入口参数:无//出口参数:无//函数作用:DS18B20读一个字节数据//说明://*********************************************** unsigned char ds18b20_readbyte(void){uchar i,data=0;//读出温度for(i=8;i>;0;i--)//读8位数据{data=data>;>;1;//数据先右移一位DQ_IO=0;//设置RE0为输出口DQ=0;//RE0输出低电平DelayUs(1);//延时6us(低电平时间大于1us)DQ_IO=1;//拉高总线,产生读时间间隙(设置RE0为输入口) DelayUs(1);//延时6us(从拉低电平开始15us之内完成读位)if(DQ){data=data|0x80;} //先读高位数据,高位为1else {data=data|0x00;} //高位为0DelayUs(25);//延时61us(从拉低电平开始60-120us之内释放总线)}return(data);}//*********************************************** //函数名:read_ds18b20_data();//入口参数:无//出口参数:无//函数作用:读DS18B20测试的温度数据//说明://*********************************************** void read_ds18b20_data(void){DQ_IO=1;//设置RE0为输入口ds18b20_reset();//调用复位函数ds18b20_writebyte(0XCC);//跳过ROM匹配ds18b20_writebyte(0X44);//发送温度变换命令ds18b20_reset();//再次复位ds18b20_writebyte(0XCC);//跳过ROM匹配ds18b20_writebyte(0XBE);//发送读温度命令lowtemp=ds18b20_readbyte();//读出低8位温度值hightemp=ds18b20_readbyte();//读出高8位温度值DQ_IO=1;//释放总线zhengshu=((lowtemp>;>;4)|(hightemp<<4))&0X3F; xiaoshu=lowtemp<<4;temp[0]=(zhengshu/100)%10;//整数百位temp[1]=(zhengshu/10)%10;//整数十位temp[2]=zhengshu%10;//整数个位temperature=0;if(xiaoshu&0x80)//下面是把小数部分转换为BCD码形式 {temperature+=5000;}if(xiaoshu&0x40){temperature+=2500;}if(xiaoshu&0x20){temperature+=1250;}if(xiaoshu&0x10){temperature+=625;}temp[3]=(temperature/1000)%10;//十分位temp[4]=(temperature/100)%10;//百分位temp[5]=(temperature/10)%10;//千分位temp[6]=temperature%10;//万分位DelayUs(1);//延时6us}//*********************************************** //函数名:lcd_display_temp();//入口参数:无//出口参数:无//函数作用:LCD显示测试温度程序//说明://*********************************************** void lcd_display_temp(void){PORTD=0X80;//设置第1行显示地址lcd_enable();lcd_writedata(name);//调用显示函数PORTD=0XC0;//设置第2行显示地址lcd_enable();//调用写使能函数lcd_writebyte(0x20);lcd_writebyte(0x20);lcd_writebyte(0x20);if(temp[0]==0){lcd_writebyte(0x20);}else{lcd_writebyte(temp[0]+0x30);}lcd_writebyte(temp[1]+0x30);lcd_writebyte(temp[2]+0x30);lcd_writebyte(0x2e);lcd_writebyte(temp[3]+0x30);lcd_writebyte(temp[4]+0x30);lcd_writebyte(temp[5]+0x30);lcd_writebyte(temp[6]+0x30);lcd_writebyte(0x20);lcd_writebyte(0x43);lcd_writebyte(0x20);lcd_writebyte(0x20);lcd_writebyte(0x20);}//*********************************************** //函数名:main();//入口参数:无//出口参数:无//函数作用:MAIN函数//说明://*********************************************** void main(void){port_init();//调用端口初始化函数lcd_init();//调用LCD初始化函数while(1){read_ds18b20_data(); //调用温度转换函数CLRWDT();//清看门狗lcd_display_temp(); //调用温度显示函数}}。
DS18B20温度计C程序最终版
i = 100; //拉低约800us, 符合协议要求的480us以上
while(i>0) i--;
ds = 1; //产生一个上升沿, 进入等待应答状态
i = 4;
while(i>0) i--;
}
void dsWait()
}
//获取当前温度值
int getTmpValue()
{
unsigned int tmpvalue;
int value; //存放温度数值
float t;
unsigned char low, high;
sendReadCmd();
//连续读取两个字节数据
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#include <math.H> //要用到取绝对值函数abs()
//通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55~ +125度
{
uchar j;
while(x--)
{
for(j=0;j<100;j++);
}
}
void delay(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j = 0; j < 125; j++);
tmpvalue <<= 8;
多个DS18B20温度测量程序
#include<reg51.h>#include<intrins.h> //nop函数#include<stdlib.h>#include<math.h>#define uchar unsigned char#define uint unsigned intsbit DS18B20_DQ=P2^7;sbit feng=P2^0;sbit deng=P1^0;#define LCD_data P0 //ch375数据端口uchar count1,count2,count;sbit LCD_RS=P3^5;sbit LCD_RW=P3^6; //ch375的rw也是此口sbit LCD_EN=P3^4;#include<key_fo.h>uchar ds18b20_serial[4][8]={0x28,0x51,0x8c,0x9e,0x03,0x00,0x00,0xfd, //第1个18B20的ID0x28,0x71,0x91,0x9e,0x03,0x00,0x00,0xdb, //第2个18B20的ID0x28,0x43,0xa6,0x9a,0x03,0x00,0x00,0x83, //第3个18B20的ID0x28,0xe3,0x8a,0x9e,0x03,0x00,0x00,0x08 //第4个18B20的ID};#include<12864.h>uchar temp_num1;uchar temp_num2;uint temper=0,yushe1=325,yushe2=325,yushe3=325,yushe4=325,piancha;/****************************************************函数:void Ds18b20_Delay(uint timer)功能:STC单片机严格的us级延时函数*****************************************************/void Ds18b20_Delay(uint timer) //us{while(timer--){_nop_();_nop_();_nop_();}}/***************************************************函数:void rest()功能:DS18B20芯片复位函数说明:复位时,MCU将数据线置为低电平,并且保持480uS-960uS,然后置为高电平,延时一段时间后,然后由MCU接受DS18B20的响应信号。
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;}}}。
完整DS18B20温度测控程序
#include<reg52.h>sbit s2=P0^0;sbit led=P1^3;unsigned char wendushangxian=0;sbit DQ=P1^6;sbit wei1=P3^0;sbit wei2=P3^1;sbit wei3=P3^2;sbit wei4=P3^3;sbit key_Max_jia=P0^0;sbit key_Max_jian=P0^1;sbit key_Min_jia=P0^2;sbit key_Min_jian=P0^3;sbit dianji_jian=P1^2;sbit dianji_jia=P1^7;sbit Led_tempreture_Max=P1^3;sbit Led_tempreture_Min=P1^4;sbit Led_normal=P1^5;unsigned char num[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; int tempreture_Max=40;int tempreture_Min=-10;void delay_mylself(int temp){unsigned int i,j;for(i=0;i<temp;i++)for(j=0;j<1140;j++);}void delay(unsigned int i) //如果i是unsigend char类型,则会出现错误结果{while(i--);}void DS18B20_Init(void)//初始化{unsigned char flag=0;DQ = 1; //DQ复位delay(1);DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480us小于960usDQ = 1; //拉高总线delay(6);while(DQ);while(!DQ);//flag=DQ; //稍做延时后如果flag=0则初始化成功flag=1则初始化失败//delay(30);}unsigned char Read(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 Write(unsigned char dat)//写字节{unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}}void init(){wei1=0;wei2=0;wei3=0;wei4=0;}void Display(unsigned int temp){unsigned char one,two,three,four;int wendu=0;if(temp<=0xf000){ temp>>=4; //右移4位,相当于乘0.0625,将温度化为十进制//temp*=10; //扩大10倍,显示一位小数one=temp/1000; //千位two=temp%1000/100; //百位three=temp%1000%100/10; //十位four=temp%1000%100%10; //个位wendu=temp;}else{temp=~temp;temp+=1;temp>>=4;one=10; //负数two=temp%1000/100; //百位three=temp%1000%100/10; //十位four=temp%1000%100%10; //个位wendu=-temp;}if(wendu>tempreture_Max){Led_tempreture_Max=0;Led_tempreture_Min=1;Led_normal=1;dianji_jian=1;dianji_jia=0;}else if(wendu<tempreture_Min){Led_tempreture_Max=1;Led_tempreture_Min=0;Led_normal=1;dianji_jia=1;dianji_jian=0;}else{Led_tempreture_Max=1;Led_tempreture_Min=1;Led_normal=0;dianji_jian=0;dianji_jia=0;}//第1位wei1=1;wei2=0;wei3=0;wei4=0;P2=num[one];delay_mylself(1);//第2位wei1=0;wei2=1;wei3=0;wei4=0;P2=num[two];delay_mylself(1);//第3位wei1=0;wei2=0;wei3=1;wei4=0;P2=num[three];delay_mylself(1);//第4位wei1=0;wei2=0;wei3=0;wei4=1;P2=num[four];delay_mylself(10);}void common_display(int temp){unsigned char one,two,three,four;one=temp/1000; //千位two=temp%1000/100; //百位three=temp%1000%100/10; //十位four=temp%1000%100%10; //个位if(temp<0){temp=-temp;two=temp%1000/100; //百位three=temp%1000%100/10; //十位four=temp%1000%100%10; //个位//第1位wei1=1;wei2=0;wei3=0;wei4=0;P2=num[10];delay_mylself(50);}else{//第1位wei1=1;wei2=0;wei3=0;wei4=0;P2=num[one];delay_mylself(50);}//第2位wei1=0;wei2=1;wei3=0;wei4=0;P2=num[two];delay_mylself(50);//第3位wei1=0;wei2=0;wei3=1;wei4=0;P2=num[three];delay_mylself(50);//第4位wei1=0;wei2=0;wei3=0;wei4=1;P2=num[four];delay_mylself(60);}void key(){unsigned char flag=0;if(key_Max_jia==0){flag=1;tempreture_Max+=1;if(tempreture_Max>125){tempreture_Max=125;}while(!key_Max_jia); //按键松手检测}else if(key_Max_jian==0){flag=2;tempreture_Max-=1;if(tempreture_Max<tempreture_Min){tempreture_Max=tempreture_Min;}while(!key_Max_jian); //按键松手检测}else if(key_Min_jia==0){flag=3;tempreture_Min+=1;if(tempreture_Min>tempreture_Max){tempreture_Min=tempreture_Max;}while(!key_Min_jia); //按键松手检测}else if(key_Min_jian==0){flag=4;tempreture_Min-=1;if(tempreture_Min<-55){tempreture_Min=-55;}while(!key_Min_jian); //按键松手检测}if(flag==1||flag==2){common_display(tempreture_Max);delay_mylself(200);flag=0;}else if(flag==4||flag==3){common_display(tempreture_Min);delay_mylself(200);flag=0;}}void main(){unsigned int temp;unsigned char tl=0,th=0;while(1){DS18B20_Init();Write(0xCC); // 跳过读序号列号的操作Write(0x44); // 启动温度转换delay(100);DS18B20_Init();Write(0xCC); //跳过读序号列号的操作Write(0xBE); //读取温度寄存器等delay(100);tl=Read(); //读取温度值低位th=Read(); //读取温度值高位temp=th<<8;temp|=tl;Display(temp);key();}}。
DS18b20温度测量程序。单片机C51控制
//DS18B20的读写程序,数据脚P3.3 ////温度传感器18B20汇编程序,采用器件默认的12位转化 ////最大转化时间750微秒,显示温度-55到+125度,显示精度 ////为0.1度,显示采用4位LED共阳显示测温值 ////P0口为段码输入,P24~P27为位选 ///***************************************************/#include "reg51.h"#include "intrins.h" //_nop_();延时函数用#define Disdata P1 //段码输出口#define discan P0 //扫描口#define uchar unsigned char#define uint unsigned intsbit DQ=P3^2; //温度输入口uint h;//**************温度小数部分用查表法***********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09 };//uchar dd[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};//共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"uchar scan_con[4]={0x00,0x01,0x02,0x03}; //列扫描控制字uchar temp_data[2]={0x00,0x00}; //读出温度暂放uchar display[4]={0x00,0x00,0x00,0x00,}; //显示单元数据,共4个数据和一个运算暂用///////***********11微秒延时函数**********///void delay(uint t){for(;t>0;t--);}///***********显示扫描函数**********/scan(){uchar k;for(k=0;k<3;k++){P0=0xff;dd[k]=dd[display[k]];dd[k]=dd[k]*16;dd[k]=dd[k]|scan_con[k];P0=dd[k];delay(90);P0=0xff;}}/////***********18B20复位函数**********/ ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();DQ=0; //delay(50); // 550usDQ=1; //delay(6); // 66uspresence=DQ; // presence=0继续下一步 }delay(45); //延时500uspresence = ~DQ;}DQ=1;}/////**********18B20写命令函数*********/ //向 1-WIRE 总线上写一个字节void write_byte(uchar val){uchar i;for (i=8; i>0; i--) //DQ=1;_nop_();_nop_();DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; //最低位移出delay(6); //66usval=val/2; //右移一位}DQ = 1;delay(1);}///*********18B20读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_(); //4usDQ = 1;_nop_();_nop_();_nop_();_nop_(); //4usif(DQ)value|=0x80;delay(6); //66us}DQ=1;return(value);}///***********读出温度函数**********///read_temp(){ow_reset(); //总线复位write_byte(0xCC); // 发Skip ROM命令write_byte(0xBE); // 发读命令temp_data[0]=read_byte(); //温度低8位temp_data[1]=read_byte(); //温度高8位ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令}/***********温度数据处理函数**********/void work_temp(){display[3]=temp_data[0]&0x0f;display[0]=ditab[display[3]]; //小数部分display[3]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4); display[2]=display[3]/10%10;display[1]=display[3]%10;}/////**************主函数****************/main(){Disdata=0xff; //初始化端口discan=0xff;ow_reset(); // 开机先转换一次write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令for(h=0;h<500;h++){scan();} //开机显示"0000"2秒while(1){read_temp(); //读出18B20温度数据work_temp(); //处理温度数据scan(); //显示温度值2秒}}////*********************结束**************************//。
DS18B20测温程序
//温度高于26摄氏度则蜂鸣器响#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbitdula=P2^6;sbitwela=P2^7;sbit beer=P2^3; //控制蜂鸣器sbitdsb=P2^2; //ds18b20的数据总线sbitrs=P3^5; //液晶显示数据命令选择端口sbitlcme=P3^4; //液晶显示使能信号sbit key=P3^7;uint temp; //温度传感器测得的温度uchar code listone[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucharcodelisttwo[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; ucharcodelistthree[]={"The temp is under:"};void delay(uchari){while(--i);}Voiddelayone(uint z){uintx,y;for(x=100;x>0;x--)for(y=z;y>0;y--);}/*液晶显示写命令初始化*/ Voidwritecom(uchar com) {rs=0;delayone(2);lcme=0;P0=com;lcme=1;delayone(2);lcme=0;}/*液晶显示写数据初始化*/ void writebyte(uchar byte) {rs=1;delayone(2);lcme=0;P0=byte;lcme=1;delayone(2);lcme=0;}/*液晶显示初始化*/ void ds18b20init() {uinttempone;uinti;dula=0;wela=0;lcme=0;writecom(0x38);writecom(0x0f);writecom(0x06);writecom(0x80);for(i=0;i<16;i++){writebyte(listthree[i]);delayone(2);}writecom(0x80+0x40);for(i=0;i<16;i++){tempone=temp&0x80;writebyte(tempone);delay(2);temp<<=1;}writecom(0x0c);}/*温度传感器初始化*/ voidtempinit(){dsb=1;delay(1);dsb=0;delay(250);dsb=1;delay(100);}voidwritedata(uchardat) {uinti;for(i=0;i<8;i++){dsb=1;_nop_();dsb=0;_nop_();_nop_();dsb=dat&0x01;delay(10);dat>>=1;delay(1);}dsb=1;}ucharreaddata(){uinti;for(i=0;i<8;i++){dsb=1;_nop_();dsb=0;_nop_();_nop_();// date>>=1;dsb=1;delay(1);date>>=1; //右移放于此处也可以if(dsb==1)date|=0x80;delay(10);}return date;}uint control(){floattt;// uint temp;tempinit();writedata(0xcc);writedata(0x44);tempinit();writedata(0xcc);writedata(0xbe);a =readdata();b = readdata();temp = b;temp<<= 8;temp = temp|a;tt = temp*0.0625;temp = tt*100+0.05;return temp;}voidshuma(uint temp) {ucharbai,shi,ge,xiaoshu; bai=(temp/1000);shi=temp%1000/100; ge=temp%100/10; xiaoshu=temp%10;dula=1;P0=listone[bai];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delayone(1);dula=1;P0=listtwo[shi];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayone(1);dula=1;P0=listone[ge];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delayone(1);dula=1;P0=listone[xiaoshu];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(10);}void warning(uint temp){if((temp>=2600)&&(temp<2800)&&(key==1)){beer=0;P1=0x55;delayone(4);}if((key==0)||(temp<2600)){delayone(5);if((key==0)||(temp<2600)){beer=1;P1=0xff;}}}void main(){while(1){if(temp<2600){shuma(control());}if((temp>=2600)&&(temp<2800)){shuma(control());warning(temp);}if(temp>=2800){dula=0;wela=0;P0=0xff;}}}。
温度传感器DS18B20测试程序
;**************************************;温度传感器DS18B20测试程序供参考;**************************************DQ BIT P3.7 ;DS18B20的数据口位P3.3 TPL DA TA 50H ;存放温度值的高字节TPH DATA 51H ;存放温度值的低字节TPPL DATA 54H ;十进制TPPH DATA 55HORG 0JMP MAINORG 100HMAIN:CALL DS18B20_Reset ;设备复位MOV A,#0CCH ;跳过ROM命令CALL DS18B20_WriteByte ;送出命令MOV A,#044H ;开始转换CALL DS18B20_WriteByte ;送出命令JNB DQ,$ ;等待转换完成CALL DS18B20_Reset ;设备复位MOV A,#0CCH ;跳过ROM命令CALL DS18B20_WriteByte ;送出命令MOV A,#0BEH ;读暂存存储器CALL DS18B20_WriteByte ;送出命令CALL DS18B20_ReadByte ;读温度低字节MOV TPL,A ;存储数据CALL DS18B20_ReadByte ;读温度高字节MOV TPH,A ;存储数据CALL HZDL0CALL DISJMP MAIN;**************************************; 驱动LED显示器的程序;**************************************PDL BIT 20HDIS: MOV DPTR,#TABDIS1: MOV R0,#TPPLMOV R2,#0FBHMOV R3,#02HCLR PDLDIS2: MOV A,@R0 ;四位扫描显示ANL A, #0FH;SW AP AMOVC A,@A+DPTRORL P3,#3CHMOV A,R2ANL P3,ARL AMOV R2, A;INC R0LCALL DAYMOV A,@R0ANL A, #0F0HSW AP AMOVC A,@A+DPTRORL P3,#3CHJB PDL,DIS3SETB PDL;ORL A, #80HDIS3: MOV P1,AMOV A,R2ANL P3,ARL AMOV R2, ALCALL DAYINC R0DJNZ R3,DIS2RETTAB: DB 03FH,06H,05BH,4FH,66H,6DH,7DH,07H ;DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H,40H ;共阴极代码DAY: MOV R4,#1D1: MOV R5,#248D2: NOPNOPDJNZ R5,D2DJNZ R4,D1RET;**************************************HZDL0: MOV TPPL, #00H ; 十六进制 -> 十进制MOV TPPH, #00HMOV TPPH+1, #00HMOV TPH+1, #00HMOV R3, #04HHZDL2: CLR CMOV A, TPLRLC AMOV TPL,AMOV A, TPHMOV TPH,AMOV A, TPH+1RLC AMOV TPH+1,ADJNZ R3, HZDL2HZDL021: MOV R3, #10HHZDL022: MOV R0, #TPLMOV R2, #03HHZDL026: MOV A, @R0RLC AMOV @R0, AINC R0DJNZ R2, HZDL026MOV R0, #TPPLMOV R2, #03HHZDL028: MOV A, @R0ADDC A, @R0DA AMOV @R0, AINC R0DJNZ R2, HZDL028DJNZ R3, HZDL022RET;**************************************;延时X*10微秒;**************************************DelayX0us: ;2 当改用1T的MCU时,请调整此延时函数NOP ;1NOP ;1NOP ;1NOP ;1NOP ;1NOP ;1NOP ;1NOP ;1DJNZ R7,DelayX0us ;2RET ;2;**************************************;复位DS18B20,并检测设备是否存在;**************************************DS18B20_Reset:CLR DQ ;送出低电平复位信号MOV R7,#48 ;延时至少480usCALL DelayX0usSETB DQ ;释放数据线MOV R7,#6 ;等待60usCALL DelayX0usMOV C,DQ ;检测存在脉冲MOV R7,#42 ;等待设备释放数据线CALL DelayX0usJC DS18B20_Reset ;如果设备不存在,则继续等待RET;**************************************;从DS18B20读1字节数据;**************************************DS18B20_ReadByte:CLR APUSH 0MOV 0,#8 ;8位计数器ReadNext:CLR DQ ;开始时间片NOPNOPSETB DQ ;准备接收NOPNOPMOV C,DQ ;读取数据RRC AMOV R7,#6 ;等待时间片结束CALL DelayX0usDJNZ 0,ReadNextPOP 0RET;**************************************;向DS18B20写1字节数据;**************************************DS18B20_WriteByte:PUSH 0MOV 0,#8 ;8位计数器WriteNext:CLR DQ ;开始时间片NOPNOPRRC A ;输出数据MOV DQ,CMOV R7,#6 ;等待时间片结束CALL DelayX0usSETB DQ ;准备送出下一位数据DJNZ 0,WriteNextPOP 0RETEND。
数字温度传感器DS18B20(含程序)
数字温度传感器DS18B20摘要DS-18B20 数字温度传感器具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
应用范围广泛,适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域,轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制和汽车空调、冰箱、冷柜、以及中低温干燥箱等。
一、引脚图DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)二、DS18B20的主要特性1.1、电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电1.2、DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯1.3、多个DS18B20可以并联在唯一的三线上,实现组网多点测温1.4、DS18B20在使用中不需要任何外围元件1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
三、DS18B20的外形和内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20内部结构图四、DS18B20工作原理DS18B20的温度转换时的延时时间由2s 减为750ms。
DS18B20测温原理如图3所示。
DS18B20温度测试程序(51单片机数码管显示)+电路图
DS18B20温度测试程序(51单片机数码管显示)+电路图•下面是电路图采用4位数码管显示程序一共有2个文件:/****************************************************************************** *****************************************ds18b20.h 头文件******************************************************************************* ****************************************/#ifndef _DS18B20_H_#define _DS18B20_H_#include <reg51.h>#define led P1#define ledw P2extern unsigned char f;extern void ds18b20_reset();extern void dela(unsigned char i);extern void ds18b20_write(unsigned char dat);extern unsigned char ds18b20_read();extern unsigned char ds18b20_temp();extern unsigned char ledtab[];#endif/****************************************************************************** **************************************ds18b20.c 文件******************************************************************************* *************************************/#include"ds18b20.h"#define uchar unsigned char#define uint unsigned int#define led P1#define ledw P2uchar ledtab[]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbit dq=P3^7 ;uchar delay,f;//uchar f;void dela(uchar i) //5us t=5+i*2{while(--i);}void ds18b20_reset(){while(1){dq=1;dq=0;delay=250; //540us延时,当delay=1时延时为2us ,T=2*xwhile(--delay);dq=1;delay=25;while(--delay);while(dq==0){delay=220;while(--delay);if(dq==1)break;}delay=150;while(--delay);break;}}void ds18b20_write(uchar dat) {uchar i=0;for(i=0;i<8;i++){dq=1;dq=0;delay=3;while(--delay);dq=dat&0x01;delay=35;while(--delay);dq=1;dat=dat>>1;}}uchar ds18b20_read(){uchar i=0,m=0;for(i=0;i<8;i++){//m>>=1dq=1;dq=0;delay=4;while(--delay);dq=1;delay=4;while(--delay);if(dq==1)m|=0x01<<i;//m=m|0x80;delay=25;while(--delay);dq=1;delay=1;while(--delay);}return m;}uchar ds18b20_temp(){uchar temp=0,temph=0,templ=0,k=0; ds18b20_reset();ds18b20_write(0xcc);ds18b20_write(0x44);ds18b20_reset();ds18b20_write(0xcc);ds18b20_write(0xbe);templ=ds18b20_read();temph=ds18b20_read();if((temph&0xf80)!=0){f=1;templ=~templ;temph=~temph;k=templ+1;templ=k;if(templ>0xff){temph++;}}elsef=0;templ=templ>>4;temph=temph<<4;temp=templ|temph;return temp;}/****************************************************************************** ************************************main.c 主文件******************************************************************************* ************************************/#include<reg51.h>#include"ds18b20.h"#define uchar unsigned charvoid main(){uchar a=0,b=0,c=0,temp=0;while(1){temp=ds18b20_temp();a=temp/100;b=temp0/10;c=temp;if(f==1){led=0xbf;ledw=1;dela(5000);ledw=0;dela(600);}led=ledtab[c]; ledw=8;dela(5000); ledw=0;dela(600) ;led=ledtab[b]; ledw=4;dela(5000); ledw=0;dela(600) ;led=ledtab[a]; ledw=2;dela(5000);ledw=0;dela(600) ; }}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
///无线模块板
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//sbit DQ=P3^5;
//sbit d1=P2^3;
//sbit d2=P2^4;
//sbit d3=P2^5;
sbit DQ=P2^0; //ds18b20 // 1602
sbit lcden=P3^7;
sbit lcdrs=P3^4;
sbit lcdrw=P3^6;
sbit BELL=P1^6;
uint wendu=0;
//////// 1602
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay1ms(5);
lcden=1;
delay1ms(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay1ms(5);
lcden=1;
delay1ms(5);
lcden=0;
}
void write_str(uchar *str)
{
while(*str!='\0') //未结束
{
write_data(*str++);
delay1ms(1);
}
}
void init_1602()
{
// uchar num;
uchar table[16]={0};
uchar table1[16]={0};
lcdrw=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80);
/* for(num=0;num<16;num++)
{
write_data(table[num]);
delay1ms(10);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_data(table1[num]);
delay1ms(10);
}
*/
}
///// //// ds18b20
bit init_DS18B20()
{
uchar num;
bit flag;
DQ=1;
for(num=0;num<2;num++); //先拉高
DQ=0;
for(num=0;num<200;num++); // 480-960us powerup DQ=1;
for(num=0;num<20;num++); // >60us wait
flag=DQ; // 响应
for(num=0;num<150;num++); // 60-240us ds18b20存在信号DQ=1;
return flag;
}
void DS18B20_WR_CHAR(uchar byte) // 先写低位
{
uchar num;
uchar num1;
for(num1=0;num1<8;num1++)
{
DQ=0; //拉低
_nop_(); //下拉1us
_nop_();
DQ=byte&0x01;
for(num=0;num<20;num++); // >60us wait
byte>>=1;
DQ=1; //拉高
_nop_();
_nop_();
}
}
uchar DS18B20_RD_CHAR() //先读低位
{
uchar num;
uchar num1;
uchar byte=0;
for(num1=0;num1<8;num1++)
{
DQ=0; //拉低
_nop_();
DQ=1;
for(num=0;num<1;num++); // <10us
byte>>=1;
if(DQ==1)
byte|=0x80;
else
byte|=0x00;
DQ=1; //拉高
_nop_();
_nop_();
for(num=0;num<20;num++); // >60us
}
return byte;
}
uint DS18B20_WENDU()
{
uchar temperaturel=0,temperatureh=0;
uint temperature=0;
if(init_DS18B20()==0)
{
DS18B20_WR_CHAR(0xcc);
DS18B20_WR_CHAR(0x44);
delay1ms(1000);
if(init_DS18B20()==0)
{
DS18B20_WR_CHAR(0xcc);
DS18B20_WR_CHAR(0xBE);
_nop_();
temperaturel=DS18B20_RD_CHAR();
temperatureh=DS18B20_RD_CHAR();
temperature=(temperatureh*256+temperaturel)*0.625;
init_DS18B20();
}
return temperature;
}
}
///////
main()
{
init_1602();
delay1ms(1000);
while(1)
{
if( init_DS18B20()==0)
{
wendu=DS18B20_WENDU();
write_com(0x80);
write_str("temperature:");
write_com(0x80+0x44);
write_data((wendu/100)%10+48);
write_data((wendu/10)%10+48);
write_data('.');
write_data(wendu%10+48);
write_data(0xdf); // 0xdf
write_data('c');
BELL=0;
delay1ms(1);
BELL=1;
delay1ms(2000);
}
}
}。