仿真通不過自己也找不出錯誤,用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();//計算溫度
}
}
} |