怎样将PT100将AD转换成温度,算法不会,所以精度太大
#include <reg51.h>
#include<intrins.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
uchar code str1[]={"Temper" } ;
uchar code str2[]={" " } ;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
sbit CS=P2^4;
sbit CLK=P2^5;
sbit DIDO=P2^7;
sbit be=P3^4;
sbit jdq=P3^3;
sbit led1=P3^5;
sbit led2=P3^6;
uchar flag,num,count,k1num,k2num,
k3num,k4num,a,b,c,d,e,f;
char tempmax,tempmin;//设定的温度
uchar dat;
long int temp;
double deal,U ;//电阻值,温度对电阻的变化量(Q
//延时函数
void delay(uint z)
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<114;y++);}
//蜂鸣器子程序
void di()
{
be=0;delay(100);be=1;}
// 忙碌
bit lcd_busy(void)
{
bit result;
lcdrs=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
lcdrw=1;
lcden=1; //E=1,才允许读写
_nop_();//空操作
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
result=(bit)(P0&0x80); //将忙碌标志电平赋给result
lcden=0;//将E恢复低电平
return result;
}
//写命令函数
void write_com(uchar com)
{
while( lcd_busy());
lcdrs=0;lcdrw=0;lcden=0;
_nop_();_nop_();
P0=com;delay(5);
lcden=1;delay(5);
lcden=0;}
//写数据函数
void write_date(uchar date)
{
while( lcd_busy());
lcdrs=1;
lcdrw=0;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//LCD1602显示函数
void lcd1602_display(uchar *p,uchar*q)
{
write_com(0x80+0x40);
while(*p!='\0')
{
write_date(*p);
p++;
delay(1);
}
write_com(0x80+0x48);
while(*q!='\0')
{
write_date(*q);
q++;
delay(1);
}
}
//D0832初始话显示 ///////////////////////
void Init_AD0808()
{
lcd_init();
lcd1602_display(str1,str2);
} ///////////////
void delay_ADC(uint i)
{
while(i--);
} ///////////////////
uchar ADC0808()
{
uchar i;
CS=1;delay_ADC(5) ;
CLK =1; delay_ADC(5) ;
CS = 0;
DIDO = 1;CLK = 0; delay_ADC(5) ;
CLK =1; DIDO =1; delay_ADC(5) ;
CLK = 0; CLK = 1; delay_ADC(5) ;
DIDO = 0; CLK = 0; delay_ADC(5) ;
CLK = 1;DIDO =1; delay_ADC(5) ;
for(i = 0; i< 8; i++)
{
CLK = 0; delay_ADC(5) ;
if(DIDO) dat |=0x01;
CLK =1;
dat <<= 1; delay_ADC(5) ;
U=5.0/255.0*dat;
deal=10.0*59.9*U;
temp=(long int)deal;
tempmax=temp/10;tempmin=temp/10;
}
return temp;
CS= 1;
}
//AD 转换
void AD0808_display()
{
disdata[0]=temp/1000+0x30;//百位数
disdata[1]=temp/100%10+0x30;//十位数
disdata[2]=temp/10%10+'0';//个位数
disdata[3]=temp%10+0x30;//小数位
if(disdata[0]==0x30)
{
disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{
disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
write_com(0x80+0x49);
write_date(disdata[0]);//显示百位
write_com(0x80+0x4a);
write_date(disdata[1]);//显示十位
write_com(0x80+0x4b);
write_date(disdata[2]);//显示个位
write_com(0x80+0x4c);
write_date(0x2e);//显示小数点
write_com(0x80+0x4d);
write_date(disdata[3]);//显示小数位
if((tempmax>290)||(tempmin<30))
{jdq=0;be=~be;led2=0;delay(50);}
else
{led2=1;}
}
//主函数
void main()
{
TMOD=0x01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
EA=1;
ET0=1;
TR0=1;
lcd_init();
Init_AD0808();
write_com(0x80);
while(1)
{
ADC0808();
AD0808_display();
tempmax = temp/10;
}
}
|