如何使用STM8S单片机的多通道AD转换

如何使用STM8S单片机的多通道AD转换,第1张

我给你个例程,我这是两个通道,一个是采集音频,然后彩灯随音乐节奏闪烁,同时采集电池电量。
void AD2_Config(void)
{

/ Init GPIO for ADC2 /
GPIO_Init(GPIOB, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);

/ De-Init ADC peripheral/

ADC1_DeInit();
ADC1_ClearITPendingBit(ADC1_IT_EOC);
/ Init ADC1 peripheral /
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_6, ADC1_PRESSEL_FCPU_D18, \
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL6,\
DISABLE);
/ Enable EOC interrupt /
//if(autoFm == 1)
ADC1_ITConfig(ADC1_IT_EOCIE,DISABLE);
//else
// ADC1_ITConfig(ADC1_IT_EOCIE,ENABLE);

/ Enable general interrupts /
/Start Conversion /
ADC1_StartConversion();
}
void AD_Config(void)
{

/ Init GPIO for ADC2 /
GPIO_Init(GPIOB, GPIO_PIN_7, GPIO_MODE_IN_FL_NO_IT);
// GPIOD->ODR &= 0x8f;
/ De-Init ADC peripheral/

ADC1_DeInit();
ADC1_ClearITPendingBit(ADC1_IT_EOC);
/ Init ADC1 peripheral /
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_7, ADC1_PRESSEL_FCPU_D18, \
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL7,\
DISABLE);
/ Enable EOC interrupt /
// if(autoFm == 1)
// ADC1_ITConfig(ADC1_IT_EOCIE,DISABLE);
//else
ADC1_ITConfig(ADC1_IT_EOCIE,ENABLE);

/Start Conversion /
ADC1_StartConversion();

}

main()
{
TIM2_Config();
TIM4_Config();

AD2_Config();
TIM1_Config();

enableInterrupts();
while(1)
{
if(ADChange >= 1)//这是个延时,多久进一次
{
AD2_Config();
while(RESET == ADC1_GetFlagStatus(ADC1_FLAG_EOC));
VoicADLeve = ADC1_GetConversionValue();
AD_Config();
ADChange = 0;
ADChange = 0;
}
}
}
在ADC中断里面
INTERRUPT_HANDLER(ADC2_IRQHandler, 22)
{
ADC1_ClearITPendingBit(ADC2_IT_EOC);
}

INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
{
uint16_t temp;
temp = ADC1_GetConversionValue();//这是采集音频
if(temp < min_ad)
{
min_ad = temp;
}
if(temp > max_ad)
{
max_ad= temp;
}
ADC1_ClearITPendingBit(ADC1_IT_EOC);
}

这程序我只给了你ADC的部分

可以发送16进制数或ASCII码格式的数据
发送16进制的数据,例如:
SBUF=ADC1;//ADC1是AD转换的结果,16进制数据
发送ASC码的格式数据,例如:
SBUF=0X30+ADC1/100; //发送百位数字
SBUF=0X30+(ADC1%100)/10;//发送十位数字
SBUF=0X30+(ADC1%100)%10;//发送个位数字

AD0809的采集程序
//---A/D转换---
//-----头文件引用------
#include <Reg51h>
#include <absacch>
#include <intrinsh>
typedef unsigned char BYTE; /自定义字节类型/
#define Set_Bit(BIT) (BIT = 1) /定义置1函数/
#define Clear_Bit(BIT) (BIT = 0) /定义清0函数/
//
void Write_Hd7279(BYTE,BYTE); /定义HD7279写函数/
BYTE Read_Hd7279(BYTE); /定义HD7279读函数/
void Send_Byte(BYTE); /定义HD7279发送字节函数/
BYTE Receive_Byte(void); /定义HD7279接收字节函数/
void Short_Delay(void); /定义短延时函数/
void Long_Delay(void); /定义长延时函数/
void Mcu_Init(void); /定义MCU初始化函数/
void Delay_200_mS(void); /定义200ms延时函数/
sbit Hd7279_Clk=P1^6; /定义HD7279时钟硬件连接/
sbit Hd7279_Data=P1^5; /定义HD7279数据硬件连接/
sbit cs=P1^7;
void Short_Delay(void) /短延时函数/
{
BYTE i;
for(i=0;i<0x08;i++);
}
//
void Long_Delay(void) /长延时函数/
{
BYTE i;
for(i=0;i<0x30;i++);
}
//
void Write_Hd7279(BYTE Command,BYTE Data) /HD7279写函数/
{
Send_Byte(Command);
Send_Byte(Data);
}
//
void Send_Byte(BYTE Data_Out) /HD7279发送字节函数/
{
BYTE i;
cs=0;
Long_Delay();
for(i=0;i<8;i++)
{
if(Data_Out&0x80) Set_Bit(Hd7279_Data);
else Clear_Bit(Hd7279_Data);
Set_Bit(Hd7279_Clk);
Short_Delay();
Clear_Bit(Hd7279_Clk);
Short_Delay();
Data_Out=Data_Out<<1;
}
Clear_Bit(Hd7279_Data);
}
//-----宏声明-----
#define A_DPORT XBYTE[0xFef3]//0809通道0地址
#define uchar unsigned char
//-----变量定义-----
bit bdata bz=0;//定义标志
uchar val;
//-----初始化-----
void first(void)
{
P1=0xff;
P2=0xff;
P3=0xff;
P0=0xff;
Send_Byte(0xa4);
IT1=1;
EX1=1;
EA=1; //INT0 允许
}
//-----中断-----
void int_0(void) interrupt 2
{
val=A_DPORT; //读 A_D 数据
bz=1; //置读数标志
}
//-----主程序-----
main()
{
first(); //初始化
while(1)
{
A_DPORT=val; //启动 A_D
while(bz==0); //等待 A_D 转换结束
// val=~A_DPORT;
//P1=val; //数据输出
Write_Hd7279(0xc8,val&0x0f);
Write_Hd7279(0xc9,val>>4);
Write_Hd7279(0x92,0x00);
Write_Hd7279(0x93,0x00);
Write_Hd7279(0x94,0x00);
Write_Hd7279(0x95,0x00);
Write_Hd7279(0xce,0x0d);
Write_Hd7279(0xcf,0);
bz=0; //清读数标志
}
}
这就是C的程序
>void adchange()//AD采集程序,采集3路
{
uchar temp7,temp8,temp9,temp10,temp11,temp12;//这些变量用来暂存转换结果
ADC_CONTR=ADC_CONTR|0X80; //10000000 开启转换电源
Delay1ms(1); //延时,等待内部电源稳定
P1M0=P1M0|0X07; //设置p10 P11和 p13所在通道为开/漏模式
P1M1=P1M1|0X07;
ADC_CONTR=0xe0; //11100000 开启P10通道开始转换
Delay25us(10); //延时一端时间,使输入电压达到稳定
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp7=ADC_DATA; //读取转换结果
temp8=ADC_LOW2;
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp9=ADC_DATA; //读取转换结果
temp10=ADC_LOW2;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp11=ADC_DATA; //读取转换结果
temp12=ADC_LOW2;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12792313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-28
下一篇 2023-05-28

发表评论

登录后才能评论

评论列表(0条)

保存