求单片机读取热电偶测温数据的程序

求单片机读取热电偶测温数据的程序,第1张

热电偶电路如果设计好了的话,温度改变导致阻值改变。

进而改变惠斯通桥的平衡,从而在仪表放大器两个输入端形成电势差。

这个电势差会被放大给ADC(模拟/数字转换器)。

单片机要做的就是读出ADC的数据,然后将它计算成温度值而已。

;     

      怎么根据自己的病症,判断出患上哪类小病呢?比如感冒就有不同的感冒。有伤寒,热伤风,流感等引起的感冒。下面就交你一个小办法,做一下健康自检。

      1、首先要登录微信,在微信的发现里,点击进入小程序。

      2、进入小程序界面后,在小程序搜索栏里,输入测体温后点击搜索。

      3、搜索出测体温小程序后,点击进入。

      4、进入到测体温小程序界面后,点击开始记录。

      5、点击开始记录后,把体温温度对症在刻度线上,然后点击确认。

      6、确认以后,点击开始健康自检。

      7、点击健康自检后,按照上面的提示 *** 作,结合你的病症情况选择是或否。

      8、根据你的选择选项,测体温小程序,就会对症显示出病症存在的状况,以及相关的注意事项等。

/lcd1602显示温度(使用温度传感器18b20)/

#include<reg52h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

/液晶屏相关参数/

#define data_port P1 //液晶屏指令、数据通信接口

sbit rs=P2^0; //液晶屏寄存器选择接口(rs=0时选择指令寄存器,rs=1时选择数据寄存器)

sbit rw=P2^1; //液晶屏读写选择接口(rw=0时选择写入,rw=1时选择读出)

sbit en=P2^2; //液晶屏使能接口(en=0时通信接口中断,en=1时通信接口接通)

uchar code line1_str[]={" Temperature "};//液晶屏第一行要显示的字符串

uchar code num_tab[]={"0123456789"};

/温度传感器18b20相关参数/

sbit DQ=P3^5; //温度传感器18b20的数据接口

/子函数声明部分/

void T1_int(); //定时器T1初始化子函数声明

void in_command(uchar com); //向液晶屏输入命令子函数声明

void in_data(uchar dat); //向液晶屏输入数据子函数声明

void lcd_disp_string(uchar str[]); //液晶屏显示一串字符子函数声明

void lcd_int(); //液晶屏初始化子函数声明

void disp_temperature(uint temp);//lcd1602显示温度子函数声明

bit ds18b20_ret(); //温度传感器18b20复位子函数声明

void ds18b20_wr_com(uchar com); //向温度传感器18b20写入命令子函数声明

void rd_ram_command(); //发送命令子函数(读取18b20的RAM)

uint ds18b20_rd_data(); //读出温度传感器18b20寄存器的相关数据(主要是温度值)子函数声明

void temperature_convert(); //18b20温度转换子函数声明

void delayms(uint ms); //毫秒延时子函数声明

void delay_n10_us(uchar n); //微秒延时子函数声明

//

void main()

{

T1_int(); //定时器T1初始化

DQ=1; //释放温度传感器18b20的数据接口

temperature_convert(); //第一次调用18b20温度转换子函数消除85°C问题

lcd_int(); //液晶屏初始化(放在18b20温度转换子函数后边用来延时,跳过85°C)

while(1)

{

temperature_convert(); //调用18b20温度转换子函数

rd_ram_command(); //发送命令子函数(读取18b20的RAM)

disp_temperature(ds18b20_rd_data());//调用lcd1602显示温度子函数

}

}

/定时器T1初始化/

void T1_int()

{

TMOD=0x10; //0001 0000 T1工作在定时方式1

TH1=0; //T1设定初值

TL1=0;

TR1=0; //暂时关闭T1

}

/18b20温度转换子函数/

void temperature_convert()

{

while(ds18b20_ret()==0);//温度传感器18b20复位

ds18b20_wr_com(0xcc); //向温度传感器18b20写入"跳跃ROM命令"

ds18b20_wr_com(0x44); //向温度传感器18b20写入"温度转换命令"

delay_n10_us(50); //500us延时,等待转换完成

}

/发送命令子函数(读取18b20的RAM)/

void rd_ram_command()

{

while(ds18b20_ret()==0);

ds18b20_wr_com(0xcc); //向温度传感器18b20写入"跳跃ROM命令"

ds18b20_wr_com(0xbe); //向温度传感器18b20写入"读RAM命令"

}

/读出18b20寄存器的相关数据(主要是温度值)子函数/

uint ds18b20_rd_data()

{

uchar i;

uint temp_val;

for(i=0;i<16;i++)

{

temp_val>>=1;

DQ=0;

_nop_();

DQ=1;

_nop_();

_nop_();

if(DQ==1)

{

temp_val|=0x8000;

}

delay_n10_us(7); //70us延时,确保读出

}

return(temp_val);

}

/向温度传感器18b20写入命令子函数声明/

void ds18b20_wr_com(uchar com)

{

uchar i;

for(i=0;i<8;i++)

{

if((com&0x01)==0)

{

DQ=0;

delay_n10_us(7); //70us延时,确保写入0

DQ=1;

_nop_();

}

else

{

DQ=0;

_nop_();

DQ=1;

delay_n10_us(7); //70us延时,确保写入1

}

com>>=1;

}

}

/温度传感器18b20复位子函数/

bit ds18b20_ret()

{

uint temp; //暂存脉冲时间

DQ=0; //启动复位脉冲

delay_n10_us(50); //500us延时(大于480us)

DQ=1; //停止复位脉冲

TR1=1; //启动T1

while(DQ==1 && TH1256+TL1<=60);//等待18b20回应,等待时间不超过60us

if(DQ==0) //18b20回应

{

temp=TH1256+TL1;

while(TH1256+TL1-temp<40); //等待60us再次检测回应脉冲是否存在

if(DQ==0) //18b20正常回应

{

while(TH1256+TL1<=480);//等待正常复位完成

TR1=0; //关闭T1

TH1=0; //计时归零

TL1=0;

return(1); //18b20有正常回应返回1

}

else

{

TR1=0; //关闭T1

TH1=0; //计时归零

TL1=0;

return(0); //18b20有正常回应返回0

}

}

else

{

TR1=0; //关闭T1

TH1=0; //计时归零

TL1=0;

return(0); //18b20没有回应返回0

}

}

/lcd1602显示温度子函数声明/

void disp_temperature(uint temp)

{

uchar temp_h,temp_l,flag=0; //温度整数部分,小数部分(二进制)和最高位是否为'0'标志

uint temp_decimal=0; //存储温度值的小数部分(十进制)

in_command(0xc2); //设定第二行字符串起始显示位置

if(temp>=0x8000)

{

in_data('-'); //显示'-'号

temp=~temp;

temp+=1;

}

else

{

in_data(' '); //'+'号不显示

}

temp_h=temp/16;

temp_l=temp%16;

if(temp_h/100!=0)

{

flag=1;

in_data(num_tab[temp_h/100]); //显示温度值的百位

}

else

{

in_data(' '); //百位为'0'则百位不显示

}

temp_h%=100;

if(temp_h/10!=0 || flag==1)

{

flag=1;

in_data(num_tab[temp_h/10]); //显示温度值的十位

}

else

{

in_data(' '); //百位,十位都为'0'则十位不显示

}

temp_h%=10;

in_data(num_tab[temp_h]); //显示温度值的个位

in_data(''); //显示小数点

if(temp_l/8==1)

{temp_decimal+=5000;}

temp_l=temp_l%8;

if(temp_l/4==1)

{temp_decimal+=2500;}

temp_l=temp_l%4;

if(temp_l/2==1)

{temp_decimal+=1250;}

temp_l=temp_l%2;

if(temp_l==1)

{temp_decimal+=625;}

in_data(num_tab[temp_decimal/1000]);//显示温度值的十分位

in_data(' ');

in_data(223); //显示温度单位标志'摄氏度'

in_data('C');

}

/液晶屏初始化子函数/

void lcd_int()

{

/LCD初始设置/

delayms(15); //延时15MS,等待LCD初始化

in_command(0x01); //清显示屏

in_command(0x38); //8位通信,2行显示,57点阵

in_command(0x0c); //开显示,关光标,关闪烁

in_command(0x06); //字符不动,光标右移动,地址加一

/1602显示上电后电机默认的状态信息/

in_command(0x80); //设定第一行字符串起始显示位置

lcd_disp_string(line1_str); //显示数据(字符)

}

/液晶屏显示一串字符/

void lcd_disp_string(uchar str[])

{

uchar i=0;

while(str[i]!='\0')

{

in_data(str[i]); //显示数据(字符)

i++;

delayms(50); //延时

}

}

/向液晶屏输入命令子函数/

void in_command(uchar com)

{

delayms(2);

en=0;//关闭通信,为设置参数做准备

rs=0;//选择指令寄存器

rw=0;//写入液晶

_nop_();

data_port=com;

en=1;//开始通信

_nop_();

en=0;//关闭通信,为设置参数做准备

}

/向液晶屏输入数据子函数/

void in_data(uchar dat)

{

delayms(2);

en=0;//关闭通信,为设置参数做准备

rs=1;//选择数据寄存器

rw=0;//写入液晶

_nop_();

data_port=dat;

_nop_();

en=1;//开始通信

_nop_();

en=0;//关闭通信,为设置参数做准备

}

/微秒延时子函数/

void delay_n10_us(uchar n)

{

while(n--)

{

_nop_();

_nop_();

}

}

/毫秒延时子函数/

void delayms(uint ms)

{

uchar i;

while(ms--)

{

for(i=0;i<124;i++);

}

}

#include<reg52h> #include<mathh>

#include<INTRINSH>

#define uchar unsigned char

#define uint unsigned int;

//

/ 定义端口 /

//

sbit seg1=P2^0;

sbit seg2=P2^1;

sbit seg3=P2^2;

sbit DQ=P1^7;//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;

TL0=0xf0;

IE=0x82;

TR0=1;

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; // 取反加1

temp +=1;

}

else

str[0]=0;

TempH=temp>>4;

TempL=temp&0x0F;

TempL=TempL6/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++;

}

}

count++;

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); //精确延时 大于 480us

DQ = 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(0xCC); // 跳过读序号列号的 *** 作

WriteOneChar(0x44); // 启动温度转换

delay(200);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的 *** 作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar(); //低位

b=ReadOneChar(); //高位

b<<=8;

t=a+b;

return(t);

}

//LZ,这是测温并且用数码管显示程序,报警可以自己另行添加!主要程序就是这些!

()

极个别的手机可以测体温。但是大部分手机还不支持测试体温的功能。

一家科技公司开发出了世界上第一款智能手机专用的微型温度计传感器模块,这款传感器如果使用在智能手机上,再通过与App的结合,可以在05秒之内测量出人体的体温。这种温度计传感器模块使用了继承微电系统,也叫作i-MEMS,可以测量-40到200摄氏度之间的人类或物体温度。当然,传感器的使用方式也非常独特,不会让智能手机本身的温度影响测量结果。

当然,关于它最有趣的部分就是它使用了免接触技术。用户不用将智能手机贴到皮肤上就可以来测量体温。这样的设计有助于减少感染的风险,并且可以扩大有关应用程序的应用范围。

商务:

商务手机,顾名思义,就是以商务人士或就职于国家机关单位的人士作为目标用户群的手机产品。由于功能强大,商务手机倍受欢迎。业内专家指出:“一部好的商务手机,应该帮助用户既能实现快速而顺畅的沟通,又能高效地完成商务活动。”

影像:

虽然影像手机是手机的一种,但主要是主打影像功能的手机。世界上第一支相机手机,是由日本的夏普公司在2000年11月所制造的J-SH04。这支相机手机不出所料的使用了CMOS影像感光模组﹙简称CMOS﹚,原因是CMOS能够比当时数码相机所用的CCD影像感光模组更为省电。让手机的电池不因为加入了相机的使用而快速用尽。

二系统软件设计

图4 系统程序流程图

21 系统程序流程图

系统程序流程图如图4所示。

22 温度部分软件设计

DS18B20的一线工作协议流程是:初始化→ROM *** 作指令→存储器 *** 作指令→数据传输。其工作时序包括初始化时序、写时序和读时序。故主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的 *** 作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。程序主要函数部分如下:

(1)初始化函数

//读一个字节函数

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(4);}

return(dat);}

//写一个字节函数

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;}}

(2)读取温度并计算函数

ReadTemperature(void)

{unsigned char a=0;

unsigned char b=0;

unsigned int t=0;

float tt=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;

tt=t00625;

t= tt10+05; //放大10倍输出并四舍五入---此行没用

(3)主程序部分见前

return(t);}

三 结束语

AT89C2051单片机体积小、重量轻、抗干扰能力强、对环境要求不高、价格低廉、可靠性高、灵活性好。即使是非电子计算机专业人员,通过学习一些专业基础知识以后也能依靠自己的技术力量来开发所希望的单片机应用系统。本文的温度控制系统只是单片机广泛应用于各行各业中的一例,相信读者会依靠自己的聪明才智使单片机的应用更加广泛化。另外对本例子可以作一些扩展,单片机的应用越来越广泛,由于单片机的运算功能较差,往往需要借助计算机系统,因此单片机和PC机进行远程通信更具有实际意义。目前此设计已成功应用于钻井模拟器实验室室温控制。

本文作者创新观点:采用的单片机AT89C2051性价比高,而且温度传感器DS18B20转化温度的方法非常简洁且精度高、测试范围较广。

参考文献

[1]林伸茂8051单片机彻底研究基础篇 北京:人民邮电出版社 2004

[2]范风强等单片机语言C51应用实战集锦 北京:电子工业出版社 2005

[3]谭浩强C语言程序设计(第二版) 北京:清华大学出版社 1999

[4]夏路易等电路原理图与电路板设计教程 北京:北京希望电子出版社 2002

[5]赵晶Protel99高级应用 北京:人民邮电出版社 2000

[6]聂毅单片机定时器中断时间误差的分析及补偿[J] 微计算机信息 2002,18(4):37~38

以上就是关于求单片机读取热电偶测温数据的程序全部的内容,包括:求单片机读取热电偶测温数据的程序、如何用手机微信测体温、单片机ts18b20测温程序 请大神注释程序 最好每一句都注释明白(小白一只 只有15财富 全送好人)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9566646.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存