十六、串口命令控制LED灯开关
【1 】USART0选择UART模式,波特率9600,I/O引脚映射到备用位置1。
【2】命令字“0xA1”,点亮D4灯,操作完成后,返回“D4 is open!”。
【3】命令字“OxA2”,关闭D4灯,操作完成后,返回“D4 is closed!”。
【4】命令字“OxB1”,点亮D6灯,操作完成后,返回"D6 is open!”。
【5】命令字“OxB2”,关闭D6灯,操作完成后,返回“D6 is closed!”。
#include"ioCC2530.h"
#define D4 P1_1
#define D6 P1_4
unsigned char cmd=0;//cmd用来储存上位机发来的命令。可以通过判断它是否为0来决定是否接收到上位机的数据。
void Set_Clock_32MHZ()//系统时钟切换函数
{CLKCONCMD&=~0X40;//要操作的位为0100 0000。选择系统时钟源为32MHZ晶振while(CLKCONSTA&0X40);/*CLKCONSTA原本的值为0100 0000 & 0100 0000 的值为0X40,while内条件是成立的,做空指令等待。*//*等CLKCONSTA的值变为0000 0000(即从16MHZ切换成32MHZ了),相与的结果就是0X00了,while条件不成立,达到等待晶振稳定的目的。*/CLKCONCMD&=~0X47;//要操作的位为0100 0111,将其取反清零。最后进一步设置时钟速度,成功设置系统主时钟频率为32MHZ
}
void Init_Port()//端口初始化函数
{P1SEL &=~0X1B;P1DIR |=0X1B;P1 &=~0X1B;
}
void Init_Uart0()//串口初始化函数
{PERCFG &=~0X01;//设置串口的引脚功能,将P0_2和P0_3设置成外设功能P1SEL |=0X0C; //将P0_2和P0_3端口设置成外设功能U0BAUD=59; //设置串口的波特率:32mhz情况下9600U0GCR=8;U0UCR |=0X80;//设置UART控制寄存器 U0UCRU0CSR |=0XC0;//设置控制与状态寄存器 U0CSRUTX0IF=0; //清除中断标志URX0IF=0;URX0IE=1; //使能串口数据接收完成中断EA=1; //开启总中断
}
void UR0_SendByte(unsigned char dat)//串口字节发送函数
{U0DBUF=dat;while(UTX0IF==0);//串口是一位一位发送出去的,需要点时间,通过监控它的标志位来确定是否发送完成。//当串口数据发送完成之后UTX0IF会被置1。这里用while空语句等待,若发送完成则条件不成立,开始执行下面的语句。UTX0IF=0; //将其清零,使得下次还能用。
}
void UR0_SendString(unsigned char *str)//串口字符串发送函数。
{while(str!='\0')//字符串有一个\0作为发送完的标志{UR0_SendByte(*str++);//发送完毕之后指针指向下一个内容}
}
# pragma vector=URX0_VECTOR//串口接收完成中断服务函数。
__interrupt void Service_UR0Recv()
{cmd=U0DBUF;//B0DBUF储存接收到的数据。将接收到的数据付给临时变量cmd}
void Control_LED()//命令控制灯光开关函数。在收到上位机的指令后调用此函数来进行对LED的控制。
{switch(cmd){case 0XA1:D4=1;UR0_SendString("D4 is opened!\r\n");break;case 0XA2:D4=0;UR0_SendString("D4 is closed!\r\n");break;case 0XB1:D6=1;UR0_SendString("D6 is opened!\r\n");break;case 0XB2:D4=0;UR0_SendString("D6 is closed!\r\n");break;}cmd=0; //使用完cmd之后清零,方便下次使用。
}
void main()
{Set_Clock_32MHZ();Init_Port();Init_Uart0();while(1){if(cmd!=0)//如果cmd不为0,则说明从上位机收到了新的命令,此时就用这个命令来处理LED。{Control_LED(); }}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
