此内容由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
两个单片机之间通讯协议方式太多了,自己简单的写个协议都行的,一般串口转发程序就可以作为你所需要的例程,A机收到B机的串口消息,并通过串转USB发到PC机,需要看你自己的需要来定,单纯的两个MCU串口通讯,只需要把你的程序稍微改一下就行了。