DS18B20温度传感器驱动程序(完美)
温度传感器DS18B20驱动程序
TempDelay(20); //20
_nop_();
_nop_();
D18B20 = 1;
}
void WriteByte (unsigned char wr) //单字节写入
}
void Star18b20(void)
{
Res18b20();
WriteByte(0xcc);
WriteByte(0x44);
}
void Config18b20 (void) //重新配置报警限定值和分辨率
{
Res18b20();
WriteByte(0xcc); //skip rom
_nop_();
_nop_();
D18B20=1;
wr >>= 1;
}
}
unsigned char ReadByte (void) //读取单字节
{
unsigned char i,u=0;
void RedaByte (void);
void ReadRAM (unsigned char j);
float GetTemp (void);
void Config18b20 (void);
void Star18b20 (void);
void TempDelay (unsigned char us)
TempDelay(14); //delay 100 uS//14
_nop_();
_nop_();
_nop_();
if(D18B20==0)
flag = 1; //detect 1820 success!
(完整版)读取DS18B20温度传感器的64位ID号方法及程序
#include <reg52.h>#define uchar unsigned char#define uint unsigned int/********************************************************************/ sbit DQ = P2^2; //温度传感器信号线sbit rs = P3^5; //LCD数据/命令选择端(H/L)位声明sbit lcden = P3^4; //LCD使能信号端位声明/********************************************************************/ //uint temp; //定义整型的温度数据//float f_temp; //定义浮点型的温度数据//uint warn_11 = 270; //定义温度设定值,是温度值乘以10后的结果//uint warn_12 = 250; //定义温度下限值//uint warn_h1 = 300; //定义温度上限值/********************************************************************/ void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WriteData(uchar dat); //1602液晶数据写入函数void LCD_Init(); //LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数 *//**********************************************/void main(){ uchar a,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a = DS18B20_ReadByte();b = DS18B20_ReadByte();c = DS18B20_ReadByte();d = DS18B20_ReadByte();e = DS18B20_ReadByte();f = DS18B20_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数 *//***************************************************/void delay(uint z)//延时函数{uint x,y;for( x = z; x > 0; x-- )for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 */ /***************************************************/void DS18B20_Reset(void)//DQ18B20复位,初始化函数{uint i;DQ = 0;i = 103;while( i > 0 ) i--;DQ = 1;i = 4;while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数 *//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{uint i;bit dat;DQ = 0;i++; //i++起延时作用DQ = 1;i++;i++;dat = DQ;i = 8;while( i > 0 )i--;return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数 */ /***************************************************/uchar DS18B20_ReadByte(void) //读1个字节数据函数{uchar i,j,dat;dat = 0;for( i = 1; i <= 8; i++ ){j = DS18B20_Readbit();dat = ( j << 7 ) | ( dat >> 1 );}return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数 *//***************************************************/void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{uint i;uchar j;bit testb;for( j=1; j<=8; j++){testb = dat&0x01;dat= dat>>1;if(testb) //写1{DQ = 0;i++;i++;DQ = 1;i = 8;while(i>0)i--;}else{DQ = 0; //写0i = 8;while(i>0)i--;DQ = 1;i++;i++;}}}/***********************************************//* LCD函数:void LCD_WriteCom() *//* 功能:向LCD写入命令 *//***********************************************/void LCD_WriteCom(uchar com){rs = 0;P0 = com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) *//* 功能:向LCD写入数据 *//***********************************************/void LCD_WriteData(uchar dat){rs = 1; //选择LCD为写入数据状态lcden = 0;P0 = dat; //将待写入数据放到总线上delay(5);lcden = 1; //给LCD使能端一个脉冲delay(5); //信号将之前放到总线上lcden = 0; //的数据写入LCDdelay(5);}/***********************************************//* LCD函数:void LCD_Init() */ /* 功能:初始化LCD,设定LCD的初始状态 *//***********************************************/void LCD_Init(){LCD_WriteCom(0x38); //LCD显示模式设定delay(15);LCD_WriteCom(0x08); //关闭LCD显示delay(3);LCD_WriteCom(0x01); //LCD显示清屏delay(3);LCD_WriteCom(0x06); //设定光标地址指针为自动加1delay(3);LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//* */ /* 显示18B20序列号 *//* *//**********************************************/void Display18B20Rom(char Rom){uchar h,l;l = Rom & 0x0f; //取低4位h = Rom & 0xf0; //取高4位h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30); //取ASCII码elseLCD_WriteData(h+0x37); //取ASCII码if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30); //取ASCII码elseLCD_WriteData(l+0x37); //取ASCII码}。
温度传感器DS18B20驱动
]Linux下的ds18b20驱动原文地址:Linux下的ds18b20驱动作者:王宁运行环境 Fedora9.0交叉编译 arm-linux-gcc-4.3.2一.编译成模块#include <linux/module.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/delay.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/miscdevice.h>#include <asm/irq.h>#include <mach/regs-gpio.h>#include <mach/hardware.h>#include <asm/uaccess.h>#define DEVICE_NAME "DS18B20"#define DS18B20_MAJOR 250#define DS_PIN S3C2410_GPB1#define OUT S3C2410_GPB1_OUTP#define IN S3C2410_GPB1_INP#define DIS_UP 1#define EN_UP 0//#define Search 0x00F0#define Read_ROM 0x0033 //just for one#define Skip_ROM 0x00CC //ds18b20的固定时序,跳过读序号列号的操作#define Convert 0x0044 //ds18b20的固定时序,管脚识别到该信号是开始对测到的温度进行转换#define Write 0x004E //TH---TL---Config#define Read 0x00BE //读取温度寄存器等(共可读9个寄存器)前两个就是温度//#define bit_9 0x001F//#define bit_10 0x003F//#define bit_11 0x005F#define bit_12 0x007F#define uint16 unsigned int//unsigned int ROM_DATA[8];void usdelay(unsigned int i){unsigned int j;for(i=i;i>0;i--)for(j=90;j>0;j--);}void msdelay(unsigned int i) //延时 i ms{for(i=i;i>0;i--)usdelay(1000);}void SetL(void){s3c2410_gpio_cfgpin(DS_PIN,OUT);s3c2410_gpio_setpin(DS_PIN,0);}void SetH(void){s3c2410_gpio_cfgpin(DS_PIN,OUT);s3c2410_gpio_setpin(DS_PIN,1);}unsigned int Read_DS(void){unsigned int i;s3c2410_gpio_cfgpin(DS_PIN,IN);s3c2410_gpio_pullup(DS_PIN,EN_UP);__asm("nop");__asm("nop");__asm("nop");i=s3c2410_gpio_getpin(DS_PIN);if(i!=0)i=1;return i;}unsigned int ds_start(void) //初始化ds18b20{unsigned int flag=1;int err=0;SetH();udelay(2);SetL();udelay(600); //560延时要大于480uSetH();udelay(60); //稍作延时while(Read_DS()!=0) //ds18B20初始化成功会返回一个低电平,此时跳出循环,执行下面的操作{printk(DEVICE_NAME "Wait....n");udelay(5);err++; //初始化的最多次数吧,超过规定的次数,说明初始化失败 if(err==20){printk(DEVICE_NAME "start failn");return -1;}}//printk(DEVICE_NAME "start sucessn");flag=0;SetH();//初始化成功后赋为高电平准备从外界读入温度udelay(400);return flag;}void ds_send(unsigned int uidata) //向18b20写入一个字节的数据{//printk("the send data is %dn",uidata);int i;for(i=0;i<8;i++){SetL();udelay(1);if((uidata&1)!=0){SetH();udelay(80); //等待18b20进行数据采集}else{udelay(80); //等待18b20进行数据采集SetH();}uidata>>=1;}}unsigned int ds_read(void) //从18b20读一个字节的数据{unsigned int uidata=0;unsigned int i;for(i=0;i<8;i++){uidata>>=1;SetL();udelay(1);s3c2410_gpio_setpin(DS_PIN,1);s3c2410_gpio_cfgpin(DS_PIN,IN);udelay(10);if(s3c2410_gpio_getpin(DS_PIN))uidata=(uidata|0x80);udelay(65);SetH();}// printk("ds_read successn");return uidata;}unsigned int read_tem(void){unsigned int th,tl;//int err=0;//ds_init(100,0,bit_12);th=tl=0;ds_start();ds_send(Skip_ROM); //跳过读序号列号的操作ds_send(Convert); //启动温度转换mdelay(50);ds_start();ds_send(Skip_ROM); //跳过读序号列号的操作ds_send(Read); //准备读温度tl=ds_read();th=ds_read();th<<=8; //温度在低两个字节中//printk("the tl data is %dn",tl);tl|=th; //获取温度//printk("the th data is %dn",th);//printk("the tl2 data is %dn",tl);//printk("read_tmp successn");return tl;}static int ds18b20_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg){return 0;}static ssize_t ds18b20_read(struct file *pFile, uint16 __user *pData, size_t count, loff_t *off )uint16 tmp,ret;tmp =read_tem();// printk("the tmpk data is %dn",tmp);ret=copy_to_user(pData, &tmp, sizeof(tmp)); //将读取得的DS18B20数值复制到用户区if(ret>0){printk("copy data failedn");return -1;}//else// printk("copy data succesen");return 0;}static struct file_operations ds18b20_fops = {.owner = THIS_MODULE,.ioctl = ds18b20_ioctl,.read = ds18b20_read,};static int __init ds18b20_init(void){int ret;ret = register_chrdev(DS18B20_MAJOR, DEVICE_NAME, &ds18b20_fops);if (ret < 0) {printk(DEVICE_NAME " can't register major numbern");return ret;}s3c2410_gpio_cfgpin(DS_PIN, OUT);s3c2410_gpio_setpin(DS_PIN, 1);printk(DEVICE_NAME " initializedn");return 0;}static void __exit ds18b20_exit(void){unregister_chrdev(DS18B20_MAJOR, DEVICE_NAME);printk(DEVICE_NAME " rmmodulen");}module_init(ds18b20_init);module_exit(ds18b20_exit);MODULE_AUTHOR("benjamin_xc@"); // 驱动程序的作者MODULE_DESCRIPTION("DS18B20 Driver"); // 一些描述信息MODULE_LICENSE("GPL");下面是将驱动编译成模块的过程:1.将编写好的驱动代码copy或move到你的内核驱动代码中,比如我的是FriendlyARM/mini2440/linux2.6.29/drivers/char2.编辑char目录下的Makefile文件,添加如下obj-m += 18b20.o 注意此处红色的部分要和你自己建的程序代码的文件名保持一致。
DS18B20温度传感器程序
{ LCD_ShowNumber(1,10,DS18B20_Read()); LCD_ShowNumber(0,10,DS18B20_Check());
} } #endif
/****************************************************************************** * File name:DS18B20.c Author:zzm Data:2011.12.13 Description:DS18B20 测温传感器的控制 Version:Thermostat V1.0 History: Others:测量范围为 -55 ℃ ~+ 125 ℃ ******************************************************************************* / #include"System_cfg.h"
void DS18B20_Ready(void) {
DS18B20_Init();
/*跳过读序号列号的操作*/ DS18B20_WriteByte(0xCC);
/*启动温度转换*/ DS18B20_WriteByte(0x44);
/*等待转换完成*/ while (!DQ);
DS18B20_Init(); DS18B20_WriteByte(0xCC);
/*对负温度的特殊处理*/ if((TH&0xf8)!=0x00)
{ flag=1; TL=~TL; TH=~TH; TL=TL+1;
/*如果低 8 位大于 255,向高 8 位进 1*/ if(TL>255)
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温度传感器程序#include#include#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit beep=P2^3;uint temp;float f_temp;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void dsreset() //DS18B20复位,初始化函数{uint i;ds=0;i=103;while(i>0) i--;ds=1;i=4;while(i>0) i--;}bit tempreadbit() //读1位字节uint i;bit dat;ds=0;i++; //i++起延时作用ds=1;i++;i++;dat=ds;i=8; while(i>0) i--;return(dat);}uchar tempread() //读一个字节数据函数{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前,这样刚好一个字节在dat里}return(dat);}tempwritebyte(uchar dat)//向DS18B20写一个字节数据函数{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb)ds=0;i++;i++;ds=1;i=8;while(i>0) i--;}else{ds=0;i=8;while(i>0) i--;ds=1;i++;i++;}}}tempchange() //DS18B20开始获取温度{dsreset();delay(1);tempwritebyte(0xcc); //写跳过读ROM指令tempwritebyte(0x44); //写温度转换指令}uint get_temp() //读取寄存器的温度数据{uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread(); //读底8位b=tempread(); //读高8位temp=b;temp<<=8; //两个字节组合为1个字节temp=temp|a;f_temp=temp*0.0625;//温度寄存器中为12位,分辨率为0.0625度temp=f_temp*10+0.5; //小数只取一位,加0.5为四舍五入f_temp=f_temp+0.05;return temp; //temp是整型}main(){while(1){tempchange();}}。
DS18B20温度传感器完整C程序
DQ=val&0x01; //最低位移出
delay(6); //66 us
val=val/2; //右移1位
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
return temp; //返回温度值
}
//
}
//
//
/****************DS18B20写命令函数************************/
//向1-WIRE 总线上写1个字节
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_(); //从高拉倒低
ow_reset(); //总线复位
delay(200);
write_byte(0xcc); //发命令
write_byte(0x44); //发转换命令
ow_reset();
delay(1);
//
uchar code dis_7[12]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xff,0x02};
//共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
(完整版)读取DS18B20温度传感器的64位ID号方法及程序
#include <reg52.h>#define uchar unsigned char#define uint unsigned int/********************************************************************/ sbit DQ = P2^2; //温度传感器信号线sbit rs = P3^5; //LCD数据/命令选择端(H/L)位声明sbit lcden = P3^4; //LCD使能信号端位声明/********************************************************************/ //uint temp; //定义整型的温度数据//float f_temp; //定义浮点型的温度数据//uint warn_11 = 270; //定义温度设定值,是温度值乘以10后的结果//uint warn_12 = 250; //定义温度下限值//uint warn_h1 = 300; //定义温度上限值/********************************************************************/ void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WriteData(uchar dat); //1602液晶数据写入函数void LCD_Init(); //LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数 *//**********************************************/void main(){ uchar a,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a = DS18B20_ReadByte();b = DS18B20_ReadByte();c = DS18B20_ReadByte();d = DS18B20_ReadByte();e = DS18B20_ReadByte();f = DS18B20_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数 *//***************************************************/void delay(uint z)//延时函数{uint x,y;for( x = z; x > 0; x-- )for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 */ /***************************************************/void DS18B20_Reset(void)//DQ18B20复位,初始化函数{uint i;DQ = 0;i = 103;while( i > 0 ) i--;DQ = 1;i = 4;while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数 *//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{uint i;bit dat;DQ = 0;i++; //i++起延时作用DQ = 1;i++;i++;dat = DQ;i = 8;while( i > 0 )i--;return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数 */ /***************************************************/uchar DS18B20_ReadByte(void) //读1个字节数据函数{uchar i,j,dat;dat = 0;for( i = 1; i <= 8; i++ ){j = DS18B20_Readbit();dat = ( j << 7 ) | ( dat >> 1 );}return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数 *//***************************************************/void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{uint i;uchar j;bit testb;for( j=1; j<=8; j++){testb = dat&0x01;dat= dat>>1;if(testb) //写1{DQ = 0;i++;i++;DQ = 1;i = 8;while(i>0)i--;}else{DQ = 0; //写0i = 8;while(i>0)i--;DQ = 1;i++;i++;}}}/***********************************************//* LCD函数:void LCD_WriteCom() *//* 功能:向LCD写入命令 *//***********************************************/void LCD_WriteCom(uchar com){rs = 0;P0 = com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) *//* 功能:向LCD写入数据 *//***********************************************/void LCD_WriteData(uchar dat){rs = 1; //选择LCD为写入数据状态lcden = 0;P0 = dat; //将待写入数据放到总线上delay(5);lcden = 1; //给LCD使能端一个脉冲delay(5); //信号将之前放到总线上lcden = 0; //的数据写入LCDdelay(5);}/***********************************************//* LCD函数:void LCD_Init() */ /* 功能:初始化LCD,设定LCD的初始状态 *//***********************************************/void LCD_Init(){LCD_WriteCom(0x38); //LCD显示模式设定delay(15);LCD_WriteCom(0x08); //关闭LCD显示delay(3);LCD_WriteCom(0x01); //LCD显示清屏delay(3);LCD_WriteCom(0x06); //设定光标地址指针为自动加1delay(3);LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//* */ /* 显示18B20序列号 *//* *//**********************************************/void Display18B20Rom(char Rom){uchar h,l;l = Rom & 0x0f; //取低4位h = Rom & 0xf0; //取高4位h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30); //取ASCII码elseLCD_WriteData(h+0x37); //取ASCII码if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30); //取ASCII码elseLCD_WriteData(l+0x37); //取ASCII码}。
DS18B20驱动程序(LPC213)
#define SetOut() IO0DIR|=0x04 //设置P0.2口为输出#define SetIn() IO0DIR&=~0x04 //设置P0.2口为输入//====================================================== // 函数名称: Delay()// 函数功能: 10微秒延时// 入口参数: time 延时的毫秒数// 出口参数:无//====================================================== void Delay(uint32 time){uint32 i;for(;time>0;time--)for(i=84;i>0;i--);}//====================================================== // 函数名称: Delay_1()// 函数功能: 1微秒延时// 入口参数: time 延时的毫秒数// 出口参数:无//====================================================== void Delay_1(uint32 time){uint32 i;for(;time>0;time--)for(i=6;i>=0;i--);}//====================================================== // 函数名称: void 18B20_Initial_IO(void)// 函数功能:端口初始化子程序// 入口参数:无// 出口参数:无//====================================================== void F_18B20_Initial_IO(void){PINSEL0&=~(3<<4); // 设置管脚P0.2连接GPIO// IO0DIR|=0x04; //设置P0.2口为输出}//====================================================== // 函数名称: uint8 18B20_Reset(void)// 函数功能:一线总线复位及从设备应答控制程序// 入口参数:无// 出口参数: 0表示复位失败 1表示复位成功uint8 F_18B20_Reset(){uint8 flag=0;SetOut();IO0SET=0x04;Delay(5); //延时50usIO0CLR = 0x04; //P0.2置低,初始化开始Delay(70); //延时700usIO0SET = 0x04; //拉高总线Delay(2); //延时20usSetIn();/*等待18B20发出存在脉冲--低电平*/Delay(3); //延时30usif((IO0PIN&0x04)==0){flag=1;}else{flag=0;}return flag;}//=================================================================== ==// 函数名称: uint8 DS18B20_Initial(void)// 函数功能: DS18B20初始化// 包括对端口的初始化,以及对DS18B20进行一次复位(总线)// 入口参数:无// 出口参数:初始化结果,返回0表示初始化失败//=================================================================== ==uint8 DS18B20_Initial(void){uint8 uiTemp=0;F_18B20_Initial_IO();uiTemp = F_18B20_Reset(); //一线总线复位及从设备应答控制return uiTemp;}// 函数名称: void F_18B20_Write_1(void)// 函数功能:向一线总线写1// 入口参数:无// 出口参数:无//======================================================void F_18B20_Write_1(){SetOut();/*先置高再置低,告诉18B20 写开始*/ IO0SET = 0x04; //P0.2置高Delay(120); //延时120usIO0CLR = 0x04; //P0.2置低Delay(1); //延时10usIO0SET = 0x04; //P0.2置高,写 1 开始Delay(6); //延时60usSetIn();Delay_1(5); //保证写2位数据的间隙大于 1 us }//======================================================// 函数名称: void F_18B20_Write_0(void)// 函数功能:向一线总线写0// 入口参数:无// 出口参数:无//======================================================void F_18B20_Write_0(){SetOut();/*先置高再置低,告诉18B20写开始*/IO0SET = 0x04; //P0.2置高Delay(120); //延时130usIO0CLR = 0x04; //P0.2置低,写 0 开始Delay(7); //延时70usIO0SET = 0x04; //P0.2置高,释放总线Delay_1(5); //保证写2位数据的间隙大于 1 usSetIn();}// 函数名称: uint8 F_18B20_Read_DQ(void)// 函数功能:读一位一线总线的数据// 入口参数:无// 出口参数:当前读回的位的值0/1//======================================================uint8 F_18B20_Read_DQ(){uint8 read_byte;SetOut();/*先置高再置低,告诉18B20 读开始*/IO0SET = 0x04; //P0.2置高Delay(2); //延时20usIO0CLR = 0x04; //P0.2置低Delay(1); //延时10usSetIn();Delay_1(5); //延时5usif(IO0PIN & 0x04)read_byte=0x80;elseread_byte=0;SetOut(); //设置P0.2口为输出IO0SET = 0x04; //P0.2置高,释放总线SetIn();return read_byte;}//=================================================================== ==// 函数名称: void DS18B20_WriteByte(uint8 Data)// 函数功能: DS18B20字节写入子程序// 入口参数: Data 要写入的数值// 出口参数:无//=================================================================== ==void DS18B20_WriteByte(uint8 Data){uint8 i;for(i=0;i<8;i++){if(Data&0x0001)F_18B20_Write_1();elseF_18B20_Write_0();Data = Data>>1;}}//=================================================================== ==// 函数名称: uint8 DS18B20_ReadByte(void)// 函数功能: DS18B20字节读出子程序// 入口参数:无// 出口参数:读出的字节数据//=================================================================== ==uint8 DS18B20_ReadByte(void){uint8 i,Data=0;for(i=0;i<8;i++){Data = Data>>1;Data = Data|F_18B20_Read_DQ();}return Data;}//=================================================================== ==// 函数名称: float DS18B20_ReadTemp(void)// 函数功能:启动一次DS18B20测温,并读取测温结果,以浮点数返回// 在本函数中,启动测温后在程序里面作了等待,以待测DS18B20// //完成本次测温转换如用户觉得不合适// 入口参数:无// 出口参数:测温值,浮点数以摄氏度为单位//=================================================================== ==float DS18B20_ReadTemp(void){float fTemp=0.0;uint16 t=0;if(F_18B20_Reset()) //如果一线总线复位及从设备应答控制成功则向下执行{DS18B20_WriteByte(0xcc); //跳过读序号列号的操作DS18B20_WriteByte(0x44); //启动温度转换Delay(50);F_18B20_Reset(); //一线总线复位及从设备应答控制DS18B20_WriteByte(0xcc); //跳过读序号列号的操作DS18B20_WriteByte(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=DS18B20_ReadByte();b=DS18B20_ReadByte();t=b;t<<=8;t=t|a;fTemp=t*0.0625;}return fTemp;}//=================================================================== ==// 语法格式: uint8 DS18B20_SetConfig(uint8 Config)// 实现功能:设置DS18B20中的config寄存器,可通过该寄存器的设置选择温// 度转换结果的有效位数// 参数: Config 要设置的值// 返回值:如返回0则表示设置失败//=================================================================== ==uint8 DS18B20_SetConfig(uint8 Config){uint8 uiTemp = 0;uint8 Data[2];if(F_18B20_Reset()) //如果一线总线复位及从设备应答控制成功则向下执行{DS18B20_WriteByte(0xcc); //跳过ROMDS18B20_WriteByte(0xbe); //读暂存存储器uiTemp = DS18B20_ReadByte();uiTemp = DS18B20_ReadByte();Data[0] = DS18B20_ReadByte();Data[1] = DS18B20_ReadByte();F_18B20_Reset();DS18B20_WriteByte(0xcc); //跳过ROMDS18B20_WriteByte(0x4e); //写暂存存储器DS18B20_WriteByte(Data[0]);DS18B20_WriteByte(Data[1]);DS18B20_WriteByte(Config);uiTemp = F_18B20_Reset();}return uiTemp;}//=================================================================== ==// 语法格式: unsigned int DS18B20_GetConfig(void)// 实现功能:获取DS18B20中的config寄存器的值// 参数:无// 返回值: Config 当中的值//=================================================================== ==uint8 DS18B20_GetConfig(void){uint8 uiTemp = 0;if(F_18B20_Reset()){DS18B20_WriteByte(0xcc); //Skip ROMDS18B20_WriteByte(0xbe); //Read Scratchadfor(uiTemp=0;uiTemp<5;uiTemp++)uiTemp = DS18B20_ReadByte();uiTemp = F_18B20_Reset();}return uiTemp;}。
51单片机Ds18b20温度传感器程序
* 实验名 : 18B20温度显示试验* 实验说明 : 数码管显示温度值,并且将温度值通过串口发送到电脑上。
* 连接方式 : 见连接图temp.h#ifndef __TEMP_H_#define __TEMP_H_#include<reg51.h>//---重定义关键词---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif//--定义使用的IO口--//sbit DSPORT=P3^7;//--声明全局函数--//void Delay1ms(uint );uchar Ds18b20Init();void Ds18b20WriteByte(uchar com);uchar Ds18b20ReadByte();void Ds18b20ChangTemp();void Ds18b20ReadTempCom();int Ds18b20ReadTemp();#endiftemp.c#include"temp.h"/******************************************************************************** 函数名: Delay1ms* 函数功能: 延时函数* 输入: 无* 输出: 无*******************************************************************************/void Delay1ms(uint y){uint x;for( ; y>0; y--){for(x=110; x>0; x--);}}/******************************************************************************** 函数名: Ds18b20Init* 函数功能: 初始化* 输入: 无* 输出: 初始化成功返回1,失败返回0*******************************************************************************/ uchar Ds18b20Init(){uchar i;DSPORT = 0;//将总线拉低480us~960usi = 70;while(i--);//延时642usDSPORT = 1;//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低i = 0;while(DSPORT)//等待DS18B20拉低总线{Delay1ms(1);i++;if(i>5)//等待>5MS{return 0;//初始化失败}}return 1;//初始化成功}/******************************************************************************** 函数名: Ds18b20WriteByte* 函数功能: 向18B20写入一个字节* 输入: com* 输出: 无*******************************************************************************/void Ds18b20WriteByte(uchar dat){uint i, j;for(j=0; j<8; j++){DSPORT = 0;//每写入一位数据之前先把总线拉低1usi++;DSPORT = dat & 0x01; //然后写入一个数据,从最低位开始i=6;while(i--); //延时68us,持续时间最少60usDSPORT = 1;//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值dat >>= 1;}}/******************************************************************************** 函数名: Ds18b20ReadByte* 函数功能: 读取一个字节* 输入: com* 输出: 无*******************************************************************************/ uchar Ds18b20ReadByte(){uchar byte, bi;uint i, j;for(j=8; j>0; j--){DSPORT = 0;//先将总线拉低1usi++;DSPORT = 1;//然后释放总线i++;i++;//延时6us等待数据稳定bi = DSPORT;//读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。
DS18B20驱动程序
DS18B20驱动程序作者: 嵌入式应用软件园目录第1章程序功能 (3)第2章程序代码 (4)第3章DS18B20简介 (11)3.1 DS18B20概述 (11)3.2 DS18B20的内部结构 (11)3.3 DS18B20温度传感器的存储器 (12)3.4 DS18B20使用中注意事项 (13)3.4 DS18B20常用命令详述 (14)DS18B20驱动程序DS18B20_MAIN,您可以直接在你的应用当中使用,直接返回温度的BCD码值。
BCD码值可以直接在数码管或LCD 上显示出来。
驱动程序中包含DS18B20温度传感器用到的全部函数。
如,DS18B20的复位函数(RESET_18B20)、写函数(WRITE_18B20)、读函数(READ_18B20),读出ROM中64的ID函数(READ_18B20ID),搜索DS18B20的ID函数(CHECK_18B20ID),警报搜索(ALARM_18B20ID)。
直接调用函数RE_TEMP,会返回当前的温度值。
再经过函数CONV_TEMP转换后,可以返回温度值的BCD码值。
我们的辛勤付出,需要您的肯定,请访问: 嵌入式应用软件园。
如需源代码/此代码技术支持,请访问: 嵌入式应用软件园。
第3章DS18B20简介3.1 DS18B20概述DS18B20 “一线总线”数字化温度传感器是DALLAS最新单线数字温度传感器,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,支持3V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
温度传感器DS18B20驱动程序
#include "ds18b20.h"之马矢奏春创作#include <intrins.h>#if 0/******************************************************** ********************FUNCTION NAME: InitDS18b20*CREATE DATE: /11/12*CREATED BY: XS*FUNCTION: 复位DS18B20和检测存在脉冲*MODIFY DATE: /11/12*INPUT: 无**RETURN: 初始化胜利, 返回1, 否则返回0********************************************************* ******************/BOOL InitDs18b20(void){BOOL flag = FALSE;BIT bt;bt = ET0;ET0 = 0;DQ = 1;Delay70us(1); //稍作延时DQ = 0; // 复位Delay70us(8); //精确延时年夜于480usDQ = 1; //拉高总线,等候存在脉冲Delay70us(1); // 6075us之间if(0==DQ){flag = TRUE;}Delay70us(8); // 复位后年夜于480us延时ET0 = bt;return flag;}/******************************************************** ********************FUNCTION NAME: ReadByte*CREATE DATE: /11/12*CREATED BY: XS*FUNCTION: 从DS18B20中读取一个字节的数据*MODIFY DATE: /11/12*INPUT: 无**RETURN: 读取的数据********************************************************* ******************/UCHAR ReadByte(void){UCHAR i;UCHAR dat = 0;BIT bt;bt = ET0;ET0 = 0;for (i=0;i<8;i++){dat >>= 1;DQ = 0;Delay5us();DQ = 1;Delay5us();if(1==DQ){dat |=0x80;}Delay70us(1);}ET0 = bt;return(dat);}/****************************************************************************FUNCTION NAME: WriteByte*CREATE DATE: /11/12*CREATED BY: XS*FUNCTION: 向DS18B20中写入一个字节的数据*MODIFY DATE: /11/12*INPUT: 写入的数据**RETURN: 无********************************************************* ******************/void WriteByte(UCHAR wDat){UCHAR i;BIT bt;bt = ET0;ET0 = 0;for (i=0; i<8; i++){DQ = 0;Delay5us();if((wDat & 0x01)!=0){DQ = 1;}else{DQ = 0;}Delay70us(1);DQ = 1;Delay5us();wDat >>= 1;}ET0 = bt;}/******************************************************** ********************FUNCTION NAME: ReadDs18b20*CREATE DATE: /11/12*CREATED BY: XS*FUNCTION: 从DS18B20贮存器中读取多字节数据*MODIFY DATE: /11/12*INPUT: 读取数据存入的地址和需要读取数据的数量**RETURN: 无********************************************************* ******************/void ReadScrat(UCHAR *prDat,UCHAR num){UCHAR i;for(i=0;i<num;i++){*prDat = ReadByte();prDat++;}}/******************************************************** ********************FUNCTION NAME: ReadTemp*CREATE DATE: /11/12*CREATED BY: XS*FUNCTION: 读取温度*MODIFY DATE: /11/12*INPUT: 读取的温度存入的地址**RETURN: 胜利返回1, 否则返回0********************************************************* ******************/BOOL ReadTemp(float *prTemperature){UCHAR counter = 0;UCHAR tempBuff[9];float tempDat = 0;ClrWDT();while(1){if(InitDs18b20()){counter = 0;break;}else{counter++;if(counter>=ERR_COUNTER) // 连续3次初始化失败, 即认为DS18B20呈现故障{return 0;}}}WriteByte(SKIP_ROM); // 跳过读序号列号的把持WriteByte(CONVERT_T); // 启动温度转换Delay70us(20); // 延时至少500us, 以供温度转换while(1){if(InitDs18b20()){counter = 0;break;}else{counter++;if(counter>=ERR_COUNTER)// 连续3次初始化失败, 即认为DS18B20呈现故障{return 0;}}}WriteByte(SKIP_ROM); //跳过读序号列号的把持WriteByte(READ_SCRAT); //读取温度寄存器等(共可读9个寄存器)ReadScrat(tempBuff, 9);if(0==CRC8(tempBuff,9)){if(0==(tempBuff[1]&0x80)) //为正温度{tempDat = (tempBuff[1]&0x07)*0x100 + tempBuff[0];}else{tempDat = ((0xFFtempBuff[1])&0x07)*0x100 + (0x100tempBuff[0]);tempDat = tempDat;}*prTemperature = tempDat * 0.0625;return TRUE;}return FALSE;}/******************************************************** ********************FUNCTION NAME: GetDS18B20Temperature*CREATE DATE: /8/17*CREATED BY: XS*FUNCTION: 采样3次求均值作为温度值*MODIFY DATE: /8/17*INPUT: 温度贮存的地址**RETURN: 正常为1, 故障为0********************************************************* ******************/BOOL GetDS18B20Temperature(float *pgTemperature){UCHAR i;UCHAR counter = 0;float tempDat = 0;float tempVal = 0;for(i=0;i<3;){if(ReadTemp(&tempDat)){tempVal += tempDat;counter = 0;i++;}else{counter++;if(counter>=ERR_COUNTER) //连续10次温度采样毛病, 则判断为故障, 并返回{return FALSE;}}}*pgTemperature = tempVal / 3;// SendStr("boxTemp:");// print(*pgTemperature ,1);// SendChar('\n');return TRUE;}/******************************************************** ********************FUNCTION NAME: CRC8*CREATE DATE: /8/17*CREATED BY: XS*FUNCTION: CRC效验*MODIFY DATE: /8/17*INPUT: 需要效验的数据地址和个数**RETURN: 效验结果***************************************************************************/UCHAR CRC8(UCHAR *point,UCHAR CRClen) //效验胜利则crc返回0{UCHAR i,j,crc_8,crcbuff;crc_8 = 0;for(i=0; i<CRClen; i++){crcbuff=*point++;for(j=0;j<8; j++){if(((crc_8 ^ crcbuff)&0x01)==0){crc_8 >>= 1;}else{crc_8 ^= 0x18;crc_8 >>= 1;crc_8 |= 0x80;}crcbuff >>= 1;}}return crc_8;}/******************************************************** ********************FUNCTION NAME: Delay5us*CREATE DATE: /8/17*CREATED BY: XS*FUNCTION: 延时5us*MODIFY DATE: /8/17*INPUT: 无**RETURN: 无********************************************************* ******************/void Delay5us(void){// UCHAR i;// for(i=0;i<7;i++);_nop_();_nop_();}#endif/******************************************************** ********************FUNCTION NAME: Delay70us*CREATE DATE: /8/17*CREATED BY: XS*FUNCTION: 延时70us*MODIFY DATE: /8/17*INPUT: 次数**RETURN: 无********************************************************* ******************/void Delay70us(UCHAR timers){UCHAR i,j;for(j=0;j<timers;j++){for(i=0;i<22;i++){// Delay5us();_nop_();_nop_();_nop_();}}}。
DS18B20温度传感器详解带c程序
00A2H
+0.5
0000 0000 0000 000
0000H
-0.5
1111 1111 1111 1000
FFF8H
-10.125
1111 1111 0110 1110
FF5EH
-25.0625
1111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
duan=1; switch(i) {
case 0: if(zf==0) P1=numfh[zf];
else if(bai!=0) P1=numd[bai]; else if(shi!=0) P1=numd[shi]; else P1=numdg[ge]; break;
case 1: if(zf==0&&shi!=0) P1=numd[shi];
表 3.2 DS18B20 温度/数字对应关系表
温度(℃)
输出的二进制码
对应的十六进制码
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
uchar x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); } /******************15us 延时函数****************/ void delay(uint z) {
while(z--); } /******************初始化 DS18B20 函数****************/ void reset_ds18b20() {
ds18b20驱动程序
/*包含了这么多的头文件,也不知道有的有没有用*/#include<linux/platform_device.h>#include<linux/delay.h>#include<linux/fs.h>#include<linux/module.h>#include<linux/kernel.h>#include<linux/uaccess.h>#include<linux/clk.h>#include<asm-arm/arch-s3c2410/regs-gpio.h>#include<asm/io.h>#include<asm/arch/map.h>#include<asm-arm/plat-s3c24xx/clock.h>#include<asm/arch/regs-clock.h>/*和引脚相关的宏定义*/#define DQ S3C2410_GPH9#define CFG_IN S3C2410_GPH9_INP#define CFG_OUT S3C2410_GPH9_OUTPstatic int opencount = 0;unsigned char init_ds(void)//ds18b20复位,返回0成功,返回1失败{unsigned char ret = 0;s3c2410_gpio_cfgpin(DQ, CFG_OUT);s3c2410_gpio_pullup(DQ, 0);s3c2410_gpio_setpin(DQ, 1);s3c2410_gpio_setpin(DQ, 0);udelay(500);s3c2410_gpio_setpin(DQ, 1);udelay(50);s3c2410_gpio_cfgpin(DQ, CFG_IN);udelay(200);ret = s3c2410_gpio_getpin(DQ);s3c2410_gpio_cfgpin(DQ, CFG_OUT);s3c2410_gpio_pullup(DQ, 0);s3c2410_gpio_setpin(DQ, 1);return ret;}void write_byte(char data)//向18b20写一个字节{char i = 0;s3c2410_gpio_cfgpin(DQ, CFG_OUT);s3c2410_gpio_pullup(DQ, 1);for(i=0; i<8; i++){s3c2410_gpio_setpin(DQ, 0);udelay(10);s3c2410_gpio_setpin(DQ, 1);s3c2410_gpio_setpin(DQ, data&0x01);udelay(60);s3c2410_gpio_setpin(DQ, 1);udelay(2);data >>= 1;}}unsigned char read_byte(void)//从18b20读一个字节{unsigned char i;unsigned char data=0;s3c2410_gpio_cfgpin(DQ, CFG_OUT);s3c2410_gpio_pullup(DQ, 0);for(i=0; i<8; i++){s3c2410_gpio_setpin(DQ, 0);udelay(1);s3c2410_gpio_setpin(DQ, 1);s3c2410_gpio_cfgpin(DQ, CFG_IN);udelay(10);data >>= 1;if(s3c2410_gpio_getpin(DQ))data |= 0x80;udelay(50);s3c2410_gpio_cfgpin(DQ, CFG_OUT);s3c2410_gpio_pullup(DQ, 0);s3c2410_gpio_setpin(DQ, 1);udelay(2);}return data;}/*文件的写函数,没有实际意义,用户不能写文件*/static ssize_t ds18b20_write(struct file*filp,const char*buffer, size_t count, loff_t *ppos){return 10;//随便返回一个正整数}/*18b20的读函数,读出的温度只保留了整数*/static ssize_t ds18b20_read(struct file*filp,char*buffer,size_t count, loff_t *ppos){unsigned char a=0, b=0;unsigned int t=0;unsigned char temp=0;unsigned char flag;flag = init_ds();if(flag&0x01)return-1;write_byte(0x0cc);write_byte(0x44);udelay(500);flag = init_ds();if(flag&0x01)return-1;write_byte(0x0cc);write_byte(0x0be);a = read_byte();b = read_byte();flag = init_ds();temp = ((b & 0x7) << 4)) | (a >> 4);copy_to_user(buffer,&temp, 1);return 1;}static int ds18b20_open(struct inode *node,struct file*file) {unsigned char flag;if(opencount == 1)return-EBUSY;flag = init_ds();if(flag&0x01){printk("uable to open device!/n");return-1;}else{opencount++;printk("device opened!/n");return 0;}}static int ds18b20_release(struct inode *node,struct file*file) {opencount--;printk("device released!/n");return 0;}static struct file_operations ds18b20_fops ={.owner = THIS_MODULE,.write= ds18b20_write,.read= ds18b20_read,.release = ds18b20_release,.open= ds18b20_open,};static int ds18b20_probe(struct platform_device *pdev){int ret;s3c2410_gpio_cfgpin(DQ, CFG_OUT);s3c2410_gpio_setpin(DQ, 0);ret = register_chrdev(0,"ds18b20",&ds18b20_fops);if(!ret)printk("--------------Uable to register driver!-------------------/n");printk("Probe for ds18b20 finished!/n");return 0;}static struct platform_driver ds18b20 ={.probe = ds18b20_probe,.driver ={.name ="s3c2410-ds",.owner = THIS_MODULE,},};int __init ds18b20_init(void){printk("Initial driver for ds18b20....................../n");return platform_driver_register(&ds18b20);}void __exit ds18b20_exit(void){return platform_driver_unregister(&ds18b20);}module_init(ds18b20_init);module_exit(ds18b20_exit);MODULE_AUTHOR("********************"); MODULE_DESCRIPTION("DS18B20 driver for s3c2410"); MODULE_LICENSE("GPL");。
ds18b20驱动程序
/*******************************************************************
* 保存温度值的数组.依次存放正负标志,温度值十位,个位,和小数位 *
*******************************************************************/
return ReturnTemp ;
}
/******************************************************************************
* Function: void v_TemperatureUpdate_f( void ) *
v_Ds18b20Init_f() ; /复位DS18B20
v_Ds18b20Write_f( 0xcc ) ; //跳过ROM
v_Ds18b20Write_f( 0x44 ) ; //启动温度转换
v_Ds18b20Init_f() ;
* Function: uint8 v_Ds18b20Init_f( void ) *
* Description: 初始化DS18B20 *
* Return: 读取到的温度值 *
******************************************************************************/
* Description:读取当前的温度数据并转化存放在数组Temperature(只保留了一位小数) *
* Parameter: *
void v_Ds18b20Write_f( uint8 Cmd )
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;}}}。
51单片机驱动DS18B20温度传感器程序及心得
51单片机驱动DS18B20温度传感器程序及心得关于DS18B20温度传感器,在没有硬件设备的辅助下,写内部程序有些困难,因为看不到实际信号波形。
对于单片机,我。
渐渐的有些心灰意冷。
虽然掌握了1_WIRE总线,却少了很多喜悦,下雨了。
它是我的爱好,我付出了很多,可是我看不到实际的前景。
以我个人之力,要步入尖端芯片领域,很困难,在这里,采棉花是个普遍性的大问题,大型机械设备缺陷很多,如果以微控制芯片提高精度,我想效益会相当可观,可是技术瓶颈难以逾越。
硬件研发,失败了,所有投入赴之东流,成功了,回报丰厚。
现在,各行各业都处于饱和,没有成熟先进的技术,很难有立足之地,,,,,我开始重新审视我的选择。
艰难。
/*建立时间: 2013年5月2日;前言: 我用软件仿真,测算延时时间,效果不错,但是根据教程,复位时,先释放总线(wd高电平),然后主机拉低wd,持续时间为400--960微妙.后主机拉高wd,持续15-60微妙,后从机,会拉低电平持续时间是60--240微妙(此时表示复位成功),如果从机没有将总线拉低,则复位失败.然后,主机拉高电平60--240微妙.复位结束;可,实验证明,在,从机,拉低总线电平后,持续一定时间,从机还会将总线拉高!这是教程中的一个重大错误!temperature sensor reset module finishing time: 23:08:00(温度传感器复位模块完成时间 )temperature sensor 操作过程:1. reset DS18B20;2. 发出Skip ROM 命令(CCH); (跳跃ROM命令)3. 发出Convert T命令(44H); (温度转换命令)4. reset DS18B20;5. 发出Skip ROM命令(CCH);(跳跃ROM命令)6. 发出读取命令(BEH);7. 读出两个字节的温度;8. 温度格式转换;2013年5月8日22:56:44DS18B20 Temperature sensor read data module accomplish;(温度传感器读数据模块完成)现在还有温度显示模块没有完成,硬件是1602液晶屏......2013年5月9日19:32:31今天,温度传感器的程序主体结构全部完成!!!!! 不容易啊,值得庆祝一下!!!!!!一共写了7天程序!{陆陆续续};喝个品酸乳果汁.......*/#include ;typedef unsigned char uint8 ;typedef unsigned int uint16;sbit wd = P3^2; //定义数据单总线;sbit e =P1^5; // 定义1602液晶显示器数据使能端口; sbit rs=P1^0; // 定义数据/指令选择端口;sbit rw=P1^1; // 定义读/写选择端口;sbit BF=P0^7; // 定义繁忙位;bit w=0; //定义一个全局一位变量;//===========1602液晶显示器模块;=============== busy() //液晶屏繁忙检测函数;{ e=0;rs=0;rw=0;P0=0xff;do{ e=0;//使能位清零;rs=0;//指令;rw=1;//读;e=1;//数据传输启动;}while(BF); //如果BF==0;则液晶处于空闲状态; e=0;}play_data(uint8 wr) //液晶写入数据;{busy();//繁忙检测;P0=wr;//装载数据;rs=1;//数据;rw=0;//写入;e=1;//传输开始;e=0;//传输结束;}play_cmd(uint8 cmd) //液晶写入指令; {busy(); //繁忙检测;P0=cmd; //装载数据;rs=0;//指令;rw=0;//写入;e=1;//传输开始;e=0;//传输结束;}reset_1602()//1602液晶显示器初始化函数;play_cmd(0x38);play_cmd(0x0c);play_cmd(0x06);play_cmd(0x01);}//=========温度传感器延时模块============================// sbit led= P1^0;delay(uint8 num )//如果unm等于1;延时16.28微妙; {while(num--); //如果num大于一,则16.28+(num-1)*6.51.}delay2()//此函数延时3.26微秒;{uint8 j=0;j=9;}delay3()uint16 s=60000;while(s--);}reset_1820() //========复位温度传感器; ======== {while(wd){wd=1;delay(140);//拉高总线,延时大概921微妙左右;(延时值自定); wd=0;//总线由单片机拉低,下为延时函数,大概800微秒左右;delay(61); //1个此函数会延时400微妙左右;delay(61); //两个是800微妙左右;wd=1;//主机拉高总线,68微秒左右;delay(9);//延时68微妙左右if(wd==0)//如果wd是0就终止复位;(代表复位成功);{while(wd==0);//总线一旦为低,那么就等待从机再将总线拉高. break;//终止while循环;(reset function end)}else{wd=1;delay(20);//延时140微妙;}}delay(30); //此时总线为高电平并延时205微妙,复位成功!;// if(wd)led=0;//此语句为检验是否复位成功;P1^0外接9012三极管接led小灯;}write_byte(uint8 dat){uint8 i=0;for(i=0;i;>;=1;delay(6); //A点到此处用时65.11微秒;wd=1;//总线释放;delay2(); //延时3.26微秒;}}//========此函数执行完成之后总线为高电平; uint8 read_byte() //=====读8位数据;==================={uint8 j=0, dat =0;for(j=0;j;>;=1;wd=0; // A点 mcu拉低电平3.26微秒;delay2();// 延时3.26微秒;wd=1;if(wd){dat|=0x80;}//读完数据后A点到此处是11.93微秒,保持在15微秒之内;delay(9);// A点到此处80.29微秒; 理想时间范围是60--120微秒;wd=1; //释放总线;delay2(); //延时3.26微秒;}return dat;}start_sensor()//启动传感器;{reset_1820();write_byte(0xcc); //跳跃命令;write_byte(0x44); //转换temperature(温度)命令; }uint8 read_temp()//从温度传感器度温度数据过程;{uint8 ak[2];uint16 dat=0 , j=0;reset_1820();//复位温度传感器write_byte(0xcc); //跳跃rom命令;write_byte(0xbe) ; // 发出读数据命令;ak[0]=read_byte(); //读取第一个字节数据;ak[1]=read_byte(); //读取第二个字节数据;dat=ak[1];//要把两个八位数据载入1个16位变量里;dat;>;11)==0x1f) //此语句是负温度进入.0x1f是二进制5个全1;{dat=(~dat)+1;//负温度要取反加一操作;dat/=16;//传感器给的温度系数要除以16后,得到的数才是常规温度系数;w=0;//此语句是在主函数中用来判断是正温度还是负温度;return dat; //向主函数返回数据,并终止函数; }j=dat;if((j>;>;11)==0)//如果是零则是正温度;{dat/=16;//数据直接除以16,就得到了常规温度系数;w=1;//1代表正;return dat; //向主函数返回数据,并终止函数;}return 130; //向主函数返回数据,并终止函数;}delay_ms() //延时1秒;{uint8 i=250;uint16 j=608;while(j--){ while(i--);i=250;}}error() //测温出错;{uint8 i=5, j=0 ,ak[]="Error!"; while(i--)play_cmd(0x82);while(ak[j]!='\0'){play_data(ak[j++]);} j=0;delay3();play_cmd(0x01);delay3();}}main(){uint8dat=0 ,j=3,len=0 ,num[]="start.....";reset_1602();while(j--)//这是启动电源时,液晶显示:start....(并闪烁3次){play_cmd(0x82);while(num[len]!='\0'){play_data(num[len++]);}len=0;delay3();play_cmd(0x01);delay3();}while(1){start_sensor();//启动温度传感器;delay_ms();//等待1秒;dat = read_temp(); //读取温度数据并赋给dat变量;if(dat==130)//如果返回来的数据是130,表明采集温度出错;{error();}else if(w==1) //如果w是1,就代表正温度.输出;{play_cmd(0x83);play_data(dat/10+'0');play_data(dat%10+'0');}else//否则,就是负温度,输出时前面加一个负号;{play_cmd(0x82);play_data('-');play_data(dat/10+'0');play_data(dat%10+'0');}} //我的亲娘四舅奶奶啊!!!!!!终于完成了!!!!2013年5月9日19:32:10}。
18b20.h温度传感器相关的程序
18b20.h主程序#include <REG52.H>#include <lcd12864.H>#include <ds18b20.H>#include <logo.H>#include <zb.H>#include <apple.H>sbit beep=P2^1;sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;uchar count,xx=13,alarmx,alarmx1=1,ff,fA; uchar max=31,min=55;uchar tt[5];void key();void init(){init_lcd();clrram_lcd();TMOD=0x01;TH0=0x4c;TL0=0x00;EA=0;ET0=1;TR0=1;}void show_logo(){uchar i,j;show_p(logo);mdelay(1000);for(i=0;i<128;i++){for(j=49;j<63;j++)disp_bit(i,j,2);}mdelay(1500);}void show_zb(){show_p(zb);gotoxy(1,7);wr_d_lcd(0xa1);wr_d_lcd(0xe6);}void about(){clrram_lcd();show_p(apple);mdelay(2000);show_p(logo);while(ff==9){key();}}void alarm(uchar nn){if((nn!=0) & alarmx1){fA=1;beep=~beep;gotoxy(1,2);if(beep){print(" ");}else{print("△");gotoxy(3,2);switch(nn){case 1 : print("高温告警");break;case 2 : print("失温告警");break;case 3 : print("传感器告警");break;}}}else if(fA){beep=1;gotoxy(1,2);print(" ");gotoxy(3,2);print(" ");fA=0;}}void temp_to_zb(void){uchar y,temp,i;temp=(temp_h<<5)|(temp_l>>3);if(temp<0x29)temp=0x29;else if (temp>0x55)temp=0x55;else{y=101-temp;if(y<max)alarmx=1;else if (y>min)alarmx=2;else if (alarmx!=3)alarmx=0;for(i=16;i<60;i++){disp_bit(xx,i,0);}disp_bit(xx,y,1);xx++;if(xx==124)xx=13;for(i=max;i<min;i+=alarmx1){disp_bit(xx,i,1);}}}void zb_to_sz(uchar zz){uchar tt0;if(tt0=(101-zz)&0x01)tt[4]=5+'0';elsett[4]='0';tt[3]='.';tt0=(101-zz)>>1;tt[2]=tt0%10+'0';tt[1]=tt0/10%10+'0';tt[0]=tt0/100;if(tt[0]==0)tt[0]=' ';tt[5]='\0';}void key(){if(key2==0){mdelay(10);if(key2==0){while(key2==0);switch(ff){case 0: gotoxy(2,1);print("Alarm: ");gotoxy(2,5);if(alarmx1==1) print("On");else print("Off");ff++;break;case 1: gotoxy(2,1);print("Set max");gotoxy(2,5);zb_to_sz(max);print(tt);ff++;break;case 2: gotoxy(2,1);print("Set min");gotoxy(2,5);zb_to_sz(min);print(tt);ff++;break;case 3: gotoxy(2,1);print("About ");ff++;break;case 4: gotoxy(2,1);print(" ");ff=0;break;case 9: ff=0;show_zb();xx=13;break;}}}if(key3==0){mdelay(10);if(key3==0){while(key3==0);switch(ff){case 0: break;case 1: gotoxy(2,5);if(alarmx1==1) {alarmx1=2; print("Off");}else {alarmx1=1; print("On ");}break;case 2: if(max>16){max--;gotoxy(2,5);zb_to_sz(max);print(tt);}break;case 3: if(min>16){min--;gotoxy(2,5);zb_to_sz(min);print(tt);}break;case 4: ff=9;about(); break;}}}if(key4==0){mdelay(10);if(key4==0){while(key4==0);switch(ff){case 0: break;case 1: gotoxy(2,5);if(alarmx1==1) {alarmx1=2; print("Off");}else {alarmx1=1; print("On ");}break;case 2: if(max<60){max++;gotoxy(2,5);zb_to_sz(max);print(tt);}break;case 3: if(min<60){min++;gotoxy(2,5);zb_to_sz(min);print(tt);}break;case 4: break;}}}}void disp_temp(){if(count==10){count=0;ReadTemp();temp_to_str();gotoxy(1,3);print(TempBuffer);temp_to_zb();alarm(alarmx);}}void check_ds18b20(){if(presence==1)alarmx=3;elsealarmx=0;}main(){init();show_logo();show_zb();EA=1;while(1){check_ds18b20();key();disp_temp();}}void timer0() interrupt 1 {TH0=0x4c;TL0=0x00;count++;if(count>10)count=0;}ds18b20.h温度传感器相关的程序//****************************************//ds18b20子程序模块//****************************************#define uint unsigned int#define uchar unsigned charsbit DQ = P2^7; //温度传送数据IO口uchar temp_value,temp1_value,temp_h,temp_l,presence; //temp_value温度值正数部分 temp1_value温度值小数部分uchar TempBuffer[8];/***********ds18b20延迟子函数(晶振12MHz )*******/void delay_18B20(unsigned int i){while(i--);}/**********ds18b20初始化函数**********************/Init_DS18B20(void){DQ = 1; //DQ复位delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(40); //精确延时大于 480usDQ = 1; //拉高总线delay_18B20(7);presence = DQ; //稍做延时后如果x=0则初始化成功 x=1则初始化失败delay_18B20(10);return(presence); //返回信号,0=presence,1= no presence}/***********ds18b20读一个字节**************/uchar ReadOneChar(void){uchar i=0;uchar dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(uchar dat){uchar i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat>>=1;}}/**************读取ds18b20当前温度************/void ReadTemp(void){uchar t;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(100); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(50);temp_l=ReadOneChar(); //读取温度值低位temp_h=ReadOneChar(); //读取温度值高位t=temp_h&0xf8;if(t){TempBuffer[0]=' ';TempBuffer[1]='-';temp_value=temp_h<<4;temp_value+=(temp_l & 0xf0)>>4;temp_value=~temp_value+1;temp1_value=~temp_l & 0x0f;}else{temp_value=temp_h<<4;temp_value+=(temp_l & 0xf0)>>4;temp1_value=temp_l & 0x0f;TempBuffer[0]=' ';TempBuffer[1]=temp_value/100+'0'; //百位if(TempBuffer[1]=='1'){TempBuffer[1]='1';}else{TempBuffer[1]=' ';}}}/**************温度数据转换成液晶字符显示************/ void temp_to_str(){TempBuffer[2]=temp_value%100/10+'0'; //十位TempBuffer[3]=temp_value%10+'0'; //个位TempBuffer[4]='.';TempBuffer[5]=temp1_value*625/1000%10+'0';TempBuffer[6]=temp1_value*625/100%10+'0';TempBuffer[7]=temp1_value*625/10%10+'0';//TempBuffer[8]=temp1_value*625%10+'0';TempBuffer[8]='\0';。