温度传感器程序:51单片机驱动DS18B20温度传感器程序及心得
关于DS18B20温度传感器,在没有硬件设备的辅助下,写内部程序有些困难,因为看不到实际信号波形。对于单片机,我。。。渐渐的有些心灰意冷。。虽然掌握了1_WIRE总线,却少了很多喜悦,下雨了。。。它是我的爱好,我付出了很多,可是我看不到实际的前景。。以我个人之力,要步入尖端芯片领域,很困难,在这里,采棉花是个普遍性的大问题,大型机械设备缺陷很多,如果以微控制芯片提高精度,我想效益会相当可观,可是技术瓶颈难以逾越。。。硬件研发,失败了,所有投入赴之东流,成功了,回报丰厚。现在,各行各业都处于饱和,没有成熟先进的技术,很难有立足之地,,,,,我开始重新审视我的选择。。。。。。艰难。。
#include
typedef unsigned char uint8 ;
typedef unsigned int uint16;
sbit wd=P3^2; //定义数据单总线;
sbit e=P1^5; // 定义1602液晶显示器数据使能端口;
sbit rs=P1^0; // 定义数据/指令选择端口;
sbit rw=P1^1; // 定义 读/写 选择端口;
sbit BF=P0^7; // 定义繁忙位;
bit w=0; //定义一个全局一位变量;
//===========1602液晶显示器模块;===============
busy() //液晶屏繁忙检测函数;
{ e=0;
rs=0;
rw=0;
P0=0xff;
do
{ e=0; //使能位清零;
rs=0; //指令;
rw=1; //读;
e=1; //数据传输启动;
}while(BF); //如果BF==0;则液晶处于空闲状态;
e=0;
}
play_data(uint8 wr) //液晶写入数据;
{
busy(); //繁忙检测;
P0=wr; //装载数据;
rs=1; //数据;
rw=0; //写入;
e=1; //传输开始;
e=0; //传输结束;
}
play_cmd(uint8 cmd) //液晶写入指令;
{
busy(); //繁忙检测;
P0=cmd; //装载数据;
rs=0; //指令;
rw=0; //写入;
e=1; //传输开始;
e=0; //传输结束;
}
reset_1602() //1602液晶显示器初始化函数;
{
play_cmd(0x38);
play_cmd(0x0c);
play_cmd(0x06);
play_cmd(0x01);
}
//=========温度传感器延时模块============================
// sbit led=P1^0;
delay(uint8 num ) //如果unm等于1;延时16.28微妙;
{
while(num--); //如果num大于一,则16.28+(num-1)*6.51.
}
delay2() //此函数延时3.26微秒;
{
uint8 j=0;
j=9;
}
delay3()
{
uint16 s=;
while(s--);
}
reset_1820() //========复位温度传感器;========
{
while(wd)
{
wd=1;
delay(140); //拉高总线,延时大概921微妙左右;(延时值自定);
wd=0; //总线由单片机拉低,下为延时函数,大概800微秒左右;
delay(61); //1个此函数会延时400微妙左右;
delay(61); //两个是800微妙左右;
wd=1; //主机拉高总线,68微秒左右;
delay(9); //延时68微妙左右
if(wd==0) //如果wd是0就终止复位;(代表复位成功);
{
while(wd==0); //总线一旦为低,那么就等待从机再将总线拉高.
break; //终止while循环;(reset function end)
}
else
{
wd=1;
delay(20); //延时140微妙;
}
}
delay(30); //此时总线为高电平并延时205微妙,复位成功!;
// if(wd)led=0;//此语句为检验是否复位成功;P1^0外接9012三极管接led小灯;
}
write_byte(uint8 dat)
{
uint8 i=0;
for(i=0;i<8;i++) { wd=0; //A点; delay2(); //延时 wd=dat & 0x01; dat>>=1;
delay(6); //A点到此处用时65.11微秒;
wd=1; //总线释放;
delay2(); //延时3.26微秒;
}
} //========此函数执行完成之后总线为高电平;
uint8 read_byte() //=====读8位数据;===================
{
uint8 j=0, dat=0;
for(j=0;j<8;j++)
{
dat>>=1;
wd=0; // A点 mcu拉低电平3.26微秒;
delay2(); // 延时3.26微秒;
wd=1;
if(wd)
{
dat|=0x80;
} //读完数据后A点到此处是11.93微秒,保持在15微秒之内;
delay(9); // A点到此处80.29微秒; 理想时间范围是60--120微秒;
wd=1; //释放总线;
delay2(); //延时3.26微秒;
}
return dat;
}
start_sensor() //启动传感器;
{
reset_1820();
write_byte(0xcc); //跳跃命令;
write_byte(0x44); //转换temperature(温度)命令;
}
uint8 read_temp() //从温度传感器度温度数据过程;
{
uint8 ak[2];
uint16 dat=0 , j=0;
reset_1820(); //复位温度传感器
write_byte(0xcc); //跳跃rom命令;
write_byte(0xbe) ; // 发出读数据命令;
ak[0]=read_byte(); //读取第一个字节数据;
ak[1]=read_byte(); //读取第二个字节数据;
dat=ak[1]; //要把两个八位数据载入1个16位变量里;
dat<<=8;
dat|=ak[0];
j=dat;
//==========以下是把温度传感器内部数据编译成16进制编码;
if((j>>11)==0x1f) //此语句是负温度进入.0x1f是二进制5个全1;
{
dat=(~dat)+1; //负温度要取反加一操作;
dat/=16; //传感器给的温度系数要除以16后,得到的数才是常规温度系数;
w=0; //此语句是在主函数中用来判断是正温度还是负温度;
return dat; //向主函数返回数据,并终止函数;
}
j=dat;
if((j>>11)==0) //如果是零则是正温度;
{
dat/=16; //数据直接除以16,就得到了常规温度系数;
w=1; //1代表正;
return dat; //向主函数返回数据,并终止函数;
}
return 130; //向主函数返回数据,并终止函数;
}
delay_ms() //延时1秒;
{
uint8 i=250;
uint16 j=608;
while(j--)
{ while(i--);
i=250;
}
}
error() //测温出错;
{
uint8 i=5, j=0 ,ak[]="Error!";
while(i--)
{
play_cmd(0x82);
while(ak[j]!='\0')
{
play_data(ak[j++]);
} j=0;
delay3();
play_cmd(0x01);
delay3();
}
}
main()
{
uint8 dat=0 ,j=3,len=0 ,num[]="start.....";
reset_1602();
while(j--) //这是启动电源时,液晶显示:start....(并闪烁3次)
{ play_cmd(0x82);
while(num[len]!='\0')
{
play_data(num[len++]);
}
len=0;
delay3();
play_cmd(0x01);
delay3();
}
while(1)
{
start_sensor(); //启动温度传感器;
delay_ms(); //等待1秒;
dat=read_temp(); //读取温度数据并赋给dat变量;
if(dat==130) //如果返回来的数据是130,表明采集温度出错;
{
error();
}
else if(w==1) //如果w是1,就代表正温度.输出;
{
play_cmd(0x83);
play_data(dat/10+'0');
play_data(dat%10+'0');
}
else //否则,就是负温度,输出时前面加一个负号;
{
play_cmd(0x82);
play_data('-');
play_data(dat/10+'0');
play_data(dat%10+'0');
}
} //我的亲娘四舅奶奶啊!!!!!!终于完成了!!!!2013年5月9日19:32:10
}
温度传感器程序:温度传感器c程序
DS18B20温度显示演示程序-LCD1602显示
采用C语言编写
开机时对DS18B20进行检测,如果DS18B20检测不正常,LCD1602显示:
DS18B20 ERROR
PLEASE CHECK
蜂鸣器报警。
DS18B20检测正常,LCD1602显示:
DS18B20 OK
TEMP: 100.8℃
如果温度值高位为0,将不显示出来。
你可以通过拔插DS18B20查看DS18B20的检测功能。
#include < reg51.h >
#include < intrins.h >
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^3 ; //定义DS18B20端口DQ
sbit BEEP=P3^7 ; //蜂鸣器驱动线
bit presence ;
sbit LCD_RS=P2^0 ;
sbit LCD_RW=P2^1 ;
sbit LCD_EN=P2^2 ;
uchar code cdis1[ ]={" DS18B20 OK "} ;
uchar code cdis2[ ]={" TEMP: . C "} ;
uchar code cdis3[ ]={" DS18B20 ERR0R "} ;
uchar code cdis4[ ]={" PLEASE CHECK "} ;
unsigned char data temp_data[2]={0x00,0x00} ;
unsigned char data display[5]={0x00,0x00,0x00,0x00,0x00} ;
unsigned char code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
void beep() ;
unsigned char code mytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
void delay1(int ms)
{
unsigned char y ;
while(ms--)
{
for(y=0 ; y<250 ; y++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
bit lcd_busy()
{
bit result ;
LCD_RS=0 ;
LCD_RW=1 ;
LCD_EN=1 ;
delayNOP() ;
result=(bit)(P0&0x80) ;
LCD_EN=0 ;
return(result) ;
}
void lcd_wcmd(uchar cmd)
{
while(lcd_busy()) ;
LCD_RS=0 ;
LCD_RW=0 ;
LCD_EN=0 ;
_nop_() ;
_nop_() ;
P0=cmd ;
delayNOP() ;
LCD_EN=1 ;
delayNOP() ;
LCD_EN=0 ;
}
void lcd_wdat(uchar dat)
{
while(lcd_busy()) ;
LCD_RS=1 ;
LCD_RW=0 ;
LCD_EN=0 ;
P0=dat ;
delayNOP() ;
LCD_EN=1 ;
delayNOP() ;
LCD_EN=0 ;
}
void lcd_init()
{
delay1(15) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据
delay1(5) ;
lcd_wcmd(0x38) ;
delay1(5) ;
lcd_wcmd(0x38) ;
delay1(5) ;
lcd_wcmd(0x0c) ; //显示开,关光标
delay1(5) ;
lcd_wcmd(0x06) ; //移动光标
delay1(5) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
delay1(5) ;
}
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量
}
温度传感器程序:温度传感器程序编写
#include
#define uchar unsigned char
#define uint unsigned int
sbit led=P2^5;
sbit wei=P2^7;
sbit duan=P2^6;
sbit DQ=P2^2;
uchar mazhi_duan[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
uchar mazhi_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff};
void delayl(uint n)
{
uint i,j;
for(i=n;i>0;i--)
for(j=114;j>0;j--);
}
void delays(uchar i)
{
while(i--);
}
bit init_DS18B20() //DS8B20初始化
{
bit x;
DQ=1; //DQ复位
delays(8);
DQ=0; //单片机将DQ拉低
delays(75);
DQ=1; //拉高总线
delays(15);
x=DQ; //延时过后 若x=0则初始化成功 若x=1则初始化失败
delays(5);
return x;
}
void write_data(uchar dat)
{
uchar i,temp;
temp=dat;
DQ=1;
for(i=0;i>=1;
}
}
uchar read_data()
{
uchar i,dat;
DQ=1;
for(i=0;i>=1;
DQ=1;//配置为输入
if(DQ)
dat|=0x80;
delays(4);
}
return dat;
}
uint readtemp()
{
uchar temph,templ;
uint temp;
float wendu;
init_DS18B20();
write_data(0xcc);//跳过ROM
write_data(0x44);//启动温度转换
//delayl(100);
init_DS18B20();
write_data(0xcc);//跳过ROM
write_data(0xBE);//读温度
//以下读温度,低八位在前
//高8位在后
templ=read_data();
temph=read_data();
temp=(temph<<8)|templ;
wendu=temp*0.625+0.5;//温度扩大10倍,四舍五入
temp=wendu;//10倍温度
return temp;
}
void STC_init()
{
P1=0x00;//关闭led
led=0; //锁存
wei=0;
duan=0;
}
void display(uchar weil,uchar duanl,bit dp)
{
wei=1;
P0=mazhi_wei[weil-1];
wei=0;
duan=1;
if(dp==1)
P0=(mazhi_duan[duanl]|0x80);
else
P0=mazhi_duan[duanl];
duan=0;
}
void main()
{
uchar i;
uint wendu;
STC_init();
wendu=readtemp();
delayl(500);
wendu=readtemp();
delayl(500);
while(1)
{
wendu=readtemp();
for(i=0;i<80;i++)
{
display(1,wendu/100,0);
delayl(3);
display(2,wendu0/10,1);
delayl(3);
display(3,wendu,0);
delayl(3);
}
}
}
温度传感器程序:这个温度传感器 可以让你的电路和程序都变简单
想给你的产品中加入显示环境温度的功能?
大众所熟悉的,是给电路中加入热敏电阻或者DS18B20。
热敏电阻
热敏电阻的阻值,随温度的变化而变化,每一种型号的热敏电阻,厂家都会提供它的阻值和温度的对应关系表格。我们计算温度的程序,一般是用查表法或者区间线性法。不管是哪种方法,都会存才误差,程序也稍微复杂一些。
使用热敏电阻测量温度,优点是便宜,一个热敏电阻不到一毛钱,缺点是程序可能要复杂一些。
DS18B20
DS18B20有三个引脚,一个GND,一个VCC,剩下一个是数据引脚,通过一定的时序来获得温度数据,单凭一个引脚做数据输出,程序就会更复杂一些,一般通过单片机的引脚作为GPIO模拟时序,当单片机有其他中断发生时,如果打断了读数据的时序,尤其是当其它中断耗时多一点时,读出的数据就会不准确。
DS18B20是一款数字温度传感器。优点是精确度误差只有0.5℃,缺点是程序复杂,价格贵,一个DS18B20要5元左右。
老顽童今天给群众们介绍的温度传感器型号为:TC1047
TC1047的一个引脚是GND,一个引脚是VCC(3.3V和5V都可以),剩下的一个引脚是电压输出引脚。输出的电压和温度成正比,温度=(电压-500mV)÷10,测温范围-40℃~125℃。
看到了吧,就是这么简单。只需要用单片机的ADC测个电压,再通过一个简单的公式(温度=(电压-500mV)÷10)就可以得到温度了。
例如,测得的电压是712mV,那么温度=(712-500)÷10=21.2℃
用它设计出来的电路,非常简单,占电路板的体积也非常小。
它的精确度误差是±2℃,相比DS18B20,精确度差点,但是和热敏电阻比,误差还是可以的。
好了,今天给你介绍的芯片是否对你的设计有所帮助呢?
科技老顽童,电子设计经验分享第一人,欢迎关注。
您可能感兴趣的文章
- iepe传感器:IEPE (集成电路型压电式传感器)
- 奥迪a6氧传感器:奥迪a6前氧传感器
- 国外传感器:别再虚谈人工智能了:只有传感器,才更接近智能的真相
- 传感器校验:传感器校准
- 红外二氧化碳传感器:0755-83680810 / 83680830
- 北京称重传感器:传力称重传感器
- 燃气传感器:MEMS燃气传感器模组
- acc传感器:ACC(自适应巡航控制系统)操作设定及传感器校准
- 氧化氮传感器:一氧化氮传感器(NO传感器)(NO/CF-100)
- 气囊传感器在哪:安全气囊传感器有哪些?
- 进口传感器:世界传感器品牌排行榜
- 高温湿度传感器:KZWS/GW高温型温湿度传感器
- 北斗星扭矩传感器:【图】北斗星转向助力故障EPS灯亮扭矩传感器调整修复(方向盘宜歪)
评论已关闭!