大二時候做的熱敏電阻溫度傳感器有需要的了解一下;
多多指教
需要的原件清單:
源程序:
//程序頭函數
#include <reg52.h>
#include<intrins.h>
//宏定義
#define uint unsigned int
#define uchar unsigned char
#define Data_ADC0809 P1 //定義P1為Data_ADC0809
//管腳聲明
//ADC0832
sbit SCL=P1^1;
sbit DO=P1^2;
sbit CS=P1^4;
//顯示數組 H, L, -
uchar Data_[]={
0x5F,/*0*/
0x44,/*1*/
0x9D,/*2*/
0xD5,/*3*/
0xC6,/*4*/
0xD3,/*5*/
0xDB,/*6*/
0x45,/*7*/
0xDF,/*8*/
0xD7,/*9*/
0xCE,/*H*/
0x1A,/*L*/
0x80,/*-*/
};
uchar code Data_T[]={//AD數值對應的溫度
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*0-11*///此范圍內為無效值,讀到的數據顯示為---7
0x89,0x88,0x87,0x86,0x85,0x84,0x83,0x82,0x81,/*12-20*/ //此范圍內為負溫度值-9~-1
0,1,2,3,4,5,6,6,7,8, /*21-30*/ //以下為正溫度0-111
9,9,10,11,11,12,13,13,14,15, /*31-40*/
15,16,17,17,18,18,19,19,20,21,/*41-50*/
21,22,22,23,23,24,24,25,25,26, /*51-60*/
26,27,27,28,28,29,29,30,30,30, /*61-70*/
31,31,32,32,33,33,33,34,34,35, /*71-80*/
35,36,36,36,37,37,38,38,39,39, /*81-90*/
39,40,40,41,41,42,42,42,43,43, /*91-100*/
44,44,44,45,45,46,46,47,47,47, /*101-110*/
48,48,49,49,49,50,50,51,51,51, /*111-120*/
52,52,53,53,54,54,54,55,55,56, /*121-130*/
56,57,57,57,58,58,59,59,60,60, /*131-140*/
60,61,61,62,62,63,63,64,64,65, /*141-150*/
65,65,66,66,67,67,68,68,69,69, /*151-160*/
70,70,71,71,72,72,73,73,74,74, /*161-170*/
75,75,76,76,77,78,78,79,79,80, /*171-180*/
80,81,82,82,83,83,84,85,85,86, /*181-190*/
87,87,88,89,89,90,91,91,92,93, /*191-200*/
94,94,95,96,97,98,99,99,100,101,/*201-210*/
102,103,104,105,106,107,108,109,110,111 /*211-220*/
};
sbit Wei1 = P2^4;
sbit Wei2 = P2^5;
sbit Wei3 = P2^6;
sbit Wei4 = P2^7; //數碼管的位選
//函數聲明
void Display(uchar Data);
uint temp,temp1; //溫度值變量
uchar p; //讀取五十次ad值for循環
unsigned char ADC_Read(bit SGL,bit ODD)
{
unsigned char i=0,value=0,value1=0;
SCL=0;
DO=1;
CS=0;
SCL=1;
SCL=0;
DO=SGL;
SCL=1;
SCL=0;
DO=ODD;
SCL=1;
SCL=0;
DO=1;
for(i=0;i<8;i++)
{
SCL=1;
SCL=0;
value<<=1;
if(DO)
value++;
}
for(i=0;i<8;i++)
{
value1>>=1;
if(DO)
value1+=0x80;
SCL=1;
SCL=0;
}
CS=1;
SCL=1;
if(value==value1)
return value;
return 0;
}
//延時
void delay(uint t) //大約延時25us,不精確
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
void main() //主函數
{
uchar i;
uint pp;
P2=0;
temp1=0;
while(1) //進入循環
{
for(i=0;i<50;i++) //讀取五十次ad值
{
temp=ADC_Read(1,0); //讀取ad值
pp=pp+temp; //每讀取一次就將ad值累加到pp里
Display(temp1); //防止讀取數據時數碼管熄滅,這里每讀取一次AD值時就調用一次顯示函數
}
temp1=pp/50; //讀取完五十次ad值后,將累加值除以50得到平均值
pp=0; //計算完平均值后將累加值變量清零
temp1=Data_T[temp1];//將ad值查表得到實際溫度值
//
for(p=0;p<50;p++) //調用五十次顯示函數
Display(temp1); //顯示函數
}
}
//顯示 Data表示數據
void Display(uchar Data)
{
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=1; //關閉位選端
P0=0xff; //關閉顯示
if(Data>128) //要顯示的數值大于128,也就是負溫度值,有符號的數值,最高位如果是1,那么就代表是負數
{
Data=Data-128; //將數值減去128,也就是減去最高位的1,得到數值的絕對值
P0=Data_[12]; //顯示負號“-”
Wei1=0; //打開第一位
Wei2=1; //關閉其他位
Wei3=1;
Wei4=1;
delay(10); //延時
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=1; //關閉所有位
P0=Data_[Data/10]; //顯示溫度值的十位
Wei1=1;
Wei2=0; //打開第二位
Wei3=1;
Wei4=1;
delay(10);
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=1;
P0=Data_[Data%10]; //顯示溫度值的個位
Wei1=1;
Wei2=1;
Wei3=0;
Wei4=1;
delay(10);
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=1;
P0=~0xa7; //顯示字母c
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=0;
delay(10);
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=1;
}
else
if(Data<128) //溫度的數值小于128,也就是正數
{
if(Data/100==0) //百位的數值是否為0
P0=~0xff; //為0就不顯示
else //不為0
P0=Data_[Data/100]; //正常顯示數值
Wei1=0;
Wei2=1;
Wei3=1;
Wei4=1;
delay(10);
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=1;
P0=Data_[Data/10%10]; //顯示溫度值的十位
Wei1=1;
Wei2=0;
Wei3=1;
Wei4=1;
delay(10);
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=1;
P0=Data_[Data%10]; //顯示溫度值的個位
Wei1=1;
Wei2=1;
Wei3=0;
Wei4=1;
delay(10);
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=1;
P0=~0xa7; //顯示字母c
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=0;
delay(10);
Wei1=1;
Wei2=1;
Wei3=1;
Wei4=1;
}
}
|