您好,我需要一个msp430的AD程序,您能帮助一下吗? 10
展开全部
#include <msp430x14x.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
ADC12CTL0 = SHT0_2 + ADC12ON;
ADC12CTL1 = SHP;
ADC12IE = 0x01;
ADC12CTL0 |= ENC;
P6SEL |= 0x01;
P1DIR |= 0x01;
for (;;)
{
ADC12CTL0 |= ADC12SC;
_BIS_SR(CPUOFF + GIE);
}
}
// ADC12 interrupt service routine
#pragma vector=ADC12_VECTOR
__interrupt void ADC12_ISR (void)
{
if (ADC12MEM0 < 0x7FF)
P1OUT &= ~0x01;
else
P1OUT |= 0x01;
_BIC_SR_IRQ(CPUOFF);
}
很简单的一个程序,adc采样外部电压,低于设置值时关灯,高于它时开灯
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
ADC12CTL0 = SHT0_2 + ADC12ON;
ADC12CTL1 = SHP;
ADC12IE = 0x01;
ADC12CTL0 |= ENC;
P6SEL |= 0x01;
P1DIR |= 0x01;
for (;;)
{
ADC12CTL0 |= ADC12SC;
_BIS_SR(CPUOFF + GIE);
}
}
// ADC12 interrupt service routine
#pragma vector=ADC12_VECTOR
__interrupt void ADC12_ISR (void)
{
if (ADC12MEM0 < 0x7FF)
P1OUT &= ~0x01;
else
P1OUT |= 0x01;
_BIC_SR_IRQ(CPUOFF);
}
很简单的一个程序,adc采样外部电压,低于设置值时关灯,高于它时开灯
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
STM32是一款广泛应用于消费类电子、汽车、工业和物联网领域的低功耗嵌入式系统芯片。ST公司推出了多个STM32系列,以满足不同应用需求。以下是ST公司主要的STM32系列:1. STM32WB系列:这是ST公司推出的第一款支持2.4GHz...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
/*******************************************************
ADC12电压测量实验
网址:http://www.eda121.com
功能:在数码管上显示P6.0输入的电压
参考电压为外部
*******************************************************/
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uchar Code[18]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar Bit[8]={0,0,0,0,0,0,0,0}; //数码管各位显示的数字
uchar BitCode=0x80; //数码管位码初值
uint ADCBuf[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到的数据
ulong Sum=0;//20个数据的和
ulong VBuf=0;//电压扩大10000000的值
uchar Count=0;
//时钟初始化函数
void InitClock(void){
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频 最高的标称频率
DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
do{
IFG1&=~OFIFG;//清除振荡器失效标志
for(uint i=255;i>0;i--);
}while(IFG1&OFIFG);//判断XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频
}
//端口初始化函数
void InitPort(void){
P2SEL=0x00;//P2口所有引脚设置为一般的IO口
P4SEL=0x00;//P4口所有引脚设置为一般的IO口
P2DIR=0xFF;//P2口所有引脚设置为输出方向
P4DIR=0xFF;//P4口所有引脚设置为输出方向
P2OUT=0x00;//P2口先输出低电平
P4OUT=0xFF;//P4口先输出低电平
P5SEL&=~BIT7;//P5.7设置为一般的IO口
P5DIR|=BIT7;//P5.7设置为输出方向
P5OUT&=~BIT7;//P5.7输出低电平来使能74HC573来驱动数码管
}
//ms级延时子程序
void DelayMs(uint ms){
while(ms--){
for(uint i=0;i<800;i++);
}
}
//数码管扫描显示程序
void Display(void){
for(uchar i=0;i<8;i++){
P4OUT=BitCode; //输出位码
if(i==0){ //输出段码,如果第三位显示小数点
P2OUT=Code[Bit[i]]&0x7F;
}else{
P2OUT=Code[Bit[i]];
}
BitCode>>=1;//位码右移一位
if(BitCode==0) BitCode=0x80;
DelayMs(1); //延时1ms
P2OUT=0xFF;
}
}
//ADC12初始化
void InitADC12(void){
P6SEL=0x01;//P6.0为模拟输入
ADC12CTL0&=~ENC;//ENC设置为0从而修改ADC12寄存器
ADC12MCTL0=INCH_0+SREF_2+EOS;//参考电压为VeREF+和AVss 输入通道A0
ADC12CTL1=CSTARTADD_0+SHP+CONSEQ_2+ADC12SSEL_0+ADC12DIV_0;//起始地址ADCMEM0,采样脉冲由采样定时器产生,单通道多次转换,内部时钟源不分频
ADC12CTL0=MSC+ADC12ON;//采样信号由SHI仅首次触发,打开ADC12模块
}
//计算电压值
void GetV(void){
for(uchar i=0;i<20;i++) Sum+=ADCBuf[i];
VBuf=Sum/20.0*((2.5*10000000)/4095.0);//计算电压并扩大10000000倍 2.5为外部参考电压 可用R4调节
Sum=0;
//计算数码管各位要显示的数值
Bit[0]=VBuf/10000000;
Bit[1]=VBuf%10000000/1000000;
Bit[2]=VBuf%1000000/100000;
Bit[3]=VBuf%100000/10000;
Bit[4]=VBuf%10000/1000;
Bit[5]=VBuf%1000/100;
Bit[6]=VBuf%100/10;
Bit[7]=VBuf%10;
}
//定时器A初始化
void InitTimerA(void){
TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数 清除TAR
CCTL0=CCIE;//CCR0中断允许 比较模式
CCR0=20000;//时间间隔20ms
}
//定时器A中断
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAINT(void){
ADC12CTL0&=~ENC;
ADCBuf[Count]=ADC12MEM0;
Count++;
if(Count==20){
GetV();
Count=0;
}
ADC12CTL0|=ENC+ADC12SC;//使能ADC转换
}
void main(){
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
InitClock();
InitPort();
InitTimerA();
InitADC12();
_EINT();//打开中断
while(1){
Display();
}
}
ADC12电压测量实验
网址:http://www.eda121.com
功能:在数码管上显示P6.0输入的电压
参考电压为外部
*******************************************************/
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uchar Code[18]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar Bit[8]={0,0,0,0,0,0,0,0}; //数码管各位显示的数字
uchar BitCode=0x80; //数码管位码初值
uint ADCBuf[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到的数据
ulong Sum=0;//20个数据的和
ulong VBuf=0;//电压扩大10000000的值
uchar Count=0;
//时钟初始化函数
void InitClock(void){
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频 最高的标称频率
DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
do{
IFG1&=~OFIFG;//清除振荡器失效标志
for(uint i=255;i>0;i--);
}while(IFG1&OFIFG);//判断XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频
}
//端口初始化函数
void InitPort(void){
P2SEL=0x00;//P2口所有引脚设置为一般的IO口
P4SEL=0x00;//P4口所有引脚设置为一般的IO口
P2DIR=0xFF;//P2口所有引脚设置为输出方向
P4DIR=0xFF;//P4口所有引脚设置为输出方向
P2OUT=0x00;//P2口先输出低电平
P4OUT=0xFF;//P4口先输出低电平
P5SEL&=~BIT7;//P5.7设置为一般的IO口
P5DIR|=BIT7;//P5.7设置为输出方向
P5OUT&=~BIT7;//P5.7输出低电平来使能74HC573来驱动数码管
}
//ms级延时子程序
void DelayMs(uint ms){
while(ms--){
for(uint i=0;i<800;i++);
}
}
//数码管扫描显示程序
void Display(void){
for(uchar i=0;i<8;i++){
P4OUT=BitCode; //输出位码
if(i==0){ //输出段码,如果第三位显示小数点
P2OUT=Code[Bit[i]]&0x7F;
}else{
P2OUT=Code[Bit[i]];
}
BitCode>>=1;//位码右移一位
if(BitCode==0) BitCode=0x80;
DelayMs(1); //延时1ms
P2OUT=0xFF;
}
}
//ADC12初始化
void InitADC12(void){
P6SEL=0x01;//P6.0为模拟输入
ADC12CTL0&=~ENC;//ENC设置为0从而修改ADC12寄存器
ADC12MCTL0=INCH_0+SREF_2+EOS;//参考电压为VeREF+和AVss 输入通道A0
ADC12CTL1=CSTARTADD_0+SHP+CONSEQ_2+ADC12SSEL_0+ADC12DIV_0;//起始地址ADCMEM0,采样脉冲由采样定时器产生,单通道多次转换,内部时钟源不分频
ADC12CTL0=MSC+ADC12ON;//采样信号由SHI仅首次触发,打开ADC12模块
}
//计算电压值
void GetV(void){
for(uchar i=0;i<20;i++) Sum+=ADCBuf[i];
VBuf=Sum/20.0*((2.5*10000000)/4095.0);//计算电压并扩大10000000倍 2.5为外部参考电压 可用R4调节
Sum=0;
//计算数码管各位要显示的数值
Bit[0]=VBuf/10000000;
Bit[1]=VBuf%10000000/1000000;
Bit[2]=VBuf%1000000/100000;
Bit[3]=VBuf%100000/10000;
Bit[4]=VBuf%10000/1000;
Bit[5]=VBuf%1000/100;
Bit[6]=VBuf%100/10;
Bit[7]=VBuf%10;
}
//定时器A初始化
void InitTimerA(void){
TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数 清除TAR
CCTL0=CCIE;//CCR0中断允许 比较模式
CCR0=20000;//时间间隔20ms
}
//定时器A中断
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAINT(void){
ADC12CTL0&=~ENC;
ADCBuf[Count]=ADC12MEM0;
Count++;
if(Count==20){
GetV();
Count=0;
}
ADC12CTL0|=ENC+ADC12SC;//使能ADC转换
}
void main(){
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
InitClock();
InitPort();
InitTimerA();
InitADC12();
_EINT();//打开中断
while(1){
Display();
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询