[原创] MSP430F5529与PC之间的通信如下,求两片单片机之间的通信例程

HI唐辉   2017-3-5 21:15 楼主



此内容由EEWORLD论坛网友HI唐辉原创,如需转载或用于商业用途需征得作者同意并注明出处

#include

// ACLK = REFO = 32768Hz, MCLK = SMCLK = default DCO/2 = 1048576Hz

unsigned int table[12]={1,2,3,4,5,6,7,8,9,10,11,12};

unsigned int Num_twelve;



//函数使用前声明

void GPIO_init();

void UART_IO_init();

void Delay(unsigned int time);

void send_buf(unsigned char *ptr);

/*=================================main=============================*/

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // 关看门狗

GPIO_init();

UART_IO_init();

__bis_SR_register(LPM0_bits + GIE); // 低功耗模式0,全局中断允许

}
/*================================================================*/


/*
* 函数名:GPIO_init
* 函数类型:void
* 函数功能:对通用IO口初始化
* 入口参数:无
* 返回值:无
*/

void GPIO_init()
{

P1DIR|=BIT0;

P1OUT|=BIT0;

P2IE |= BIT1; //设置p2.1可以中断

P2IES |= BIT1; //设置p2.1为下降沿中断

P2IFG &= ~BIT1;//设置p2.1为0 无中断请求

P2REN |= BIT1; //设置p2.1为上下拉电阻使能

P2OUT |= BIT1;

}
/*
* 函数名:UART_IO_init
* 函数类型;void
* 函数功能:对通串口初始化  Baud=115200
* 入口参数:无
* 返回值:无
*/

void UART_IO_init()

{

P4SEL |=BIT4+BIT5 ; // P5.6,7 = USCI_A1 TXD/RXD

UCA1CTL1 |= UCSWRST;

UCA1CTL1 |= UCSSEL_2; // SMCLK

UCA1BR0 = 9; // 1048756Hz 115200

UCA1BR1 = 0; // 1048756Hz 115200

UCA1MCTL |= UCBRS_1 + UCBRF_0;   //一、二级调制

UCA1CTL1 &= ~UCSWRST;

UCA1IE |= UCRXIE; //  USCI_A1 RX 中断允许

}


//发送数据之前确定发送缓存准备好

/*
* 函数名:send_buf
* 函数类型:void
* 函数功能:发送字符
* 入口参数:char *ptr
* 返回值:无
*/
void send_buf(unsigned char *ptr)

{

while(*ptr !='\0') //C语言字符串末尾自动加“\0”   (ASCII码值为0)

{

while (!(UCA1IFG & UCTXIFG));//等待一个字符发送完成

UCA1TXBUF=*ptr; //发送字符对应的ASCII码,

*ptr++;

Delay(50);

}

}


/*
* 函数名:Delay
* 函数类型:void
* 函数功能:延时
* 入口参数:int time
* 返回值:无
*/
void Delay(unsigned int time)

{

unsigned int i,j;

for(i=0;i<250;i++)

    for(j=0;j
//_no_opertion();

}

/*
* 函数名:USCI_A1_ISR
* 函数类型:_interrupt_void
* 函数功能:串口中断响应
* 入口参数:无
* 返回值:无
*/

#pragma vector=USCI_A1_VECTOR

interrupt void USCI_A1_ISR(void)

{

switch(__even_in_range(UCA1IV,4))

{

case 0:break; // Vector 0 - no interrupt

case 2:       // Vector 2 - RXIFG

while (!(UCA1IFG&UCTXIFG));   //发送是否完成?

switch(UCA1RXBUF)

{

case 0:
{

P1OUT^=BIT0;

UCA1TXBUF=UCA1RXBUF;

}

break;

case 1:

{

UCA1TXBUF=table[Num_twelve];

Num_twelve++;

if(Num_twelve==12)

Num_twelve=0;

}

break;

} // TX -> RXed character

break;

case 4:break; // Vector 4 - TXIFG

default: break;

}

}

// UCTXIFG=0x02,UCA1IFG&UCTXIFG,当UCA1IFG的UCTXIFG位为1时,说明UCA1TXBUF为空,

//跳出while循环循环;当UCTXIFG位为0时UCA1TXBUF不为空,停在循环。

/*
* 函数名:Key_interrupt
* 函数类型:interrupt_void
* 函数功能:按键中断响应
* 入口参数:
* 返回值:无
*/

#pragma vector=PORT2_VECTOR

interrupt void Key_interrput()

{

if(P2IFG&BIT1)

{

Delay(50);            //延时消抖

if(P2IFG&BIT1)        //确认按下

{

while((P2IN&BIT1)==0);//松手检测

P2IFG &= ~BIT1; //清除中断标志位

send_buf("2017年电子设计大赛\n");//转义字符:回车



}

}

}


More information,please add the weibo ID :_Tang辉,chat number :951141617

回复评论 (1)

两个单片机之间通讯协议方式太多了,自己简单的写个协议都行的,一般串口转发程序就可以作为你所需要的例程,A机收到B机的串口消息,并通过串转USB发到PC机,需要看你自己的需要来定,单纯的两个MCU串口通讯,只需要把你的程序稍微改一下就行了。
点赞  2017-3-5 22:21
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复