基于STC12C5A60S2系列1T 8051单片机十位ADC转换器转换电压模拟量为电压数字量应用
STC12C5A60S2系列1T 8051单片机管脚图
STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置
STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍
STC12C5A60S2系列1T 8051单片机A/D转换器介绍
STC12C5A60S2系列1T 8051单片机A/D转换器的结构
基于STC12C5A60S2系列1T 8051单片机A/D转换器的特殊功能寄存器列表
基于STC12C5A60S2系列1T 8051单片机A/D转换器用到的特殊功能寄存器
STC12C5A60S2系列1T 8051单片机辅助寄存器AUXR
STC12C5A60S2系列1T 8051单片机辅助寄存器AUXR1
A/D转换器P1口模拟功能控制寄存器P1ASF
作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器模拟输入通道
A/D转换器控制寄存器ADC_CONTR
作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器以下功能
(1)、设置A/D转换器电源
(2)、设置A/D转换器转换速度
(3)、设置A/D转换器转换结束标志位
(4)、设置A/D转换器转换启动
(5)、设置A/D转换器模拟输入通道
A/D转换器控制寄存器ADC_RES ADC_RESL
作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器保存转换的结果
A/D转换器中断寄存器
作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器中断
基于STC12C5A60S2系列1T 8051单片机十位ADC转换器转换电压模拟量为电压数字量
main.c
#include "STC12C5A60S2.h"
#include "Timer0.h"
//#include "Timer1.h"
//#include "Key.h"
#include "Digitron.h"
//#include "ADC0832.h"
#include "STC12ADC.h"
#include "STC12ADCAnalogFliterMiddle.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define SinglechipVoltage 5//自定义单片机电压为5V
uint STC12ADCAnalogDataResult = 0;//定义STC12ADC转换器模拟量数字结果变量为0 即模拟量转十进制数变量
float InputVoltage = 0;//定义外部输入电压变量
//uchar AnalogSamplingCount = 0;//定义模拟采样计数变量为0
//uint OutPutVoltage = 0;//定义输出电压变量为0
//uint AnalogFilterVoltage = 0;//定义模拟滤波电压变量为0
//uint AnalogFilterOutPutVoltage = 0;//定义模拟滤波后输出电压变量为0
void main(void)//主函数
{
Timer0Init();//定时器0初始化函数
STC12ADCInit();//STC12ADC转换器初始化函数
// Timer1Init();//定时器1初始化函数
// ADC0832Init();//ADC0832初始化函数
DigitronBootDisplay();//数码管开机显示函数
while(1)//主循环
{
// AnalogDataResult = ADC0832Change();//ADC0832转化函数转化的模拟量十进制数赋给模拟量数字结果变量 即模拟量转十进制数变量
// OutPutVoltage = (AnalogDataResult * 1.0 * 5 / 255) * 1000;//输出电压计算公式 5是基准电压5V 255是模数芯片ADC0832内部八位模拟转换寄存器储存的最大数值 为啥乘以1000? 由于输出电压是用四位数码管来显示 需要乘以1000来把输出电压变成四位数在四位数码管上分解显示出来
// DigitronDisplayDataSplit();//数码管显示数据分解函数
// STC12ADCAnalogDataResult = STC12ADCAnalogChangeResult(0);//STC12ADC转换器通道0模拟量转化结果赋给STC12ADC转换器模拟量数字结果变量
STC12ADCAnalogDataResult = STC12ADCAnalogFliterMiddle();//STC12ADC转换器模拟量中位值滤波算法函数(采样101次 冒泡排序 取中间值 采样次数Sample可以按照需求改动 Sample值需为奇数)返回值赋给STC12ADC转换器模拟量数字结果变量
// STC12ADCAnalogDataResult = STC12ADCAnalogAverage() * 1000;//STC12ADC转换器通道0模拟量转化结果赋给STC12ADC转换器模拟量数字结果变量
// STC12ADCAnalogChangeResult();//STC12ADC转换器模拟量转化结果
InputVoltage = SinglechipVoltage * STC12ADCAnalogDataResult / 1023;//计算输入电压公式:输入电压 / 基准电压 = STC12ADC转换器模拟量转化结果(即模拟量转十进制数变量)/ 1023份
// STC12ADCAnalogDataResult = (InputVoltage * 255 / SinglechipVoltage) * 1000;//计算输入电压公式:输入电压 / 基准电压 = STC12ADC转换器模拟量转化结果(即模拟量转十进制数变量)/ 255份
// DigitronDisplayData();//数码管显示数据函数
// KeyScan();//按键扫描函数 该函数放在定时器定时2ms的中断函数中扫描
// KeyScanResult();//按键扫描结果函数
// AnalogFilterVoltage = AnalogFilterVoltage + OutPutVoltage;//模拟滤波电压变量
// AnalogSamplingCount++;//模拟采样计数变量自加1
// if(AnalogSamplingCount >= 8)//模拟采样计数变量计8次
// {
// AnalogFilterOutPutVoltage = AnalogFilterVoltage >> 3;//模拟滤波电压变量右移三位 表示模拟滤波电压变量除以8取平均滤波后的输出电压
// AnalogSamplingCount = 0;//模拟采样计数变量清0
// AnalogFilterVoltage = 0;//模拟滤波电压变量清0
// }
}
}
STC12ADCAnalogFliterMiddle.c
#include "STC12ADCAnalogFliterMiddle.h"
//#include "ADC0832.h"
#include "STC12ADC.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define Sample 101//采样次数
void delayms(uint ms)//
{
uint msi,msj;//
for(msi = 0;msi < ms;msi++)//
for(msj = 0;msj < 120;msj++);//
}
// uchar FliterRange()//模拟量限幅滤波算法
//{
// uchar NewValue;
// NewValue = ADC0832Change();//ADC0832转化函数 还没转化成数字量
// if((NewValue - Value > 10) || (Value - NewValue > 10))
// return Value;
// return NewValue;
// }
uint STC12ADCAnalogFliterMiddle()//STC12ADC转换器模拟量中位值滤波算法函数(采样101次 冒泡排序 取中间值 采样次数Sample可以按照需求改动 Sample值需为奇数)
{
xdata uint ValueBuf[Sample];//
uint Count,i,j,Temp;//
for(Count = 0;Count < Sample;Count++)//连续采样101次
{
ValueBuf[Count] = STC12ADCAnalogChangeResult(0);//STC12ADC转换器模拟量转化结果函数
delayms(20);//
}
for(j = 0;j < Sample-1;j++)//冒泡法排序
{
for(i = 0;i < Sample-1-j;i++)//
{
if(ValueBuf[i] > ValueBuf[i+1])//
{
Temp = ValueBuf