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,0x00,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;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];。
ds18b20c语言程序
ds18b20c语言程序DS18B20驱动程序(C语言)//#include"reg51.h"sbit DQ =P1^4; //定义通信端口//延时函数/*void delay(unsigned inti){while(i--);}*///初始化函数Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ 复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于 480usDQ = 1; //拉高总线delay(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(20);}//读一个字节ReadOneChar(void){unsigned chari=0;unsigned char dat = 0;for (i=8;i>;0;i--){DQ = 0; // 给脉冲信号dat>;>;=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay(4);}return(dat);}//写一个字节WriteOneChar(unsigned chardat){unsigned char i=0;for (i=8; i>;0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ =1;dat>;>;=1;}//delay(4);}//DS18B20程序读取温度ReadTemperature(void){unsigned char a=0;unsignedchar b=0;unsigned int t=0;floattt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();b=ReadOneChar();t=b;t<<=8;t=t|a;t t=t*0.0625;//t= tt*10+0.5; //放大10倍输出并四舍五入---此行没用return(t);}//DS18B20主程序main(){unsigned chari=0;while(1){i=ReadTemperature();//读温度}}ds18b20c语言程序完毕。
DS18B20 c语言程序
**************************************/
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); //等待转换完成
DS18B20的C语言程序
uchar i;
for(i = 0;i < 6;i++) dN[i] = 0; //初始化显示变量
//数值转换
if(temper & BIT0)
{
dN[0] = 5;
dN[1] = 2;
dN[2] = 6;
_DINT();
for(i = 0; i < 8;i++)
{
DQ0;
DelayNus(6); //延时6us
if(wdata & 0X01) DQ1;
else DQ0;
函数名称:Read_SP
功 能:发送读ScratchPad命令
参 数:无
返回值 :无
********************************************/
void Read_SP(void)
{
Write_18B20(0xbe);
}
/*******************************************
}
}
函数名称:Write_18B20
功 能:向DS18B20写入一个字节的数据
参 数:wdata--写入的数据
返回值 :无
********************************************/
void Write_18B20(uchar wdata)
{
uchar i;
uint Do1Convert(void)
{
uchar i;
do
{
i = Init_18B20();
DS18B20的c读写程序
1.//这是关于DS18B20的c读写程序,数据脚P1.0,晶振12MHZ2.//采用的是启东单片机开发板AY-MPU89S51E3.//进行温度显示,这里我们考虑用四位数码管来显示温度4.//显示范围-55.0到+99.5度,显示精度为0.5度5.//关于程序中的延时请参考ds18b20的读写时序6.7.#include <reg52.h>8.#define uchar unsigned char9.10.uchar tempint,tempdf; //温度整数部分和小数部分11.12.sbit TMDAT = P1^0; //根据实实际情况设定13.sbit ld7=P1^7; //初始化成功标志led14.sbit ld6=P1^6; //负温度标志led15.sbit point=P0^7; //小数点显示16.uchar f; //负温度标志17.18.code unsigned char ledmap[]={19. 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xBF};20. //7段数码管0~9数字的共阳显示代码和负号位代码(最后一位)21.22.void set_ds18b20(); //初始化DS18B20子程序23.void get_temperature(); //获得温度子程序24.void read_ds18b20(); //读DS18B20子程序25.void write_ds18b20(uchar command);//向DS18B20写1字节子程序26.void delayms(uchar count); //延时count毫秒子程序27.void disp_temp(); //显示温度子程序28.29.void main()30.{31.SP=0x60; //设置堆栈指针32.while(1)33.{34.get_temperature(); //获得温度35.if(tempdf>=8)36. { //0.5度精度显示37.tempdf=5;38. }39.else40. {41.tempdf=0;42. }43.disp_temp(); //显示温度44.}45.}46.47.void set_ds18b20()48.{49. while(1)50. {51. uchar delay,flag;52. flag=0;53. TMDAT=1;54. delay=1;55. while(--delay);56. TMDAT=0; //数据线置低电平57. delay=250;58. while(--delay); //低电平保持500us59. TMDAT=1; //数据线置高电平60. delay=30;61. while(--delay); //高电平保持60us62. while(TMDAT==0) //判断DS18B20是否发出低电平信号63. {64. delay=210; //DS18B20响应,延时420us65. while(--delay);66. if(TMDAT) //DS18B20发出高电平初始化成功,返回67. {68. flag=1; //DS18B20初始化成功标志69. ld7=0; //初始化成功LED标志70. break;71. }72. }73. if(flag) //初始化成功,再延时480us,时序要求74. {75. delay=240;76. while(--delay);77. break;78. }79. }80.}81.82.void get_temperature() //温度转换、获得温度子程序83.{84. set_ds18b20(); //初始化DS18B2085. write_ds18b20(0xcc); //发跳过ROM匹配命令86. write_ds18b20(0x44); //发温度转换命令87. disp_temp(); //显示温度,等待AD转换88. set_ds18b20();89. write_ds18b20(0xcc); //发跳过ROM匹配命令90. write_ds18b20(0xbe); //发出读温度命令91. read_ds18b20(); //将读出的温度数据保存到tempint和tempdf处92.93.}94.95.void read_ds18b20()96.{97. uchar delay,i,j,k,temp,temph,templ;98. j=2; //读2位字节数据99. do100. {101. for(i=8;i>0;i--) //一个字节分8位读取102. {103. temp>>=1; //读取1位右移1位104. TMDAT=0; //数据线置低电平105. delay=1;106. while(--delay);107. TMDAT=1; //数据线置高电平108. delay=4;109. while(--delay); //延时8us110. if(TMDAT) //读取1位数据111. temp|=0x80;112. delay=25; //读取1位数据后延时50us113. while(--delay);114. }115. if(j==2) //读取的第一字节存templ116. templ=temp;117. else118. temph=temp; //读取的第二字节存temph119. }while(--j);120. f=0;121. if((temph & 0xf8)!=0x00) //若温度为负的处理,对二进制补码的处理122. {123. f=1; //为负温度f置1124. ld6=0;125. temph=~temph;126. templ=~templ;127. k=templ+1;128. templ=k;129. if(k>255)130. {131.temph++;132. }133. }134. tempdf=templ & 0x0f; //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf135. templ>>=4;136. temph<<=4;137. tempint=temph|templ;138.}139.140.void write_ds18b20(uchar command)141.{142. uchar delay,i;143. for(i=8;i>0;i--) //将一字节数据一位一位写入144. {145. TMDAT=0; //数据线置低电平146. delay=6; //延时12us147. while(--delay);148. TMDAT=command&0x01; //将数据放置在数据线上149. delay=25; //延时50us150. while(--delay);151. command=command>>1; //准备发送下一位数据152. TMDAT=1; //发送完一位数据,数据线置高电平153. }154.}155.156.void disp_temp()157.{158. uchar tempinth,tempintl,cnt;159.160. tempinth=tempint/10; //整数高半字节161. tempintl=tempint%10; //整数低半字节162. cnt=200; //循环显示200次163. while(--cnt)164. {165. while(f==1)166. {167. P0=ledmap[10];168. if(tempinth==0)169. {170.P2=0xef;171.delayms(1);172.173.goto loop;174. }175. else176. {P2=0xdf;}177. }178. delayms(1);179.180. P0=ledmap[tempinth];181. P2=0xef; //开十位182. delayms(1);183.184.loop:P0=ledmap[tempintl];185. P2=0xf7; //开个位186. point=0; //小数点显示187. delayms(1);188.189. P0=ledmap[tempdf];190. P2=0xfb; //开十分位191. delayms(1);192. }193.}194.195.void delayms(uchar count) //延时count ms子程序196.{197. uchar i,j;198. do199. {200. for(i=5;i>0;i--)201. for(j=98;j>0;j--);202. }while(--count);203.}/bbs/read.php?tid=1695第一节DS18B20通讯协议DS18B20采用Dallas公司1-WIRE网络协议通讯,这里就围绕着DS18B20介绍1-WIRE网络协议。
18b20的c读写程序
(3) 18b20的c读写程序DS18B20的c读写程序(转)2009-05-08 17:55//这是一个温度采集模块的驱动程序。
/*|----|| DS | DS18B20管脚排列+----+| | || | || | |----------Vdd| |------------DQ-->P0.0|---------------GND*///--------------delay.c--------------------void delay(unsigned int delay_time) //延时子程序{for(;delay_time>0;delay_time--){}}//------------DS18B20控制命令-----------------------------#define T_CONVER 0x44 //开始温度转换#define T_CONFIG 0x5f //11位转换#define T_READ 0xbe //读暂存器#define T_WRITE 0x4e //写暂存器#define T_ROM_JMP 0xcc //忽略64ROM地址#define T_COPY_E2 0x48 //将温度上下限数值写到E2ROM#define T_RECALL_E2 0xb8 //将E2中存储的温度上下限数值复制到上下限寄存器中。
#define T_cont 0.0625 //温度转换常数//------------------------------------------------------sbit DQ=P3^4; //DS18B20数据输出端sbit LED=P3^2; //LEDbit REC_suc=0; //DS18B20成功复位标志位bit T_sign; //温度正负符号float temp=0; //转换好的温度数值signed char temp_TH=25,temp_TL=18; //温度上下限unsigned char t_bai,t_shi,t_ge,t_feng; //温度转换好的各个位void DS18B20_init(); //DS18B20初始化函数void DS18B20_send(unsigned char in_data); //DS18B20发送一个字节数据函数unsigned char DS18B20_read(); //从DS18B20读取一个字节函数void ReadTemperature(); //读取温度数值void temp_data_turn(float in_data); //温度转换//--------------------------------------------------------/****************************DS18B20初始化函数**************************/ /*函数原型:void DS18B20_init()/*函数功能:DS18B20初始化/*输入参数:无/*输出参数:无/*调用模块:delay()/*建立时间:2005/11/14/*作者:丁霄/**********************************************************************/ void DS18B20_init(){unsigned char i=1;DQ=0;DQ=1;delay(20); //延时227uswhile(REC_suc==0){DQ=0;delay(45); //延时502usDQ=1;delay(3); //等待DS18B20作出相应延时40uswhile(1){ i=DQ;if(i==0){REC_suc=1;delay(20); //延时227usbreak;}}}REC_suc=0;}/****************************DS18B20发送函数**************************/ /*函数原型:void DS18B20_send(unsigned char in_data)/*函数功能:DS18B20发送数据/*输入参数:要发送的数据/*输出参数:无/*调用模块:_cror_()/*建立时间:2005/11/14/*作者:丁霄/**********************************************************************/void DS18B20_send(unsigned char in_data){unsigned char i,out_data,k;out_data=in_data;for(i=1;i<9;i++) //串行发送数据{DQ=0;DQ=1;_nop_();_nop_();k=out_data&0x01;if(k==0x01) //判断数据写1{DQ=1;}else //写0{DQ=0;}delay(5); //延时62usDQ=1;out_data=_cror_(out_data,1); //循环左移1位}}/**************************DS18B20读函数**************************/ /*函数原型:void DS18B20_read()/*函数功能:DS18B20读数据/*输入参数:无/*输出参数:读到的一字节内容/*调用模块:delay()/*建立时间:2005/11/14/*作者:丁霄/******************************************************************/ unsigned char DS18B20_read(){unsigned char i,in_data,k;in_data=0;for(i=1;i<9;i++) //串行发送数据{DQ=0;DQ=1;_nop_();k=DQ; //读DQ端if(k==1) //读到的数据是1{in_data=in_data|0x01;}else{in_data=in_data|0x00;}delay(4); //延时51usDQ=1;in_data=_cror_(in_data,1); //循环左移1位}return(in_data);}/**************************DS18B20读取温度函数**************************//*函数原型:void ReadTemperature()/*函数功能:DS18B20读取温度转换好的数据/*输入参数:无/*输出参数:无/*调用模块:DS18B20_send(),DS18B20_send(),DS18B20_init(),DS18B20_send(),DS18B20_send(), T_L=DS18B20_read(),T_H=DS18B20_read()/*建立时间:2005/11/15/*作者:丁霄/******************************************************************/void ReadTemperature(){unsigned char T_L=0;unsigned char T_H=0;unsigned char k;DS18B20_init();DS18B20_send(T_ROM_JMP); // 跳过读序号列号的操作DS18B20_send(T_CONVER); // 启动温度转换DS18B20_init();DS18B20_send(T_ROM_JMP); //跳过读序号列号的操作DS18B20_send(T_READ); //读取温度寄存器等(共可读9个寄存器)前两个就是温度T_L=DS18B20_read();T_H=DS18B20_read();k=T_H&0xf8;T_sign=1; //温度是负数elseT_sign=0; //温度是正数T_H=T_H&0x07;temp=(T_H*256+T_L)*T_cont;}/**************************DS18B20温度转换函数**************************/ /*函数原型:void temp_data_turn(float in_data)/*函数功能:DS18B20读取温度转换/*输入参数:无/*输出参数:无/*调用模块:无/*建立时间:2005/11/16/*作者:丁霄/******************************************************************/void temp_data_turn(float in_data){unsigned int y;in_data=in_data*10; //数值扩大10倍,精度到0.1t_bai=in_data/1000;y=(unsigned int)in_data%1000;t_shi=y/100;y=y%100;t_ge=y/10;t_feng=y%10;}(4)。
DS18B20温度传感器C程序
void LedScan()//数码管扫描程序。
{
static unsigned char i = 0,a=0xF8;
P1 = 0xFF;//P1是数码管数据引脚,注意跟据实际情况修改
P0 = (P0 & a) | a;//P0是138译码器数据输入引脚,注意跟据实际情况修改
我这里12个数码管,2个138译码器,所以最大扫描到0x04.
int temp=1;
unsigned char flg;
unsigned char T0RH,T0RL;
void ConfigTimer0(unsigned int ms)//开内部定时器延时,到时间后触发中断。
{
unsigned long tmp;
tmp = 11059200 / 12;
tmp = (tmp * ms) / 1000;
DelayX10us(6);
}
EA =பைடு நூலகம்1;
return dat;
}
bit Start18B20()
{
bit ack;
ack = Get18B20Ack();
if(ack == 0)
{
Write18B20(0xCC);
Write18B20(0x44);
}
return ~ack;
}
bit Get18B20Temp(int *temp)
{
bit ack;
unsigned char LSB, MSB;
ack = Get18B20Ack();
if(ack == 0)
{
Write18B20(0xCC);
Write18B20(0xBE);
LSB = Read18B20();
单片机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程序
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程序
#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程序
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的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语言程序
#include<reg52.h>#include<intrins.h>typedef unsigned char uchar;typedef unsigned int uint;uchar wbuf[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F}; uchar tplsb,tpmsb;//温度低位,高位uint temp=0;//实际温度uint temp1=30;//报警温度uint temp2=27;//报警温度//sbit led=P2^1; //示警发光二极管信号引脚sbit motor=P1^7; //电机信号输出引脚sbit reduce=P2^1; //报警温度下减键sbit plus=P2^0; //报警温度上加键//bit flag1=0;//bit flag2=0;sbit A=P2^6;//数码管位选sbit C=P2^7;//数码管位选sbit DQ=P1^0;//DS18B20控制线void delay1(uint j ){ int i,k;for(i=0;i<110;i++)for(k=0;k<j;k++);}void delay(uint t) //延时t毫秒{uint i;while(t--);{for(i=0;i<250;++i); //延时约1us{}}}/*产生复位脉冲初始化DS18B20*/void Init(){uint i=100;DQ=0;while(i>0)i--;//拉低约900usDQ=1;//拉高电平,产生上升沿i=4;while(i>0)i--;}/*等待应答脉冲*/void Wait(){uint i;while(DQ);while(~DQ); //检测到应答脉冲i=4;while(i>0)i--;}/*读数据一位*/bit Rebit(){uint i;bit b;DQ=0;i++;//保持低电平至少1usDQ=1;i++;i++;//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效b=DQ;i=9;while(i>0)i--;//读时隙不低于60usreturn(b);}/*读一个字节数据*/uchar Rebyte(){uchar i,j=0,k=0;for(i=0;i<8;i++){k=Rebit();j=(k<<7)|(j>>1);}return(j);}/*写一个字节数据*/void Wrbyte(uchar b){uint i,j;bit temp;for(j=0;j<8;j++){temp=b&0x01;b>>=1;if(temp){/*写1*/DQ=0;i++;i++;//延时15usDQ=1;i=8;while(i>0)i--;//整个写1时隙不低于60us}else{/*写0*/DQ=0;i=8;while(i>0)i--;DQ=1;i++;i++;}}}/*启动温度转化*/void Convert(){Init();//初始化DS18B20Wait();//等待应答delay(1);//延时Wrbyte(0xcc);//skip rom命令Wrbyte(0x44);//convert T命令}/*读取温度值*/void Retemp(){Init();//初始化DS18B20Wait();//等待应答delay(1);//延时Wrbyte(0xcc);//skip rom命令Wrbyte(0xbe);//read scratchpad(读暂存器)命令tplsb=Rebyte();//温度低位字节(其中第四位为小数部分)tpmsb=Rebyte();//温度高位字节(其中高五位为符号位)temp=(tpmsb*256+tplsb)*0.0625;//转换}/*LED显示*/void Display(){for(n=0;n<3;n++){ j=temp/10;//取温度十位k=temp%10; //取温度个位P0=wbuf[j];//把要显示的位送入P0口A=0;C=1; //开第一位数码管,显示十位delay(10);//com1=1; //关第一位显示P0=wbuf[k];//把要显示的位送入P0口A=1;C=0; //开第二位数码管,显示个位//delay(2);//com2=1;//关第二位显示}}void main(){EA=1;EX0=1;TF0=1;//EX1=1;do{//delay(1);Convert();//温度转换delay(10);Retemp();//读温度delay(10);Display();//显示if((temp>=temp1)||(temp<=temp2)){// led=0;motor=0;}else{// led=1;motor=1;}// if(temp<=temp2)// motor=0;}while(1);}void TNTO() interrupt 0do{for(n=0;n<5;n++){ j=temp1/10;//取温度十位k=temp1%10; //取温度个位P0=wbuf[j];//把要显示的位送入P0口A=0;C=1; //开第一位数码管,显示报警温度十位delay1(12);P0=wbuf[k];//把要显示的位送入P0口A=1;C=0; //开第二位数码管,显示报警温度个位delay1(12);}if((P2&0x0f)!=0x0f){i=0;delay1(60);if((P2&0x0f)!=0x0f){ if(plus==0){ delay1(10);if(plus==0)temp1++;}if(reduce==0){ delay1(10);if(reduce==0)temp1--;}}}i++;if(((P2&0x0f)==0x0f)&&(i>=50)) break;}while(1);}。
DS18B20 C语言程序
/**********************êy??1ü??ê?**************************************/
void delay1ms(unsigned char a)
{
unsigned char j;
while(a-- != 0)
{
i=8;
while(i>0)i--;
DQ=1;
i++;
i++;
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
init_play()//初始化显示
{ lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
/******************************ds1820程序***************************************/
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
for (j = 0; j < 125; j++);
}
}
void disp(temp)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
_NOP();
P4DIR &=~ BIT4;
if((P4IN&BIT4)==0)
temp=temp&0x7f;
else
temp=temp|0x80;
delay(7);
P4DIR |= BIT4;
LcdWriteCommand(0x06,1);
LcdWriteCommand(0x0c,1);
}
void LcdWriteData(uchar data)
{
WaitForEnable();
SET_RS;
CLR_RW;
_NOP();
#define SET_EN P3OUT|=BIT2;
uchar *s1="The temper is:";
uchar table0[]={"0123456789."};
uchar table1[]={"1111"};
void DispStr(uchar x,uchar *ptr)
#define CLR_RS P3OUT&=~BIT0;
#define SET_RS P3OUT|=BIT0;
#define CLR_RW P3OUT&=~BIT1;
#define SET_RW P3OUT|=BIT1;
#define CLR_EN P3OUT&=~BIT2;
delay(60000);
Init();
Skip();
ReadDo();
ReadTemp();
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
typedef unsigned int uint;
void DispStr(uchar x,uchar *ptr);
//void DisplChar(uchar x,uchar y,uchar data);
void LcdWriteCommand(uchar cmd,uchar chk);
DataPort=data;
_NOP();
SET_EN;
_NOP();
_NOP();
CLR_EN;
}
void Trans_val(float shuzi)
{
uchar ptr[4];
uint i,t;
{
DQ0;
delay(1);
if((n&0x01)==0x01)
{
DQ1;
}
else
{
DQ0;
}
n=n>>1;
delay(9);
DQ1;
}
}
unsigned char Read_18B20()
t=shuzi*10;
ptr[0]=t/100;
ptr[1]=(t/10)%10;
ptr[3]=t%10;
ptr[2]='.';
for(i=0;i<4;i++)
table1[i]=table0[ptr[i]];
table1[2]=ptr[2];
void LcdWriteData(uchar data);
void LcdReset();
void WaitForEnable();
#define DataDir P4DIR
#define DataPort P4OUT
#define Busy 0x80
#define CtrlDir P3DIR
}
}
/*void DisplChar(uchar x,uchar y,uchar data)
{
LocateXY(x,y);
LcdWriteData(data);
}
void LocateXY(uchar x,uchar y)
{
uchar temp;
temp=x&0x0f;
{
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++)
{
temp=temp>>1;
DQ0;
_NOP();
DQ1;
_NOP();
_NOP();
_NOP();
}
else
{
Error=0;
P4DIR|= BIT4;
DQ1;
}
}
void Skip()
{
Write_18B20(0xcc);
}
void Convert()
{
Write_18B20(0x44);
}
void ReadDo()
temperature<<=8;
temperature |= temp_low;
Temper=temperature*0.0625;
}
void GetTemp()
{
Init();
Skip();
Convert();
delay(60000);
delay(60000);
_NOP();
_NOP();
while((P4IN&Busy)!=0);
CLR_EN;
P4DIR|=0xff;
}
void LcdReset()
{
CtrlDir|=0xFF; //控制线端口设为输出状态
DataDir=0xff; //数据线端口设为输出状态
#include "msP430x14x.h"
#define DQ1 P5OUT |= BIT4;
#define DQ0 P5OUT &=~ BIT4;
float Temper=0.0;
int temperature=0;
unsigned char Error=0;
typedef unsigned char uchar;
LcdWriteCommand(0x38,0);
LcdWriteCommand(0x38,0);
LcdWriteCommand(0x38,0);
LcdWriteCommand(0x38,1);
LcdWriteCommand(0x08,1);
LcdWriteCommand(0x01,1);
DQ1;
}
return temp;
}
void Init()
{
DQ0;
delay(50);
DQ1;
delay(17);
P4DIR &=~ BIT4;
if((P4IN&BIT4)==BIT4)
{
Error=1;
P4DIR |= BIT4;
DispStr(0x80+0x40+0x05,table1);
}
void delay(unsigned int n)
{
while(n--);
}
void Write_18B20(unsigned char n)
{
unsigned char i;
for(i=0;i<8;i++)
{
Write_18B20(0xbe);
}
void ReadTemp()
{
char temp_low,temp_high;
temp_low=Read_18B20();
temp_high=Read_18B20();
temperature=(temp_high&0x0f);
P5DIR |= BIT4;
DQ1;
while(1)
{
GetTemp();
LcdReset();
DispStr(0x80+0x01,s1);
Trans_val(Temper);
}
}
DataPort=cmd;
_NOP();
SET_EN;
_NOP();
_NOP();
CLRห้องสมุดไป่ตู้EN;
}
void WaitForEnable()
{
P4DIR&=0x00;
CLR_RS;
SET_RW;
_NOP();
SET_EN;
{
uchar *temp;
temp=ptr;
uint n=0;
LcdWriteCommand(x,0);
while(*ptr++!='\0') n++;
for(uint i=0;i<n;i++)
{
LcdWriteData(temp[i]);
y&=0x01;
if(y) temp|=0x40;
temp|=0x80;
}
*/
void LcdWriteCommand(uchar cmd,uchar chk)
{
if(chk) WaitForEnable();
CLR_RS;
CLR_RW;
_NOP();