#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Cv 16777215.0 //24bit
unsigned long start =8385925; //传感器初值
#define GAIN 64.0 //增益
#define Rs 10000 //电阻 上
#define Rx 100 // 电阻 下
sbit ADDO = P2^1;
sbit ADSK = P2^0;
sbit lcden=P3^4; //液晶使能口
sbit lcdrs=P3^5; //数据命令选择端
sbit rw=P3^6; //读写选择端
sbit dula = P2^6;
sbit wela = P2^7;
unsigned long ReadCount(void);
////===========数表=================//
//unsigned char code table[]=
//{ 0x3f,0x06,0x5b,0x4f,
// 0x66,0x6d,0x7d,0x07,
// 0x7f,0x6f,0x77,0x7c,
// 0x39,0x5e,0x79,0x71,
// 0x00};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
rw=0; //写指令
P0=com; //指令码
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
rw=0; //写数据
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //初始化
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);//设置指令
write_com(0x0e);//显示开/关及光标设置
write_com(0x06);
write_com(0x01);//清屏
write_com(0x80);//数据指针 (0x80)左;(0x80+0x10)右
}
//void jzzh() //获取的24bit数据 转换为三个8 bit
//{
// v_table[0]=(ReadCount()&0xff0000)>>16;
// v_table[1]=(ReadCount()&0x00ff00)>>8;
// v_table[2]=(ReadCount()&0x0000ff);
//}
////******************************************//
// 转换结果计算 //
//******************************************//
float Result_Calculate(void) //最大返回148.97225
{
float temp=0;
float result=0; //定义一个浮点型 -1.7*10(-308)~1.7*10(308)
temp = (float)ReadCount();
result = temp/1024*4.3;
return result;
}
//*************PT100阻值计算*****************************//
float PT100_Calculate(void) //
{
float temp=0;
float result=0; //定义一个浮点型 -1.7*10(-308)~1.7*10(308)
temp = (float)(Result_Calculate()/32/10);
result = temp/4.3;
result=result+(97.125/(9980.0+97.125));
result=(result*9980.0)/(1-result);
return result;
}
//double Result_Calculate(void) //温度推算
//{
//// double resol=0;//分辨率
// double temp=0;
// double result=0; //4.21定义一个浮点型 -1.7*10(-308)~1.7*10(308)
// temp=(double)ReadCount();
// result = temp/16.95;
//// result =resol*1.265 ;
// return result;
//}
/*****************计算温度函数*******************/
float temperature(unsigned long ff)
{
float temp1,T_out;
uchar temp2;
temp1=PT100_Calculate(); //计算Pt100阻值
temp2=(uchar)temp1; //取Pt100阻值高位
if(temp2<100)
T_out=777; //若阻值在小于0℃之间
else if(temp2<139)
T_out=2.558*temp1-256.02; //若阻值在0~100℃之间
else if(temp2<177)
T_out=2.637*temp1-267.01; //若阻值在100~200℃之间
else if(temp2<214)
T_out=2.721*temp1-281.9; //若阻值在200~300℃之间
else if(temp2<250)
T_out=2.81*temp1-300.94; //若阻值在300~400℃之间
else if(temp2>250)
T_out=777; //若阻值在大于400℃之间
return(T_out);
}
void shu_dis()
{
uint value=0;
uint mvalue=0;
uint wd=0;
int a=0;
unsigned long ldata=0;
ldata=ReadCount(); //AD转换数据
value=PT100_Calculate()*100; //计算阻值
mvalue=Result_Calculate()/32*10000; // 计算电压值*100)
wd = (uint)(temperature(ldata)*10);
write_com(0x80); //显示位置 第一行第一个点
write_data((ldata/1000000%10)+0x30);
write_data((ldata/100000%10)+0x30);
write_data((ldata/10000%10)+0x30);
write_data((ldata/1000%10)+0x30);
write_data((ldata/100%10)+0x30);
write_data((ldata/10%10)+0x30);
write_data((ldata%10)+0x30);
write_data(' ');
write_data((mvalue/1000%10)+0x30);
write_data('.');
write_data((mvalue/100%10)+0x30);
write_data((mvalue/10%10)+0x30);
write_data((mvalue%10)+0x30);
write_data('m');
write_data('v');
write_com(0x80+0x40); //显示位置 第一行第一个点
write_data((value/10000%10)+0x30);
write_data((value/1000%10)+0x30);
write_data((value/100%10)+0x30);
write_data('.');
write_data((value/10%10)+0x30);
write_data((value%10)+0x30);
write_data('R');
write_data(' ');
write_data((wd/1000%10)+0x30);
write_data((wd/100%10)+0x30);
write_data((wd/10%10)+0x30);
write_data('.');
write_data((wd%10)+0x30);
write_data('C');
}
void main()
{
init();
while(1)
{
shu_dis();
}
}
/**************************************************************
24bit HX711 参考驱动程序( C ) 优质人生 2010/11
在 C 中调用 : extern unsigned long ReadAD(void);
.
.
unsigned long data;
data=ReadAD();
.
.
-------------------------------------------------------------*/
unsigned long ReadCount(void)
{
unsigned long Count=0;
unsigned char i,j=0;
int a=0;
unsigned long num=0;
ADSK=0; // 使能 AD ( PD_SCK 置低)
Count=0;
while((ADDO)&&(j==251)) j++; //AD 转换未结束则等待,否则开始读取
for (i=0;i<24;i++)
{
ADSK=1; //PD_SCK 置高(发送脉冲)
Count=Count<<1; // 下降沿来时变量 Count 左移一位,右侧补零
ADSK=0; //PD_SCK 置低
if(ADDO) Count++;
}
ADSK=1;_nop_();ADSK=0;
// ADSK=1;ADSK=0;
ADSK=1;
Count=Count^0x800000;// 第 26 个脉冲下降沿来时,转换数据 采用读取通道B方式
ADSK=0;
// return(Count);
// Count=Count&0XFFF;
// start=start&0XFFF; //去掉数据的十进制的后两位
num=Count-start;
for(a=0;a<2;a++)
{
num+=num;
delay(310);
}
return(num/4);
}
51单片机PT100温度检测程序
5星 · 超过95%的资源 需积分: 50 106 浏览量
2018-07-15
14:57:51
上传
评论 12
收藏 43KB ZIP 举报
玩点模块
- 粉丝: 2
- 资源: 1
最新资源
- DH 应急 餐馆商铺宾馆娱乐场所安消融合解决方案配置清单 V1.0.rar
- 《基于深度学习的推荐系统》源码(大创项目).zip
- ARK-2150L应急环境监测应用.rar
- 拉丝金属-上盖使用波浪纹理.blend
- share_344428a8f0cdf5752fc9cebc9885d93a.mp4
- 根据全国城市首字母 排列索引列表(json数据)
- 内网渗透实战——红日ATT&CK系列靶场(一)学习笔记_红日靶场1攻略-CSDN博客.html
- siap300 RE 串口日志
- openpose-models,覆盖openpose/models下面的文件
- 旅行商问题(英语:Travelling salesman problem, TSP)是一个经典的组合优化问题,可以描述为:给定一
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈