季紅梅
【摘 要】教育教學(xué)須因材施教,面對高職學(xué)生群體,應(yīng)運(yùn)用怎樣的教學(xué)方法才能達(dá)到最佳教學(xué)效果呢?根據(jù)自己多年教學(xué)體會,認(rèn)為高職課堂教學(xué),既不能等同于高中教學(xué),也不能完全照搬高校教學(xué)。它必須具有高職的特色,其課堂教學(xué)既要注重知識性,更要注重趣味性,理論夠用,技能為主,通過學(xué)生跟著老師做、學(xué)生學(xué)著自己做、理論教學(xué)做總結(jié)的方式,通過實踐體會理解掌握單片機(jī)的功能應(yīng)用技能。
【關(guān)鍵詞】高職教學(xué);ZigBee無線技術(shù);單片機(jī)數(shù)據(jù)通訊應(yīng)用
1.引言
當(dāng)前各類高職技能大賽項目的機(jī)器人控制、非接觸識別等等科目,單片機(jī)的數(shù)據(jù)通訊應(yīng)用屬于必用項目。如何設(shè)計數(shù)據(jù)通訊知識的教學(xué),使得掌握單片機(jī)數(shù)據(jù)采集或者控制所需數(shù)據(jù)傳輸給其他單片機(jī)或者遠(yuǎn)端PC,是必須面對的科目。
2.數(shù)據(jù)通訊的方法
單片機(jī)的常用數(shù)據(jù)通信主要分為以下類型:
類型1:串行通訊
使用單片機(jī)的串口接口(Serial Interface),將數(shù)據(jù)逐位順序傳送的過程稱為串口通訊。串口通訊特點是通信線路簡單,只要一對傳輸線就可以實現(xiàn)雙向通信(可以直接利用電話線作為傳輸線),從而大大降低了成本,但傳送速度較慢。CC2530具有USART0/USART1兩個串口供用戶使用,通過RS232接口線將單片機(jī)的數(shù)據(jù)傳遞到PC機(jī)或接收PC機(jī)發(fā)出的指令。還可以設(shè)計相應(yīng)線路板,實現(xiàn)單片機(jī)之間的串口數(shù)據(jù)通訊。
類型2:無線局域網(wǎng)通訊
使用ZigBee無線技術(shù),CC2530單片機(jī)模塊板可以在0~75m的范圍內(nèi),以IEEE 802.15.4標(biāo)準(zhǔn)的下實現(xiàn)無線數(shù)據(jù)收發(fā)功能。一個ZigBee網(wǎng)絡(luò)最多可以容納254個從設(shè)備和1個主設(shè)備。一個區(qū)域內(nèi)最多可以存在100個網(wǎng),而且組網(wǎng)靈活,用于實現(xiàn)單片機(jī)板之間的數(shù)據(jù)通訊。通訊方式可以是一對一、一對多、多對多、級聯(lián)組網(wǎng)等,用戶可以設(shè)計靈活的數(shù)據(jù)協(xié)議來實現(xiàn)數(shù)據(jù)通訊。
局域網(wǎng)無線通訊和串口通訊的靈活組合,可以滿足大多數(shù)用戶的數(shù)據(jù)交流與控制需求,且結(jié)合其他通訊設(shè)備,方便實現(xiàn)遠(yuǎn)程監(jiān)控。
3.UART串口通訊設(shè)計步驟
UART串口通訊實現(xiàn)步驟為:設(shè)置串口初始化、讀寫串口處理等步驟。又根據(jù)數(shù)據(jù)傳輸方向,分為單片機(jī)→PC、PC→單片機(jī)數(shù)據(jù)傳輸?shù)淖鞑煌渲?。在完成初始化串口配置以后,將需要傳輸?shù)臄?shù)據(jù)存入緩存UxDBUF,并且需要等待一定時間,等待數(shù)據(jù)被接收方取走,發(fā)送數(shù)據(jù)不宜使用發(fā)送中斷(PC實時性差,容易亂碼,故使用定時器T1設(shè)置定時發(fā)送中斷發(fā)送字符數(shù)據(jù),可以通過調(diào)試測試出最佳等待時間)。接收數(shù)據(jù)則可以使用接收中斷來實現(xiàn)數(shù)據(jù)接收(單片機(jī)實時性好)。實驗參考代碼如下:
3.1單片機(jī)→PC初始化設(shè)置函數(shù)(使用UART0口,異步通訊模式,波特率為57600)
void initUART01(void)
{ //片內(nèi)外設(shè)引腳位置采用上電復(fù)位默認(rèn)值,即PERCFG寄存器采用默認(rèn)值
PERCFG = 0x00; //位置 1 P0 口
P0SEL = 0x3c; //定義P0 用作串口, P0.2、P0.3、P0.4、P0.5作為片內(nèi)外設(shè)I/O
U0BAUD = 216; U0GCR = 10; //波特率為57600
U0CSR |= 0x80; // 模式選擇UART模式
U0UCR |= 0x80; // 進(jìn)行USART初始化清除
UTX0IF = 0; // 清零UART0 TX發(fā)送中斷標(biāo)志 }
3.2PC→單片機(jī)初始化設(shè)置函數(shù)(使用UART0口,異步通訊模式,波特率為57600)
void initUART02(void)
{ //片內(nèi)外設(shè)引腳位置采用上電復(fù)位默認(rèn)值,即PERCFG寄存器采用默認(rèn)值
PERCFG = 0x00; //位置 1 P0 口
P0SEL = 0x3c; //定義P0 用作串口, P0.2、P0.3、P0.4、P0.5作為片內(nèi)外設(shè)I/O
U0BAUD = 216; U0GCR = 10; //波特率為57600
U0CSR |= 0x80; // 模式選擇UART模式
U0UCR |= 0x80; // 進(jìn)行USART初始化清除
U0CSR |= 0x40; //允許UART0接收數(shù)據(jù)。特別強(qiáng)調(diào)必須在其他配置完成后才能配置,不能和模式選擇一起配置
URX0IF = 0; // 清零UART0 RX接收中斷標(biāo)志 }
3.3發(fā)送功能代碼參考(設(shè)計定時中斷,在中斷中定時發(fā)送,假設(shè)為:0.02s)
void UART0SendByte(unsigned char c) // 發(fā)送一字節(jié)
{ U0DBUF = c; // 將要發(fā)送的1字節(jié)數(shù)據(jù)寫入U0DBUF(串口 0 收發(fā)緩沖器)
while (!UTX0IF); // 等待TX中斷標(biāo)志,即U0DBUF就緒
UTX0IF = 0; // 清零TX中斷標(biāo)志 }
void UART0SendString(unsigned char *str) // UART0發(fā)送一個字符串
{ while(1)
{ if(*str == ‘\0)
break; // 遇到結(jié)束符,退出
UART0SendByte(*str++); // 發(fā)送一字節(jié) } }
3.4接收功能代碼參考
#pragma vector=URX0_VECTOR //中斷向量表的設(shè)置endprint
__interrupt void URX0_ISR(void)
{ URX0IF = 0;//清中斷標(biāo)志
receive_handler(); //調(diào)用接收數(shù)據(jù)后處理函數(shù)(略)}
3.5定時發(fā)送中斷設(shè)計等其他相關(guān)輔助代碼,參見教學(xué)研究二、三
4.無線局域網(wǎng)通訊設(shè)計
借助于TI公司提供基于CC2530的軟件代碼BasicRF包,實現(xiàn)ZigBee無線通訊十分簡單。BasicRF是簡單的無線點對點傳輸協(xié)議,可以用來進(jìn)行無線設(shè)備數(shù)據(jù)傳輸?shù)娜腴T學(xué)習(xí)開發(fā)相對簡單的無線控制與無線傳感網(wǎng)絡(luò)。這樣無需深入了解無線通訊底層協(xié)議理論(這對于高職學(xué)生是非常困難的…),只要教會學(xué)生使用BasicRF包實現(xiàn)無限傳輸數(shù)據(jù)的方法即可。教師需要對BasicRF包的應(yīng)用,合理做出功能上的劃分,設(shè)計好實現(xiàn)程序的框架,教授學(xué)生將功能函數(shù)添加到框架的合適的部位,實現(xiàn)數(shù)據(jù)的傳輸。
4.1根據(jù)TI公司提供基于CC2530的軟件代碼BasicRF包的使用說明,進(jìn)行編程環(huán)境的基本配置(略)
4.2初始化
//BasicRF地址設(shè)置:
#define RF_CHANNEL 20 // 頻道 11~26
#define PAN_ID 0x1A5B //網(wǎng)絡(luò)id 0x0000-0xFFFF
#define MY_ADDR 0x1015 //本機(jī)模塊地址 id 0x0000-0xFFFF
#define SEND_ADDR 0xAC3A //發(fā)送地址 0x0000-0xFFFF
//提示:發(fā)送模塊和接收模塊MY_ADDR和SEND_ADDR相反。
//多組同時實驗:RF_CHANNEL / PAN_ID 至少一個不一樣
//模塊相關(guān)資源初始化
void halBoardInit(void )
//無線收發(fā)參數(shù)的配置初始化
void ConfigRf_Init(void );
//檢查結(jié)構(gòu)變量配置端口是否成功,返回值成功為SUCCESS 0,失敗為FAILED 1
uint8 basicRfInit(&basicRfConfig)
4.3發(fā)送與接收函數(shù)
//發(fā)送“ZIGBEE TEST \r\n”,13個字符,成功返回值為0:
uint8 basicRfSendPacket(SEND_ADDR,”ZIGBEE TEST\r\n”,13);
//判斷有無收到zigbee信號,有為真返回值為1:
uint8 basicRfPacketIsReady();
//接收數(shù)據(jù)放緩存pRxData中,緩沖區(qū)最大長度為MAX_RECV_BUF_LEN ,返回值是數(shù)據(jù)串長度
uint8 basicRfReceive(pRxData, MAX_RECV_BUF_LEN, NULL);
4.4主程序框架(參見圖1)
void main(void)
{ uint16 len = 0;
halBoardInit(); //模塊相關(guān)資源的初始化
ConfigRf_Init(); //無線收發(fā)參數(shù)的配置初始化
//LED1(綠)、LED2(紅)點亮,參見教學(xué)研究二、三
while(1)
{ len = RecvUartData(); // 接收串口數(shù)據(jù)
if(len > 0)
{
// 綠燈取反,無線發(fā)送指示(略)
basicRfSendPacket(SEND_ADDR,uRxData,len);
//把串口數(shù)據(jù)通過zigbee發(fā)送出去}
if(basicRfPacketIsReady()) //查詢有沒收到無線信號
{ // 紅燈取反,無線接收指示(略)
len = basicRfReceive(pRxData, MAX_RECV_BUF_LEN, NULL); //接收無線數(shù)據(jù)
halUartWrite(pRxData,len); //接收到的無線發(fā)送到串口數(shù)
}}}
說明:
⑴根據(jù)需要選擇框架中功能塊,不需要的刪去即可;
⑵收發(fā)模塊使用相同的框架流程,注意收發(fā)地址的對應(yīng)關(guān)系。
5.數(shù)據(jù)通訊教學(xué)總結(jié)
通過框架式教學(xué)設(shè)計的實踐,學(xué)生基本上能夠完成數(shù)據(jù)通訊功能的設(shè)計,并且能夠自由拓展應(yīng)用,設(shè)計6組及以上的單片機(jī)組網(wǎng)應(yīng)用項目,并且結(jié)合其他課程知識點,實現(xiàn)人機(jī)互動的PC級C#平臺監(jiān)控界面設(shè)計,部分學(xué)生可以實現(xiàn)手機(jī)遠(yuǎn)程操作平臺對單片機(jī)網(wǎng)應(yīng)用的實時監(jiān)控。
參考文獻(xiàn):
[1] 姜仲 劉丹 ZigBee技術(shù)與實訓(xùn)教程[M]北京 清華大學(xué)出版社2014.
[2] 物聯(lián)網(wǎng)無線傳感網(wǎng)實訓(xùn)教程[M]北京 新大陸時代教育科技有限公司2014.
[3] 本書編委 ZigBee技術(shù)開發(fā)-CC2530單片機(jī)原理及應(yīng)用[M]北京 清華大學(xué)出版社2015.
[4] 楊玥 單片機(jī)與接口技術(shù)-基于CC2530的單片機(jī)應(yīng)用[M]北京 清華大學(xué)出版社2017.endprint