18b20--c程序

合集下载

基于51单片机的18B20温度计C程序

基于51单片机的18B20温度计C程序

本程序为本人用单片机80c51与18b20做实验时写的,其中有些是汉语拼音,便于咱们中国同胞们理解.仅供参考#include <reg52.h>#define uint unsigned int#define uchar unsigned charuchar tab[]="0123456789WD:C";sbit ds=P2^6;sbit rs=P3^4;sbit rw=P3^5;sbit en=P3^6;uchar s,g,shu;/***延时2tus***/yanshi(uchar t){while(--t){;}}/***延时tms** */delay(uint t){uchar a,b;for(a=t;a>0;a--)for(b=110;b>0;b--);}/***18B20初始化***/chushi(){ds=0;yanshi(250); //延时500usds=1;yanshi(2);}/***等待应答***/yingda(){while(ds);while(~ds);yanshi(2);}/***写一个字节***/w_dat(uchar dat){uchar i;for(i=0;i<8;i++){dat=dat>>1;ds=0;yanshi(8);ds=CY;yanshi(30);ds=1;}}/***读一个字节***/ uchar du_dat(){uchar i,dat;for(i=0;i<8;i++){ dat=dat>>1;ds=0;yanshi(1);ds=1;if(ds==1){dat=dat|0x80;}yanshi(30);}return dat;}/***启动温度转换***/ zhuanhuan(){chushi();yingda();delay(1);w_dat(0xcc);w_dat(0x44);}/***读取温度***/uchar du_wendu(){uchar a,b,dat;chushi();yingda();delay(1);w_dat(0xcc);w_dat(0xbe);a=du_dat(); //低位字节;b=du_dat(); //高位字节;dat=(b<<4)|(a>>4);return dat;}////////////////////////////// 1602液晶/////////////////////////////w_ml(uchar com){rs=0;P0=com;delay(5);en=1;delay(5);en=0;}chushihua(){rw=0;en=0;w_ml(0x38);w_ml(0x0c);w_ml(0x06);w_ml(0x01); }w_1602(uchar date){rs=1;P0=date;delay(5);en=1;delay(5);en=0;}xianshi(){w_ml(0x80);w_1602(tab[10]);w_1602(tab[11]);w_1602(tab[12]);w_1602(tab[s]);w_1602(tab[g]);w_1602(tab[13]);}/***************//** 主函数**//**************/main(){chushihua();while(1){delay(1);zhuanhuan();delay(10);shu=du_wendu();s=shu/10;g=shu%10;xianshi();}}。

温度传感器18B20驱动程序(C语言)

温度传感器18B20驱动程序(C语言)

温度传感器18B20驱动程序(C语言)我精心整理的一个温度传感器18B20的程序包,可直接调用这个程序适用于12MHz晶振的51单片机,默认为89C52系列,如果是89C51的话,把头文件改为#include "reg51.h"就可以了,下面是头文件和C文件,大家在工程里加入C文件,在主程序中加入头文件,直接调用read_temp();函数,就可以返回浮点型的温度值,为10进制,可以处理后直接用LCD或数码管显示,很方便,是我做温控的子程序。

/*************头文件******************/#include "reg52.h"#include "intrins.h" //_nop_();延时函数用#define uchar unsigned char#define uint unsigned intsbit DQ="P3"^4; //温度输入口ow_reset(void);//18B20复位void write_byte(uchar val);//写命令uchar read_byte(void);//读数据/***********读出温度函数**********输入:无输出:zs+xs,格式为123.4即为浮点型数的温度格式===================================*/float read_temp();/***************C文件**********************/#include "reg52.h"#include "18B20.h" //_nop_();延时函数用//*******温度小数部分用查表法**********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; /***********11微秒延时函数**********///void delay(uint t){for(;t>0;t--);}///***********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);}///***********读出温度函数**********输入:无输出:zs+xs,格式为123.4即为浮点型数的温度格式===================================*/ //float read_temp(){float zs,xs;//存放整数和小数uchar temp_data[2];//读出温度暂存EA=0;//禁止中断,防止读错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); // 发转换命令xs=ditab[temp_data[0]&0x0f];//小数位xs=xs/10;zs=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//整数位return (zs+xs);EA=1;//开中断}//结束当然,大家做数字温度计的话直接使用这个程序就可以了,但是如果要做多点温控的话,大家还要自己写查找序列号的程序!加油!/************************************************************ *18B20驱动程序,DQ为数据口,接于P2.1*11.0592M晶振,上拉4.7k电阻*Author:fyb*2005-3-25 11:23,OK!*************************************************************/ #i nclude<reg51.h>#i nclude<intrins.h>#define uchar unsigned char#define uint unsigned intsbit dq = P1^7;bit flag;uint Temperature;uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节uchar id_buff[8];uchar *p;uchar crc_data;uchar code CrcTable [256]={0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62 , 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 12 8, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29 , 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210,48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 2 05,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 2 38,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 1 45, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 2 44, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 2 15, 137, 107, 53};///************************************************************ *Function:延时处理*parameter:*Return:*Modify:*************************************************************/ void TempDelay (uchar us){while(us--);}/************************************************************ *Function:18B20初始化*parameter:*Return:*Modify:*************************************************************/ void Init18b20 (void){dq=1;_nop_();dq=0;TempDelay(86); //delay 530 uS//80_nop_();dq=1;TempDelay(14); //delay 100 uS//14_nop_();_nop_();_nop_();if(dq==0)flag = 1; //detect 1820 success!elseflag = 0; //detect 1820 fail!TempDelay(20); //20_nop_();_nop_();dq = 1;}/************************************************************ *Function:向18B20写入一个字节*parameter:*Return:*************************************************************/ void WriteByte (uchar wr) //单字节写入{uchar i;for (i=0;i<8;i++){dq = 0;_nop_();dq=wr&0x01;TempDelay(5); //delay 45 uS //5_nop_();_nop_();dq=1;wr >>= 1;}}/************************************************************ *Function:读18B20的一个字节*parameter:*Return:*Modify:*************************************************************/ uchar ReadByte (void) //读取单字节{uchar i,u=0;for(i=0;i<8;i++){dq = 0;u >>= 1;if(dq==1)u |= 0x80;TempDelay (4);_nop_();}return(u);}/************************************************************ *Function:读18B20*parameter:*Return:*Modify:*************************************************************/ void read_bytes (uchar j){uchar i;for(i=0;i<j;i++){*p = ReadByte();p++;}}/************************************************************ *Function:CRC校验*parameter:*Return:*Modify:*************************************************************/ uchar CRC (uchar j)uchar i,crc_data=0;for(i=0;i<j;i++) //查表校验crc_data = CrcTable[crc_data^temp_buff[i]];return (crc_data);}/************************************************************ *Function:读取温度*parameter:*Return:*Modify:*************************************************************/ void GemTemp (void){read_bytes (9);if (CRC(9)==0) //校验正确{Temperature = temp_buff[1]*0x100 + temp_buff[0];// Temperature *= 0.625;Temperature /= 16;TempDelay(1);}}/************************************************************ *Function:内部配置*parameter:*Return:*Modify:*************************************************************/ void Config18b20 (void) //重新配置报警限定值和分辨率Init18b20();WriteByte(0xcc); //skip romWriteByte(0x4e); //write scratchpadWriteByte(0x19); //上限WriteByte(0x1a); //下限WriteByte(0x7f); //set 11 bit (0.125)Init18b20();WriteByte(0xcc); //skip romWriteByte(0x48); //保存设定值Init18b20();WriteByte(0xcc); //skip romWriteByte(0xb8); //回调设定值}/************************************************************ *Function:读18B20ID*parameter:*Return:*Modify:*************************************************************/ void ReadID (void)//读取器件 id{Init18b20();WriteByte(0x33); //read romread_bytes(8);}/************************************************************ *Function:18B20ID全处理*parameter:*Return:*Modify:*************************************************************/ void TemperatuerResult(void){p = id_buff;ReadID();Config18b20();Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;GemTemp();}。

18B20温度C语言程序

18B20温度C语言程序

#include "reg52.h"# include<absacc.h>#include <intrins.h>#define delay_3us _nop_();_nop_();_nop_() //延时3us宏定义sbit DQ=P1^2; //ds18b20的数据端口sbit DE=P3^3; //灯L2sbit DF=P2^2; //K0sbit DM=P2^3; //K1sbit DN=P3^5; //灯L3# define PORTA XBYTE[0X7CFF]# define PORTB XBYTE[0X7DFF]# define PORTC XBYTE[0X7EFF]# define CONTROL XBYTE[0X7FFF]# define uchar unsigned char# define uint unsigned intsbit K0=P2^2;sbit K1=P2^3;sbit K2=P2^4;sbit K3=P2^5;uchar count=0;uchar idata temp[6]; //保存转换后的温度值uchar id[2][8];uchar code table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x080,0x00};//0-9,'.'消影uchar idata tm;bit flag=0;bit init_ds18b20(void){uchar j;DQ=1; //总线初始状态DQ=0; //启动总线j=250;while(--j); //延时500us ,初始化信号DQ=1; //释放总线,之后检测存在信号j=40;while(--j); //延时80usj=110; //检测低电平(存在信号),如220us 时间里检测不到则初始化失败返回0while(DQ!=0) //初始化失败{j--; //调整检测时间if(!j) //检测时间到return 0; //失败返回0}j=250; //延时500us,满足初始化时序while(--j);return 1; //返回1}bit rdbit_ds18b20(void){uchar j; //定义延时变量bit b; //返回变量暂存DQ=1;_nop_();DQ=0; //启动总线delay_3us;DQ=1; //释放总线delay_3us;delay_3us;delay_3us;if(DQ) //延时9US后采样b=1;elseb=0;j=30;while(--j); //延时满足时序return b; //返回采样值}uchar rdbyte_ds18b20(void){uchar i,dat;for(dat=0,i=0;i<8;i++){dat>>=1; //右移一位if(rdbit_ds18b20()) //如果读取的为1dat|=0x80; //则置位最高位}return dat; //返回接收数据}void wtbyte_ds18b20(uchar wdat){uchar i,j;for (i=0;i<8;i++){if(wdat&0x01) //如果最低位为1{ //则输出1DQ=1;_nop_();DQ=0; //启动总线delay_3us;DQ=1; //写1j=30;while(--j); //等待60us满足写时序}else //如果最低位为0{DQ=1;_nop_();DQ=0; //启动总线j=35;while(--j); //保持70us低电平,写0 满足时序要求DQ=1; //释放总线}wdat>>=1; //wdat右移一位,等待接收下一位}}void convter_t(uchar uct_l,uchar uct_h){uchar tm_dot; //存放小数部分tm_dot=(uct_l>>2)&0x03; //四位二进制小数部分只保留高两位uct_h=(uct_h<<4)&0xf0; //将高位数据左移到最高四位tm=uct_h|((uct_l>>4)&0x0f);//底四位右移到低四位,同高四位合并成一个字节temp[0]=tm/100; //tm除100取整数部分;得百位数据temp[1]=(tm-temp[0]*100)/10; //tm取十位一下数据除10取整数部分;得十位数据temp[2]=tm%10; //tm对10取余的个位数据temp[3]=10; //小数点位赋值10。

单片机中使用DS18B20温度传感器C语言程序文件

单片机中使用DS18B20温度传感器C语言程序文件

单片机中使用DS18B20温度传感器C语言程序(参考1)/********************************************************************************DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){while(us--);}void delay(uint count) //延时子函数{uint i;while(count){i=200;while(i>0)i--;count--;}}/*串口初始化,波特率9600,方式1 */void init_com(){TMOD=0x20; //设置定时器1为模式2 TH1=0xfd; //装初值设定波特率TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示*/void display(uint temp){uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存P0=0xfe;wela=1;wela=0;delay(1); //延时约2ms P0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);}/*****************************************时序:初始化时序、读时序、写时序。

18B20温度显示 c语言程序

18B20温度显示  c语言程序
while(1)
{
tempchange();//温度转换函数
for(i=10;i>0;i--)
{
dis_temp(get_temp());//获取温度并显示
}
deal(temp);//进行温度处理
sprintf(buff,"%f",f_temp);//将浮点温度格式转化为字符型
for(i=10;i>0;i--)
uint temp;//定义整型温度数据
float f_temp ; //定义温度型温度数据
uint warn_l1=270;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;
sbit led1=P1^0;//发光二极管控制
sbit led2=P1^1;
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出数据最低位在最前面,这样刚好在一个字节的dat里
}
return(dat);
}
void tempwritebyte(uchar dat)//向DS18B20里写一个字节的数据函数
{
warn(10,0x0c);//第三个和第四个灯亮,蜂鸣器发出“嘀”声
}
else//在27到30度之间只调用显示函数延时
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
void init_com(void)

单片机DS18B20温度计C语言程序

单片机DS18B20温度计C语言程序

{ dsInit(); //初始化 DS18B20, 无论什幺命令, 首先都要发起初始化 dsWait(); //等待 DS18B20 应答 delay(1); //延时 1ms, 因为 DS18B20 会拉低 DQ 60~240us 作为应答信号 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom writeByte(0x44); //写入温度转换命令字 Convert T } //向 DS18B20 发送读取数据命令 void sendReadCmd() { dsInit(); dsWait(); delay(1);
单片机 DS18B20 温度计 C 语言程序
#include #include #include //要用到取绝对值函数 abs() //通过 DS18B20 测试当前环境温度, 并通过数码管显示当前温度值, 目前显 示范围: -55~ +125 度 sbit wela = P2; //数码管位选 sbit dula = P2; //数码管段选 sbit ds = P2 ; int tempValue; //0-F 数码管的编码(共阳极) unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
i = 8; while(i>0) i--; //延时约 64us, 符合写时隙不低于 60us 要求 } else //写 0, 将 DQ 拉低 60us~120us ds = 0; i = 8; while(i>0) i--; //拉低约 64us, 符号要求 ds = 1; i++; i++; //整个写 0 时隙过程已经超过 60us, 这里就不用像写 1 那样, 再延 时 64us 了 } } //向 DS18B20 发送温度转换命令 void sendChangeCmd()

多个ds18b20_c程序

多个ds18b20_c程序

bit ds_init() //复位并检测单线器件,返回0,否则死循环{bit flag;uchar i;DQ=0;i=210; while(i) i--; //delay(500); //>480DQ=1;i=16; while(i) i--; // delay(40); //15-60while(DQ);flag=DQ; //存在器件i=25; while(i) i--; // delay(60); //60-240while(~DQ);i=105; while(i) i--; // delay(420); //>(480-60)return flag;}void ds_writebyte(uchar b) //先读写最低位{uchar i,j,temp;for(i=0;i<8;i++){temp=b&0x01;b=b>>1;DQ=0;j=2; while(j) j--; // delay(2);//>1if(temp){DQ=1;j=25; while(j) j--; // delay(60);//>15}else{j=32;while(j) j--; // delay(80); //>60DQ=1;j=5; while(j) j--;//>1}}}bit ds_readbit(){bit j;uchar k;DQ=0; k=2;while(k) k--;//>1DQ=1;k=2;while(k) k--;j=DQ;k=25; while(k) k--; // delay(60); return j;}uchar ds_readbyte() //先读的为最低位{uchar i,j,b;b=0;for(i=0;i<8;i++){j=ds_readbit();b=(j<<i)|b;}return b;}uchar crctest(uchar *p){uchar crc,i,n,cbit,bit0,byte,r;crc=0;for(i=0;i<9;i++){byte=*p;for(n=0;n<8;n++){cbit=crc&0x01;bit0=byte&0x01;crc=crc>>1;r=cbit^bit0;if(r==1) crc=crc^0x8c;byte=byte>>1;}p++;} //crc==0 校正正确return crc;}void Get_wendu() //得到float型全局量wendu[number_18B20]{uchar code serial_number[4][8]={0x28,0x2e,0xe0,0xce,0x01,0x00,0x00,0xe6, //一号18b20ROM号0x28,0x13,0x2d,0x6c,0x01,0x00,0x00,0 x21, //二号0x28,0xea,0x07,0x6c,0x01,0x00,0x00,0 x80, //三号0x28,0x2a,0x0e,0x6c,0x01,0x00,0x00,0 xec};//四号//四个18b20的八字节序列号数据uchar scratch[9];//TL,TH,ThR,TlR,Con,Res,Res,Res,CRC;//温度高低字节,结构寄存器和卷积码字节uint T_18B20; //整型,合并存储温度数据uchar i,j,crc;char fuhao; //表示正负温度+1,-1;while(ds_init()); //返回1 则继续复位,直到检测到低电平的应答脉冲则向下执行ds_writebyte(0xcc);//SKIP ROM,不发送ROM命令则要发送跳过ROM命令(0xcc)ds_writebyte(0x44);//命令单总线上的所有器件开始转换delayms(10); //一般转换要750us,这里等待3ms足够for(j=0;j<number_18B20;j++) //读取转换后的四个温度{while(ds_init()); //返回1 则继续复位,直到检测到低电平的应答脉冲则向下执行ds_writebyte(0x55); //ROM匹配for(i=0;i<8;i++)ds_writebyte(serial_number[j][i]);//ROM匹配注意:发送序列号后,只有匹配的18B20才会对接下来的命令响应ds_writebyte(0xbe); // read scratchpad 命令for(i=0;i<9;i++){scratch[i]=ds_readbyte();}crc=crctest(scratch); //crc==0 校正正确////////////////////////T_18B20=0;T_18B20=scratch[1]; T_18B20=(T_18B20<<8)+scratch[0];fuhao=1;if(T_18B20>0xf000) //为负温度{T_18B20=~T_18B20+1;fuhao=-1;}wendu[j]=fuhao*T_18B20/16.0+T_18B20%16/16.0; //将温度高低字节变成floatif(crc!=0) wendu[j]=85.5;}}发表于 2008/4/16 20:59:28标签:无标签DS18B20温度采集通过串口送入电脑DS18B20温度采集通过串口送入电脑程序肯定还是把其它的驱动组合,呵呵,EDN51验证。

DS18B20温度传感器详解带c程序

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() {

温度传感器18B20的C语言程序设计

温度传感器18B20的C语言程序设计

#include<math.h>#include<INTRINS.H>code uchar tab[10]={48,49,50,51,52,53,54,55,56,57};/******************************************************************/ /* 定义端口*/ /******************************************************************/sbit DQ=P3^7;//ds18b20 端口sfr dataled=0x80;//显示数据端口/******************************************************************/ /* 全局变量*/ /******************************************************************/ uint temp=0;uchar str[7];/******************************************************************/ /* 函数声明*/ /******************************************************************/unsigned int ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay3(unsigned int i);void cewen(void);/******************************************************************/ /* 延时函数*/ /******************************************************************/ void delay3(unsigned int i)//延时函数{while(i--);}/******************************************************************/ /* 初始化*/ /******************************************************************/ void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay3(8); //稍做延时DQ = 0; //单片机将DQ拉低delay3(80); //精确延时大于480usDQ = 1; //拉高总线delay3(10);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay3(5);}/******************************************************************/ /* 读一个字节*/ /******************************************************************/ unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay3(5);}return(dat);}/******************************************************************//* 写一个字节*/ /******************************************************************/ void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay3(5);DQ = 1;dat>>=1;}delay3(5);}/******************************************************************//* 读取温度*/ /******************************************************************/ unsigned int ReadTemperature(void){unsigned char a=0;unsigned int b=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay3(200);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar(); //低位b=ReadOneChar(); //高位b<<=8;t=a+b;return(t);}void cewen(void){unsigned int TempH,TempL;temp=ReadTemperature();if(temp&0x8000){str[0]='-';//负号标志temp=~temp; // 取反加1temp +=1;}elsestr[0]=0x20;TempH=temp>>4;TempL=temp&0x0F;TempL=TempL*6/10;//小数近似处理str[6]='C'; //显示C符号str[4]='.';str[1]=0x20;//tab[TempH/100]; //百位温度str[2]=tab[(TempH%100)/10]; //十位温度str[3]=tab[(TempH%100)%10]; //个位温度,带小数点str[5]=tab[TempL];//定时读取当前温度}/*******************************温度显示函数*************************************/void temperature_screen(){unsigned char i,j;cewen();for(i=0,j=9;i<7;i++,j++)LCD_write_char(j,1,str[i]);}。

单片机DS18B20温度传感器C语言程序含CRC校验

单片机DS18B20温度传感器C语言程序含CRC校验

单片机中使用DS18B20温度传感器C语言程序(参考1)/******************************************************************************** DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接 P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为 int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){ while(us--); }void delay(uint count) //延时子函数{ uint i;while(count){ i=200;while(i>0)i--;count--; } }/*串口初始化,波特率9600,方式1 */void init_com(){ TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示 */void display(uint temp){ uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1); }/*****************************************时序:初始化时序、读时序、写时序。

温度传感器18B20驱动程序(C语言)

温度传感器18B20驱动程序(C语言)

//1楼主:温度传感器18B20驱动程序(C语言)/*************************************************************18B20驱动程序,DQ为数据口,接于P2.1*11.0592M晶振,上拉4.7k电阻*************************************************************/#define uchar unsigned char#define uint unsigned intsbit dq = P1^7;bit flag;uint Temperature;uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节uchar id_buff[8];uchar *p;uchar crc_data;uchar code CrcTable [256]={0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176,238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};///*************************************************************Function:延时处理*parameter:*Return:*Modify:*************************************************************/void TempDelay (uchar us){while(us--);}/*************************************************************Function:18B20初始化*parameter:*Return:*Modify:*************************************************************/void Init18b20 (void){dq=1;_nop_();dq=0;TempDelay(86); //delay 530 uS//80_nop_();dq=1;TempDelay(14); //delay 100 uS//14_nop_();_nop_();_nop_();if(dq==0)flag = 1; //detect 1820 success!elseflag = 0; //detect 1820 fail!TempDelay(20); //20_nop_();_nop_();dq = 1;}/************************************************************ *Function:向18B20写入一个字节*parameter:*Return:*Modify:*************************************************************/ void WriteByte (uchar wr) //单字节写入{uchar i;for (i=0;i<8;i++){dq = 0;_nop_();dq=wr&0x01;TempDelay(5); //delay 45 uS //5_nop_();_nop_();dq=1;wr >>= 1;}}/************************************************************ *Function:读18B20的一个字节*parameter:*Return:*Modify:*************************************************************/ uchar ReadByte (void) //读取单字节{uchar i,u=0;for(i=0;i<8;i++){dq = 0;u >>= 1;dq = 1;if(dq==1)u |= 0x80;TempDelay (4);_nop_();}return(u);}/************************************************************ *Function:读18B20*parameter:*Return:*Modify:*************************************************************/ void read_bytes (uchar j){uchar i;for(i=0;i {*p = ReadByte();p++;}}/************************************************************ *Function:CRC校验*parameter:*Return:*Modify:*************************************************************/ uchar CRC (uchar j){uchar i,crc_data=0;for(i=0;i crc_data = CrcTable[crc_data^temp_buff[i]]; return (crc_data);}/************************************************************ *Function:读取温度*parameter:*Return:*Modify:*************************************************************/ void GemTemp (void){read_bytes (9);if (CRC(9)==0) //校验正确{Temperature = temp_buff[1]*0x100 + temp_buff[0];// Temperature *= 0.625;Temperature /= 16;TempDelay(1);}}/************************************************************ *Function:内部配置*parameter:*Return:*Modify:*************************************************************/ void Config18b20 (void) //重新配置报警限定值和分辨率{Init18b20();WriteByte(0xcc); //skip romWriteByte(0x4e); //write scratchpadWriteByte(0x19); //上限WriteByte(0x1a); //下限WriteByte(0x7f); //set 11 bit (0.125)Init18b20();WriteByte(0xcc); //skip romWriteByte(0x48); //保存设定值Init18b20();WriteByte(0xcc); //skip romWriteByte(0xb8); //回调设定值}/************************************************************ *Function:读18B20ID*parameter:*Return:*Modify:*************************************************************/ void ReadID (void)//读取器件 id{Init18b20();WriteByte(0x33); //read romread_bytes(8);}/************************************************************ *Function:18B20ID全处理*parameter:*Return:*Modify:*************************************************************/ void TemperatuerResult(void){p = id_buff;ReadID();Config18b20();Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;GemTemp();}/*急什么?急着买吗?还是要程序?我给你提供一段吧!也是网友写的。

18B20温度检测程序--cgzhello

18B20温度检测程序--cgzhello

#include<stdio.h>#include <REG52.H>#define uchar unsigned char#define uint unsigned intsbit LE3=P2^7;sbit LE2=P2^6;sbit LE1=P2^5;sbit DQ=P2^3; //数据传输线接单片机的相应的引脚uchar tempvalue;uint tempjingdu;/*******************************共阳LED段码表*******************************/ unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay_18B20(unsigned int i){while(i--);}void delay(uint dat){uint i,j;for(i=dat;i>0;i--)for(j=110;j>0;j--);}void Init_DS18B20(void){bit x=0;DQ = 1; //DQ复位delay_18B20(3); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(4);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(40); //60us// return(x);}unsigned char ReadOneChar(void){uchar i=0;uchar j=0;uchar dat = 0;for (i=8;i>0;i--){dat>>=1;DQ=1;j++; //DQ拉高,延时2usj++;DQ = 0; // DQ拉低for(j=7;j>0;j--);//拉低延时15usDQ = 1; // DQ拉高for(j=7;j>0;j--);//拉高延时15usif(DQ)dat|=0x80;for(j=10;j>0;j--);//延时30us,还要算上上面循环时间,这里延时23us }return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(uchar dat){unsigned char i=0;uchar j;for(i=8;i>0;i--){DQ=0;for(j=7;j>0;j--);//拉低应延时15us,现为16.28usDQ=dat&0x01;for(j=20;j>0;j--);//应延时45us,现为44.48usDQ=1;dat>>=1;}}/*void initcom(){TMOD=0X20;TH1=0XFD;TL1=0XFD;SCON=0X50;TR1=1;TI=1;ET1=0;} *//**************读取ds18b20当前温度************/void ReadTemp(void){uchar aa=0;uchar bb=0;tempvalue=0x00;tempjingdu=0x00;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x4E); //写入"写暂存器"命令,修改TH和TL和分辩率配置寄存器WriteOneChar(100); //先写TH,再写TL,最后写配置寄存器WriteOneChar(0); //写入想设定的温度报警上限WriteOneChar(0x7f); //写入想设定的温度报警下限//写配置寄存器,格式为0 R1 R0 1,1 1 1 1delay_18B20(40); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay(35); // this message is wery important//(80)延时时间有些短Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度aa=ReadOneChar(); //读取温度值低位bb=ReadOneChar(); //tempjingdu=(aa&0x0f)*0.0625*10+0.5;//四舍五入取精度aa=(aa&0xf0)>>4; //运算符逻辑运算优先级不同,所以这里会分开计算tempvalue=(bb&0x07)*16+aa;}void display(){P1=table[tempvalue/10];LE1=1; //开锁存器delay(10);LE1=0; //关锁存器P1=0xff;P1=table[tempvalue%10];LE2=1;delay(10);LE2=0;P1=0xff;P1=table[tempjingdu];LE3=1;delay(10);}void main(){P2=0; //关所有锁存器while(1){ReadTemp();display();}}。

一片DS18B20构成测温系统C程序

一片DS18B20构成测温系统C程序

一片DS18B20构成测温系统C程序2008-10-2 14:20:00点击:41用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+100度之间,用8位数码管显示出来。

#i nclude <AT89X52.H>#i nclude <INTRINS.h>unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0 x00,0x40};unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,25,28,31,34,38,41,44,48,50,53,56,59,63,66,69,72,75,78,81,84,88,91,94,97};unsigned char displaycount;unsigned char displaybuf[8]={16,16,16,16,16,16,16,16};unsigned char timecount;unsigned char readdata[8];sbit DQ=P3^7;bit sflag;bit resetpulse(void){unsigned char i;DQ=0;for(i=255;i>0;i--);DQ=1;for(i=60;i>0;i--);return(DQ);for(i=200;i>0;i--);}void writecommandtods18b20(unsigned char command) {unsigned char i;unsigned char j;for(i=0;i<8;i++){if((command & 0x01)==0){DQ=0;for(j=35;j>0;j--);DQ=1;}else{DQ=0;for(j=2;j>0;j--);DQ=1;for(j=33;j>0;j--);}command=_cror_(command,1);}}unsigned char readdatafromds18b20(void) {unsigned char i;unsigned char j;unsigned char temp;temp=0;for(i=0;i<8;i++){temp=_cror_(temp,1);DQ=0;_nop_();_nop_();DQ=1;for(j=10;j>0;j--);if(DQ==1){temp=temp | 0x80;}else{temp=temp | 0x00;}for(j=200;j>0;j--);}return(temp);}void main(void){TMOD=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;ET0=1;EA=1;while(resetpulse());writecommandtods18b20(0xcc); writecommandtods18b20(0x44); TR0=1;while(1){;}}void t0(void) interrupt 1 using 0 {unsigned char x;unsigned int result;TH0=(65536-4000)/256;TL0=(65536-4000)%256;if(displaycount==2){P0=displaycode[displaybuf[displaycount]] | 0x80;}else{P0=displaycode[displaybuf[displaycount]];}P2=displaybit[displaycount];displaycount++;if(displaycount==8){displaycount=0;}timecount++;if(timecount==150){timecount=0;while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0xbe);readdata[0]=readdatafromds18b20(); readdata[1]=readdatafromds18b20(); for(x=0;x<8;x++){displaybuf[x]=16;}sflag=0;if((readdata[1] & 0xf8)!=0x00) {sflag=1;readdata[1]=~readdata[1];readdata[0]=~readdata[0];result=readdata[0]+1;readdata[0]=result;if(result>255){readdata[1]++;}}readdata[1]=readdata[1]<<4;readdata[1]=readdata[1] & 0x70; x=readdata[0];x=x>>4;x=x & 0x0f;readdata[1]=readdata[1] | x;x=2;result=readdata[1];。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
delay_18B20(3); // wait for presence18b20 36us
presence = DQ; // get presence signal // 0= DS18B20 ready, 1= busy
//if(!presence)P1_0=0;
P0=0xdf;
wela=0;
delay_led(1);//延时1秒
P0=0xdf;
dula=1;
P0=table[wei_2];
dula=0;
wela=1;
P0=0xef;
wela=0;
delay_led(1);
dula=1;
}
//以下是读取器件序列号的子程序,需要读取序列时可在程序中调用;
//调用时确保总线中只有一只器件,若有多个器件时则读取出来的号码无效;
//将读取出来的序列号填到前面的数组中即可使用;
//平时可以将此子程序删除以节约空间。
//////////////////////////读取器件序列号子程序////////////////////////////
wei_4=aa/100%1000%100%10;
wei_5=aa/10%10000%1000%100%10;
wei_6=aa/1%100000%10000%1000%100%10;
}
/******延时函数*********/
void delay_led(uint z)
// c d e f .
void display(
//uchar ,uchar ,uchar ,
uchar ,uchar ,uchar );
void delay_led(uint z);
void init_led();
void zhuanhuan();
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******led初始化函数******/
void init_led()
{
ห้องสมุดไป่ตู้ela=0;
dula=0; //一般位选和段选开始时要清零
}
/********显示函数*********/
delay_18B20(50);
tmstart();
delay_18B20(50); /*等待转换结束*/
zhuanhuan();
display(
//wei_1,wei_2,wei_3,
wei_4,wei_5,wei_6);
value>>=1;
DQ = 0; // pull DQ low to start timeslot
_nop_();_nop_();_nop_();_nop_();
DQ = 1; // then return high
/*******主函数**********/
void main()
{
init_led();//初始化子程序
tmstart ();
delay_18B20(50); /*等待转换结束*/
while(1)
{
Read_Temperature();
sbit DQ=P2^0; //数据线
sbit FM=P2^3; //控制蜂鸣器
void ReadSerialNumber(void);
uchar sn1,sn2,sn3,sn4,sn5,sn6,sn7,sn8; //存放DS18B20的64位序列号
void ow_reset(void);
void ReadSerialNumber(void)
{
ow_reset(); //复位
delay_18B20(1); //延时
write_byte(0x33); //发送读序列号子程序
void display(
//uchar wei_1,uchar wei_2,uchar wei_3,
uchar wei_4,uchar wei_5,uchar wei_6)
{
/* dula=1;
P0=table[wei_1];
dula=0;
wela=1;
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uint aa;
uchar wei_1,wei_2,wei_3,v,wei_4,wei_5,wei_6;
uint shuju;//得到的温度值
uchar temp[2]={0,0}; //存放DS18B20的温度寄存器值
uint value = 0;
sbit FWD=P1^1; //负温度显示指示
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
// 0 1 2 3
0x66,0x6d,0x7d,0x07,
// 4 5 6 7
0x7f,0x6f,0x77,0x7c,
// 8 9 a b
0x39,0x5e,0x79,0x71,0x80};
FWD=0; /*表示温度为负数*/
}
else
{
temple=i;
FWD=1; /*表示温度为正数*/
}
//temple=temp[1]*0x100+temp[0];
shuju=temple*10/16;
P0=table[wei_3];
dula=0;
wela=1;
P0=0xf7;
wela=0;
delay_led(1); */
dula=1;
P0=table[wei_4];
dula=0;
wela=1;
P0=0xfb;
wela=0;
void tmstart (void);
void ReadSerialNumber(void);
void Read_Temperature(void);
void write_byte(char);
uint read_byte(void);
void delay_18B20(uint);
void baojing();
{
uchar presence;
DQ = 0; //pull DQ line low
delay_18B20(44); //至少480微秒, leave it low for 501us
DQ = 1; // allow line to return high?
delay_led(1);
dula=1;
P0=table[wei_5]+0x80; //小数点显示+80H即可
dula=0;
wela=1;
P0=0xfd;
wela=0;
delay_led(1);
dula=1;
P0=table[wei_6];
i=temp[1];
i<<=8; /*把b放到高八位上去*/
i|=temp[0]; /*将a放到底八位上去*/
i&=0x07ff;
if( (temp[1]&0x08))
{
temple=~i+1; //如果为负温则去除其补码
k++;k++; //延时8us
temp[0]=read_byte(); //读取低字节
temp[1]=read_byte(); //读取高字节
//if(!(temp[0]&0x80)) /*当低位寄存器第八位为0时*/
// {}
delay_18B20(12); // wait for end of timeslot
}
//=========从总线上读取一个字节========
uint read_byte(void)
{
uchar i;
for (i=8;i>0;i--)
{
ow_reset();
k++; //延时4us
write_byte(0xCC); //Sk_nop_();ip ROM
k++; //延时4us
write_byte(0xBE); // read register
}
//===========向18B20写一个字节=================
void write_byte(char val)
{
uchar i,j;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
dula=0;
wela=1;
P0=0xfe;
wela=0;
delay_led(1);
}
//========18b20程序=================*/
void delay_18B20(uint seconds) //延时
{
for(;seconds>0;seconds--);
相关文档
最新文档