基于STC12C5A60S2系列1T 8051单片机A/D转换器应用
- 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转换器用到的特殊功能寄存器
- A/D转换器P1口模拟功能控制寄存器P1ASF
- A/D转换器控制寄存器ADC_CONTR
- A/D转换器控制寄存器ADC_RES ADC_RESL
- A/D转换器中断寄存器
- 基于STC12C5A60S2系列1T 8051单片机A/D转换器转换电压模拟量为数字量化
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转换器用到的特殊功能寄存器
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单片机A/D转换器转换电压模拟量为数字量化
#include <stc12c5a60s2.h>
#include <intrins.h>
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define NixieTubeSegmentCode P0//自定义数码管段码为单片机P0组引脚
#define NixieTubeBitCode P2//自定义数码管位码为单片机P2组引脚
uchar Code NixieTubeBitCodeArray = [0xfe,0xfd,0xfb,0xf7];//定义数码管位码数组变量
uchar NixieTubeDisplayDataArray[0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00];//定义数码管显示0~F数据及符号“—”及熄灭数组变量
uchar NixieTubeCacheDataArray[];//定义数码管缓存数据数组变量
uchar AdcChangeResult;//声明A/D转换器转换结果变量
uchar AdcLowBitResult;//声明A/D转换器低位转换结果变量
uchar AdcChangeOverFlag = 0;//定义A/D转换器转换结束标志位清0
uint AdcDataResult;//声明A/D转换器数字结果变量
//float Vin;//声明外部输入电压变量
void AdcInit();//A/D转换器初始化函数
void AdcChangeResult();//A/D转换器转化结果函数
void NixieTubeDisplayDataSplit();//数码管显示数据分解函数
void NixieTubeDisplayData();//数码管显示数据函数
void Timer0Init(void);//定时器0初始化函数
void main(void)//主函数
{
Timer0Init();//定时器0初始化函数
AdcInit();//A/D转换器初始化函数
while(1)//主循环
{
AdcDataResult = AdcChangeResult();//A/D转换器转化结果赋给A/D转换器数字结果变量
//Vin = VCC * AdcDataResult / 1023;//计算输入电压
}
}
void AdcInit()//A/D转换器初始化函数
{
P1ASF |= 0x01;//设置P1.0端口为A/D转换器模拟输入通道
AUXR1 = 0x00;//设置A/D转换器转换结果寄存器CON_RES存放高八位A/D转换器转换结果 CON_RESL存放低二位A/D转换器转换结果
AD_CONTR |= 0x80;//打开A/D转换器电源
_nop_();
_nop_();
_nop_();
_nop_();
AD_CONTR = 0xe1;//设置A/D转换器转换速度为最高 选P1.0端口作为A/D转换器模拟输入通道 A/D转换器转换结束标志位清0 A/D转换器转换启动控制位清0
AD_CONTR |= 0x08;//启动A/D转换器
}
uint AdcChangeResult()//A/D转换器转化结果函数
{
while(AdcChangeOverFlag = 0)//当A/D转换器转换结束标志位为0
{
AdcChangeOverFlag = AD_CONTR & 0x10;//判断A/D转换器转换是否结束 当AdcChangeOverFlag = 0x10表示A/D转换器转换结束 跳出while()循环
}
AD_CONTR & = 0xe7;//A/D转换器转换结束后 A/D转换器结束标志位与转换启动控制位都清0
AdcChangeResult = ADC_RES;//A/D转换器高位A/D转换结果寄存器高八位存放值赋给A/D转换器转换结果变量
AdcChangeResult << = 2;//A/D转换器转换结果左移2位变成高八位和空出低二位
AdcLowBitResult = ADC_RESL;//A/D转换器低位A/D转换结果寄存器低二位存放值赋给A/D转换器低位转换结果变量
AdcLowBitResult & = 0x03;//保留A/D转换器低位A/D转换结果寄存器低二位存放值 屏蔽A/D转换器低位A/D转换结果寄存器其他位
AdcChangeResult |= AdcLowBitResult;//A/D转换器高位A/D转换结果寄存器高八位存放值或上A/D转换器低位A/D转换结果寄存器低二位存放值组成一个十位数据
return AdcChangeResult;//返回A/D转换器转换结果
}
void NixieTubeDisplayDataSplit()//数码管显示数据分解函数
{
uchar NixieTubeQianWei,NixieTubeBaiWei,NixieTubeShiWei,NixieTubeGewei;//声明数码管千位、百位、十位、个位变量
NixieTubeQianWei = AdcDataResult / 1000 ;//数码管千位分解
NixieTubeBaiWei = AdcDataResult / 100 % 10;//数码管百位分解
NixieTubeShiWei = AdcDataResult / 10 % 10 ;//数码管十位分解
NixieTubeGeWei = AdcDataResult % 10 ;//数码管个位分解
if(AdcDataResult < 1000 )
{
NixieTubeCacheDataArray[0] = 0x00;//数码管千位不显示
}
else
{
NixieTubeCacheDataArray[0] = NixieTubeQianWei;//数码管千位显示数据
}
if(AdcDataResult < 100 )
{
NixieTubeCacheDataArray[1] = 0x00;//数码管百位不显示
}
else
{
NixieTubeCacheDataArray[1] = NixieTubeBaiWei;//数码管百位显示数据
}
if(AdcDataResult < 10 )
{
NixieTubeCacheDataArray[2] = 0x00;//数码管十位不显示
}
else
{
NixieTubeCacheDataArray[2] = NixieTubeShiWei;//数码管十位显示数据
}
NixieTubeCacheDataArray[3] = NixieTubeGeWei;//数码管个位显示数据
}
void NixieTubeDisplayData()//数码管显示数据函数
{
static uchar i = 0;//定义静态数码管位变化变量
switch(i)//数码管位变化筛选
{
case 0 ://数码管千位显示
NixieTubeSegmentCode = 0x00;//数码管段码消影
NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[0]];//数码管千位的段码显示
NixieTubeBitCode = NixieTubeBitCodeArray[0];//数码管千位码显示
i++;//数码管位变化自加1
break;//跳出
case 1 ://数码管百位显示
NixieTubeSegmentCode = 0x00;//数码管段码消影
NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[1]];//数码管百位的段码显示
NixieTubeBitCode = NixieTubeBitCodeArray[1];//数码管百位码显示
i++;//数码管位变化自加1
break;//跳出
case 2 ://数码管十位显示
NixieTubeSegmentCode = 0x00;//数码管段码消影
NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[2]];//数码管十位的段码显示
NixieTubeBitCode = NixieTubeBitCodeArray[2];//数码管十位码显示
i++;//数码管位变化自加1
break;//跳出
case 3 ://数码管个位显示
NixieTubeSegmentCode = 0x00;//数码管段码消影
NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[3]];//数码管个位的段码显示
NixieTubeBitCode = NixieTubeBitCodeArray[3];//数码管个位码显示
i = 0;//数码管位变化清0
break;//跳出
default:break;//跳出
}
}
void Timer0Init(void)//定时器0定时1ms初始化函数 晶振为12MHz
{
TMOD &= 0xf0;//设定定时器/计数器工作模式清0
TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位定时器0模式1
TH0 = 0xfc;//设定定时器0高8位初值
TL0 = 0x18;//设定定时器0低8位初值
TF0 = 0;//定时器0溢出中断标志位清0
ET0 = 1;//打开定时器中断开关
EA = 1;//打开定时器中断总开关
TR0 = 1//打开定时器0开关
}
void Timer0(void) interrupt 1//定时器0定时1ms中断函数 晶振为12MHz
{
TR0 = 0;//关定时器0开关
NixieTubeDisplayData();//数码管显示数据函数
TH0 = 0xfc;//设定定时器0高8位初值
TL0 = 0x18;//设定定时器0低8位初值
TR0 = 1;//开定时器0开关
}