大二时候做的热敏电阻温度传感器有需要的了解一下;
多多指教
需要的原件清单:
源程序:
//程序头函数
#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;
}
}
|