基于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.000//自定义单片机电压为5V
uint STC12ADCAnalogDataResult = 0;//定义STC12ADC转换器模拟量数字结果变量为0 即模拟量转十进制数变量
//float InputVoltage = 0.000;//声明外部输入电压变量
//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 = STC12ADCAnalogFliterMiddle();//STC12ADC转换器模拟量中位值滤波算法函数(采样101次 冒泡排序 取中间值 采样次数Sample可以按照需求改动 Sample值需为奇数)返回值赋给STC12ADC转换器模拟量数字结果变量
// STC12ADCAnalogDataResult = STC12ADCAnalogChangeResult(0);//STC12ADC转换器通道0模拟量转化结果赋给STC12ADC转换器模拟量数字结果变量
// InputVoltage = SinglechipVoltage * STC12ADCAnalogDataResult / 255;//计算输入电压公式:输入电压 / 基准电压 = 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];//xdata指外部数据存储区 地址范围从0x0000到0xFFFF 最大可扩展至64KB 访问速度较慢 因为需要通过特殊功能寄存器DPTR进行间接寻址 扩展外部数据存储区 存储大量数据或不适合放在内部RAM中的全局变量 data指内部数据存储区 地址范围通常为0x00到0x7F 即低128字节 访问速度最快 因为它可以直接通过寄存器实现读写操作 用于存放局部变量和小的全局变量 或者频繁用到或对运算速度要求很高的变量
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[i];