十万火急【msp430单片机的AD转换程序】!!!!!

正参加电子设计大赛,急需要MSP430AD转换程序.
1.如果是MSP430F247的或者MSP430F1611的更好。
2.要包括主程序和AD初始化程序。
3.如果有AD的几种模式的初始化也行。
4.如果程序好的,追加重分悬赏!
5.可以发到我的邮箱里面 lszxliubo@163.com
6.最好是能用128*64液晶显示的。

这个是F247的程序。

#include "msp430x24x.h"
#define Latch_addr_H P5OUT|=0x10
#define Latch_addr_L P5OUT&=0xef
#define Latch_data_H P5OUT|=0x20
#define Latch_data_L P5OUT&=0xdf
#define uchar unsigned char
void delay(unsigned int i);
void LED_Disp(uchar pos,uchar value);
void init();
void transport();
void ADC12setup(void);
const uchar tab[11]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfe};
uchar shuma[4]={6,7,8,9};
unsigned int shuju;

//主函数
main( void )
{
uchar m;
P5DIR |= 0x30; //定义为输出端口
P4DIR |= 0xff;
P2DIR |=0xff;
P2OUT=0xff;
init();

transport();
delay(2000);
ADC12CTL0 |= ADC12SC; //sampling open,AD转换完成后(ADC12BUSY=0),ADC12SC自动复位;
while((ADC12IFG & BIT0) == 0); //等转换结束
shuju = ADC12MEM0; //读转换数据值,同时清ADC12IFG0标志

while(1)
{
//ADC12CTL0 |= ADC12SC; //sampling open,AD转换完成后(ADC12BUSY=0),ADC12SC自动复位;
//while((ADC12IFG & BIT0) == 0); //等转换结束
//shuju = ADC12MEM0;

transport();

LED_Disp(m,shuma[m]);
delay(5);
m++;
if(m>3)
m=0;
if(m==3)
{
LED_Disp(m,10);
delay(5);
}

}
}

//初始化+采集
void init()
{
WDTCTL = WDTPW + WDTHOLD; // 停止WDT
P1DIR=0x01;P1OUT=0x0f; //LED设置
ADC12setup();
_EINT(); // 全局中断使能

}
//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_0; //R+=3.3V R-=VSS
//转换允许
ADC12CTL0 |= ENC ; //转换允许(上升沿)
shuju=0x00;
}

//转换
void transport()
{

unsigned int q;
q=(shuju*5)/4;
shuma[0]=q%10;
shuma[1]=(q%100)/10;
shuma[2]=(q%1000)/100;
shuma[3]=q/1000;
}
//显示函数
void LED_Disp(uchar pos,uchar value)
{

P5OUT=0x00;
P4OUT=0x10<<(pos);
Latch_addr_H;
Latch_addr_L;

if( value<=10)
{
P4OUT=tab[value];
Latch_data_H;
Latch_data_L;
}
}
//延时
void delay(unsigned int i)
{ int m,n;
for(m=0;m<i;m++)
for(n=0;n<120;n++);
}
/*adc中断服务程序
#pragma vector=ADC_VECTOR//ADC 中断服务程序
__interrupt void ADC12ISR (void)
{
static unsigned int index = 0; // 中断服务程序中的静态变量

A0results[index] = ADC12MEM0; //移动A0 结果往数组,此操作的同时清除ADC12FIG.0
A1results[index] = ADC12MEM1; //移动A1 结果往数组,此操作的同时清除ADC12FIG.1
A2results[index] = ADC12MEM2; //移动A2 结果往数组,此操作的同时清除ADC12FIG.2
A3results[index] = ADC12MEM3; //移动A3 结果往数组,此操作的同时清除ADC12FIG.3
index = (index+1)%Num_of_Results; // 增加结果的索引,取index 变量的模(余数)
}
*/
温馨提示:内容为网友见解,仅供参考
第1个回答  2020-05-20
这个是F247的程序。
#include
"msp430x24x.h"
#define
Latch_addr_H
P5OUT|=0x10
#define
Latch_addr_L
P5OUT&=0xef
#define
Latch_data_H
P5OUT|=0x20
#define
Latch_data_L
P5OUT&=0xdf
#define
uchar
unsigned
char
void
delay(unsigned
int
i);
void
LED_Disp(uchar
pos,uchar
value);
void
init();
void
transport();
void
ADC12setup(void);
const
uchar
tab[11]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfe};
uchar
shuma[4]={6,7,8,9};
unsigned
int
shuju;
//主函数
main(
void
)
{
uchar
m;
P5DIR
|=
0x30;
//定义为输出端口
P4DIR
|=
0xff;
P2DIR
|=0xff;
P2OUT=0xff;
init();
transport();
delay(2000);
ADC12CTL0
|=
ADC12SC;
//sampling
open,AD转换完成后(ADC12BUSY=0),ADC12SC自动复位;
while((ADC12IFG
&
BIT0)
==
0);
//等转换结束
shuju
=
ADC12MEM0;
//读转换数据值,同时清ADC12IFG0标志
while(1)
{
//ADC12CTL0
|=
ADC12SC;
//sampling
open,AD转换完成后(ADC12BUSY=0),ADC12SC自动复位;
//while((ADC12IFG
&
BIT0)
==
0);
//等转换结束
//shuju
=
ADC12MEM0;
transport();
LED_Disp(m,shuma[m]);
delay(5);
m++;
if(m>3)
m=0;
if(m==3)
{
LED_Disp(m,10);
delay(5);
}
}
}
//初始化+采集
void
init()
{
WDTCTL
=
WDTPW
+
WDTHOLD;
//
停止WDT
P1DIR=0x01;P1OUT=0x0f;
//LED设置
ADC12setup();
_EINT();
//
全局中断使能
}
//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_0;
//R+=3.3V
R-=VSS
//转换允许
ADC12CTL0
|=
ENC
;
//转换允许(上升沿)
shuju=0x00;
}
//转换
void
transport()
{
unsigned
int
q;
q=(shuju*5)/4;
shuma[0]=q%10;
shuma[1]=(q%100)/10;
shuma[2]=(q%1000)/100;
shuma[3]=q/1000;
}
//显示函数
void
LED_Disp(uchar
pos,uchar
value)
{
P5OUT=0x00;
P4OUT=0x10<<(pos);
Latch_addr_H;
Latch_addr_L;
if(
value<=10)
{
P4OUT=tab[value];
Latch_data_H;
Latch_data_L;
}
}
//延时
void
delay(unsigned
int
i)
{
int
m,n;
for(m=0;m<i;m++)
for(n=0;n<120;n++);
}
/*adc中断服务程序
#pragma
vector=ADC_VECTOR//ADC
中断服务程序
__interrupt
void
ADC12ISR
(void)
{
static
unsigned
int
index
=
0;
//
中断服务程序中的静态变量
A0results[index]
=
ADC12MEM0;
//移动A0
结果往数组,此操作的同时清除ADC12FIG.0
A1results[index]
=
ADC12MEM1;
//移动A1
结果往数组,此操作的同时清除ADC12FIG.1
A2results[index]
=
ADC12MEM2;
//移动A2
结果往数组,此操作的同时清除ADC12FIG.2
A3results[index]
=
ADC12MEM3;
//移动A3
结果往数组,此操作的同时清除ADC12FIG.3
index
=
(index+1)%Num_of_Results;
//
增加结果的索引,取index
变量的模(余数)
}
*/
第2个回答  2019-09-09
这个是F247的程序。
#include
"msp430x24x.h"
#define
Latch_addr_H
P5OUT|=0x10
#define
Latch_addr_L
P5OUT&=0xef
#define
Latch_data_H
P5OUT|=0x20
#define
Latch_data_L
P5OUT&=0xdf
#define
uchar
unsigned
char
void
delay(unsigned
int
i);
void
LED_Disp(uchar
pos,uchar
value);
void
init();
void
transport();
void
ADC12setup(void);
const
uchar
tab[11]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfe};
uchar
shuma[4]={6,7,8,9};
unsigned
int
shuju;
//主函数
main(
void
)
{
uchar
m;
P5DIR
|=
0x30;
//定义为输出端口
P4DIR
|=
0xff;
P2DIR
|=0xff;
P2OUT=0xff;
init();
transport();
delay(2000);
ADC12CTL0
|=
ADC12SC;
//sampling
open,AD转换完成后(ADC12BUSY=0),ADC12SC自动复位;
while((ADC12IFG
&
BIT0)
==
0);
//等转换结束
shuju
=
ADC12MEM0;
//读转换数据值,同时清ADC12IFG0标志
while(1)
{
//ADC12CTL0
|=
ADC12SC;
//sampling
open,AD转换完成后(ADC12BUSY=0),ADC12SC自动复位;
//while((ADC12IFG
&
BIT0)
==
0);
//等转换结束
//shuju
=
ADC12MEM0;
transport();
LED_Disp(m,shuma[m]);
delay(5);
m++;
if(m>3)
m=0;
if(m==3)
{
LED_Disp(m,10);
delay(5);
}
}
}
//初始化+采集
void
init()
{
WDTCTL
=
WDTPW
+
WDTHOLD;
//
停止WDT
P1DIR=0x01;P1OUT=0x0f;
//LED设置
ADC12setup();
_EINT();
//
全局中断使能
}
//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_0;
//R+=3.3V
R-=VSS
//转换允许
ADC12CTL0
|=
ENC
;
//转换允许(上升沿)
shuju=0x00;
}
//转换
void
transport()
{
unsigned
int
q;
q=(shuju*5)/4;
shuma[0]=q%10;
shuma[1]=(q%100)/10;
shuma[2]=(q%1000)/100;
shuma[3]=q/1000;
}
//显示函数
void
LED_Disp(uchar
pos,uchar
value)
{
P5OUT=0x00;
P4OUT=0x10<<(pos);
Latch_addr_H;
Latch_addr_L;
if(
value<=10)
{
P4OUT=tab[value];
Latch_data_H;
Latch_data_L;
}
}
//延时
void
delay(unsigned
int
i)
{
int
m,n;
for(m=0;m<i;m++)
for(n=0;n<120;n++);
}
/*adc中断服务程序
#pragma
vector=ADC_VECTOR//ADC
中断服务程序
__interrupt
void
ADC12ISR
(void)
{
static
unsigned
int
index
=
0;
//
中断服务程序中的静态变量
A0results[index]
=
ADC12MEM0;
//移动A0
结果往数组,此操作的同时清除ADC12FIG.0
A1results[index]
=
ADC12MEM1;
//移动A1
结果往数组,此操作的同时清除ADC12FIG.1
A2results[index]
=
ADC12MEM2;
//移动A2
结果往数组,此操作的同时清除ADC12FIG.2
A3results[index]
=
ADC12MEM3;
//移动A3
结果往数组,此操作的同时清除ADC12FIG.3
index
=
(index+1)%Num_of_Results;
//
增加结果的索引,取index
变量的模(余数)
}
*/

十万火急【msp430单片机的AD转换程序】!!!
delay(2000);ADC12CTL0 |= ADC12SC; \/\/sampling open,AD转换完成后(ADC12BUSY=0),ADC12SC自动复位;while((ADC12IFG & BIT0) == 0); \/\/等转换结束 shuju = ADC12MEM0; \/\/读转换数据值,同时清ADC12IFG0标志 while(1){ \/\/ADC12CTL0 |= ADC12SC; \/\/sampling open,AD转换完成...

#芝麻开门#msp430的AD转换
当然是电压数据,这个数据对应的就是送入单片机的0.5——2.5V的电压数据。然后要根据放大倍数,算出放大前的电压,然后在根据放大前的电压,算出PT100的电阻值,然后查表求出温度;然后把温度转换成相应进制的数据显示在数码管上。

msp430的AD转换程序中断问题“__bis_SR_register(LPM0_bits + GIE...
__bis_SR_register(LPM0_bits + GIE); \/\/置位SR寄存器,LPM0_bits是低功耗模式中的一种,CPU休息,具体可以查手册;GIE是打开全局中断使能 __no_operation(); \/\/进行一个时钟周期的无操作,一般调试可以把断点打在这 这个主要是用在低功耗上,cpu不需要工作时就打到休眠,打开中断使能,等待中...

MSP430中16进制转10进制的函数,看不懂
AD采样得到的N值和电压之间的关系我相信你清楚,V=N*Vref(参考电压)\/2的12次方。这里你只是部分函数,但是MSP430的供电电压是3.3V,我想你的参考电压就应该是3.3V。所以V=N*3.3V*100\/((2的12次方)*100)。这里为什么上下都乘了100,主要就是因为下面16进制转10进制方便处理。caltmp = Hex...

MSP430单片机14脚的JTAG仿真器怎样转换成10脚的
20Pin Connector 的定义如下( 参考此图 ) :Vcc 1 2 NC nTRST 3 4 GND TDI 5 6 GND TMS 7 8 GND TCK 9 10 GND GND 11 12 GND TDO 13 14 GND NRESET 15 16 GND NC 17 18 GND NC 19 20 GND 14Pin:nTRST 1 2 GND TDI 3 4 GND...

MSP430单片机温控系统中,外部温度传感器读到的电压值如何转换为我想要的...
二、采用已经封装好的数字温度传感器,可以直接读出温度值。这个相对比较简单。做I2C协议或者1WIRE的协议就可以、三、加热问题,一般是用GPIO控制继电器,控制电热丝加热。 单片机一般只有3.3V 电压低电流大不适合做加热。 一般用大电压,在相同的功率下,电流小。有其他的问题再发站内信 ...

MSP430 AD部分的小问题
1) SHT1 \/ SHT0是采样保持时间长短设置。AD都有最小采样保持时间,不懂的话,百度下。这个和电路匹配还有芯片本身寄生电容、采样电容大小相关。2)SHP 是用来选择 脉冲采样方式 (Pulse sample mode)还是扩展采样模式(Extended sample mode)3)SAMPCON 实际是 触发采样动作到采样完成 的时间差。

为什么像有些单片机如MSP430有集成的A\/D转换模块还要用外围的A\/D芯片...
MSP430或其它单片机内建的ADC参数达不到要求,就需要外置的ADC芯片了。比如说,TI的MSP430有些型号所带的Sigma-Delta 16位ADC,仅有200SPS的采样率,就是每秒能采样200次,如果是做音频应用,例如44.1kHz采样率,它根本就无法支持了,所以需要外置。又比如有些MSP430带的是SAR结构的ADC12,但是应用上...

我用msp430单片机内部AD读精密电位器(WDD35)的值比用万用表的值小很多...
2)你用精度是多少的万用表来测的,这个也比较重要吧,普通的我姑且认为是一般的分辨率就可以读取,这样的话差异小也正常,主要还是1)中的问题。3)从你的描述中“用普通的电位器用单片机AD读的值和万用表读的值很接近”我可以理解为你的ad转换程序是OK而且也做了相关的量化了吗,读取的数据是要...

如何将一个方波在MSP430单片机内转换成数字信号
1、确定一下这个方波的电压范围,是不是出于0~3.3V,如果不是,请做好转换电路,将该方波转换到这个电压范围,否则单片机无法识别。2、确定该方波的频率范围,去查一下香农采样定理,然后判断你的单片机能否正确采样。3、上述都没问题之后,通过MSP430内容的脉冲捕捉器就可以采集了。

相似回答