/***********************************************
程序功能:MSP430F149的ADC模块测试
程序简介:设置430内部的的12位ADC模块工作,讲采集的数据的10进制数值显示在数码管上
程序现象:从P6.0输入一个模拟电压值(0~2.5V),就可以看到LED数码管上显示了一个四位数
且随着输入电压的变化而变化(0000~4095)
作者:鱼小
时间:2008-08-11凌晨
地点:机电楼电赛培训基地
***********************************************/
#include <msp430x14x.h>
#define uint unsigned int
#define duan P2OUT //LED段
#define wei P1OUT //LED位(P1低四位)
uint ADC0; //保存输出值
char dis_buffer[4];
char seg7code[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳数码管段码,最后一位为空
//ADC12初始化
void ADC12setup(void)
{
//ADC12设置**************************
P6SEL |= 0x01; //使用A/D通道 A0
ADC12CTL0 = ADC12ON ; //开ADC12内核,设SHT0=2 (N=4)
ADC12CTL1 = SHP ; //SAMPCON信号选为采样定时器输出
//ADC12内部参考电压设置
ADC12CTL0 |= REF2_5V; //选用内部参考电压为2.5V
ADC12CTL0 |= REFON; //内部参考电压打开
ADC12MCTL0 |= SREF_1; //R+=2.5V R-=VSS
//转换允许
ADC12CTL0 |= ENC ; //转换允许(上升沿)
ADC0=0x00;
}
//延时
void delay(uint i){
while(i--){
char j;
for (j=0;j<125;j++);
}
}
//数据变换
void data_converter( char *p,unsigned int value)
{
unsigned int m,n,j=0;
p[0]=value/1000;
m=value%1000;
p[1]=m/100;
n=m%100;
p[2]=n/10;
j=n%10;
p[3]=j/1;
}
//数码管显示
void display()
{
uint i;
for(i=0;i<4;i++)
{
switch(i)
{
case 0:wei=0x0e;duan=seg7code[dis_buffer[0]];delay(1);duan=0xff;break;
case 1:wei=0x0d;duan=seg7code[dis_buffer[1]];delay(1);duan=0xff;break;
case 2:wei=0x0b;duan=seg7code[dis_buffer[2]];delay(1);duan=0xff;break;
case 3:wei=0x07;duan=seg7code[dis_buffer[3]];delay(1);duan=0xff;break;
default:break;
}
}
}
//主函数
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P1DIR=0xff;
P2DIR=0xff;
ADC12setup();
for (;;)
{
ADC12CTL0 |= ADC12SC; //sampling open,AD转换完成后
(ADC12BUSY=0),ADC12SC自动复位;
while((ADC12IFG & BIT0) == 0); //等转换结束
ADC0 = ADC12MEM0; //读转换数据值,同时清ADC12IFG0标志
data_converter(dis_buffer,ADC0); //数据变换
display();
}
}
jizzll_617398179 2008-8-12 10:49
用户160522 2008-8-12 10:28