找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6009|回复: 2
收起左侧

基于热敏电阻的温度传感器

[复制链接]
ID:329771 发表于 2018-5-14 21:04 | 显示全部楼层 |阅读模式
大二时候做的热敏电阻温度传感器有需要的了解一下;
多多指教
需要的原件清单:
元件名称
型号
对应原理图编号
数量
电容
10uF
C1
1
电容
30pF
C2, C3
2
电容
100nF
C4
1
3MM 发光二极管 红
N-green
L1
1
DC电源座子
POWER
P1
1
排阻
102
R1
1
电阻
10k
R2
1
电阻
220
R3
1
热敏电阻
100K(25C)
R4
1
可调电阻
10k
R5
1
电阻
30k
R6
1
电阻
1k
R7
1
微动开关
SW-PB
S1
1
电源开关
电源开关
S2
1
4位数码管
共阴数码管
SMG1
1
51单片机
STC89C51
U1
1
模数转换芯片
ADC0809
U2
1
可控精密稳压源
TL431
U3
1
晶振
12MHz
Y1
1
源程序:
//程序头函数
#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;
}
}





pcb.png
原理图.png

电路原理,pcb 图 程序.zip

90.47 KB, 下载次数: 63, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:369818 发表于 2018-7-11 23:15 | 显示全部楼层
哇,厉害了。
回复

使用道具 举报

ID:234782 发表于 2019-2-26 16:14 | 显示全部楼层
多多益善,有不用AC0809的温度采集吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表