MSP430学习笔记10-ADC采集1602显示
扫描二维码
随时随地手机看文章
同样是开发板中的例程,对关键的地方做了说明,程序如下:
/*********************************************************
程序注意点:
首先可以选择是否开启内部参考电压还是使用外部参考电压
每个通道可以独立选择参考电压
如果连接了外部参考电压应该注意关闭内部参考电压防止损坏
单片机
程序功能:MCU的片内ADC对P6.0端口的电压进行转换
将模拟电压值显示在1602液晶上。
----------------------------------------------------------
拨码开关设置:将LCD位拨至ON,其余位拨至OFF
测试说明:调节电位器W1的旋钮观察液晶显示数字变化。
*********************************************************/
#include
#include"cry1602.h"
#include"cry1602.c"
//typedefunsignedcharuchar;
//typedefunsignedintuint;
#defineNum_of_Results32
ucharshuzi[]={"0123456789."};
uchartishi[]={"Thevoltis:"};
staticuintresults[Num_of_Results];//保存ADC转换结果的数组
voidTrans_val(uintHex_Val);
/************************主函数****************************/
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
/*下面六行程序关闭所有的IO口*/
P1DIR=0XFF;P1OUT=0XFF;
P2DIR=0XFF;P2OUT=0XFF;
P3DIR=0XFF;P3OUT=0XFF;
P4DIR=0XFF;P4OUT=0XFF;
P5DIR=0XFF;P5OUT=0XFF;
P6DIR=0XFF;P6OUT=0XFF;
P6DIR|=BIT2;P6OUT|=BIT2;//关闭电平转换
LcdReset();//复位1602液晶
DispNChar(2,0,12,tishi);//显示提示信息
Disp1Char(11,1,'V');//显示电压单位
P6SEL|=BIT0;//使能ADC通道
ADC12CTL0=ADC12ON+SHT0_8+MSC;//打开ADC,设置采样时间
//上面的配置中并没有打开内部的参考电压
//ADC12MCTLx用来选择通道和参考电压,这里面没有对此寄存器进行配置为默认值
//默认值是参考电压选择AVCC(3.3V),通道是A0,所以测量范围是0-3.3V
ADC12CTL1=SHP+CONSEQ_2;//使用采样定时器
//上面的寄存器配置采样保持触发源选择时ADC12SC,采集信号使用采样时序电路产生的信号
//转换模式为单路重复转换上面的设置必须在ENC=0的情况下设置
ADC12IE=BIT0;//使能ADC中断
ADC12CTL0|=ENC;//使能转换
ADC12CTL0|=ADC12SC;//开始转换
_EINT();//开启全局中断
LPM0;
}
/*******************************************
函数名称:ADC12ISR
功能:ADC中断服务函数,在这里用多次平均的
计算P6.0口的模拟电压数值
参数:无
返回值:无
********************************************/
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
staticuintindex=0;
results[index++]=ADC12MEM0;//将转换的结果存入数组
if(index==Num_of_Results)//如果数组存满
{
uchari;
unsignedlongsum=0;
index=0;//在从头开始存,会覆盖原有的数据
for(i=0;i
{
sum+=results[i];
}
sum>>=5;//除以32
Trans_val(sum);
}
}
/*******************************************
函数名称:Trans_val
功能:将16进制ADC转换数据变换成三位10进制
真实的模拟电压数据,并在液晶上显示
参数:Hex_Val--16进制数据
n--变换时的分母等于2的n次方
返回值:无
********************************************/
voidTrans_val(uintHex_Val)
{
unsignedlongcaltmp;
uintCurr_Volt;
uchart1,i;
ucharptr[4];
caltmp=Hex_Val;
caltmp=(caltmp<<5)+Hex_Val;//caltmp=Hex_Val*33
caltmp=(caltmp<<3)+(caltmp<<1);//caltmp=caltmp*10
Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n