本程序采用的是八路ADC单次采集的模式,根据配置,在单次的模式下转换完成后ADC12SC会自动复位,因此需要在循环中进行ADC12CTL0 |= ADC12SC;操作,而如果配置成连续采集的模式,只需要在程序开始将ADC12SC置位一次就可以,但是就需要注意当进入中断后如果不手动禁止中断会一直停留在循环中,因此在采集到需要的数据后需要将ADC关闭或者中断使能禁止才能重新回到主函数,这一点需要注意。
八路单次采集的程序如下:
/***************************************
八路AD多路单次采集基亚5110液晶显示
采集模式:多路单次
****************************************/
#include
#include "LCD5110.h"
#define uint unsigned int
#define uchar unsigned char
unsigned char ad0[]="1:0.0V";
unsigned char ad1[]="2:0.0V";
unsigned char ad2[]="3:0.0V";
unsigned char ad3[]="4:0.0V";
unsigned char ad4[]="5:0.0V";
unsigned char ad5[]="6:0.0V";
unsigned char ad6[]="7:0.0V";
unsigned char ad7[]="8:0.0V";
uchar flag=1;
uint temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;
void Init_Clk()
{
uchar i;
BCSCTL1&=~XT2OFF; //打开XT振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡错误标志
for(i = 0; i < 100; i++)
_NOP(); //延时等待
}
while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待
IFG1&=~OFIFG;
BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M
}
void Init_ADC()
{
P6SEL|=0XFF; //信号采集端口选择第二功能
ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC+设置采样时间
ADC12CTL1 = SHP+CONSEQ_1; // 使用采样时序电路信号+多路单次模式
//上面的寄存器配置采样保持触发源选择时ADC12SC,采集信号使用采样时序电路产生的信号
// 转换模式为多路单次复转换 上面的设置必须在ENC=0的情况下设置
//设置每个通道的输入端口和参考电压,参考电压默认为AVCC 3.3V
ADC12MCTL0 = INCH_0;
ADC12MCTL1 = INCH_1;
ADC12MCTL2 = INCH_2;
ADC12MCTL3 = INCH_3;
ADC12MCTL4 = INCH_4;
ADC12MCTL5 = INCH_5;
ADC12MCTL6 = INCH_10;
ADC12MCTL7 = INCH_11+EOS; // 最后一个通道
ADC12IE = BIT7; // 最后一个通道转换完成后使能ADC中断
ADC12CTL0 |= ENC; // 使能转换
}
/*******************************************
函数名称:Trans_val
功 能:将16进制ADC转换数据变换成三位10进制
真实的模拟电压数据,并在液晶上显示
参 数:Hex_Val--16进制数据
n--变换时的分母等于2的n次方
返回值 :无
********************************************/
void Trans_val(uchar ptr[6],uint Hex_Val)
{
unsigned long caltmp;
uint Curr_Volt;
caltmp = Hex_Val;
caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 3
Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n
// 参考电压为3.3V,所以计算公式应该为Hex_val*3.3/2^n
// 乘除计算通过移位来进行可以有效的提高程序运行效率
ptr[2] = (Curr_Volt / 10)+0x30; //个位
ptr[4] = (Curr_Volt % 10)+0x30; //小数位
}
void main()
{
Init_Clk();
Init_ADC();
WDTCTL = WDTPW + WDTHOLD;
LCD_init();
LCD_showsh(0, 0, "电压采集:");
_EINT();//开启全局中断
P5DIR|=BIT5;
P3OUT|=~BIT5;
while (1)
{
ADC12CTL0 |= ADC12SC;
LCD_prints(0,2,ad0);
LCD_prints(8,2,ad1);
LCD_prints(0,3,ad2);
LCD_prints(8,3,ad3);
LCD_prints(0,4,ad4);
LCD_prints(8,4,ad5);
LCD_prints(0,5,ad6);
LCD_prints(8,5,ad7);
}
}
/*******************************************
函数名称:ADC12ISR
功 能:ADC中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
temp0 = ADC12MEM0;
Trans_val(ad0,temp0);
temp1 = ADC12MEM1;
Trans_val(ad1,temp1);
temp2 = ADC12MEM2;
Trans_val(ad2,temp2);
temp3 = ADC12MEM3;
Trans_val(ad3,temp3);
temp4 = ADC12MEM4;
Trans_val(ad4,temp4);
temp5 = ADC12MEM5;
Trans_val(ad5,temp5);
temp6 = ADC12MEM6;
Trans_val(ad6,temp6);
temp7 = ADC12MEM7;
Trans_val(ad7,temp7);
}
上一篇:stm8下载程序(使用ST-LINK下载器和STVP下载软件)
下一篇:MSP430学习笔记10-ADC采集1602显示
推荐阅读最新更新时间:2024-03-16 16:00
设计资源 培训 开发板 精华推荐
- 高性能 i.MX RT 处理器助力智能节点无需联网实现机器学习
- EEWORLD十周年为你而任性——上百块ST开发板团购盛宴开始啦!49元包邮,发帖还返现
- PI LYTSwitch™-6系列IC 让你了解不知道的秘密看专题赢好礼!
- 2016 TI 电机驱动研讨会资料大放送,不容错过!
- 先到先得双重有礼 成为体验FLUKE新品的先锋者
- Keysight示波器主题月有奖系列活动之 注册大奖天天抽 抢楼踩中亦有奖
- 有奖直播 | 是德科技 InfiniiMax4.0系列高带宽示波器探头新品发布
- 有奖直播:ADI数字主动降噪耳机方案 8月6日上午10:00-11:30 邀您聆听让技术为我们静下来
- 是德科技有奖直播:示波器在通用电子测量中的应用和技巧