仿真通不过自己也找不出错误,用PT100做的数字温度计,ADC0808的基准电压为0.7V和5V,程序如下
#include <reg51.h>
#include <math.h>
#define uchar unsigned char
sbit START = P2^4; // 高电平时开始转换
sbit EOC = P2^6; // 转换标志位,高电平时标志转换结束。
sbit CLOCK = P2^5; // 单片机输出脉冲信号作为转换器的工作频率
sbit OE = P2^7; // 输出使能 高电平标志转换结束可以开始输出
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
uchar getdata;
double change;
long int temp;
uchar dispbuf[6];
uchar code table1[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//无小数点0~9
uchar code table2[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点0~9
void TimeInitial()
{
TMOD = 0x10;//定时器1选择2^16
TH1 = (65536-200)%256;
EA = 1;
ET1 = 1;
TR1 = 1;//开定时器
}
void Delay(uchar i)
{
unsigned int j;
for(;i>0;i--){
for(j = 0;j<125;j++){
;}
}
}
void t1(void) interrupt 3 using 0//选用0组工作寄存器
{
TH1 = (65536-200)/256;
TL1 = (65536-200)%256;
CLOCK = ~CLOCK;//取反,0.2ms给ADC0808 一个时钟脉冲
}
void Display()//数码管显示程序
{
P0 = table1[dispbuf[3]];//显示百位
P20 = 0;
P21 = 1;
P22 = 1;
P23 = 1;
Delay(8);
P0 = 0x00;
P0 = table1[dispbuf[2]];//显示十位
P20 = 1;
P21 = 0;
P22 = 1;
P23 = 1;
Delay(8);
P0 = 0x00;
P0 = table2[dispbuf[1]];//显示个位
P20 = 1;
P21 = 1;
P22 = 0;
P23 = 1;
Delay(8);
P0 = 0x00;
P0 = table1[dispbuf[0]];//显示小数位
P20 = 1;
P21 = 1;
P22 = 1;
P23 = 0;
Delay(8);
P0 = 0x00;
}
void PT100(){
double PR,aveT,aT,deal,U,aR; //电阻值 ,温度对电阻的变化量,温度变化量,结果,电压,电阻变化量
U = 4.3/255.0*getdata; //计算某一刻电压值
aR = (4.3/255*getdata)/(4.3/142.29); //计算某一刻电阻值
PR = 149.29-aR; //计算电阻变化量,110度阻值为142.29
aveT = 42.29/110.0; //一度等于42.29/110欧姆
aT = PR/aveT; //温度变化量
deal = 10*(110.0-aT); //所得温度×10
temp = (long int)deal; //最终温度取整(实际值乘十倍)
if(U<5&&U>3.56){//计算-50~0的温度
aveT = (100.0-80.31)/50;
PR = 100.0-aR;
aT = 10*(PR/aveT);
temp = (long int)aT;
dispbuf[0] = temp%10;//计算小数位
dispbuf[1] = temp/10%10;//计算个位
dispbuf[2] = temp/100%10;//计算十位
dispbuf[3] = temp%10;//显示符号
}
else{
dispbuf[0] = temp%10;
dispbuf[1] = temp/10%10;
dispbuf[2] = temp/100%10;
dispbuf[3] = temp/1000%10;//百位
}
Display();
}
void main(void)
{
TimeInitial();
while(1){
START = 0;//关闭转换
OE = 0;//关闭输出
START = 1;//开始转换
START = 0;//开始输出
while(EOC==0){
OE = 1;//开启数据输出允许
Delay(10);//延时
getdata = P1;//模数转换后的值给getdata
OE = 0;
PT100();//计算温度
}
}
} |