DS18B20温度传感器完整C程序

合集下载

DS18B20数字温度计C程序(能显示负温)

DS18B20数字温度计C程序(能显示负温)

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

温度传感器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();}。

DS18B20 c语言程序

DS18B20 c语言程序
从DS18B20读1字节数据
**************************************/
BYTE DS18B20_ReadByte()
{
BYTE i;
BYTE dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ = 0; //开始时间片
DelayXus(1); //延时等待
DQ = 1; //准备接收
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(BYTE dat)
{
char i;
for (i=0; i<8; i++) //8位计数器
**************************************/
void DelayXus(BYTE n)
{
while (n--)
{
_nop_();
_nop_();
}
}
/**************************************
void main()
{
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
while (!DQ); //等待转换完成

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语言版)函数以及头文件
delay(5); DQ=1; dat>>=1; } delay(4); }
//读温度值(低位放 tempL;高位放 tempH;) float ReadTemperature(void)
{
float sdate;
unsigned char tempL,tempH;
unsigned int tt;
//*********************** **写一个字节**************************// void WriteOneChar(unsigned char dat);
//读温度值(低位放 tempL;高位放 tempH;) float ReadTemperature(void) ; #endif
if(tempH>0x7f)
//最高位为 1 时温度是负
{ tempL=~tempL;
//补码转换,取反加一
tempH=~tempH+1;
fg=0;
//读取温度为负时 fg=0
}
tt=tempL+tempH*256;
sdate=tt*0.0625;
return sdate;
}
//头文件 #ifndef _ds18b20_h_ #define _ds18b20_h_
void delay(unsigned char i);
//***********************************************************
//
延时子程序
//************************************************************ void delay1ms();

DS18B20温度传感器设计原理图及c程序代码

DS18B20温度传感器设计原理图及c程序代码

/*******************代码部分**********************//*************** writer:shopping.w ******************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit DQ = P3^3;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;uchar code Temp_Disp_Title[]={"Current Temp : "};uchar Current_Temp_Display_Buffer[]={" TEMP: "};uchar code Temperature_Char[8] ={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};uchar code df_Table[]=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};uchar CurrentT = 0;uchar Temp_Value[]={0x00,0x00}; uchar Display_Digit[]={0,0,0,0};bit DS18B20_IS_OK = 1;void DelayXus(uint x){uchar i;while(x--){for(i=0;i<200;i++);}}bit LCD_Busy_Check(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN=0;return result;}void Write_LCD_Command(uchar cmd) {while(LCD_Busy_Check());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void Write_LCD_Data(uchar dat){while(LCD_Busy_Check());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void LCD_Initialise(){Write_LCD_Command(0x01);DelayXus(5);Write_LCD_Command(0x38);DelayXus(5);Write_LCD_Command(0x0c);DelayXus(5);Write_LCD_Command(0x06);DelayXus(5);}void Set_LCD_POS(uchar pos){Write_LCD_Command(pos|0x80); }void Delay(uint x){while(--x);}uchar Init_DS18B20(){uchar status;DQ = 1;Delay(8);DQ = 0;Delay(90);DQ = 1;Delay(8);DQ = 1;return status;}uchar ReadOneByte(){uchar i,dat=0;DQ = 1;_nop_();for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;_nop_();_nop_();if(DQ)dat |= 0X80;Delay(30);DQ = 1;}return dat;}void WriteOneByte(uchar dat) {uchar i;for(i=0;i<8;i++){DQ = 0;DQ = dat& 0x01;Delay(5);DQ = 1;dat >>= 1;}}void Read_Temperature(){if(Init_DS18B20()==1)DS18B20_IS_OK=0;else{WriteOneByte(0xcc);WriteOneByte(0x44);Init_DS18B20();WriteOneByte(0xcc);WriteOneByte(0xbe);Temp_Value[0] = ReadOneByte();Temp_Value[1] = ReadOneByte();DS18B20_IS_OK=1;}}void Display_Temperature(){uchar i;uchar t = 150, ng = 0;if((Temp_Value[1]&0xf8)==0xf8){Temp_Value[1] = ~Temp_Value[1];Temp_Value[0] = ~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng = 1;}Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);Display_Digit[3] = CurrentT/100;Display_Digit[2] = CurrentT%100/10;Display_Digit[1] = CurrentT%10;Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';Current_Temp_Display_Buffer[10] = '.';Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';if(Display_Digit[3] == 0)Current_Temp_Display_Buffer[7] = ' ';if(Display_Digit[2] == 0&&Display_Digit[3]==0)Current_Temp_Display_Buffer[8] = ' ';if(ng){if(Current_Temp_Display_Buffer[8] == ' ')Current_Temp_Display_Buffer[8] = '-';else if(Current_Temp_Display_Buffer[7] == ' ')Current_Temp_Display_Buffer[7] = '-';elseCurrent_Temp_Display_Buffer[6] = '-';}Set_LCD_POS(0x00);for(i=0;i<16;i++){Write_LCD_Data(Temp_Disp_Title[i]);}Set_LCD_POS(0x40);for(i=0;i<16;i++){Write_LCD_Data(Current_Temp_Display_Buffer[i]);}Set_LCD_POS(0x4d);Write_LCD_Data(0x00);Set_LCD_POS(0x4e);Write_LCD_Data('C');}void main(){LCD_Initialise();Read_Temperature();Delay(50000);Delay(50000);while(1){Read_Temperature();if(DS18B20_IS_OK)Display_Temperature();DelayXus(100);}}。

单片机中使用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);}/*****************************************时序:初始化时序、读时序、写时序。

数字温度传感器DS18B20的C语言源程序

数字温度传感器DS18B20的C语言源程序
P0=tab[disdata[3]];
delay(150);
P0=0xff;
P2=0xff;
}
void main(void)
{unsigned int temp;
while(1) //主循环
{ temp="ReadTemperature"();
t=b;
t<<=8; //值左移8位
//a=a>>4; //低位右移4位,舍弃小数部分
//t=b<<4; //高位左移4位,舍弃符号位
//t=t|a;
t=t|a; //合并高低位数值
if(t<0xfff)
}
//读取温度
ReadTemperature(void)
{
unsigned char a="0";
unsigned char b="0";
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作 发送指令0xcc
WriteOneChar(0x44); // 启动温度转换 发送指令0x44
void delay(unsigned char i)
{
while(i--);
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x="0";
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //ຫໍສະໝຸດ 片机将DQ拉低 Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作

应用DS18B20编写的C程序

应用DS18B20编写的C程序

#include<reg52.h>#include<stdio.h>#define uchar unsigned char#define uint unsigned intsbit ds=P2^2; //温度控制器sbit dula=P2^6; //段锁存器sbit wela=P2^7; //位锁存器sbit relay=P1^0; //继电器sbit key1=P3^4; //设置键sbit key2=P3^5; //加键sbit key3=P3^6; //减键sbit key4=P3^7; //确定键uint num=20; //初始温度值uint temp;float f_temp;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};void relaycontrol(uint actualtemp,uint settemp) //actualtemp 实际温度,settemp 设置温度{if(actualtemp>settemp) //实际温度>设置温度,继电器吸合{relay=1;}else if(actualtemp<(settemp-10)) //实际温度<设置温度,继电器松开{relay=0;}}void delay(uint zms) //延迟函数zms就是z毫秒{uint x,y;for(x=zms;x>0;x--)for(y=110;y>0;y--);}void dsreset() //温度传感器复位{uint i;ds=0; //将数据线拉为低电平0i=100; //对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间约为8.72us while(i>0)i--; //保持低电平约870us 资料要求480~960usds=1; //将数据线拉为高电平1i=4;while(i>0)i--; //保持高电平约35us,等待应答脉冲}bit tempreadbit() //温度传感器位读取{uint i;bit dat;ds=0; //将数据线拉为低电平0i++; //保持低电平约8us,资料要求至少保持1usds=1; //将数据线拉为高电平1i++;i++; //延时约16us, 资料要求至少延时15us以上dat=ds;i=8;while(i>0)i--; //延时约64us, 资料要求不低于60usreturn(dat);}uchar tempreadbyte() //温度传感器字节读取{uchar i,j,dat;dat=0;for(i=1;i<=8;i++) //分8次读出8位,首先读出一位给j,然后左移7位,再将dat右移一位,与左移后的j进行按位或后赋值给dat{j=tempreadbit();dat=(j<<7)|(dat>>1);}return(dat); //8次循环后读完一个字节}void tempwritebyte(uchar dat) //温度传感器写字节{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01; //将字节末位取出dat=dat>>1; //将字节数据右移一位,等待下次取出if(testb) //对位进行测试,如果为"1",写"1"{ds=0; //将数据线拉为低电平0i++;i++; //保持低电平约16us,资料要求保持15~60usds=1; //将数据线拉高i=8;while(i>0)i--; //延时约64us, 资料要求不低于60us }else //对位进行测试,如果为"0",写"0"{ds=0; //将数据线拉为低电平0i=8;while(i>0)i--; //延时约64us, 资料要求不低于60usds=1;i++;i++;}}}void tempchange() //温度转换{dsreset(); //复位初始化操作delay(1);tempwritebyte(0xcc); //跳过ROM指令tempwritebyte(0x44); //温度转换命令}uint gettemp(){uchar a,b;dsreset(); //复位初始化操作delay(1);tempwritebyte(0xcc); //跳过ROM指令tempwritebyte(0xbe); //读暂存器指令a=tempreadbyte(); //读一个字节b=tempreadbyte(); //再读一个字节temp=b;temp<<=8; //将第二个字节左移8位到头temp=temp|a; //将第一、二个字节合并在一起f_temp=temp*0.0625; //将温度转换为十进制temp=f_temp*10+0.5; //保留小数点后一位return(temp);}void display(uchar we,uchar du) //数码管显示{uchar i;dula=0;P0=table[du];dula=1;dula=0;wela=0;i=0xff;i=i&(~((0x01)<<(we))); //位选择P0=i;wela=1;wela=0;delay(1);}void displaytemp(uint t) //显示温度{uchar i;i=t/100;display(0,i);delay(2);i=t%100/10;display(1,i+10);delay(2);i=t%100%10;display(2,i);}void displayset(uchar num) //温度设置显示{uchar shi,ge;shi=num/10;ge=num%10;dula=1;P0=table[shi];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table[ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(5);}uint keyscan() //温度键盘设置{uint x=0,y=0;if(key1==0){delay(10);if(key1==0){x=~x;y=~y;while(!key1);}}while(y){if(key2==0){delay(10);if(key2==0){num++;if(num>=25)num=25;while(!key2);}}if(key3==0){delay(10);if(key3==0){num--;if(num<=15)num=15;while(!key3);}}if(key4==0){delay(10);if(key4==0){y=~y;while(!key4);}}displayset(num);}return(num*10);}void main(){dula=0;wela=0;while(1){keyscan();tempchange();displaytemp(gettemp());relaycontrol(gettemp(),keyscan());}}。

18B20温度传感器C语言编程实例

18B20温度传感器C语言编程实例

温度传感器C语言编程实例#include <reg52.h>#include<intrins.h> //含有——nop_();#include <stdio.h> //含有运算#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//数据、时钟线uchar duanma[]={0XFC,0X60,0XDA,0XF2,0X66,0XB6,0XBE,0XE0,0XFE,0XF6};uint wendu; //定义温度值存储位置// uchar bdata date; 原来是用来移动数据的float f_num; //因为温度传感器的精度为0.0625所以设一个float行的变量// sbit d=date^0;void delay_ms(uint ms){uchar i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}void delay_us() //25us延时{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}/****************************************************** init()初始化复位程序变量i;还有—nop是用来延时的时序:1、2us、0、480us、等待确认;在延时20us、1******************************************************/void init(){uint i;DQ=1;_nop_();DQ=0;delay_us();//1delay_us();//2delay_us();//3delay_us();//4delay_us();//5delay_us();//6delay_us();//7delay_us();//8delay_us();//9DQ=1;i=10;while((i--)&&(DQ==1));i=10;while(i--);DQ=1;}/******************************************************字节写:write_byte变量x用来产生for循环在写的过程中,0和一是分开写的时序:0、15us、把数据植入、45us、1、重复前面、1当进行写数据时0和1是分开写的;但是时序也要分开写;******************************************************/void write_byte(uchar date)//传递过来的参数是操作指令例如:0xcc,0x44;0xbe {uchar x;bit testb;for(x=0;x<8;x++){testb=date&0x01; //数据处理,它的作用是将数据的最低取出一直去完八位date>>=1;//没去一次向左移动一次if(testb){DQ=0;_nop_();_nop_();DQ=1;delay_us();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DQ=1;delay_us();}else{DQ=0;_nop_();_nop_();DQ=0;delay_us();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DQ=1;}}DQ=1;}/******************************************************位读程序:这样做的目的是为了把程序写的更有条理性而且程序的类型是bit型的,因此返回值为bit型的时序:0、15us、把数据置入、45us、1******************************************************/bit read_bit(){bit bt;DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();bt=DQ;return bt;}/****************************************************** 字节读程序:为了将上面的位读程序组合起来变量:shuju是用来将独处的数据存入******************************************************/ uchar read_byte(){uchar n,k,shuju;shuju=0;for(n=0;n<8;n++){k=read_bit();shuju=(k<<7)|(shuju>>1); //这是一个将位数据转换成字节数据,先接受的是低位}delay_us();return shuju;}/******************************************************启动温度转换:在进行对传感器操作之前必须先写入初始化程序先写入跳跃器件地址指令0xcc再写入启动温度转换指令0x44******************************************************/void start(){init();delay_ms(1);write_byte(0xcc);write_byte(0x44);//向18b20写入启动温度转换指令}/******************************************************温度转换及处理程序:他的做用是将温度值读出因为读出0的数据是两个char型数据需要将它转换成一个uint型的这样才能把显示做出来******************************************************/uint wenduchange(){uchar a,b;init(); // 初始化;必须要有的delay_ms(1);write_byte(0xcc);// 向18b20写入跳跃地址指令write_byte(0xbe);//向18b20写入读取温度指令a=read_byte(); //先读低八位b=read_byte();//再读高八位P0=b; //程序标志!检测用wendu=b;wendu<<=8;wendu=wendu|a;f_num=wendu*0.0625; //读出的温度值乘以18b20的精度wendu=f_num*10+0.5;// 保留一位小数,加0.5为了四舍五入f_num=f_num+0.5; // 在设定变量时一定注意F_num的类型为float型return wendu;}/****************************************************** 显示程序:运用的并口显示方式******************************************************/ void display(uint datt){P2=0xfd;P0=duanma[datt/100];delay_ms(5);P2=0xff;P2=0xfb;P0=duanma[datt/10%10];delay_ms(5);P2=0xff;P2=0xf7;P0=duanma[datt%10];delay_ms(5);P2=0xff;}/****************************************************** 主函数:用来把所有的子程序汇集起来!!******************************************************/ void main(){uint date;while(1){start();delay_ms(5);date=wenduchange();display(date);}}。

51单片机与DS18B20测温的C程序——完整版

51单片机与DS18B20测温的C程序——完整版

/*-----------------------------------------------名称:18B20温度传感器修改:无内容:18B20单线温度检测的应用样例程序,请将18b20插紧,然后在数码管可以显示XX.XC,C表示摄氏度,如显示25.3C表示当前温度25.3度------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<math.h>#include<INTRINS.H>#define uchar unsigned char#define uint unsigned int/******************************************************************//* 定义端口*//******************************************************************/sbit seg1=P2^0;sbit seg2=P2^1;sbit seg3=P2^2;sbit DQ=P1^3;//ds18b20 端口sfr dataled=0x80;//显示数据端口/******************************************************************//* 全局变量*//******************************************************************/uint temp;uchar flag_get,count,num,minute,second;uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管段码表共阳uchar str[6];/******************************************************************//* 函数声明*//******************************************************************/void delay1(uchar MS);unsigned int ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);/******************************************************************//* 主函数*//******************************************************************/main(){unsigned char TempH,TempL;TMOD|=0x01;//定时器设置TH0=0xef;P2=0x00;count=0;while(1){str[5]=0x39; //显示C符号str[1]=tab[TempH/100]; //十位温度str[2]=tab[(TempH%100)/10]; //十位温度str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点str[4]=tab[TempL];if(flag_get==1) //定时读取当前温度{temp=ReadTemperature();if(temp&0x8000){str[0]=0x40;//负号标志temp=~temp; // 取反加1temp +=1;}elsestr[0]=0;TempH=temp>>4;TempL=temp&0x0F;TempL=TempL*6/10;//小数近似处理flag_get=0;}}}/******************************************************************/ /* 定时器中断*/ /******************************************************************/ void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔{TH0=0xef;//定时器重装值TL0=0xf0;num++;if (num==50){num=0;flag_get=1;//标志位有效second++;if(second>=60){second=0;minute++;if(count==1){P2=0;dataled=str[0];}//数码管扫描if(count==2){P2=1;dataled=str[1];}if(count==3){ P2=2;dataled=str[2];}if(count==4){ P2=3;dataled=str[3];}if(count==5){ P2=4;dataled=str[4];}if(count==6){ P2=5;dataled=str[5];count=0;}}/******************************************************************/ /* 延时函数*/ /******************************************************************/ void delay(unsigned int i)//延时函数{while(i--);}/******************************************************************/ /* 初始化*/ /******************************************************************/ void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(10);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(5);/******************************************************************/ /* 读一个字节*/ /******************************************************************/ unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay(5);}return(dat);}/******************************************************************/ /* 写一个字节*/ /******************************************************************/ void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}delay(5);}/******************************************************************/ /* 读取温度*/ /******************************************************************/ unsigned int ReadTemperature(void){unsigned char a=0;unsigned int b=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0x44); // 启动温度转换delay(200);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar(); //低位b=ReadOneChar(); //高位b<<=8;t=a+b;return(t);}。

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

DS18B20温度传感器详解带c程序
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];
break; case 2: if(zf==0&&shi!=0)
//因为存在脉冲检测结束后自动拉高*/ //return stat; } /******************写一个字节函数****************/ void write_byte(uchar dat) { uchar i; DQ=1; //先拉高电平,为写作准备 for(i=0;i<8;i++) {
以 12 位转化为例说明温度高低字节存放形式(温度的存储形式如表 3.1)及计算:12 位转化后得到的 12
位数据,存储在 18B20 的两个高低 8 位的 RAM 中,二进制中的前面 5 位是符号位。如果测得的温度大于 0,
这 5 位为 0,只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于 0,这 5 位为 1,测到的数值
配置寄存器
8位CRC生成器
内部结构图
2. 2 DS18B20 内部存储器及温度数据格式
对于 DS18B20 内部存储器结构(见下图),它包括一个暂存 RAM 和一个非易失性电可擦除 EERAM,后者存
放报警上下限 TH、TL。当改变 TH、T L 中的值时,数据首先被写进暂存器的第二、三字节中,主机可再读
表 3.2 DS18B20 温度/数字对应关系表

基于51单片机DS18B20温度传感器的C语言程序和电路

基于51单片机DS18B20温度传感器的C语言程序和电路

基于51单片机DS18B20温度传感器的C语言程序和电路DS18B20在外形上和三极管很像,有三只脚。

电压范围为3.0 V至5.5 V 无需备用电源测量温度位温度转换为12位数字格式最大值为750毫秒用户可定义的非易失性温度报警设置应用范围包敏感系统。

下面是DS18B20的子程序,本人用过完全可行的:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P2^0;void reset(); //DS18B20 void write_byte(uchar val); //DS18B20写命令函数uchar read_byte(void); //DS18B20读1字节函数void read_temp(); //温度读取函数void work_temp(); //温度数据处理函数uchar data temp_data[2]={0x00,0x00};uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //对于温度显示值值uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x0数部分查表main(){while(1){自己添加;}}void delay1(uint t){for(;t>0;t--);}///////温度控制子函数void reset(){uchar presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();DQ=0;delay1(50);DQ=1;delay1(6);presence=DQ;}delay1(45);presence=~DQ;}DQ=1;}void write_byte(uchar val){uchar i;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();DQ=val&0x01;delay1(6);val=val/2;}DQ=1;_nop_();}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_();DQ=1;_nop_();_nop_();_nop_();_nop_();if(DQ)value|=0x80;delay1(6);}DQ=1;return(value);}void read_temp(){reset();write_byte(0xcc);write_byte(0xbe);temp_data[0]=read_byte();temp_data[1]=read_byte();reset();write_byte(0xcc);write_byte(0x44);}void work_temp(){if(temp_data[1]>127){temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1; //需要前面宏定义}display[4]=temp_data[0]&0x0f; //低位的低4位display[0]=ditab[display[4]]; //小数点后的数值display[4]=((temp_data[0]&0xf0) >> 4)|((temp_data[1]&0x0f)<<4); //小数display[3]=display[4] / 100;display[1]=display[4] % 100;display[2]=display[1] / 10;display[1]=display[1] % 10;}电路:。

ds18b20测温c程序

ds18b20测温c程序

#include<reg52.h>#include<intrins.h>#include<ZLG7289.h>#define uint unsigned int#define uchar unsigned charuchar mod,x,dat,m,t;uchar pres_temp[]={9,9,9,9},old_temp[]={0,0,0,0};sbit dq=P3^6;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_5=P1^5;sbit P1_6=P1^6;uint temp;uchar ID[2][8]={0x28,0x08,0x34,0x31,0x02,0x00,0x00,0xac,0x28,0xf3,0xa0,0xd0,0x00,0x00,0x00,0x07}; void delay(uint count){uint i,j;for(i=0;i<count;i++)for(j=0;j<10;j++);}void delayb20(uchar count){uchar i;for(i=0;i<count;i++);}uchar b20_Init(){uchar i;dq=1;delayb20(1);dq=0;delayb20(29);dq=1;delayb20(3);i=dq;delayb20(25);if(i==0)return 1;return 0;}uchar b20_Readbit(void){uchar i;dq=0;dq=1;for(i=0;i<3;i++);return(dq);}uchar b20_Readbyte(void) {uchar i,j,dat;dat=0;for(i=0;i<8;i++){j=b20_Readbit();dat=(j<<7)|(dat>>1);}return(dat);}void b20_Writebyte(uchar dat) {uchar i,j;bit testb;for(j=0;j<8;j++){testb=dat&0x01;dat=dat>>1;if(testb){dq=0;i++;i++;dq=1;for(i=0;i<8;i++);}{dq=0;for(i=0;i<8;i++);dq=1;i++;i++;}}}uint b20_Matchrom(uint num){uint j;b20_Init();if(b20_Init()==1){b20_Writebyte(0x55);for(j=0;j<8;j++)b20_Writebyte(ID[num][j]);return 1;}elsereturn 0;}void b20_temchange(){b20_Init();delay(1);b20_Writebyte(0xcc);b20_Writebyte(0x44);delay(5000);delay(5000);}uint b20_tempget(){float tt;uchar a,b;b20_Writebyte(0xbe);a=b20_Readbyte();b=b20_Readbyte();temp=b;temp<<=8;temp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return(temp);}void dataconvt(){uint t=b20_tempget();pres_temp[0] = t/ 1000;pres_temp[1] = t % 1000 / 100;pres_temp[2]=t%100/10;pres_temp[3] = t% 10;}void display(uchar p){ uint a;dataconvt();a=pres_temp[0]*1000+pres_temp[1]*100+pres_temp[2]*10+pres_temp[3]; if(p){if(a>305){P1_1=0;P1_2=0;}if(a<295){P1_1=1;P1_2=1;}}else{if(a>305){P1_5=0;P1_6=0;}if(a<295){P1_5=1;P1_6=1;}}t=4*p;if(pres_temp[0]==0)ZLG7289_Hide(0);else if(old_temp[0]!=pres_temp[0]) {x=t;dat= pres_temp[0];ZLG7289_Download(1,x,0,dat);old_temp[0]=pres_temp[0];}if(pres_temp[0]==0&&pres_temp[1]==0) ZLG7289_Hide(1);else if(old_temp[3]!=pres_temp[3] ){x=t+1;dat= pres_temp[1];ZLG7289_Download(1,x,0,dat);}if(old_temp[3]!=pres_temp[3]){x=t+2;dat= pres_temp[2];ZLG7289_Download(1,x,1,dat);x=t+3;dat= pres_temp[3];ZLG7289_Download(1,x,0,dat);old_temp[3]=pres_temp[3];}}void main(){ZLG7289_Init(5);delay(1000);ZLG7289_Reset();delay(1000);while(1){b20_temchange();b20_Matchrom(0);display(0);b20_Matchrom(1);display(1);}}#include<reg52.h>#include<math.h>#include<intrins.h>#include<ZLG7289.h>#define unchar unsigned char#define unint unsigned intunchar pres_temp[]={9,9,9,9},old_temp[]={0,0,0,0}; bit flag=0,dp;unint value;unchar low, high, mod,x,dat,m;sbit ds=P3^6;void delay(unchar i){unchar j, k;for(j = i; j > 0; j--)for(k = 125; k > 0; k--);}void dsInit(){unint i;ds = 0;i = 103;while(i>0) i--;ds = 1;i = 4;while(i>0) i--;flag=ds;}bit readBit(){unint i;bit b;ds = 0;i++;ds = 1;i++; i++;b = ds;i = 8;while(i>0) i--;return b;}unchar readByte(){unint i;unchar j, dat;dat = 0;for(i=0; i<8; i++){j = readBit();dat = (j << 7) | (dat >> 1);}return dat;}void writeByte(unchar dat){unint i;unchar j;bit b;for(j = 0; j < 8; j++){b = dat & 0x01;dat >>= 1;if(b){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++;}}}void dataconvert(){float t;flag=0;value = high;value <<= 8;value |= low;if(value&0x8000){value=~value;value+=1;flag=1;}t = value * 0.0625;value = t * 10+0.5;if(value>310)P1=0xe7;if(value<290)P1=0xff;pres_temp[0] = value/ 1000;pres_temp[1] = value % 1000 / 100;pres_temp[2]=value%100/10;pres_temp[3] = value % 10;}void display(){if(flag==1){dat=0x40;ZLG7289_Download(2,0,0,dat);}else if(pres_temp[0]==0)ZLG7289_Hide(0);else if(old_temp[0]!=pres_temp[0]) {dat= pres_temp[0];ZLG7289_Download(1,0,0,dat);old_temp[0]=pres_temp[0];}if(pres_temp[0]==0&&pres_temp[1]==0) ZLG7289_Hide(1);else if(old_temp[3]!=pres_temp[3] ) {dat= pres_temp[1];ZLG7289_Download(1,1,0,dat);}if(old_temp[3]!=pres_temp[3]){dat= pres_temp[2];ZLG7289_Download(1,2,1,dat);dat= pres_temp[3];ZLG7289_Download(1,3,0,dat);old_temp[3]=pres_temp[3];}}void main(){ZLG7289_Init(5);delay(100);ZLG7289_Reset();delay(100);while(1){dsInit();delay(1);writeByte(0xcc);delay(1);writeByte(0x44);dsInit();delay(1);writeByte(0xcc);delay(1);writeByte(0xbe);low = readByte() ;high = readByte() ;dataconvert();if(old_temp[3]!=pres_temp[3] ){dat=0x63;ZLG7289_Download(2,4,0, dat);dat=0x0c;ZLG7289_Download(1,5,0, dat);}display();}}。

DS18B20的c语言程序

DS18B20的c语言程序

c语言程序单总线接6个DS18B20(其实程序只要多余3个即可),。

//将DQ与Vcc之间接入4.7K上拉电阻#include "reg52.h"#include "INTRINS.H"#include "1602.c"#define uchar unsigned char#define uint unsigned int//#define CLEARSCREEN LCD_en_command(0x01) 1602清屏sbit DQ="P1"^0;/*操作命令代码跳过ROM 0xCC发送温度转换0xBE写EEPROM 0x4E*//////////////低层驱动子程序///////////void Init18B20(void); //初始化void Write18B20(uchar ch);//写数据unsigned char Read18B20(void);//读数据void Delay15(uchar n);void Delay10ms(uint delay_num);void Display(void);/////////////////////////////////////code uchar decimalH[]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93}; code uchar decimalL[]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};uint ResultTemperatureH ,ResultTemperatureLH,ResultTemperatureLL;//整数,小数高位,小数低位uint ResultSignal;//符号位main(){ uint TemH,TemL,delay,k=0;for(; ; ){Init18B20();Write18B20(0xCC);//跳过ROM_nop_();//Write18B20(0x4E);//写EEPROM// Write18B20(0x00);//Th//Write18B20(0x00);//TlWrite18B20(0x7f);//12 bits温度分辨率Init18B20();Write18B20(0xCC);//跳过ROM_nop_();Write18B20(0x44);//发送温度转换指令Delay10ms(25);Delay10ms(25);Delay10ms(25);Delay10ms(25);//等待1s转换Init18B20();Write18B20(0xCC);//跳过ROMWrite18B20(0xBE);//发送温度转换指令TemL="Read18B20"(); //读低位温度值TemH="Read18B20"(); //读高位温度值Delay10ms(2);TemH=(TemH<<4)|(TemL>>4);TemL="TemL"&0x0f; //取低4位if(TemH&0x80){ TemH=~TemH;TemL=~TemL+1;ResultSignal="1"; //负}else ResultSignal="0"; //正ResultTemperatureLH="decimalH"[TemL];ResultTemperatureLL="decimalL"[TemL];ResultTemperatureH="TemH";Display();for(delay=0;delay<60000;delay++);for(delay=0;delay<20000;delay++);}}void Display(void){ uint i,j,q;LCD_init();CLEARSCREEN;LCD_en_command(0x01);delay_nms(2);q="ResultTemperatureH/100";i=(ResultTemperatureH%100)/10;j="ResultTemperatureH-"(i*10+q*100);LCD_write_string(0,LINE1," Jaq1217 18B20 "); if(ResultSignal){ LCD_write_string(0,LINE2," T is:- . "); }else {LCD_write_string(0,LINE2," T is:+ . ");}LCD_write_char(0x07,LINE2,q|0x30);LCD_write_char(0x08,LINE2,i|0x30);LCD_write_char(0x09,LINE2,j|0x30);LCD_write_char(0x0b,LINE2,(ResultTemperatureLH/10)|0x30); LCD_write_char(0x0c,LINE2,(ResultTemperatureLH%10)|0x30); LCD_write_char(0x0d,LINE2,(ResultTemperatureLL/10)|0x30); LCD_write_char(0x0e,LINE2,(ResultTemperatureLL%10)|0x30);}unsigned char Read18B20(void){ unsigned char ch;unsigned char q ;for(q=0;q<8;q++){ch=ch>>1;DQ="0";_nop_();DQ="1";_nop_();_nop_();_nop_();_nop_();if(DQ==1){ch="ch|0x80";}else {ch="ch"&0x7f;}Delay15(3);DQ="1";}return (ch);}void Write18B20(uchar ch){ uchar i;for(i=0;i<8;i++){ DQ="0";Delay15(1);DQ="ch"&0x01;Delay15(3);DQ="1";ch="ch">>1;_nop_();}}void Init18B20(void){ DQ="0";Delay15(33);//至少延时480usDQ="1";Delay15(10);//至少延时100us/*if(DQ==1) return 0; //初始化失败else return 1;DQ=1; Delay15(18); */}void Delay15(uchar n){ do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();n--;}while(n);}void Delay10ms(uint delay_num){uchar i;while(delay_num--){for(i=0;i<125;i++){;}}}说明:如果你只需要温度部分的,那么LCD部分的,你可以不看,只参考18B20的程序段。

单片机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); }/*****************************************时序:初始化时序、读时序、写时序。

关于DS18B20的c语言程序

关于DS18B20的c语言程序

#include "DS18B20.h"//unsigned char Init_DS18B20_flag = 0;/***********ds18b20延迟子函数(晶振12MHz )*******/void delay_18B20(unsigned int i){while(i--);}/**********ds18b20初始化函数**********************/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(14);x = DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat>>=1;}}/**************读取ds18b20当前温度************//*unsigned char ReadTemperature(void){unsigned char a=0;unsigned char b=0;// unsigned int t=0;unsigned char flag; //初始化是否成功标志位0,成功1,失败//flag=Init_DS18B20();Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(100); // this message is very importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar(); //读取温度值低8位b=ReadOneChar(); //读取温度值高8位if(flag) //初始化失败{a=0x00;b=0x00;}temp1=b<<4;temp1+=(a&0xf0)>>4; //小数点前的数据temp2=a&0x0f; //小数点后的数据temp=temp1;// temp=((b*256+a)>>4);//当前采集温度值除16得实际温度值// temp1 = t/100%10; //温度值十位// temp2 = t/10%10; //温度值个位// temp3 = t%10; //温度值十分位return flag;}/**************读取ds18b20当前温度************//*void ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(100); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar(); //读取温度值低8位b=ReadOneChar(); //读取温度值高8位temp1=b<<4;temp1+=(a&0xf0)>>4; //小数点前的数据temp2=a&0x0f; //小数点后的数据temp=temp1;// temp=((b*256+a)>>4);//当前采集温度值除16得实际温度值// temp1 = t/100%10; //温度值十位// temp2 = t/10%10; //温度值个位// temp3 = t%10; //温度值十分位}*/。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us
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" "不亮" "-"
scan()
{
char k;
for(k=0;k<4;k++) //4位LED扫描控制
{
Disdata=dis_7[display[k]]; //数据显示
if (k==1){DIN=1;} //小数点显示
work_temp(uint tem)
{
uchar n=0;
if(tem>6348) // 温度值正负判断
{tem=65536-tem;n=1;} // 负温度求补码,标志位置1
display[4]=tem&0x0f; // 取小数部分的值
/****************温度数据处理函数************************/
//二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分
/********************************************************/
display[0]=ditab[display[4]]; // 存入小数部分显示值
display[4]=tem>>4; // 取中间八位,即整数部分的值
display[3]=display[4]/100; // 取百位数据暂存
display[1]=display[4]%100; // 取后两位数据暂存
}
//
//
/****************主函数************************/
main()
{
Disdata=0x00; //初始化端口
discan=0x00;
for(h=0;h<4;h++) //开机显示"8888"
discan=scan_con[k]; //位选
delay(300);
}
}
//
//
/****************DS18B20复位函数************************/
ow_reset(void)
{
char presence=1;
display[2]=display[1]/10; // 取十位数据暂存
display[1]=display[1]%10;
/******************符号位显示判断**************************/
if(!display[3])
{
uchar code scan_con[4]={0xf7,0xfB,0xfD,0xff}; //列扫描]={0x00,0x00}; //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
{display[h]=8;}
ow_reset(); //开机先转换一次
write_byte(0xcc); //Skip ROM
write_byte(0x44); //发转换命令
for(h=0;h<100;h++) //开机显示"8888"
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7; //温度输入口
sbit DIN=P0^0; //LED小数点控制
delay(6); //66 us
presence=DQ; //presence=0 复位成功,继续下一步
}
delay(45); //延时500 us
presence=~DQ;
}
DQ=1; //拉高电平
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//从高拉倒低
DQ=0;
delay(50); //550 us
DQ=1;
uint h;
uint temp;
//
//
//**************温度小数部分用查表法***********//
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
#include <reg51.h>
#include <intrins.h> //_nop_();延时函数用
#define Disdata P0 //段码输出口
#define discan P2 //扫描口
write_byte(0xcc); //发命令
write_byte(0xbe);
temp_data[0]=read_byte(); //读温度值的第字节
temp_data[1]=read_byte(); //读温度值的高字节
temp=temp_data[1];
display[3]=0xF5; //最高位为0时不显示
if(!display[2])
{
display[2]=0xF5; //次高位为0时不显示
}
}
if(n){display[3]=0xF4;} //负温度时最高位显示"-"
}
DQ=1;
delay(1);
}
//
/****************DS18B20读1字节函数************************/
//从总线上取1个字节
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
delay(6); //66 us
}
DQ=1;
return(value);
}
//
/****************读出温度函数************************/
//
read_temp()
{
//
//
//
/*****************11us延时函数*************************/
//
void delay(uint t)
{
for (;t>0;t--);
}
//
/****************显示扫描函数***************************/
{scan();}
while(1)
{
work_temp(read_temp()); //处理温度数据
scan(); //显示温度值
}
}
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
相关文档
最新文档