基于热敏电阻的数字温度计
前言
单片机初学者大多都是从51开始的,普通的89C51/52并没有集成ADC,只能通过外接AD芯片进行AD转换,这里用ADC0804对PT100热敏电阻进行AD采样,单片机控制数码管显示采样结果。
一、Proteus仿真电路
![Alt]
二、c代码
#include <reg52.h>
#include <intrins.h>
unsigned char code dxcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
unsigned char dispbuf[4];
sbit cs = P2^4;
sbit intr = P2^7;
sbit wr = P2^6;
sbit rd = P2^5;
sbit P37=P3^7;
void Delay(unsigned int i);
void Display();
void main()
{
float temp = 0; //温度
int T=0;
unsigned char x = 0; //存储P1口的数值
while(1)
{
cs = 0;
wr = 0;
nop();
wr = 1; //高电平变低电平触发一次ADC转换
while(intr); // ADC转换完成后intr = 0
P1 = 0xff;
cs = 0;
rd = 0;
nop();
x = P1; //读取结果
rd = 1;
temp = x*(50000/2560)/25 - 100;
T= temp/0.385 * 10;
dispbuf[0]=T%10;
dispbuf[1]=T/10%10;
dispbuf[2]=T/100%10;
if(temp<0)
{
if(T<=-100)
{
dispbuf[0]=-T%(10);
dispbuf[1]=T/(-10)%10;
dispbuf[2]=T/(-100)%10;
dispbuf[3]=10;
}
else
{
dispbuf[0]=-T%10;
dispbuf[1]=T/(-10)%10;
dispbuf[2]=10;
dispbuf[3]=11;
}
}
else if(T<100)
{
dispbuf[3]=11;
dispbuf[2]=11;
}
else if(T<1000)
{
dispbuf[3]=11;
}
else
{
dispbuf[3]=T/1000%10;
}
Display();
}
}
void Display()
{
P3 = dxcode[dispbuf[3]];
P0=0xfe;
Delay(10);
P3 = 0x00;
P3 = dxcode[dispbuf[2]];
P0=0xfd;
Delay(10);
P3=0x00;
P3 = dxcode[dispbuf[1]] | 0x80;
P0=0xfb;
Delay(10);
P3=0x00;
P3 = dxcode[dispbuf[0]];
P0=0xf7;
Delay(10);
P3=0x00;
}
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i–)
{
for(j=0;j<125;j++)
{;}
}
}
下面是包含仿真文件和程序的下载链接
链接: https://download.csdn.net/download/weixin_40752176/13452793
1万+

被折叠的 条评论
为什么被折叠?



