PT100通过电阻连接到PIC单片机的AD口
程序思路:单片机采集PT100送过来的模拟信号,经内部AD转换,输出电压值,根据串联分压原理,计算PT100的阻值,根据查找表,找出对应温度
存在问题:用可调电位器模拟时,输出随调节进行变化;用PT100时,置于室温和开水中,温度不变化
麻烦各位帮忙解决
程序如下
#include<pic.h> //包含单片机内部资源预定义
#include<pic168xa.h> //包含877A的头文件
#include"PT100.h"
__CONFIG(0x373A);
//代码保护关,使能在线调试,写保护关断,E2PROM代码保护关,RB3数字IO(低压编程关),BOR不用,上电延时开,看门狗关,4M晶体HS振荡,掉电检测关,
void delay(uchar);
void init();
double get_tem();
void display(double);
void main()
{
double temp;
init();
while(1)
{
temp=get_tem();
display(temp);
}
}
//初始化函数
void init()
{
PORTA=0X00;
PORTD=0X00; //熄灭所有显示
TRISA=0X01; //设置RA0为输入,其他为输出
TRISD=0X00; //设置D口全为输出
ADCON1=0X8E; //转换结果左对齐,RA0做模拟输入口,其它做普通I/O
ADCON0=0X41; //系统时钟Fosc/8,选择RA0通道,允许ADC工作
delay(20); //保证采样延时
}
//获取AD值
double get_tem()
{
double result=0x00;
uint num;
double voltage;
ADGO=0x1; //开启转换过程
while(ADGO);//等待转换结束
num=ADRESL;
num|=ADRESH<<8;
voltage=(double)num/ADMAX*VCC;
result=(voltage*REF)/(VCC-voltage);
return (result);
}
//结果显示函数
void display(double num)
{
uchar sign,bai,shi,ge;
uint i,x;
uint temp=0;
uchar cnt;
double n1;
num = (double)((int)((num * 100) + 0.5)) / 100;//对原始数据进行四舍五入并取小数点后两位
//查找电阻值在列表中所对应的坐标值,并将坐标值转换成温度值
for(i=0;i<150;i++)
{
if(num==temp_table)
{
x=i;
break;
}
else if((num>temp_table)&&(num<temp_table[i+1]))
{
n1=(temp_table+temp_table[i+1])/2.0;
if(num>n1)
{
x=i+1;
break;
}
else
{
x=i;
break;
}
}
}
temp=x;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
for(cnt=10;cnt>0;cnt--)
{
PORTD=table[bai]; //显示百位
PORTA=0x37;
delay(10);
PORTD=table[shi]; //显示个位
PORTA=0x2F;
delay(10);
PORTD=table[ge]; //显示个ge位
PORTA=0x1F;
delay(10);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>