单片机怎么采集电压表的信号

2025-05-20 20:23:24
推荐回答(4个)
回答(1):

我才用的单片机为STC89C52RC,晶振12M。模数转换器为ADC0832。代码如下:
/***********************************************
程序功能: 模数转换器实现数字电压表
程序测试: 程序下载成功后,通过调节小系统左上方的
精密电位器,模拟电压的变化,数码管将显
示出当前的电压值
硬件说明: 用跳线帽把AD转换器左侧J13的AIN和CH0管脚
短接,用螺丝刀调节精密电位器VR2可以看到
当前电压值的改变
************************************************/
#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit CS = P1^0; //片选信号
sbit CLK = P1^1; //时钟线
sbit DI = P1^2; //数据写入
sbit DO = P1^2; //数据读出,因为没有同时使用所以复用P1.2管脚

uchar aa,bb,cc,dd,ee;

uchar idata ram[1]; //定义一个存储空间来存储转化好的数字量

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管编码
uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};//共阳数码管带小数点编码
void delay(uint z)//延时子函数
{
uint x,y;
for(x = z;x >0;x--)
for(y = 110;y > 0;y--);
}

uchar Adc0832(bit polarity,bit channel); //待调用子函数声明
void Display(uchar data1,uchar data2,uchar data3,uchar data4,uchar data5);
void Data_Process();

void main()
{
while(1)//死循环,程序反复执行
{
Data_Process(); //AD转化,数据处理
Display(aa,bb,cc,dd,ee);//数码管显示当前电压值
}
}
/*******************************************
函数名称:Adc0832
功 能:实现AD转换
参 数:AD转换通道选择,输入信号极性选择
返回值 :AD转换后电压值
********************************************/
uchar Adc0832(bit polarity,bit channel)// AD转换子程序
{
uchar i,get_data1 = 0,get_data2 = 0;

CLK = 0;
DI = 1; //第一个时钟上升沿,DI=1,发出起始信号
CS = 0;

CLK = 1;
CLK = 0;

DI = polarity; //第二个时钟上升沿,极性选择
CLK = 1;
CLK = 0;

DI = channel; //第三个时钟上升沿,通道选择
CLK = 1;
CLK = 0;

DI = 1; //DI置1,防止干扰输入数据(输入、输出管脚复用)
for(i = 0;i < 8;i++)//分八次,从高到低的顺序把八位数据读出
{
CLK = 1;
CLK = 0;
if(DO) //在时钟的上升沿来临之前读走数据
{
get_data1 |= 0x80 >> i;
}
}
for(i = 0;i < 8;i++)//分八次,从低到高的顺序再读取一次数据
{
if(DO)
{
get_data2 |= 0x01 << i;
}
CLK = 1;
CLK = 0;
}
CS = 1; //数据读写完后释放总线: CS DI CLK 置1
DI = 1;
CLK = 1;
if(get_data1 ==get_data2)//如果两个值相等,则数据传输正确
{
ram[0] = get_data1; //把正确的的数字量存在RAM[0]中
}
return(ram[0]);//把AD转换值返回
}

/*******************************************
函数名称:Display
功 能:数码管动态显示
参 数:五位数码管对应显示值
返回值 :无
********************************************/
void Display(uchar data1,uchar data2,uchar data3,uchar data4,uchar data5)
{

P0 = table2[data1];
P2 = 0xfe; //
delay(1);
P0 = 0xff;

P0 = table[data2];
P2 = 0xfd;
delay(1);
P0 = 0xff;

P0 = table[data3];
P2 = 0xfb;
delay(1);
P0 = 0xff;

P0 = table[data4];
P2 = 0xf7;
delay(1);
P0 = 0xff;

P0 = table[data5];
P2 = 0xef;
delay(1);
P0 = 0xff;

}
/*******************************************
函数名称:Data_Process
功 能:数据处理子函数,实现转化后的数据各位值
的分离
参 数:无
返回值 :无
********************************************/
void Data_Process()
{
uchar get_data;
uint data_temp;
get_data = Adc0832(1,0);//调用AD转换子程序,单极性信号,通道0
data_temp = get_data * 196;//AD转换后的数据乘以分辨率,为便于处理分辨率放大10000倍
aa = data_temp / 10000;
bb = data_temp % 10000 / 1000;
cc = data_temp % 10000 % 1000 / 100;
dd = data_temp % 10000 % 1000 % 100 / 10;
ee = data_temp % 10000 % 1000 % 100 % 10;
}

回答(2):

这个是最基本的单片机项目,首先把0-6V的电压用运算放大器变换成0-5为电压然后送到AD转换器(基准电压选择5V的,如ADC0809)。如果要求转换精度高的话,可以选择高精度的AD转换器,当然考虑基准电压的值,前端6V线性变换成AD的基准电压值,单片机的程序网上有很多,自己百度一下看看,我这里有一些但是给你也没什么意义,你自己学习读懂程序,学会修改程序吗,用仿真软件如protues等仿真一下就ok了。没什么难度的。

回答(3):

单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。

回答(4):

你好!实现的步骤
1、AD转换
2、单片机读取AD转换值
3、显示出转换的AD值