msp430串口发送程序f149为什么我的串口程序接受不了数据,请高手指教!!急急急

MSP430f149单片机,用DS18B20测温度,与PC串口通信_百度知道
MSP430f149单片机,用DS18B20测温度,与PC串口通信
这个程序我是把公司提供的两个源程序拼接在一起的,一个是ds18b20程序,一个是uart串口通信,但是最后把三个全局变量A1A2A3拼在一起输出一个字符串那里死活就是报错,求大神看看。
以下是把三个数字转换成字符串输出的函数。请指正哪里错了。
q=100*A1+10...
我有更好的答案
我没用过MSP430f149但是我感觉你这么写不对DS18B20带小数和负数的所以你可以把温度当字符来发。比如 +050.25设定7个ascii字符,用串口发出来比较好。
采纳率:57%
为您推荐:
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。基于msp430f149串口通信(接收字符串) - MSP430技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
基于msp430f149串口通信(接收字符串)
21:12:30  
用lcd1602显示接受的字符串
//接送字符串
#include &lcd1602.h&
uchar a[32]=&& && && && && && && && && && &&&&;
uchar rxcount = 0;
void PutString(uchar *ptr);
void main()
&&// Stop watchdog timer to prevent time out reset
& && &&&WDTCTL = WDTPW + WDTHOLD;
& && &&&//使用外部高频晶体振荡器
& && &&&BCSCTL1&=~XT2OFF;
& && &&&do{
& && && & IFG1&=~OFIFG;
& && && & for(j=0XFF;j&0;j--);
& && &&&}while((IFG1&OFIFG));
& && &&&BCSCTL2|=SELM_2;&&
& && &&&P3SEL |= 0x30;& && && && && && && && && & // P3.4,5 = USART0 TXD/RXD
& && &&&ME1 |= URXE0 + UTXE0;& && && && && && && && && &&&// Enable USART0 T/RXD
& && &&&UCTL0 |= CHAR;& && && && && && && && && & // 8-bit character
& && &&&UTCTL0 |= SSEL0;& && && && && && && && &&&// UCLK = ACLK
& && &&&UBR00 = 0x03;& && && && && && && && && &&&// 32k/9600 - 3.41
& && &&&UBR10 = 0x00;& && && && && && && && && &&&//
& && &&&UMCTL0 = 0x4A;& && && && && && && && && & //
& && &&&UCTL0 &= ~SWRST;& && && && && && && && &&&// 复位
& && &&&IE1=URXIE0;
& && &&&_EINT();
& && &&&init_lcd();
& && &&&delay(10);//等待初始化完毕
& && &&&while(1)
& && && && & display_string(a,0x80,16);& && && && &&&
& && && && & display_string(a+16,0xc0,16);& && && && &&&
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
& & a[rxcount++] = RXBUF0;//将接收到的数据存起来
& & if(rxcount==32)
& && &rxcount=0;
& & TXBUF0=RXBUF0;//将接收到的数据发出去
& & while((UTCTL0&0X01)==0);//等待数据发送完毕& && && &
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司msp430f149串口通信中断程序警告
[问题点数:50分]
msp430f149串口通信中断程序警告
[问题点数:50分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|MSP430单片机串口通信详解
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
MSP430单片机串口通信详解
#include&msp430G2553.h&
#include &in430.h&
void UartPutchar(unsigned char c);
unsigned char UartGetchar();
unsigned char temp=0;
unsigned char number[2]={0};
void main( void )
& WDTCTL = WDTPW + WDTHOLD; & & & & & & & & // Stop WDT
& BCSCTL1 = CALBC1_1MHZ; & & & & & & & & & &// Set DCO
& DCOCTL = CALDCO_1MHZ;
& P1DIR|=BIT6;
& P1OUT&=~BIT6;
& P1SEL = BIT1 + BIT2; & & & & & & & & & & &// P1.1为 RXD, P1.2为TXD
& P1SEL2 = BIT1 + BIT2; & & & & & & & & & & // P1.1为 RXD, P1.2为TXD
& UCA0CTL1 |= UCSSEL_2; & & & & & & & & & & // 选择时钟BRCLK
& UCA0BR0 = 106; & & & & & & & & & & & & & &// 1MHz 9600
& UCA0BR1 = 0; & & & & & & & & & & & & & & &// 1MHz 9600
& UCA0MCTL = UCBRS2 + UCBRS0; & & & & & & & // 波特率=BRCLK/(UBR+(M7+...0)/8)
& UCA0CTL1 &= ~UCSWRST; &
& // 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断
& IE2 |= UCA0RXIE; & & & & & & & & & & & & &// 使能接收中断
& &//UartPutchar(9);
& &// display_int(temp,0);
& & __delay_cycles(10000);
/**********************************UART接收中断*************************/
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
& //while (!(IFG2&UCA0TXIFG)); & & & & & & & &// 等待发送完成
& //UCA0TXBUF = UCA0RXBUF; & & & & & & & & & &// TX -& RXed character
& temp=UCA0RXBUF;
/******************************UART发送字节函数*************************/
void UartPutchar(unsigned char c)
&while(!(IFG2 & UCA0TXIFG)); &//待发送为空
&UCA0TXBUF=c;
&IFG2 &=~UCA0RXIFG;
/*********************************UART接收字节数据******************/
unsigned char UartGetchar()
& while(!(IFG2 & UCA0RXIFG)); //等待接收完成
& c=UCA0RXBUF;
& IFG2 &=~UCA0TXIFG;
/******智能控制工作室*******/
&&&MSP430g2553串口通信
MSP430的不同型号,其串行通讯工作模式是一样的。以MSP430G2553为例进行说明。MSP430G2553是20个引脚的16位单片机。具有内置的16位定时器、16k的FLASH和512B的RAM,以及一个通用型模拟比较器以及采用通用串行通信接口的内置通信能力。此外还具有一个10位的模数(A/D)转换器。其引脚排布如图1.1所示。其功能表如表1.1所示。
串行通讯模块主要由三个部分组成:波特率生成部分、发送控制器以及接收控制器。如图1.2所示。
一、UART模式
在异步模式下,接收器自身实现帧的同步,外部的通讯设备并不使用这一时钟。波特率的产生是在本地完成的。异步帧格式由1个起始位、7或8个数据位、校验位(奇/偶/无)、1个地址位、和1或2个停止位。一般最小帧为9个位,最大为13位。
(一)UART的初始化
单片机工作的时钟源来自内部三个时钟或者外部输入时钟,由SSEL1、SSEL0,以决定最终进入模块的时钟信号BRCLK的频率。所以配置串行通讯的第一步就是选择时钟。
通过选择时钟源和波特率寄存器的数据来确定位周期。所以波特率的配置是串行通讯中最重要的一部分。波特率设置用三个寄存器实现:UxBR0(选择控制器0):波特率发生器分频系数低8位。UxBR1(选择控制器1):波特率发生器分频系数高8位。UxMCTL
数据传输的格式,以及数据传输的模式是通过配置控制寄存器UCTL来进行设置。
接收控制部分和发送控制部分。首先需要串行口进行配置、使能以及开启中断。串口接收数据一般采用中断方式,发送数据采用主动发送。当接收到一个完整的数据,产生一个信号:URXIFG0=1(类似于51单片机的接收中断标志位),表示接收完整的数据。当数据正在发送中,UTXIFG0=1,此时不能再发送数据,必须等当前数据发送完毕(UTXIFG0=0)才能进行发送。
二、SPI模式
&&&USTAR下的SPI模式有如下特点:
1、SPI模式支持3线和4线模式;
2、支持主机与从机模式;
3、接受和发送有各自独立的发送移位寄存器和缓冲器;
4、接受和发送都有独立的中断能力;
&5、移位时钟的极性和相位可编程;
6、字符长度可以是7位或者8位。
SPI工作在全双工下,即主机发送的同时也接收数据,传输的速率由编程决定。4线SPI模式用附加数据线,允许从机数据的发送和接收。其信号如下:&SIMO:从进主出,主机模式下,数据输出;从机模式下,数据输入。SOMI:从出主进,主机模式下,数据输入,从机模式下,数据输出。UCLK:USART SPI模式时钟,信号有主机输出,从机输入。CLK时钟只能由主机提供。STE:从机模式发送接收允许控制脚,用于4线模式。
(一)SPI初始化
SPI当中不需要波特率调整,所以UxMCTL=0x0000,SPI的初始化及其复位和UART公用一套寄存器。
在初始化或者重新配置USART的SPI时,必须按照以下顺序进行:
1、UxCTL寄存器的第0位SWRST置位;
2、在SWRST置位的条件下,初始化所有的SPI寄存器,包括UxCTL寄存器;
3、通过置位模块使能寄存器MEx的URXEx和UTXEx位使能SPI的接受和发送使能模块;
4、通过软件复位UxCTL寄存器的第0位SWRST;
5、通过中断使能寄存器IEx的URXIEx和UTXIEx来使能发送和接受中断。
三、寄存器及其功能
通信模块寄存器如下:
(1)控制寄存器UxCTL
控制寄存器内的信息决定了USART的基本操作。如:选择通信协议、通信模式和校验位。在SWRST复位使USART复位操作禁止前,各位应根据选择的模式进行编程。
表3.2&&发送控制寄存器UxCTL
校验允许位
0:校验禁止
1:校验允许
奇偶校验位
停止位选择
0:1位停止位
1:2位停止位
3(LISTEN)
(选择是否发送数据由内部反馈给接收器)
USART模块的模式选择
0:UART模式(异步)
1:SPI模式(同步)
多机模式选择位
0:线路空闲多机协议
1:地址位多机协议
0(SWRST)
控制位(上电置位)
0:USART禁止
1:USART允许
(2)发送控制寄存器UxTCTL(未作说明的位未用)
寄存器UxTCTL控制与发送操作相关的USART硬件。
表3.3&&发送控制寄存器UxTCTL
时钟相位控制位
0:正常UCLK时钟
1:UCLK时钟延迟半个周期
时钟极性控制位
0:UCLKI信号与UCLK信号极性相同
1:UCLKI信号与UCLK信号极性相反
5(SSEL1)
时钟源选择
(确定波特率发生器的时钟源)
00:外部时钟UCLKI
01:辅助时钟ACLK
10:系统时钟MCLK
11:子系统时钟SMCLK
4(SSEL0)
发送控制位
0:SPI为4线模式
1:SPI为3线模式
0(TXEPT)
发送器空标志,在异步模式与同步模式时是不一样的
0:正在传输数据或者发送缓冲器(UTXBUF)有数据
1:表示发送移位寄存器和UTXBUF空或者SWRST=1
(3)接收控制寄存器URCTL
URCTL 控制与接收操作相关的USART硬件并保存由最新写入URXBUF的字符引起的出错状况和唤醒条件。若FE、PE、OE、BRK、RXERR 或 RXWake&中的任何一位置位,通过接收下一个字符不能使其复位。它们的复位要通过访问接收缓存URXBUF、USART的软件复位SWRST、系统复位PUC或用指令修改。
表3.4&&接收控制寄存器URCTL
帧错误标志位
0:无帧错误
1:有帧错误
校验错误标志位
0:校验正确
1:校验错误
溢出标志位
打断检测位
3(URXEIE)
接收出错中断允许位
0:禁止中断,不接收出错字符,不改变URXIFG标志
1:允许中断,接收出错字符,置位URXIFG标志
2(URXWIE)
接收唤醒中断允许位
0:接收的所有字符都能够置位URXIFG
1:只有接收到地址字符才置位URXIFG
1(RXWake)
接收唤醒检测位
0:未被唤醒,接收到的字符是数据
1:唤醒,接收的字符是地址
0(RXERR)
接收错误标志位
0:未接收到错误
1:接收到错误
在各种条件下URXEIE和URXWIE对URXIFG的影响:
接收字符后的标志位URXIFG
置位(&接收所&有字符)
(4)波特率选择寄存器和调制控制寄存器
波特率产生器利用波特率选择寄存器UxBR1和UxBR0,以及调整控制寄存器UxMCTL,来产生串行数据流的位定时。UxBR0、UxBR1这两个寄存器是用于存放波特率分频因子的整数部分,若波特率发生器的输入频率BRCLK不是所需波特率的整数倍,带有小数,则整数部分写入UxBR寄存器,小数部分则由调整寄存器UxMCT的内容反映。波特率由以下公式计算:
波特率=BRCLK/(UBR+(M7+M6+ &M0)/8)
寄存器各位如下:
(5)接收数据缓存URXBUF
接收缓存存放移位寄存器最后接收的字符,可由用户访问,读接收缓存可以复位接收时产生的各种错误标志、RXWAKE位和URXIFGx位。如果传输7位数据,接收缓存内容右对齐,最高位为0。当收接和控制条件为真时,接收缓存装入当前接收到的字符。
装入URXBUF
无差错地址字符
所有地址字符
无差错字符
(6)发送数据缓存UTXBUF
发送缓存含有当前要由发送器发送的数据。UTXIFG 标志表示UTXBUF已准备好接收下一个要发送的字符。将数据写入UTXBUF初始化发送功能。如果发送移位寄存器为空或即将为空,数据的发送立即开始。只有当UTXBUF为空时,数据才能写入缓存,否则可能发送不可预料的字符。
表1.1&&MSP430G2553引脚功能表
引脚功能描述
通用I/O口、ADC10模拟输入A0(1)&、Comparator_A+,CA0输入、TIMER _A时钟信号TACLK输入、ACLK信号输出
通用I/O 口、Timer0_A,捕捉:CCI0A输入,比较:Out0输出/ BSL发送、UART模式中USCI_A0接收数据输入、SPI模式中USCI_A0受控器数据输出/主控器输入、ADC10模拟输入A1 、Comparator_A+,CA1输入
通用I/O 口、Timer0_A,捕获:CCI1A输入,比较:Out1输出、UART模式中USCI_A0发送数据输出、SPI 模式中USCI_A0受控器数据输入/主控器输出、ADC10模拟输入A2、Comparator_A+,CA2输入
通用I/O 口、ADC10,转换时钟输出(1)、ADC10模拟输入A3、ADC10负基准电压、Comparator_A+,CA3输入、Comparator_A+,输出
通用I/O 口、Timer0_A,比较:Out0输出/ BSL接收、USCI_B0时钟输入/输出、USCI_A0受控器发送使能、ADC10模拟输入A5、Comparator_A+,CA5输入、JTAG测试模式选择输入终端
通用I/O 口、Timer1_A,捕获:CCI0A输入,比较:Out0输出
通用I/O 口、Timer1_A,捕获:CCI1A输入,比较:Out1输出
通用I/O 口、Timer1_A,捕获:CCI1B输入,比较:Out1输出
通用I/O 口、Timer1_A,捕获:CCI0B输入,比较:Out0输出
通用I/O 口、Timer1_A,捕获:CCI2A输入,比较:Out2输出
通用I/O 口、Timer1_A,捕获:CCI2B输入,比较:Out2输出
通用I/O 口、Timer0_A,比较:Out1输出、、ADC10模拟输入A6、Comparator_A+,CA6输入、SPI模式中USCI_B0受控器输出/主控器输入、I2C 模式中的USCI_B0SCLI2C 时钟、JTAG测试数据输入或测试时钟输入
通用I/O 口、ADC10模拟输入A7、Comparator_A+,CA7输入、Comparator_A+,输出、SPI模式中的USCI_B0受控器输入/主控器输出、I2C 模式中的USCI_B0SDAI2C 数据输入、JTAG测试数据输出终端或测试数据输入
复位、不可屏蔽中断输入、编程及测试期间的两线制(Spy-Bi-Wire) 测试数据输入/输出
为端口1上JTAG引脚选择测试模式、器件保护熔丝连接至TEST、编程及测试期间的Spy-Bi-Wire测试时钟输入
晶体振荡器的输出终端、通用I/O 口
晶体振荡器的输入终端、通用I/O 口、Timer0_A,比较:Out1输出
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved21ic官方微信-->
求模拟串口程序:MSP430F149,波特率9600,晶振32.768K
中级工程师, 积分 4574, 距离下一级还需 426 积分
中级工程师, 积分 4574, 距离下一级还需 426 积分
中级工程师, 积分 4574, 距离下一级还需 426 积分
中级工程师, 积分 4574, 距离下一级还需 426 积分
需要3个串口,只能模拟一个了,请大家帮忙。谢谢
中级工程师, 积分 4574, 距离下一级还需 426 积分
中级工程师, 积分 4574, 距离下一级还需 426 积分
中级工程师, 积分 4574, 距离下一级还需 426 积分
中级工程师, 积分 4574, 距离下一级还需 426 积分
这个很急用,谁会啊》
中级工程师, 积分 4545, 距离下一级还需 455 积分
中级工程师, 积分 4545, 距离下一级还需 455 积分
中级工程师, 积分 4545, 距离下一级还需 455 积分
中级工程师, 积分 4545, 距离下一级还需 455 积分
我用I/O口模拟过串口,只做过发送,接收没做过。
可以用定时器控制每位的时间,也可以用示波器调试每位的时间。
中级工程师, 积分 4380, 距离下一级还需 620 积分
中级工程师, 积分 4380, 距离下一级还需 620 积分
中级工程师, 积分 4380, 距离下一级还需 620 积分
中级工程师, 积分 4380, 距离下一级还需 620 积分
#include &msp430x44x.h&
//********************变量声明*****************************
#define TXD 0x01 //P1.0=TXD ---&87
#define RXD 0x02 //P1.1=RXD ---&86
#define OneBit 0x1A1
#define HalfBit 0xD0
unsigned int TxDate=0;
unsigned int RxDate=0;
unsigned char Count_R;
unsigned char Count_T;
unsigned char ParityBit=0;
unsigned char Movebit=0x01;
unsigned char verify_
//*******************函数声明******************************
void init_DCO(void);
void init_TimerA(void);
void init_TXD(unsigned int);
void init_RXD(void);
//************************************************************
//---------------------主函数-------------------------------
//************************************************************
void main(void)
WDTCTL = WDTPW + WDTHOLD;
init_DCO();
init_TimerA();
init_RXD();
if(verify_fault)
init_TXD(0xAA);
init_TXD(0xBB);
init_TXD(0xCC);
verify_fault=0;
RxDate = (RxDate & 0xff); //只取8位数据位
init_TXD(RxDate);
/*************************************************
函数(模块)名称:init_TimerA
功能:& & & & 初始化TA
输入参数: 无
输出参数: 无
函数返回值说明:无
使用的资源:
它说明: 无
*************************************************/
void init_TimerA(void)
TACTL |= TASSEL1+MC1+TACLR; //SMCLK ,连续记数,请TAR
CCTL0 |= OUT; //默认比较输出为1
P1DIR |= TXD;
P1SEL |= RXD+TXD;
/*************************************************
函数(模块)名称:init_TXD
功能:& & & & 初始化发送
输入参数: 无
输出参数: 无
函数返回值说明:无
使用的资源:
它说明: 无
*************************************************/
void init_TXD(unsigned int Byte)
Count_T = 11; //起始位,8位数据位,奇偶校验位,停止位
CCR0 = TAR + OneB
//-----------------------------------------------------
for(char i=0;i&8;i++)
if(Movebit & Byte)
ParityBit++;
Movebit &&= 1;
Movebit = 0x01;
if(ParityBit%2 == 0)
TxDate |=0x0200+B //0010 xxxx xxxx
TxDate |=0x0300+B //0011 xxxx xxxx
ParityBit = 0;
//--------------------------------------------------------
TxDate=TxDate&&1; //往左移1位,产生起始位
CCTL0 = OUTMOD0 + CCIE; //置位,比较中断允许
//while ( CCTL0 & CCIE ); //等待发送完毕
/*************************************************
函数(模块)名称:init_RXD
功能:& & & & 初始化接收
输入参数: 无
输出参数: 无
函数返回值说明:无
使用的资源:
它说明: 无
*************************************************/
void init_RXD(void)
Count_R=10; //8位数据+1位偶校验+停止位
//置位,中断允许,下降沿捕获,同步捕获,选择CCI0B作输入源
CCTL0 = OUTMOD0+CCIE+CM1+CAP+SCS+CCIS0;
/*************************************************
函数(模块)名称:TA中断函数
功能:& & & & 捕获,定时
输入参数: 无
输出参数: 无
函数返回值说明:无
使用的资源:
它说明: 无
*************************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA(void)
CCR0 += OneB
if(CCTL0 & CCIS0) //接收状态
if(CCTL0 & CAP) //处于捕获状态,开始接收数据
CCTL0 &= ~CAP; //转变比较方式
CCR0 += HalfB //再加半位的时间
else //正在接收数据
if(Count_R!=0) //8个数据,1个奇偶校验,1个停止位 没有接收完毕
RxDate=RxDate&&1;
if(CCTL0 & SCCI) //接收到的是1
RxDate |= 0x0200; //共接收10位
ParityBit ++;
if(Count_R==1) //接收到的最后一位是停止位
if( !(RxDate & 0x0200))//最后一位不是1(停止位出错)
verify_fault = 1;
Count_R--;
else //数据接收完毕
CCTL0 &= ~CCIE;
if( !(ParityBit&0x01) ) //9位数据里 1的个数是偶数(因为包括了停止位)
verify_fault = 1; //偶校验失败
ParityBit = 0;
LPM0_EXIT; //退出LPM3,CPU开始处理要发送的数据
} //数据接收完毕
}//正在接收数据
} //接收状态
else //处于发送状态
if(Count_T!=0) //8位数据+1位偶校验+停止位 没有发送完毕
if(TxDate & 0x0001) //发送的是1
CCTL0 &= ~OUTMOD2; //OUTMOD0是置位
else //发送的是0
CCTL0 |= OUTMOD2; //OUTMOD0+OUTMOD2是复位
TxDate=TxDate&&1;
Count_T--;
else //8位数据+1位偶校验+停止位 发送完毕
CCTL0 &= ~CCIE;
LPM0_EXIT;
/*************************************************
函数(模块)名称:init_DCO
功能:& & & & 初始化_DCO
输入参数: 无
输出参数: 无
函数返回值说明:无
使用的资源:
它说明: 设置XT2的各个参数
*************************************************/
void init_DCO(void)
SCFI0 |= FN_2;
SCFQCTL = 121; //(121+1)*MHz
FLL_CTL0 |= XCAP14PF;
FLL_CTL1 = 0;
可以参考下
中级工程师, 积分 4177, 距离下一级还需 823 积分
中级工程师, 积分 4177, 距离下一级还需 823 积分
中级工程师, 积分 4177, 距离下一级还需 823 积分
中级工程师, 积分 4177, 距离下一级还需 823 积分
mark 真给力
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
请问你这个程序该怎么应用呢?我用了你的程序,不知道该如何发送接收数据。
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖

我要回帖

更多关于 msp430f149串口程序 的文章

 

随机推荐