/****************************************************************************
* 文 件 名: main.c
* 作 者: SanMu
* 修 訂: 2020-11-9
* 版 本: 1.1
* 描 述: 設定串口除錯助手波特率:9600bps 8N1
* 串口除錯助手給CC2530字串控制Led燈,命令如下:
* A#使LED1,LED2,LED3,流水燈。B#使三個燈同時閃亮。C#打開三個燈。D#關閉三個燈。
* 1#改變LED1狀態。2#改變LED2狀態。3#改變LED3狀態。
****************************************************************************/
#include <ioCC2530.h>
#include <string.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define UART0_RX 1
#define UART0_TX 2
#define CONTROL_LED 3
#define SIZE 4
#define ON 0
#define OFF 1
#define LED1 P1_0 //定義P1.0口為LED1控制端
#define LED2 P1_1 //定義P1.1口為LED2控制端
#define LED3 P1_4
char RxBuf;
char UartState;
uchar count;
char RxData[SIZE]; //存盤發送字串
/****************************************************************************
* 名 稱: DelayMS()
* 功 能: 以毫秒為單位延時
* 入口引數: msec 延時引數,值越大,延時越久
* 出口引數: 無
****************************************************************************/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i<msec; i++)
for (j=0; j<1070; j++);
}
/****************************************************************************
* 名 稱: LedOnOrOff()
* 功 能: 點亮或熄滅所有LED燈
* 入口引數: mode為0時LED燈亮 mode為1時LED燈滅
* 出口引數: 無
****************************************************************************/
void LedOnOrOff(uchar mode)
{
LED1 = mode;
LED2 = mode;
LED3 = mode; //由于P1.4與仿真器共用,必須拔掉仿真器的插頭才能看到LED3的變化
}
/****************************************************************************
* 名 稱: InitLed()
* 功 能: 設定LED燈相應的IO口
* 入口引數: 無
* 出口引數: 無
****************************************************************************/
void InitLed(void)
{
P1DIR |= 0x13; //P1.0和P1.1定義為輸出口
LedOnOrOff(1); // 使所有LED燈默認為熄滅狀態
}
/****************************************************************************
* 名 稱: InitUart()
* 功 能: 串口初始化函式
* 入口引數: 無
* 出口引數: 無
****************************************************************************/
void InitUart(void)
{
PERCFG = 0x00; //外設控制暫存器 USART 0的IO位置:0為P0口位置1
P0SEL = 0x0c; //P0_2,P0_3用作串口(外設功能)
P2DIR &= ~0xC0; //P0優先作為UART0
U0CSR |= 0x80; //設定為UART方式
U0GCR |= 8;
U0BAUD |= 59; //波特率設為9600
UTX0IF = 0; //UART0 TX中斷標志初始置位0
U0CSR |= 0x40; //允許接收
IEN0 |= 0x84; //開總中斷允許接收中斷
}
/****************************************************************************
* 名 稱: UartSendString()
* 功 能: 串口發送函式
* 入口引數: Data:發送緩沖區 len:發送長度
* 出口引數: 無
****************************************************************************/
void UartSendString(char *Data, int len)
{
uint i;
for(i=0; i<len; i++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
/****************************************************************************
* 名 稱: UART0_ISR(void) 串口中斷處理函式
* 描 述: 當串口0產生接收中斷,將收到的資料保存在RxBuf中
****************************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 清中斷標志
RxBuf = U0DBUF;
}
/****************************************************************************
* 程式入口函式
****************************************************************************/
void main(void)
{
CLKCONCMD &= ~0x40; //設定系統時鐘源為32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振穩定為32M
CLKCONCMD &= ~0x47; //設定系統主時鐘頻率為32MHZ
InitLed(); //設定LED燈相應的IO口
InitUart(); //串口初始化函式
UartState = UART0_RX; //串口0默認處于接收模式
memset(RxData, 0, SIZE);
while(1)
{
if(UartState == UART0_RX) //接收狀態
{
if(RxBuf != 0)
{
if((RxBuf != '#')&&(count < 2))//以'#'為結束符
RxData[count++] = RxBuf;
else
{
if(count >= 2) //判斷資料合法性,防止溢位
{
count = 0; //計數清0
memset(RxData, 0, SIZE);//清空接識訓沖區
}
else
UartState = CONTROL_LED;//進入發送狀態
}
RxBuf = 0;
}
}
if(UartState == CONTROL_LED) //控制LED燈
{
//判斷接收的資料合法性
if(RxData[0]=='A'||RxData[0]=='B'||RxData[0]=='C'||RxData[0]=='D'
||RxData[0]=='1'||RxData[0]=='2'||RxData[0]=='3')
{
if(RxData[0]=='A')
{
LED1 = ON; //點亮LED1
DelayMS(500);
LED1 = OFF ; //熄滅LED1
LED2 = ON;
DelayMS(500);
LED2 = OFF ;
LED3 = ON ;
DelayMS(500) ;
LED3 = OFF ;
}
if(RxData[0]=='B')
{
LedOnOrOff(0); //打開所有LED燈
DelayMS(1000);
LedOnOrOff(1); //關閉所有LED燈
}
if(RxData[0]=='C')
{
LedOnOrOff(0); //打開所有LED燈
}
if(RxData[0]=='D')
{
LedOnOrOff(1); //關閉所有LED燈
}
if(RxData[0]=='1')
{
LED1 = ~LED1; / /改變LED1狀態
}
if(RxData[0]=='2')
{
LED2 = ~LED2; //改變LED2狀態
}
if(RxData[0]=='3')
{
LED3 = ~LED3; //改變LED3狀態
}
}
UartState = UART0_RX;
count = 0;
memset(RxData, 0, SIZE); //清空接識訓沖區
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/218837.html
標籤:單片機/工控
