专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
一段MSP430G2553通过ADC采集数据发送到电脑端的程序
2019-03-24 10:10
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
6558
8
978
这是在网上找到并略加修改的一段代码 通过串口调试助手测试的时候 设定的ADC输入端未连接任何信号源 单片机不断发出数据 也不知道是什么东西 求大神指导 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
still1945
1楼-- · 2019-03-24 19:04
#include<MSP430G2553.h>unsigned int k;char str[]="00.0";long temp;unsigned char tmp[3];long IntDeg;void ADC10_ISR(void);void ADC10_init(void);void Init_uart0(void);
void Uart0Sends(char *s){ while(*s!=' ') //查找字符。 { UCA0TXBUF=*s; while((IFG2&UCA0TXIFG)==0); //查询发送是否结束,寄存器为空置位,满为复位?? IFG2&=~UCA0TXIFG; //清除发送一标志位,多余的语句,发送完毕 s++; }}
void main(){ WDTCTL=WDTPW+WDTHOLD; ADC10_init(); BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; P1DIR|=BIT0; Init_uart0();
_EINT(); while(1) { ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start 采样开始, // _bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled __delay_cycles(1000); //-----ADC转换完成中断唤醒CPU后才执行以下代码-----
temp = ADC10MEM; //读取AD采样值// IntDeg= temp*4225/1024 - 2777;//转换为摄氏度,并10倍处理 IntDeg=((temp*33)/1023);//if(IntDeg>=200)// P1OUT |= BIT0;// else// P1OUT &= ~BIT0; str[0]=IntDeg/100+0X30; str[1]=IntDeg%100/10+0X30; str[3]=IntDeg%100%10+0X30;
// IntDeg=-123; //由于难以获得负温,直接给负值以测试LCD显示 }
}
/****************************************************************************************************** * 名 称:ADC10_init(void) * 功 能:初始化ADC10采集内部温度传感器,单次手动采样 * 入口参数:无 * 出口参数:无 * 说 明:直接从CCS的Example中移植过来 * 范 例:无 ******************************************************************************************************/void ADC10_init(void){ P1DIR&=~BIT4; ADC10CTL0 &= ~ENC; // 关闭AD转换器 ADC10CTL0 = ADC10IE + ADC10ON + REFON + ADC10SHT_3 + SREF_1;//1 允许ADC10中断 1 ADC10开启 ,打开基准源 64个ADC10CLK周期 ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3 + SHS_0 + INCH_4;//单通道单次采样模式 ADC10OSC 8分频 ADC10SC位 __delay_cycles(30000); ADC10CTL0 |= ENC; //开启AD转换器}/****************************************************************************************************** * 名 称:ADC10_ISR_HOOK * 功 能:ADC转换完成后唤醒CPU * 入口参数:无 * 出口参数:无 * 说 明:直接从CCS的Example中移植过来 * 范 例:无 ******************************************************************************************************/#pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR_HOOK(void){ Uart0Sends(str); _bic_SR_register_on_exit(LPM4_bits);}/********************************************************************************************************** * 串口初始化********************************************************************************************************* */void Init_uart0(){ UCA0CTL1|=UCSWRST; P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能 P1SEL2|=BIT1+BIT2;//系统组合 P1DIR |= BIT2; //P1.2 UART_TX P1DIR &=~BIT1; //P1.2 UART_RX UCA0CTL0&=~UC7BIT;//字符长度为8 UCA0CTL1|=UCSSEL_2;//选择系统时钟 UCA0BR0=0x68; //波特率为9600 UCA0BR1=0; UCA0MCTL=0X40;//UCA0MCTL=UCBRS0; UCA0CTL1&=~UCSWRST;
IE2|=UCA0RXIE;//开接收使能
}
#pragma vector=USCIAB0RX_VECTOR__interrupt void usart0_rx(void){ while((IFG2&UCA0RXIFG )==0);//接收一位然后给发送缓存器 再中断再接受 再发送的过程 IFG2&=~UCA0RXIFG ;
Uart0Sends(str);
UCA0TXBUF = UCA0RXBUF;}
加载中...
qiushenghua
2楼-- · 2019-03-24 20:36
< :TI_MSP430_内容页_SA7 --> 没去看代码,需要指出的是,程序不管你有没有输入,它只会按指令办事,浮空输入同样也会转换并输出。
你可以将模拟输入管脚接在一个稳定的电平上,看看转换结果是否同样稳定。
加载中...
ienglgge
3楼-- · 2019-03-24 22:25
精彩回答 2 元偷偷看……
加载中...
littleshrimp
4楼-- · 2019-03-25 03:06
同意楼上二位的说法
加载中...
强仔00001
5楼-- · 2019-03-25 07:16
同意二楼的,你不接入信号源,AD也会有数值漂的
加载中...
still1945
6楼-- · 2019-03-25 11:13
精彩回答 2 元偷偷看……
加载中...
1
2
下一页
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
void Uart0Sends(char *s){ while(*s!=' ') //查找字符。 { UCA0TXBUF=*s; while((IFG2&UCA0TXIFG)==0); //查询发送是否结束,寄存器为空置位,满为复位?? IFG2&=~UCA0TXIFG; //清除发送一标志位,多余的语句,发送完毕 s++; }}
void main(){ WDTCTL=WDTPW+WDTHOLD; ADC10_init(); BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; P1DIR|=BIT0; Init_uart0();
_EINT(); while(1) { ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start 采样开始, // _bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled __delay_cycles(1000); //-----ADC转换完成中断唤醒CPU后才执行以下代码-----
temp = ADC10MEM; //读取AD采样值// IntDeg= temp*4225/1024 - 2777;//转换为摄氏度,并10倍处理 IntDeg=((temp*33)/1023);//if(IntDeg>=200)// P1OUT |= BIT0;// else// P1OUT &= ~BIT0; str[0]=IntDeg/100+0X30; str[1]=IntDeg%100/10+0X30; str[3]=IntDeg%100%10+0X30;
// IntDeg=-123; //由于难以获得负温,直接给负值以测试LCD显示 }
}
/****************************************************************************************************** * 名 称:ADC10_init(void) * 功 能:初始化ADC10采集内部温度传感器,单次手动采样 * 入口参数:无 * 出口参数:无 * 说 明:直接从CCS的Example中移植过来 * 范 例:无 ******************************************************************************************************/void ADC10_init(void){ P1DIR&=~BIT4; ADC10CTL0 &= ~ENC; // 关闭AD转换器 ADC10CTL0 = ADC10IE + ADC10ON + REFON + ADC10SHT_3 + SREF_1;//1 允许ADC10中断 1 ADC10开启 ,打开基准源 64个ADC10CLK周期 ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3 + SHS_0 + INCH_4;//单通道单次采样模式 ADC10OSC 8分频 ADC10SC位 __delay_cycles(30000); ADC10CTL0 |= ENC; //开启AD转换器}/****************************************************************************************************** * 名 称:ADC10_ISR_HOOK * 功 能:ADC转换完成后唤醒CPU * 入口参数:无 * 出口参数:无 * 说 明:直接从CCS的Example中移植过来 * 范 例:无 ******************************************************************************************************/#pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR_HOOK(void){ Uart0Sends(str); _bic_SR_register_on_exit(LPM4_bits);}/********************************************************************************************************** * 串口初始化********************************************************************************************************* */void Init_uart0(){ UCA0CTL1|=UCSWRST; P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能 P1SEL2|=BIT1+BIT2;//系统组合 P1DIR |= BIT2; //P1.2 UART_TX P1DIR &=~BIT1; //P1.2 UART_RX UCA0CTL0&=~UC7BIT;//字符长度为8 UCA0CTL1|=UCSSEL_2;//选择系统时钟 UCA0BR0=0x68; //波特率为9600 UCA0BR1=0; UCA0MCTL=0X40;//UCA0MCTL=UCBRS0; UCA0CTL1&=~UCSWRST;
IE2|=UCA0RXIE;//开接收使能
}
#pragma vector=USCIAB0RX_VECTOR__interrupt void usart0_rx(void){ while((IFG2&UCA0RXIFG )==0);//接收一位然后给发送缓存器 再中断再接受 再发送的过程 IFG2&=~UCA0RXIFG ;
Uart0Sends(str);
UCA0TXBUF = UCA0RXBUF;}
你可以将模拟输入管脚接在一个稳定的电平上,看看转换结果是否同样稳定。
一周热门 更多>