贴代码:
初始化
void UART0_Init(void)
{
P3SEL |= BIT3+BIT4+BIT5; //端口设置 P3.3/4/5 复用
U0CTL &= ~SWRST; // 初始化UART0状态机
U0CTL |= CHAR; //无校验 1位停止位 8位数据 无反馈 UART异步模式
U0TCTL|= SSEL0; //波特率时钟 ACLK
U0BR0 = 0x03; //波特率 9600
U0BR1 = 0x00;
U0MCTL = 0x4A;
IE1 |= URXIE0; //使能接收中断允许
ME1 |= URXE0 + UTXE0; //接收,发送允许
IFG1 = 0; //中断标志 清零
_EINT();
}
#pragma vector = UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
//接收字符串
if(k<16)
{
Rdata[k++] = U0RXBUF;
if(k==16)k=0;
}
}
主函数:
void main(void)
{
unsigned char num[3]={0,0,0},i=0,j=0;
unsigned char *ptr;
unsigned int sum=0;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
Clock_Init();
UART0_Init();
while(1)
{
Display(U0RXBUF,1,2,0);
if(Rdata[k-1]!='\0') //接收完毕
{
// ptr = Rdata;
// while(*ptr!= '\0')
while(j<16)
{//提取字符 识别
if(Rdata[j]=='c') // 'c' =63 hex99
{
// ptr++;
j++;
if(Rdata[j]=='h') // 'h' =68 hex104
{
j++;
//数字识别
for(i=0;i<3;i++)
{
if(('0'<=Rdata[j])&&(Rdata[j]<='9')) //chxxx 提取xxx数字
{
num = Rdata[j];
i++;
}
}
j++;
}
}
}
下面的先忽略
sum = ((unsigned int)num[1]-48)*10 +((unsigned int)num[2]-48);
switch((int)num[0])
{
case 0x01:P2OUT &=~BIT7;Delay_Nus(1000*sum);break; //收到数据CH0 00 打开通道7 不改变其他通道状态
case 0x02:P2OUT &=~BIT6;break;
case 0x03:P2OUT &=~BIT5;break;
case 0x04:P2OUT &=~BIT4;break;
case 0x05:P2OUT &=~BIT3;break;
case 0x06:P2OUT &=~BIT2;break;
case 0x07:P2OUT &=~BIT1;break;
case 0x08:P2OUT &=~BIT0;break;
default :break;
}
}
}
//LPM3; //进入低功耗模式
}
|