版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Zigbee無(wú)線傳感網(wǎng)技術(shù)與應(yīng)用ZigBee無(wú)線控制音樂(lè)盒0501了解BasicRF點(diǎn)對(duì)點(diǎn)工作機(jī)制03熟悉無(wú)線發(fā)送和接收函數(shù)05理解串口讀寫(xiě)函數(shù)04理解發(fā)送地址和接收地址、PAN_ID、RF_CHANNEL等概念02掌握蜂鳴器驅(qū)動(dòng)方法學(xué)習(xí)目標(biāo)Learningobjectives任務(wù)一:?jiǎn)吸c(diǎn)音樂(lè)盒任務(wù)要求要求讀者查看元件資料以及學(xué)習(xí)資料,掌握如何修改系統(tǒng)頻率與定時(shí)器頻率,實(shí)現(xiàn)使用CC2530控制蜂鳴器的方法。任務(wù)目標(biāo)Missionobjectives01掌握蜂鳴器的控制方法03了解什么是振蕩器02了解系統(tǒng)時(shí)鐘概念04掌握控制系統(tǒng)時(shí)鐘方法儲(chǔ)備知識(shí)系統(tǒng)使用蜂鳴器為音樂(lè)盒的聲音發(fā)生來(lái)源,使用兩塊ZigBee板,一個(gè)作為發(fā)送端控制另一個(gè)接收端從而響起音樂(lè)。1.音樂(lè)盒圖:蜂鳴器儲(chǔ)備知識(shí)2.什么是蜂鳴器蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車(chē)電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類(lèi)型。蜂鳴器在電路中用字母“H”或“HA”(舊標(biāo)準(zhǔn)用“FM”、“ZZG”、“LB”、“JD”等)表示。蜂鳴器分為壓電式及電磁式的二大類(lèi):壓電式蜂鳴器是以壓電陶瓷的壓電效應(yīng),來(lái)帶動(dòng)金屬片的振動(dòng)而發(fā)聲;電磁式蜂鳴器,則是用電磁的原理,通電時(shí)將金屬振動(dòng)膜吸下,不通電時(shí)依振動(dòng)膜的彈力彈回,故壓電式蜂鳴器是以方波來(lái)驅(qū)動(dòng),電磁式是1/2方波驅(qū)動(dòng),壓電式蜂鳴器需要比較高的電壓才能有足夠的音壓,一般建議為9V以上。壓電的有些規(guī)格,可以達(dá)到120dB以上,較大尺寸的也很容易達(dá)到100dB。儲(chǔ)備知識(shí)2.什么是蜂鳴器蜂鳴器的發(fā)聲原理由振動(dòng)裝置和諧振裝置組成,而蜂鳴器又分為無(wú)源他激型與有源自激型。無(wú)源他激型蜂鳴器的工作發(fā)聲原理是:方波信號(hào)輸入諧振裝置轉(zhuǎn)換為聲音信號(hào)輸出,無(wú)源他激型蜂鳴器的工作發(fā)聲原理圖如下:圖:無(wú)源蜂鳴器儲(chǔ)備知識(shí)2.什么是蜂鳴器有源自激型蜂鳴器的工作發(fā)聲原理是:直流電源輸入經(jīng)過(guò)振蕩系統(tǒng)的放大取樣電路在諧振裝置作用下產(chǎn)生聲音信號(hào),有源自激型蜂鳴器的工作發(fā)聲原理圖如下:圖:有源蜂鳴器儲(chǔ)備知識(shí)2.什么是蜂鳴器相比之下有源蜂鳴器的控制更為簡(jiǎn)單但是由于頻率已經(jīng)固定所以在聲音方面只能響起單一的聲音,控制時(shí)只需要低電平、高電平響起即可。無(wú)源蜂鳴器在控制方面無(wú)法直接使用低電平、或高電平控制,需要在控制端輸入一個(gè)高低電平起伏的方波信號(hào),信號(hào)的翻轉(zhuǎn)頻率直接影響著聲音的高低起伏,因此可發(fā)出各種頻率的聲音如音符do、re、mi、fa等等。儲(chǔ)備知識(shí)3.CC2530控制蜂鳴器電路如圖所示,P2.0作為I/O口通過(guò)三極管Q1來(lái)驅(qū)動(dòng)無(wú)源蜂鳴器LB1,控制蜂鳴器只需在P2.0產(chǎn)生一定頻率的方波。圖:蜂鳴器連接電路圖儲(chǔ)備知識(shí)3.CC2530控制蜂鳴器電路根據(jù)圖所示的電路,完成蜂鳴器控制電路的焊接與組裝。并將該電路與Zigbee模塊1連接,即:蜂鳴器的正極連接到模塊1的J11的1腳,P2.0連接到J8的2腳,蜂鳴器控制電路的負(fù)極與J11的5腳連接。技能拓展圖:蜂鳴器電路圖儲(chǔ)備知識(shí)4.系統(tǒng)時(shí)鐘頻率時(shí)鐘頻率CC2530內(nèi)部有一個(gè)內(nèi)部系統(tǒng)時(shí)鐘或主時(shí)鐘,在CC2530中系統(tǒng)時(shí)鐘源是從所選的主系統(tǒng)時(shí)鐘源獲得的,主時(shí)鐘一般由32MHz晶振或16MHzRC振蕩器提供。由于32MHz晶振啟動(dòng)時(shí)間比較長(zhǎng),因此當(dāng)選用32MHz晶振作為主時(shí)鐘源時(shí),內(nèi)部首先選擇16MHzRC振蕩器使系統(tǒng)運(yùn)轉(zhuǎn)起來(lái),當(dāng)32MHz晶振穩(wěn)定之后才使用32MHz晶振作為主時(shí)鐘源,可以通過(guò)操作時(shí)鐘寄存器選擇使用哪個(gè)時(shí)鐘源。系統(tǒng)時(shí)鐘頻率即芯片執(zhí)行指令的速度,他代表著程序執(zhí)行一條指令的時(shí)間,如默認(rèn)芯片默認(rèn)頻率為16MHZ,一條指令所需時(shí)間即1/16000000=0.0625us,系統(tǒng)默認(rèn)時(shí)鐘頻率可根據(jù)需求進(jìn)行修改,CC2530芯片支持32MHZ、16MHZ的頻率。儲(chǔ)備知識(shí)4.系統(tǒng)時(shí)鐘頻率振蕩器CC2530共有4個(gè)振蕩器,它們?yōu)橄到y(tǒng)時(shí)鐘提供時(shí)鐘源。振蕩器分兩種類(lèi)型高頻振蕩器、低頻振蕩器。高頻振蕩器有32MHZ外部晶振、16MHZ內(nèi)部RC振蕩器。低頻振蕩器由32KHZ外部晶振、32KHZ內(nèi)部RC振蕩器。RC振蕩器:成本較低,但由于電阻電容的精度導(dǎo)致震蕩率會(huì)有誤差,同時(shí)會(huì)受到溫度、濕度之類(lèi)的環(huán)境的影響。晶體振蕩器:振蕩頻率比較穩(wěn)定,但價(jià)格相對(duì)較高,使用時(shí)還需要接兩個(gè)15-33pF的起振電容。儲(chǔ)備知識(shí)4.系統(tǒng)時(shí)鐘頻率振蕩器的作用32MHZ外部晶振:作為內(nèi)部時(shí)鐘提供時(shí)鐘源,主要用于RF收發(fā)器(使用RF時(shí)必須設(shè)置成32MHZ頻率)。但32MHZ的啟動(dòng)時(shí)間較長(zhǎng)16MHZ內(nèi)部RC振蕩器:可作為內(nèi)容時(shí)鐘提供時(shí)鐘源,但16MHZRC振蕩器不能用于RF接收器操作。32KHZ外部晶振:運(yùn)行在32.768KHZ上,為系統(tǒng)需要的時(shí)間精度提供一個(gè)穩(wěn)定的時(shí)鐘信號(hào)。32KHZ內(nèi)部RC振蕩器:運(yùn)行在32.768KHZ上,當(dāng)系統(tǒng)時(shí)鐘需要校準(zhǔn)時(shí)使用此振蕩器,校準(zhǔn)只能發(fā)生在系統(tǒng)時(shí)鐘工作由16MHZRC振蕩器轉(zhuǎn)到32MHZ時(shí)。儲(chǔ)備知識(shí)5.改變時(shí)鐘頻率如表所示,CLKCONCMD可控制系統(tǒng)工作的時(shí)鐘,OSC默認(rèn)為1則系統(tǒng)默認(rèn)工作在16MHZ的頻率下,如需使系統(tǒng)工作在32MHZ則需要將OSC設(shè)置為0。代碼如下所示:CLKCONCMD&=~(0x40);//(01000000)系統(tǒng)時(shí)鐘設(shè)置為32MHZCLKCONCMD除了可定義系統(tǒng)時(shí)鐘外,還可定義定時(shí)器頻率,如將去設(shè)置為1MHZ則定時(shí)器的頻率就將為1MHZ。(注意由于復(fù)位時(shí)TICKSPD為001所以需要將3位同時(shí)置位)代碼如下所示:CLKCONCMD=0xA8;//10101000//注意CLKCONCMD不可多次賦值必須一步到位,故需要直接計(jì)算結(jié)果賦值儲(chǔ)備知識(shí)5.改變時(shí)鐘頻率表:CLKCONCMD寄存器位名稱(chēng)復(fù)位功能介紹7OSC32K132KHZ時(shí)鐘振蕩器選擇。設(shè)置改為只能發(fā)器一個(gè)時(shí)鐘源改變,要改變改位,必須選擇16MHZRCOSC作為系統(tǒng)時(shí)鐘。0:表示32KHZ外部晶振1:表示32KHZ內(nèi)部RC振蕩器6OSC1系統(tǒng)時(shí)鐘源選擇。設(shè)置該位只能發(fā)起一個(gè)時(shí)鐘源改變。0:32MHZ外部晶振1:16MHZ內(nèi)部RC振蕩器5:3TICKSPD001設(shè)置定時(shí)器頻率:(注意不可高于OSC設(shè)置的系統(tǒng)頻率)000:32MHZ001:16MHZ010:8MHZ011:4MHZ100:2MHZ101:1MHZ110:500KHZ111:250KHZ儲(chǔ)備知識(shí)5.改變時(shí)鐘頻率一、在下方空白處編寫(xiě)將系統(tǒng)時(shí)鐘設(shè)置為外部晶振32KHZ代碼。二、在下方空白處編寫(xiě)將定時(shí)器設(shè)置為32MHZ頻率代碼。三、在下方空白處編寫(xiě)將定時(shí)器設(shè)置為2MHZ頻率代碼。思考練習(xí):儲(chǔ)備知識(shí)6.使用定時(shí)器3定時(shí)器3和定時(shí)器4所有功能都是基于一個(gè)8位定計(jì)數(shù)器,它所運(yùn)行的模式包含自由運(yùn)行模式,倒計(jì)數(shù)模式,模模式,正計(jì)數(shù)/倒計(jì)數(shù)模式。與定時(shí)器1相比為其僅為8位計(jì)數(shù)器。定時(shí)器3使能定時(shí)器3使能定時(shí)器3與使能定時(shí)器1類(lèi)似,所需寄存器為T(mén)3CTL、IEN1、T3CC0。其具體參數(shù)如下所示。儲(chǔ)備知識(shí)6.使用定時(shí)器3表:T3CTL寄存器位名稱(chēng)復(fù)位功能介紹7:5DIV[2:0]000劃分頻率,如下所示:000:1分頻001:2分頻010:4分頻011:8分頻100:16分頻101:32分頻110:64分頻111:128分頻4START0啟動(dòng)定時(shí)器。正常運(yùn)行時(shí)設(shè)置,暫停時(shí)清除。3OVFIM1溢出中斷屏蔽0:中斷禁止1:中斷使能2CLR0清除計(jì)數(shù)器。1:0MODE[1:0]00定時(shí)器3模式:00:自由運(yùn)行模式,從0x00到0xff反復(fù)計(jì)數(shù);01:倒計(jì)數(shù),從T3CC0到0x00技術(shù);10:模,從0x00到T3CC0重復(fù)計(jì)數(shù);11:正計(jì)數(shù)/倒計(jì)數(shù),從0x00到T3CC0重復(fù)計(jì)數(shù),降到0x00。儲(chǔ)備知識(shí)如表所示,如需要將定時(shí)器3工作在模模式,則代碼為:T3CTL|=0x03;//(00000011)工作模式如表所示,如需要將定時(shí)器3工作在64分頻下,則代碼為:T3CTL|=0xc0;//(11000000)工作在64分頻6.使用定時(shí)器3如表所示,如需要將定時(shí)器3啟動(dòng),則代碼為:T3CTL|=0x10;//(00010000)啟動(dòng)定時(shí)器儲(chǔ)備知識(shí)一、在下方空白處編寫(xiě)將定時(shí)器3設(shè)置為倒計(jì)數(shù)模式代碼。二、在下方空白處編寫(xiě)將定時(shí)器3設(shè)置為32分頻代碼。思考練習(xí):6.使用定時(shí)器3儲(chǔ)備知識(shí)6.使用定時(shí)器3表:IEN1寄存器位名稱(chēng)復(fù)位功能介紹5P0IE0端口0中斷使能0:中斷關(guān)閉1:中斷開(kāi)啟4T4IE0定時(shí)器4中斷使能0:中斷關(guān)閉1:中斷開(kāi)啟3T3IE0定時(shí)器3中斷使能0:中斷關(guān)閉1:中斷開(kāi)啟2T2IE0定時(shí)器2中斷使能0:中斷關(guān)閉1:中斷開(kāi)啟1T1IE0定時(shí)器1中斷使能0:中斷關(guān)閉1:中斷開(kāi)啟0DMAIE0DMA傳輸中斷使能0:中斷關(guān)閉1:中斷開(kāi)啟如表所示,如需要將定時(shí)器3開(kāi)啟中斷使能,代碼為:IEN1|=0x08;//(00001000)開(kāi)啟中斷使能7.響起音符本任務(wù)所需軟件已安裝至電腦可直接使用。本任務(wù)所需硬件:下載器、1塊ZigBee開(kāi)發(fā)板、蜂鳴器模塊、5V電源適配器、USB下載線。環(huán)境準(zhǔn)備任務(wù)實(shí)施任務(wù)實(shí)施
將系統(tǒng)時(shí)鐘修改為32MHZ,定時(shí)器頻率變?yōu)?MHZ。
按下按鈕,響起音符do、re、mi聲音。任務(wù)要求編寫(xiě)代碼步驟1:新建工程->工程名稱(chēng)為“按鈕音樂(lè)盒”->保存->main.c文件名稱(chēng)為“main.c”->設(shè)置Opion->編寫(xiě)最簡(jiǎn)單的代碼,代碼如下所示。(新建工程具體步驟,不再重復(fù)介紹)7.響起音符#include"iocc2530.h"voidmain(){
while(1){
}}任務(wù)實(shí)施步驟2:編寫(xiě)代碼將系統(tǒng)時(shí)鐘變?yōu)?2MHZ,代碼如下所示。7.響起音符#include"iocc2530.h"voidmain(){
//設(shè)置系統(tǒng)時(shí)鐘為32MHZCLKCONCMD=0x80;
while(1){
}}任務(wù)實(shí)施步驟3:聲明一個(gè)整型變量“i”,編寫(xiě)一段小延遲程序,等待系統(tǒng)時(shí)鐘穩(wěn)定,代碼如下所示。7.響起音符#include"iocc2530.h"voidmain(){
unsigned
inti=0;CLKCONCMD=0x80;
i=1000;
while(--i);
while(1){
}}任務(wù)實(shí)施步驟4:封裝方法為系統(tǒng)時(shí)鐘函數(shù),方便后續(xù)調(diào)用,代碼如下所示:7.響起音符#include"iocc2530.h"voidsystemInit(){
unsigned
inti=0;
//設(shè)置系統(tǒng)時(shí)鐘為32MHZCLKCONCMD=0x80;}voidmain(){systemInit();
while(1){
}}任務(wù)實(shí)施步驟5:宏定義蜂鳴器接口P2_0為beep,I/O口設(shè)置為輸出,并在while死循環(huán)中編寫(xiě)一個(gè)高低電平翻轉(zhuǎn)的代碼,代碼如下所示。7.響起音符代碼小貼士:代碼:beep=!beep;說(shuō)明:表示ioP2_0取反,對(duì)位進(jìn)行取反,使用符合“!”…#defineP1_0beep…voidmain(){unsigned
chartmp=0;P2DIR
|=
0x01;//設(shè)置輸出systemInit();
while(1){beep=!beep;//取反,產(chǎn)生方波tmp=255;//延遲頻率
while(tmp--);}}…任務(wù)實(shí)施步驟6:全速執(zhí)行代碼,查看蜂鳴器是否發(fā)出聲響,如圖所示。7.響起音符圖:全速執(zhí)行代碼任務(wù)實(shí)施7.響起音符蜂鳴器響起的聲音可通過(guò)產(chǎn)生的方波控制其聲音頻率,音樂(lè)的頻率為音樂(lè)頻率范圍約為20Hz---20KHz,可使用定時(shí)器進(jìn)行精確控制從而產(chǎn)生音符聲音do、re、mi等。常用的音符對(duì)照表如右所示。知識(shí)補(bǔ)充任務(wù)實(shí)施7.響起音符定時(shí)器工作在250HZ頻率下,其定時(shí)器初始數(shù)值如下所示://音階頻率表定時(shí)器8位constunsignedcharFREQ[]={0,110,100,94,89,79,71,63}知識(shí)補(bǔ)充任務(wù)實(shí)施步驟8:刪除死循環(huán)產(chǎn)生方波代碼,編寫(xiě)定時(shí)器3中斷初始化函數(shù),與中斷函數(shù),使定時(shí)器工作在“正計(jì)數(shù)/倒計(jì)數(shù)模式”,并調(diào)用該函數(shù),方便后續(xù)調(diào)用,將音符對(duì)應(yīng)的頻率數(shù)組寫(xiě)入代碼中,代碼如右所示。7.響起音符…//音階頻率表定時(shí)器3八位constunsignedcharFREQ[]={0,110,100,94,89,79,71,63//0,do,re,mi,fa,so,la,xi};voidtimerInit(){T3CTL|=0x03;//定時(shí)器3工作在正計(jì)數(shù)/倒計(jì)數(shù)模式T3CTL|=0xe0;//定時(shí)器3128分頻T3CTL|=0x10;T3CC0=FREQ[1];;//啟動(dòng)
定時(shí)器3//初始響起do頻率的聲音IEN1|=0x08;//開(kāi)啟定時(shí)器3中斷EA=1;
}…voidmain(){P2DIR|=0x01;systemInit();timerInit();
while(1){
}}#pragmavector=T3_VECTOR__interruptvoidT3_INT(void){beep=!beep;}任務(wù)實(shí)施7.響起音符代碼小貼士:代碼:T3CC0=FREQ[1]說(shuō)明:獲取數(shù)組頻率1為do、并將頻率賦值給定時(shí)器。步驟9:全速執(zhí)行代碼,查看蜂鳴器是否發(fā)出聲響do,如圖所示。任務(wù)實(shí)施步驟10:編寫(xiě)按鈕代碼,實(shí)現(xiàn)按下按鈕響起另一個(gè)音符。代碼如下所示。7.響起音符…voidmain(){
unsigned
charmode=1;P2DIR|=0x01;P1DIR&=~(0x03);P1DIR|=0x01;systemInit();timerInit();
while(1){
if(P1_2==0){delay_ms(20);
if(P1_2==1){mode++;T3CC0=FREQ[mode];
if(mode==7){mode=0;}}}}}…任務(wù)實(shí)施7.響起音符代碼小貼士:unsignedcharmode=1;說(shuō)明:表示當(dāng)前的蜂鳴器響起為do的聲音,加1則響起另外的聲音。代碼:f=FREQ[mode];說(shuō)明:將當(dāng)前頻率賦給定時(shí)器,頻率的變化由變量mode控制,mode初始值為8,加1則變化音符。代碼:if(mode==7){mode=0;}說(shuō)明:防止mode不斷累加超出限定數(shù)值,在7時(shí)返回0,表示do、re、mi、so、la、xi七個(gè)音符。任務(wù)實(shí)施步驟11:全速執(zhí)行按下按鈕測(cè)試結(jié)果是否正確。7.響起音符一、在原有程序的基礎(chǔ)上修改代碼,完成如下任務(wù):
按下另外一個(gè)sw2,使聲音停止;
將當(dāng)前音符發(fā)送給電腦顯示,每秒顯示一次;二、若使用16MHZ系統(tǒng)頻率,代碼將如何修改?技能拓展8.響起一段完整的樂(lè)曲本任務(wù)所需軟件已安裝至電腦可直接使用。本任務(wù)所需硬件:下載器、1塊ZigBee開(kāi)發(fā)板、蜂鳴器模塊、5V電源適配器、USB下載線。環(huán)境準(zhǔn)備任務(wù)實(shí)施任務(wù)實(shí)施
按下按鈕,循環(huán)播放一段樂(lè)曲;
再次按下,結(jié)束播放。任務(wù)要求編寫(xiě)代碼步驟1:復(fù)制上述任務(wù)工程到新的工程中,保留部分代碼,while主循環(huán)代碼,代碼如右所示。voidmain(){P2DIR|=0x01;P1DIR&=~(0x03);IEN1&=~(0x08);//關(guān)閉定時(shí)器中斷systemInit();timerInit();
while(1){}}8.響起一段完整的音曲任務(wù)實(shí)施代碼小貼士:代碼:IEN1&=~(0x08);//關(guān)閉定時(shí)器中斷說(shuō)明:關(guān)閉定時(shí)器,停止蜂鳴器播放聲音,需要播放時(shí)開(kāi)啟定時(shí)器中斷。步驟2:編寫(xiě)音樂(lè)音z符與節(jié)拍數(shù)組,教材選小星星樂(lè)譜部分。代碼如下所示。8.響起一段完整的音曲const
unsigned
charmusic[]={
1,1,5,5,6,6,5,4,4,3,3,2,2,1};const
unsigned
charmusic_time[]={
4,4,4,4,4,4,8,4,4,4,4,4,4,8};任務(wù)實(shí)施一個(gè)最簡(jiǎn)單的音樂(lè),需要由音符與節(jié)拍組成音符即:do、re、mi、fa、so、la、xi簡(jiǎn)譜為1、2、3、4、5、6、7節(jié)拍即:一個(gè)音符持續(xù)的時(shí)間,教材將一節(jié)拍定義為4,半拍定義為2知識(shí)補(bǔ)充8.響起一段完整的音曲任務(wù)實(shí)施步驟3:編寫(xiě)按鈕邏輯代碼,按下按鈕開(kāi)啟定時(shí)器中斷響起音符,代碼如下所示。8.響起一段完整的音曲unsignedcharmusic_count=0;unsigned
charflag=0;voidmain(){P2DIR|=0x01;P1DIR&=~(0x03);P1DIR|=0x01;systemInit();timerInit();
while(1){
if(P1_2==0){delay_ms(20);
if(P1_2==1){
if(flag){flag=0;}
else{flag=1;}}}}}任務(wù)實(shí)施代碼小貼士:代碼:
if(flag){flag=0;}
else{flag=1;}說(shuō)明:判斷當(dāng)前的flag標(biāo)志,如果為1標(biāo)志清0、為0置1,表示開(kāi)關(guān)音樂(lè)。8.響起一段完整的音曲任務(wù)實(shí)施步驟4:編寫(xiě)定時(shí)器3中斷函數(shù),并使用flag來(lái)控制是否產(chǎn)生音頻信號(hào),代碼如下所示。代碼小貼士:代碼:
if(flag){beep=!beep;}說(shuō)明:判斷當(dāng)前的flag標(biāo)志,如果為1則開(kāi)啟音樂(lè),為0則關(guān)閉音樂(lè)。8.響起一段完整的音曲#pragmavector=T3_VECTOR__interruptvoidT3_INT(void){
if(flag){beep=!beep;}}任務(wù)實(shí)施步驟5:編寫(xiě)音符產(chǎn)生、節(jié)拍切換代碼,代碼如下所示。8.響起一段完整的音曲voidmain(){P2DIR|=0x01;P1DIR&=~(0x03);systemInit();timerInit();
while(1){
if(P1_2==0){delay_ms(20);
if(P1_2==1){
if(flag){flag=0;IEN1&=~(0x03);}
else{flag=1;IEN1|=(0x03);}}}
if(flag){T3CC0=FREQ[music[music_count]];delay_ms(500*music_time[music_count]);music_count++; //音符中間停頓IEN1&=~(0x08);delay_ms(300);IEN1|=(0x08);
if(sizeof(music)==music_count){music_count=0;}}}}任務(wù)實(shí)施代碼小貼士:代碼:if(flag){…}說(shuō)明:如果按鍵被按下,flag被置位則執(zhí)行音符代碼。代碼:T3CC0=FREQH[music[music_count]];//獲取音符并轉(zhuǎn)換成頻率說(shuō)明:通過(guò)兩個(gè)數(shù)組嵌套將音符傳入頻率數(shù)組中得到頻率數(shù)值并賦值給fh、fl中產(chǎn)生頻率。代碼:delay_ms(500*music_time[music_count]);//獲取頻率延遲說(shuō)明:節(jié)拍為響起多少時(shí)間,使用延遲加入?yún)?shù)確定為500*數(shù)組的數(shù)值。8.響起一段完整的音曲任務(wù)實(shí)施步驟6:全速執(zhí)行查看效果,發(fā)現(xiàn)按鈕在開(kāi)啟音樂(lè)時(shí)反應(yīng)靈敏,但在關(guān)閉時(shí)十分反應(yīng)很慢,那是因?yàn)槌绦蛟趫?zhí)行音樂(lè)的過(guò)程中調(diào)用了延遲程序的原因,如果要解決這種問(wèn)題則需要使用外部中斷的方式,調(diào)用項(xiàng)目三外部中斷初始化函數(shù),中斷函數(shù)改寫(xiě)按鈕方法。代碼如下所示。8.響起一段完整的音曲//外部中斷初始化voidinit(){IEN2|=0x10;//端口1中斷使能P1IEN|=0x04;//端口P1_2外部中斷使能PICTL|=0x02;//端口P1_0到P1_3下降沿觸發(fā)}#pragmavector=P1INT_VECTOR//外部中斷1的向量入口__interruptvoidInt1_Sevice(){/*先清除引腳標(biāo)志位,再清除端口標(biāo)志位,否則會(huì)不斷進(jìn)入中斷*/P1IFG&=~0x04;//軟件清除P1_2引腳的標(biāo)志位P1IF=0;//軟件清除P1端口組的標(biāo)志位
if(flag){flag=0;}
else{flag=1;}}任務(wù)實(shí)施步驟7:再次全速執(zhí)行查看效果,按下sw1按鈕響起音樂(lè),再次按下停止播放。一、在原有程序的基礎(chǔ)上修改代碼,完成如下任務(wù):
自行編寫(xiě)一段音樂(lè),寫(xiě)入數(shù)組中完成音樂(lè);
使用按鈕切換音樂(lè)一、音樂(lè)二。
按下另外一個(gè)sw2,使聲音停止。技能拓展8.響起一段完整的音曲Zigbee無(wú)線傳感網(wǎng)技術(shù)與應(yīng)用ZigBee無(wú)線控制音樂(lè)盒0501了解BasicRF點(diǎn)對(duì)點(diǎn)工作機(jī)制03熟悉無(wú)線發(fā)送和接收函數(shù)05理解串口讀寫(xiě)函數(shù)04理解發(fā)送地址和接收地址、PAN_ID、RF_CHANNEL等概念02掌握蜂鳴器驅(qū)動(dòng)方法學(xué)習(xí)目標(biāo)Learningobjectives任務(wù)二:無(wú)線音樂(lè)盒任務(wù)要求要求讀者查看元件資料以及學(xué)習(xí)資料,實(shí)現(xiàn)使用CC2530建立點(diǎn)對(duì)點(diǎn)的無(wú)線控制音樂(lè)盒的方法,達(dá)到實(shí)現(xiàn)基于BasicRF的無(wú)線采集與網(wǎng)絡(luò)組建功能。任務(wù)目標(biāo)Missionobjectives01了解BasicRFLayer工作機(jī)制03掌握如何新建一個(gè)BasicRF工程方法02熟悉無(wú)線發(fā)送和接收函數(shù)儲(chǔ)備知識(shí)BasicRF是簡(jiǎn)單無(wú)線點(diǎn)對(duì)點(diǎn)傳輸協(xié)議,可用來(lái)進(jìn)行Z-Stack協(xié)議棧無(wú)線數(shù)據(jù)傳輸?shù)娜腴T(mén)學(xué)習(xí)。TI公司提供了基于CC253x芯片的BasicRF軟件包,其包括硬件層(Hardwarelayer)、硬件抽象層(HardwareAbstractionlayer)、基本無(wú)線傳輸層(BasicRFlayer)和應(yīng)用層(Application)。雖然該軟件包還沒(méi)有用到Z-Stack協(xié)議棧,但是其包含了IEEE802.15.4標(biāo)準(zhǔn)數(shù)據(jù)包的發(fā)送和接收,采用了與IEEE802.15.4MAC兼容的數(shù)據(jù)包結(jié)構(gòu)及ACK包結(jié)構(gòu)。其功能限制如下:不具備“多跳”、“設(shè)備掃描”功能。不提供多種網(wǎng)絡(luò)設(shè)備,如協(xié)調(diào)器、路由器等。所有節(jié)點(diǎn)設(shè)備同一級(jí),只能實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)數(shù)據(jù)傳輸。傳輸時(shí)會(huì)等待信道空閑,但不按IEEE802.15.4CSMA-CA要求進(jìn)行兩次CCA檢測(cè)。不重傳輸數(shù)據(jù)。1.什么是BasicRF儲(chǔ)備知識(shí)2.無(wú)線傳感網(wǎng)技術(shù)無(wú)線傳感器網(wǎng)絡(luò)(wirelesssensornetworks,WSN)是當(dāng)前在國(guó)際上備受關(guān)注的、涉及多學(xué)科高度交叉、知識(shí)高度集成的前沿?zé)狳c(diǎn)研究領(lǐng)域。Wi-Fi(wirelessfidelity)是一種可以將個(gè)人電腦、手持設(shè)備(如pad、手機(jī))等終端以無(wú)線方式互相連接的技術(shù),改善基于IEEE802.11標(biāo)準(zhǔn)的無(wú)線網(wǎng)路產(chǎn)品之間的互通性,很多人把使用IEEE802.11系列協(xié)議的局域網(wǎng)就稱(chēng)為Wi-Fi。藍(lán)牙(Bluetooth)工作在2.4GHz的頻段,最早是愛(ài)立信公司在1994年開(kāi)始研究的一種能使手機(jī)與其附件(如耳機(jī))之間相互通信的無(wú)線模塊,采用FHSS擴(kuò)頻方式,藍(lán)牙信道帶寬為1MHZ,異步非對(duì)稱(chēng)連接最高數(shù)據(jù)速率為723.2kbit/s;連接距離一般小于10m。ZigBee主要用于近距離無(wú)線連接,它有自己的無(wú)線電標(biāo)準(zhǔn),有數(shù)千個(gè)微小的傳感器之間相互協(xié)調(diào)實(shí)現(xiàn)通信。這些傳感器只需要很少的能量,以接力的方式通過(guò)無(wú)線電波將數(shù)據(jù)從一個(gè)傳感器傳到另一個(gè)傳感器,所以它們之間的通信效率非常高。儲(chǔ)備知識(shí)3.ZigBee無(wú)線傳感網(wǎng)絡(luò)通信標(biāo)準(zhǔn)ZigBee協(xié)議規(guī)范使用了IEEE802.15.4定義的物理層(PHY)和媒體介質(zhì)訪問(wèn)控制層(MAC),并在此基礎(chǔ)上定義了網(wǎng)絡(luò)層(NWK)和應(yīng)用層(APL)架構(gòu)。儲(chǔ)備知識(shí)4.BasicRF通信基本參數(shù)ZigBee信道Channel地址,2.4GHz的射頻頻段被分為16個(gè)獨(dú)立的信道。在程序設(shè)計(jì)中信道號(hào)的變量寄存器channel取值范圍為11-26,ZigBee要建立通信,此參數(shù)必須要設(shè)置在規(guī)定范圍內(nèi)。Panid網(wǎng)絡(luò)號(hào)PANID是指網(wǎng)絡(luò)標(biāo)號(hào),用來(lái)區(qū)分不同的ZigBee網(wǎng)絡(luò)。PANID的有效范圍是0~0x3fff。Mac物理地址每個(gè)ZigBee設(shè)備都有一個(gè)IEEE地址,即MAC地址。物理地址是在出廠的時(shí)候初始化的。它是全球唯一的。當(dāng)一個(gè)ZigBee節(jié)點(diǎn)加入網(wǎng)絡(luò)的時(shí)候它的IEEE不能與網(wǎng)絡(luò)中現(xiàn)有節(jié)點(diǎn)的IEEE地址沖突。5.新建工程本任務(wù)所需軟件已安裝至電腦可直接使用。本任務(wù)所需硬件:下載器、ZigBee開(kāi)發(fā)板、5V電源適配器、USB下載線、繼電器模塊、報(bào)警燈模塊。環(huán)境準(zhǔn)備任務(wù)實(shí)施任務(wù)實(shí)施
新建工程,使工程可以被正常編譯成功。任務(wù)要求編寫(xiě)代碼步驟1:由于BasicRF文件較多,故需要新建多個(gè)目錄整理。在工程目錄下新建一個(gè)目錄Project目錄,在IAR下新建一個(gè)工程名稱(chēng)為“BasicRF”,設(shè)置先前的通用的Option選項(xiàng)。5.新建工程任務(wù)實(shí)施步驟2:復(fù)制配套資料“CC2530_lib”目錄,復(fù)制至工程目錄下。圖:復(fù)制文件到工程目錄5.新建工程任務(wù)實(shí)施步驟3:在工程欄中新建app、basicrf、board、common、utils五個(gè)目錄,新建目錄步驟為“右鍵選擇工程名”->點(diǎn)擊“Add”添加->點(diǎn)擊“AddGroup”添加目錄如圖所示。添加完成后目錄如圖所示。圖:添加目錄5.新建工程任務(wù)實(shí)施步驟4:在app目錄下新建一個(gè)main.c文件,為主函數(shù)入口文件,app目錄為用戶(hù)編寫(xiě)邏輯的目錄,在main.c文件中編寫(xiě)最簡(jiǎn)程序。圖:新建一個(gè)主程序文件5.新建工程任務(wù)實(shí)施步驟5:將“CC2530_lib”目錄下的c文件拖入對(duì)應(yīng)的目錄下。圖:拖入c文件5.新建工程任務(wù)實(shí)施步驟6:設(shè)置其他的“Option”選項(xiàng)使BasicRF正常編譯,進(jìn)入Option選項(xiàng)->GeneralOption->修改Stacksizes:IData為0xC0、PDATA為0x80、XDATA為0x300,Heapsizes:XDATA為0x00、Far為0x000、Far22為0xfff、Huge為0x000。圖:設(shè)置Stack/Heap5.新建工程任務(wù)實(shí)施步驟7:設(shè)置其他的“Option”選項(xiàng),索引頭文件路徑,選擇C/C++Compiler->Preprocessor->文本框中添加頭文件目錄,語(yǔ)法為“$PROJ_DIR$”表示工程路徑,“../”表示上一級(jí)路徑,完整語(yǔ)法為如下所示。5.新建工程$PROJ_DIR$\..\CC2530_lib\basicrf$PROJ_DIR$\..\CC2530_lib\board$PROJ_DIR$\..\CC2530_lib\common$PROJ_DIR$\..\CC2530_lib\utils$PROJ_DIR$\..\CC2530_lib\moudle任務(wù)實(shí)施步驟8:點(diǎn)擊“RebuildAll”編譯工程代碼,如圖?所示,正常會(huì)有3個(gè)警告不用理會(huì),不影響使用。圖:代碼編譯5.新建工程任務(wù)實(shí)施一、將basic頭文件,放置在工程目錄下,工程O(píng)ption配置需要如何更改。二、在3分鐘內(nèi)完成新建工程任務(wù)。技能拓展5.新建工程本任務(wù)所需軟件已安裝至電腦可直接使用。本任務(wù)所需硬件:下載器、Zigbee開(kāi)發(fā)板、5V電源適配器、USB下載線、天線。環(huán)境準(zhǔn)備任務(wù)實(shí)施6.點(diǎn)對(duì)點(diǎn)通信任務(wù)實(shí)施
發(fā)送板按下按鍵,接收板點(diǎn)亮另一個(gè)設(shè)備LED。任務(wù)要求硬件連接將兩塊Zigbee開(kāi)發(fā)板旋上天線,如圖所示。6.點(diǎn)對(duì)點(diǎn)通信圖:旋上天線任務(wù)實(shí)施編寫(xiě)代碼步驟1:在上述新建工程中,app->main.c文件下,添加必要頭文件代碼,代碼如下所示。6.點(diǎn)對(duì)點(diǎn)通信#include"hal_defs.h"http://自定義define信息頭文件#include"basic_rf.h"http://rf模塊的頭文件#include"hal_board.h"http://zigbee板初始化函數(shù)任務(wù)實(shí)施6.點(diǎn)對(duì)點(diǎn)通信代碼小貼士:代碼:#include"hal_defs.h"說(shuō)明:由于basicrf中包含有使用了簡(jiǎn)寫(xiě)的宏定義所以需要包含該頭文件,包含自定義的define信息,包含int16、uint16、int32、uint32等宏定義信息文件。#include"basic_rf.h"說(shuō)明:頭文件包含basicrf所使用的函數(shù),包含初始化函數(shù)、發(fā)送函數(shù)、接收函數(shù)等。#include"hal_board.h"說(shuō)明:頭文件包含CC2530常用模塊初始化函數(shù),basicrf需要調(diào)用部分函數(shù)。任務(wù)實(shí)施步驟2:聲明全局變量的結(jié)構(gòu)體變量,結(jié)構(gòu)體為basicRfCfg,代碼如下所示。6.點(diǎn)對(duì)點(diǎn)通信staticbasicRfCfg_tbasicRf_Config結(jié)構(gòu)體:結(jié)構(gòu)體是一個(gè)或多個(gè)變量的集合,這些變量可以是不同的類(lèi)型,為了處理的方便而將這些變量組織在一個(gè)名字之下。比如我要統(tǒng)某個(gè)班的學(xué)生信息(包括姓名,學(xué)號(hào),成績(jī)),每個(gè)學(xué)生都需要至少3個(gè)變量,如若學(xué)生人數(shù)較多,那需要的變量就非常之多了。為了解決這樣的問(wèn)題,就要用到結(jié)構(gòu)體這種構(gòu)造類(lèi)型,我們可以將每個(gè)學(xué)生的各項(xiàng)信息以不同類(lèi)型的數(shù)據(jù)存放到一個(gè)結(jié)構(gòu)體中,如用字符型表示姓名,用整型或字符型表示學(xué)號(hào)、用整型或?qū)嵭捅硎境煽?jī)。知識(shí)補(bǔ)充任務(wù)實(shí)施結(jié)構(gòu)體就是將不同類(lèi)型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體,以便于引用。如定義一個(gè)學(xué)生的信息:structstudent{intnum;charname[20];intscore;};struct為結(jié)構(gòu)體關(guān)鍵字,student就是這結(jié)構(gòu)體的類(lèi)型名,而num,name,score就是該結(jié)構(gòu)體的成員,他們可以是不同類(lèi)型的,注意在定義類(lèi)型的時(shí)候不要對(duì)結(jié)構(gòu)體成員num,name,score賦初值。其次就是在大括號(hào)后面要有分號(hào)“;”。知識(shí)補(bǔ)充6.點(diǎn)對(duì)點(diǎn)通信任務(wù)實(shí)施步驟3:補(bǔ)充basicrf結(jié)構(gòu)體變量?jī)?nèi)部變量,代碼如下所示。6.點(diǎn)對(duì)點(diǎn)通信basicRf_Config.panId=0xA121;//zigbee的ID號(hào)設(shè)置basicRf_Config.channel=26;//zigbee的頻道設(shè)置basicRf_Config.myAddr=0x001;//設(shè)置本機(jī)地址basicRf_Config.ackRequest=TRUE;//應(yīng)答信號(hào)步驟4:將結(jié)構(gòu)體傳入basicRInit函數(shù)中,該函數(shù)為初始化函數(shù)中,代碼如下所示。basicRfInit(&basicRf_Config);步驟5:調(diào)用開(kāi)啟basicRF接收函數(shù),開(kāi)啟接收。代碼如下所示。basicRfReceiveOn();任務(wù)實(shí)施步驟6:將上述代碼封裝成函數(shù),方便調(diào)用,函數(shù)如下所示。6.點(diǎn)對(duì)點(diǎn)通信voidConfigRf_Init(){basicRf_Config.panId=0xA121;//zigbee的ID號(hào)設(shè)置basicRf_Config.channel=26;//zigbee的頻道設(shè)置basicRf_Config.myAddr=0x001;//設(shè)置本機(jī)地址basicRf_Config.ackRequest=TRUE;//應(yīng)答信號(hào)basicRfInit(&basicRf_Config);//檢測(cè)zigbee的參數(shù)是否配置成功basicRfReceiveOn();//打開(kāi)RF接收}任務(wù)實(shí)施步驟7:在主程序中,調(diào)用初始化模塊相關(guān)寄存器函數(shù),再調(diào)用ConfigRF_Init()初始化函數(shù)代碼如下所示(注意代碼順序不可寫(xiě)錯(cuò))。6.點(diǎn)對(duì)點(diǎn)通信voidmain(){halBoardInit();//初始化模塊相關(guān)寄存器ConfigRf_Init();//無(wú)線收發(fā)參數(shù)配置
while(1){
}}任務(wù)實(shí)施步驟8:在主程序中調(diào)用Basicrf發(fā)送函數(shù),當(dāng)有sw1按鍵被按下彈開(kāi)時(shí)發(fā)送數(shù)據(jù)a到另外設(shè)備上,代碼如下所示。6.點(diǎn)對(duì)點(diǎn)通信voidmain(){halBoardInit();//初始化模塊相關(guān)寄存器ConfigRf_Init();//無(wú)線收發(fā)參數(shù)配置
while(1){ if(P1_2==0) { delay_ms(200); if(P1_2==1) { //發(fā)送數(shù)據(jù)至設(shè)備
basicRfSendPacket(0x0002,"a",1); }}}}代碼小貼士:代碼:basicRfSendPacket(0x0002,"a",1);說(shuō)明:發(fā)送函數(shù)共三個(gè)參數(shù)參數(shù)1:發(fā)送的數(shù)據(jù)地址地址為十六進(jìn)制參數(shù)2:發(fā)送的數(shù)據(jù)參數(shù)3:發(fā)送數(shù)據(jù)的個(gè)數(shù)任務(wù)實(shí)施步驟9:下載代碼至開(kāi)發(fā)板中,該代碼為發(fā)送板,接下來(lái)開(kāi)始編寫(xiě)接收數(shù)據(jù)板代碼。6.點(diǎn)對(duì)點(diǎn)通信步驟10:在windows資源管理器中修改main.c名稱(chēng)為send.c表示發(fā)送主函數(shù),復(fù)制send.c重命名為read.c,并重新添加至工程中如圖所示。圖:附加文件任務(wù)實(shí)施步驟11:將send.c文件設(shè)置為無(wú)效,鼠標(biāo)右鍵選中文件->選擇“Option”->勾選“Excludeformbuild”選項(xiàng)將文件設(shè)置為無(wú)效。如圖所示。6.點(diǎn)對(duì)點(diǎn)通信圖:設(shè)置無(wú)效任務(wù)實(shí)施步驟12:打開(kāi)read.c文件修改代碼,首先修改設(shè)備的mac地址(物理地址)由于發(fā)送板為發(fā)送給0x0002地址,故需要將發(fā)送板修改為0x0001,注意在basicrf通信中“panId”(網(wǎng)絡(luò)ID)與“channel”(網(wǎng)絡(luò)通道)必須一致。代碼如下所示。6.點(diǎn)對(duì)點(diǎn)通信voidConfigRf_Init(void){basicRfConfig.panId=0xA121;basicRfConfig.channel=26;basicRfConfig.myAddr=0x002;//設(shè)置本機(jī)地址basicRfConfig.ackRequest=TRUE;while(basicRfInit(&basicRfConfig)==FAILED);basicRfReceiveOn();}任務(wù)實(shí)施步驟13:在主函數(shù)while循環(huán)中編寫(xiě)接收代碼,首先編寫(xiě)判斷是否接收成功代碼,代碼如下所示。6.點(diǎn)對(duì)點(diǎn)通信代碼小貼士:代碼:basicRfPacketIsReady()說(shuō)明:該函數(shù)為判斷是否有數(shù)據(jù)接收成功,如果成功則為1,無(wú)為0voidmain(){P1DIR|=0x01;halBoardInit();//初始化模塊相關(guān)寄存器ConfigRf_Init();//無(wú)線收發(fā)參數(shù)配置
while(1){
if(basicRfPacketIsReady()){
}}}任務(wù)實(shí)施步驟14:編寫(xiě)接收數(shù)據(jù)代碼,調(diào)用接收數(shù)據(jù)函數(shù),聲明一個(gè)接收緩存數(shù)據(jù)用于緩存數(shù)據(jù),代碼如下所示。6.點(diǎn)對(duì)點(diǎn)通信代碼小貼士:voidmain(){
unsigned
chartmp;P1DIR|=0x01;halBoardInit();//初始化模塊相關(guān)寄存器ConfigRf_Init();//無(wú)線收發(fā)參數(shù)配置
while(1){
if(basicRfPacketIsReady()){basicRfReceive(&tmp,1,NULL);//接收數(shù)據(jù)
}}}代碼:basicRfReceive(&tmp,1,NULL);說(shuō)明:該函數(shù)用于接收數(shù)據(jù),其有三個(gè)參數(shù)參數(shù)1:接收數(shù)據(jù)的緩存,表示將數(shù)據(jù)存儲(chǔ)在哪里。可以為數(shù)組。(由于本人任務(wù)只接收一位所以?xún)H需判斷該位的數(shù)據(jù))參數(shù)2:接收數(shù)據(jù)個(gè)數(shù)(本任務(wù)只需要接收1位)參數(shù)3:無(wú)需使用為空即可任務(wù)實(shí)施步驟15:接收到數(shù)據(jù)后,判斷數(shù)據(jù)是否為‘a(chǎn)’如果為a則取反LED燈點(diǎn)亮或熄滅。代碼如下所示。6.點(diǎn)對(duì)點(diǎn)通信voidmain(){
unsigned
chartmp;P1DIR|=0x01;halBoardInit();//初始化模塊相關(guān)寄存器ConfigRf_Init();//無(wú)線收發(fā)參數(shù)配置
while(1){
if(basicRfPacketIsReady()){basicRfReceive(&tmp,1,NULL);//接收數(shù)據(jù)
if(tmp=='a'){P1_0=~P1_0;}}}}任務(wù)實(shí)施步驟16:下載代碼在接收代碼中設(shè)置斷點(diǎn),按下發(fā)送板sw按鈕,查看是否進(jìn)入斷點(diǎn)中,查看接受數(shù)據(jù)tmp情況,如圖所示。6.點(diǎn)對(duì)點(diǎn)通信圖:接收到數(shù)據(jù)任務(wù)實(shí)施步驟17:全速執(zhí)行代碼,查看效果,如圖所示。6.點(diǎn)對(duì)點(diǎn)通信圖:查看效果任務(wù)實(shí)施一、修改代碼,完成下述功能需求。1.在發(fā)送板中按下sw2按鍵開(kāi)啟d5燈;2.再次按下則關(guān)閉;二、修改代碼,完成發(fā)送與接收同時(shí)有效,即在發(fā)送板按下sw1按鈕接收板點(diǎn)亮,在接收板按下則發(fā)送板有效。技能拓展6.點(diǎn)對(duì)點(diǎn)通信7.無(wú)線音樂(lè)盒本任務(wù)所需軟件已安裝至電腦可直接使用。本任務(wù)所需硬件:下載器、Zigbee開(kāi)發(fā)板、5V電源適配器、USB下載線、天線。環(huán)境準(zhǔn)備任務(wù)實(shí)施任務(wù)實(shí)施
發(fā)送板按下按鍵,接收板點(diǎn)亮另一個(gè)設(shè)備LED;任務(wù)要求硬件連接將兩塊Zigbee開(kāi)發(fā)板旋上天線,如圖所示。圖:旋上天線7.無(wú)線音樂(lè)盒任務(wù)實(shí)施步驟1:復(fù)制“任務(wù)一\工程2”代碼,將該工程改為BasicRF工程,并在其添加調(diào)用點(diǎn)對(duì)點(diǎn)函數(shù),該代碼為接收方重命名為read.c,主程序代碼如下所示。編寫(xiě)代碼7.無(wú)線音樂(lè)盒voidmain(){
unsigned
chartmp;P2DIR|=0x01;P1DIR&=~(0x03);
/******代碼添加部分*****/halBoardInit();//初始化模塊相關(guān)寄存器ConfigRf_Init();
/*********************/systemInit();timerInit();
while(1){
if(basicRfPacketIsReady()){basicRfReceive(&tmp,1,NULL);
//接收數(shù)據(jù)
if(tmp=='a'){
if(flag){flag=0;
}
else{
任務(wù)實(shí)施7.無(wú)線音樂(lè)盒flag=1;}}}
if(flag){T3CC0=FREQ[music[music_count]];delay_ms(500*music_time[music_count]);music_count++;IEN1&=~(0x08);//不啟動(dòng)中斷delay_ms(300);IEN1|=(0x08);//不啟動(dòng)中斷
if(sizeof(music)==music_count){music_count=0;}}
}}任務(wù)實(shí)施步驟2:將該代碼定義為接收方,分析代碼通過(guò)可見(jiàn),原先代碼控制音樂(lè)盒是通過(guò)按鈕進(jìn)行控制,如果需要將其變?yōu)闊o(wú)線控制的方式,則只需將代碼改寫(xiě)為“任務(wù)二\工程2”中的判斷方式,關(guān)鍵代碼如下所示。7.無(wú)線音樂(lè)盒…while(1){
if(basicRfPacketIsReady()){basicRfReceive(&tmp,1,NULL);//接收數(shù)據(jù)
if(tmp=='a'){
if(flag){flag=0;}
else{flag=1;}}}…任務(wù)實(shí)施步驟3:接收板程序編寫(xiě)完成,發(fā)送板程序沿用“工程2”發(fā)送程序,復(fù)制send.c至工程下。圖:接收、發(fā)送7.無(wú)線音樂(lè)盒任務(wù)實(shí)施步驟4:下載read.c、send.c至開(kāi)發(fā)板中,先下載send.c文件,將read.c設(shè)置為無(wú)效。再下載read.c文件,如圖所示。圖:設(shè)置為無(wú)效7.無(wú)線音樂(lè)盒任務(wù)實(shí)施步驟5:將read.c下載至開(kāi)發(fā)板后,設(shè)置斷點(diǎn)調(diào)試查看是否接收到無(wú)線數(shù)據(jù),并響起音樂(lè)。圖:設(shè)置工程7.無(wú)線音樂(lè)盒步驟6:為了方便調(diào)試下載,IAR系統(tǒng)還提供了一個(gè)設(shè)置可自由切換特殊設(shè)置工程,點(diǎn)擊菜單欄Project,如圖所示。任務(wù)實(shí)施步驟7:在彈出窗體中點(diǎn)擊“new”->輸入“send”發(fā)送->點(diǎn)擊“OK”->同理設(shè)置read。圖:發(fā)送7.無(wú)線音樂(lè)盒任務(wù)實(shí)施一、修改代碼完成,如下任務(wù)要求:1.按下sw2,切換另外一首音樂(lè);2.發(fā)送板將按下按鈕數(shù)據(jù)發(fā)送給串口顯示,如“sw1被按下”、“sw2被按下”。技能拓展步驟8:分別下載read、send程序至開(kāi)發(fā)板中實(shí)現(xiàn),無(wú)線音樂(lè)盒效果。7.無(wú)線音樂(lè)盒Zigbee無(wú)線傳感網(wǎng)技術(shù)與應(yīng)用ZigBee無(wú)線控制音樂(lè)盒0501了解BasicRF點(diǎn)對(duì)點(diǎn)工作機(jī)制03熟悉無(wú)線發(fā)送和接收函數(shù)05理解串口讀寫(xiě)函數(shù)04理解發(fā)送地址和接收地址、PAN_ID、RF_CHANNEL等概念02掌握蜂鳴器驅(qū)動(dòng)方法學(xué)習(xí)目標(biāo)Learningobjectives任務(wù)三:用電腦彈音樂(lè)任務(wù)要求要求讀者通過(guò)上位機(jī)軟件與zigbee開(kāi)發(fā)板連接,無(wú)線控制另外一塊zigbee開(kāi)發(fā)板實(shí)現(xiàn)遠(yuǎn)程無(wú)線彈奏音樂(lè)。任務(wù)目標(biāo)Missionobjectives01掌握Z(yǔ)igBee點(diǎn)對(duì)點(diǎn)通信的方法03實(shí)現(xiàn)多點(diǎn)無(wú)線音樂(lè)盒的調(diào)試02掌握上位機(jī)軟件通信協(xié)議原理儲(chǔ)備知識(shí)為了實(shí)現(xiàn)在同一范圍內(nèi)多點(diǎn)間通信,必須考慮防止數(shù)據(jù)包在空氣中的傳輸時(shí)相互碰撞,為了建立可靠的無(wú)線傳輸通路,必須采用各種方法。例如TDMA/FDMA/CSMA等都是無(wú)線通訊中常用的辦法。1.ZigBee多點(diǎn)原理和方法點(diǎn)對(duì)多點(diǎn)的通信方法什么是FDMAFDMA是數(shù)據(jù)通信中的一種技術(shù),即不同的用戶(hù)分配在時(shí)隙相同而頻率不同的信道上。按照這種技術(shù),把在頻分多路傳輸系統(tǒng)中集中控制的頻段根據(jù)要求分配給用戶(hù)。同固定分配系統(tǒng)相比,頻分多址使通道容量可根據(jù)要求動(dòng)態(tài)地進(jìn)行交換。儲(chǔ)備知識(shí)在FDMA系統(tǒng)中,分配給用戶(hù)一個(gè)信道,即一對(duì)頻譜,一個(gè)頻譜用作前向信道即基站向移動(dòng)臺(tái)方向的信道,另一個(gè)則用作反向信道即移動(dòng)臺(tái)向基站方向的信道。這種通信系統(tǒng)的基站必須同時(shí)發(fā)射和接收多個(gè)不同頻率的信號(hào),任意兩個(gè)移動(dòng)用戶(hù)之間進(jìn)行通信都必須經(jīng)過(guò)基站的中轉(zhuǎn),因而必須同時(shí)占用2個(gè)信道(2對(duì)頻譜)才能實(shí)現(xiàn)雙工通信。以往的模擬通信系統(tǒng)一律采用FDMA。頻分多址(FDMA)是采用調(diào)頻的多址技術(shù)。業(yè)務(wù)信道在不同的頻段分配給不同的用戶(hù)。如TACS系統(tǒng)、AMPS系統(tǒng)等。頻分多址是把通信系統(tǒng)的總頻段劃分成若干個(gè)等間隔的頻道(也稱(chēng)信道)分配給不同的用戶(hù)使用。這些頻道互不交疊,其寬度應(yīng)能傳輸一路數(shù)字話音信息,而在相鄰頻道之間無(wú)明顯的串?dāng)_。頻分多址(FDMA)技術(shù)將可用的頻率帶寬拆分為具有較窄帶寬的子信道。這樣每個(gè)子信道均獨(dú)立于其它子信道,從而可被分配給單個(gè)發(fā)送器。其優(yōu)點(diǎn)是軟件控制上比較簡(jiǎn)單,其缺陷是子信道之間必須間隔一定距離以防止干擾,頻帶利用率不高。1.ZigBee多點(diǎn)原理和方法儲(chǔ)備知識(shí)FDMA是一個(gè)多頻率的通信方式,在實(shí)驗(yàn)中信道的改變是必要的,我們將頻段設(shè)置在2.4GHz上,要改變信道的方法是改變寄存器channel,在改變信道的時(shí)候,只需要改變channel的值,在下面的代碼中給出了兩個(gè)設(shè)備,選擇不同信道的方法。在實(shí)驗(yàn)使用三個(gè)CC2530無(wú)線通訊模塊,兩個(gè)發(fā)送模塊Tx1和Tx2,一個(gè)接收模塊Rx。模塊Tx1和模塊Tx2在編程時(shí),被強(qiáng)制固定在不同的子頻道上,模塊Tx1和模塊Tx2同時(shí)向Rx模塊發(fā)送數(shù)據(jù)包(因?yàn)樵诓煌淖宇l道上發(fā)射,所以在空氣中,這些數(shù)據(jù)包不會(huì)發(fā)射碰撞,不會(huì)出現(xiàn)數(shù)據(jù)包的傳輸錯(cuò)誤)。而Rx模塊時(shí)時(shí)刻刻地掃描監(jiān)視空氣中不同子頻道,發(fā)現(xiàn)有合格的數(shù)據(jù)包,就會(huì)自動(dòng)進(jìn)行接收。這就實(shí)現(xiàn)了點(diǎn)(Rx模塊)對(duì)多點(diǎn)(模塊Tx1和模塊Tx2)的可靠無(wú)線數(shù)據(jù)通訊。1.ZigBee多點(diǎn)原理和方法FDMA程序?qū)崿F(xiàn)儲(chǔ)備知識(shí)通常上位機(jī)指的是PC,下位機(jī)指的是單片機(jī)或者帶微處理器的系統(tǒng)。下位機(jī)一般是將模擬信號(hào)經(jīng)過(guò)AD采集將模擬量轉(zhuǎn)換為數(shù)字量,下位機(jī)再經(jīng)過(guò)數(shù)字信號(hào)處理以后將數(shù)字信號(hào)通過(guò)串口發(fā)送到上位機(jī),相反上位機(jī)可以給下位機(jī)發(fā)送一些指令或者信息。常見(jiàn)的通信串口包括RS232、RS485、RS422等。這些串口只是在電平特性有所不同,在上位機(jī)與下位機(jī)進(jìn)行數(shù)據(jù)通信時(shí)可以不考慮電平特性,而且現(xiàn)在在硬件上有各種轉(zhuǎn)接接口,使用起來(lái)也很方便。當(dāng)然在通常做簡(jiǎn)單的串口UART實(shí)驗(yàn)時(shí)我們可以使用各種各樣的串口助手小軟件,但是這些串口小工具有時(shí)候并不能很好滿足需求。2.用電腦彈音樂(lè)上位機(jī)與下位機(jī)圖:上位機(jī)儲(chǔ)備知識(shí)現(xiàn)教材制作了一套上位機(jī)軟件,用來(lái)模擬鋼琴按鍵,使用串口與電腦通信,軟件使用波特率57600、無(wú)奇偶校驗(yàn)位、默認(rèn)COM連接COM10接口(需要手動(dòng)設(shè)置COM口為COM10)。其具體通信協(xié)議如下表所示。指令部分0xff表示為啟始符、0xfe表示終止符、中間為判斷的數(shù)據(jù)。2.用電腦彈音樂(lè)鋼琴小程序功能指令觸發(fā)條件0xFF0x010xFE按下鍵盤(pán)“數(shù)字健1”響起音符re0xFF0x020xFE按下鍵盤(pán)“數(shù)字健2”響起音符mi0xFF0x030xFE按下鍵盤(pán)“數(shù)字健3”響起音符fa0xFF0x040xFE按下鍵盤(pán)“數(shù)字健4”響起音符so0xFF0x050xFE按下鍵盤(pán)“數(shù)字健5”響起音符la0xFF0x060xFE按下鍵盤(pán)“數(shù)字健6”0xFF0x070xFE按下鍵盤(pán)“數(shù)字健7”0xFF0x100xFE按下鍵盤(pán)“數(shù)字健8”響起音符高音re0xFF0x200xFE按下鍵盤(pán)“數(shù)字健9”響起音符高音mi0xFF0x300xFE按下鍵盤(pán)“數(shù)字健0”表:上位機(jī)通信指令集合3.串行收發(fā)本任務(wù)所需軟件已安裝至電腦可直接使用。本任務(wù)所需硬件:下載器、ZigBee開(kāi)發(fā)板、5V電源適配器、USB下載線、串口線、天線蜂鳴器模塊。環(huán)境準(zhǔn)備任務(wù)實(shí)施任務(wù)實(shí)施
接收串口多個(gè)數(shù)據(jù),將數(shù)據(jù)放入緩存數(shù)組中;
判斷數(shù)據(jù),同時(shí)輸出結(jié)果給電腦如“響起do”、“響起re”、“響起mi”等。任務(wù)要求編寫(xiě)代碼步驟1:新建工程->工程名稱(chēng)為“串行收發(fā)”->保存->main.c文件名稱(chēng)為“main.c”->設(shè)置Opion->編寫(xiě)最簡(jiǎn)單的代碼,代碼如下所示。(新建工程具體步驟,不再重復(fù)介紹)#include"iocc2530.h"voidmain(){
while(1){
}}3.串行收發(fā)任務(wù)實(shí)施步驟2:編寫(xiě)串口使能函數(shù),開(kāi)啟設(shè)置I/O外設(shè)、串口接收中斷、57600波特率等、代碼如下所示。3.串行收發(fā)voidUartInit(){P0SEL|=0x0c;//設(shè)置外設(shè)PERCFG=0x00;//設(shè)置I/O位置U0CSR|=0xc0;//設(shè)置UART模式U0BAUD=216;//設(shè)置波特率為57600U0GCR=10;//設(shè)置波特率為57600URX0IE=1;//開(kāi)啟串口接收中斷EA=1;//開(kāi)啟總中斷}任務(wù)實(shí)施步驟3:編寫(xiě)中斷接收函數(shù),代碼如下所示。3.串行收發(fā)charCommand[3];unsigned
charuart_count=0;#pragmavector=URX0_VECTOR__interruptvoidUART(){Command[uart_count++]=U0DBUF;//接收緩存數(shù)據(jù)到dataURX0IF=0;//清中斷標(biāo)志
if(uart_count==3){uart_count=2;}}任務(wù)實(shí)施代碼小貼士:代碼:charCommand[3];說(shuō)明:接收緩存數(shù)組,通過(guò)表?得到指令共3位,故申明一個(gè)3位的數(shù)組接收數(shù)據(jù)。代碼:Command[uart_count++]=U0DBUF;說(shuō)明:將串口數(shù)據(jù)寫(xiě)入緩存數(shù)組中,寫(xiě)完一個(gè)字節(jié)后,數(shù)組計(jì)數(shù)變量累加1,表示指向下一位接收。3.串行收發(fā)任務(wù)實(shí)施代碼小貼士:代碼:if(uart_count==3){uart_count=2;}說(shuō)明:防止數(shù)組計(jì)數(shù)器,累加溢出數(shù)組限界范圍,故累加至3后停止接收,直到接收到停止指令為止。3.串行收發(fā)任務(wù)實(shí)施步驟4:在主函數(shù)中調(diào)用串口中斷函數(shù),由于工程后續(xù)作為BasicRF使用所以需要將時(shí)鐘提前至為32MHZ使用,代碼如下所示。3.串行收發(fā)voidmain(){CLKCONCMD=0x80;UartInit();//調(diào)用串口初始化函數(shù)
while(1){
}}任務(wù)實(shí)施步驟5:編寫(xiě)發(fā)送串口字符串函數(shù)、與發(fā)送單字符函數(shù),代碼如下所示。3.串行收發(fā)voidsend(unsigned
chars){U0DBUF=s;//發(fā)送a
while(!UTX0IF);UTX0IF=0;}voidsendstr(unsigned
char*s,unsigned
charlen){
intcount=0;
while(len--){send(*(s+count));count++;}}任務(wù)實(shí)施步驟5:編寫(xiě)發(fā)送串口字符串函數(shù)、與發(fā)送單字符函數(shù),代碼如下所示。3.串行收發(fā)voidmain(){CLKCONCMD=0x80;UartInit();
while(1){
if(Command[2]==0xfe){
switch(Command[1]){
case
0x01:sendstr("響起“do”\n",11);
break;
case
0x02:sendstr("響起“re”\n",11);
任務(wù)實(shí)施3.串行收發(fā)
break;
case
0x03:sendstr("響起“mi”\n",11);
break;
……//代碼基本邏輯一致,為了篇幅省略}Command[0]=0;Command[1]=0;Command[2]=0;uart_count=0;}
}}任務(wù)實(shí)施代碼小貼士:代碼:if(Command[2]==0xfe)…說(shuō)明:判斷數(shù)據(jù)接收緩存的最后一位是否為上位機(jī)的指令最后一位0xfe,如果正確則開(kāi)始判斷數(shù)據(jù)位。3.串行收發(fā)任務(wù)實(shí)施代碼小貼士:switch(Command[1]){case0x01:sendstr("響起“do”\n",11);break;case0x02:sendstr("響起“re”\n",11);break;…}說(shuō)明:使用switch語(yǔ)句判斷第2位數(shù)據(jù),是否為指定的數(shù)值0x01,如果滿足則發(fā)送給電腦這是響起“do”的數(shù)據(jù)。同理下面使用…表示代碼基本一致。3.串行收發(fā)任務(wù)實(shí)施代碼小貼士:代碼:Command[0]=0;Command[1]=0;Command[2]=0;uart_count=0;說(shuō)明:如果接收到數(shù)據(jù)0xfe則表示接收指令結(jié)束,則必須將數(shù)據(jù)位請(qǐng)0,為后續(xù)指令接收。uart_count計(jì)數(shù)器也將清0。3.串行收發(fā)任務(wù)實(shí)施步驟7:代碼完成編寫(xiě)后,先使用串口調(diào)試助手模擬上位機(jī)軟件指令發(fā)送,注意串口調(diào)試助手使用16進(jìn)制發(fā)送,格式為:ff01fe,數(shù)據(jù)中間加空格間隔如圖所示。3.串行收發(fā)圖:發(fā)送16進(jìn)制數(shù)據(jù)任務(wù)實(shí)施步驟8:設(shè)置斷點(diǎn)接收數(shù)據(jù),觀看數(shù)據(jù)是否與發(fā)送一致。3.串行收發(fā)圖:查看接收數(shù)據(jù)任務(wù)實(shí)施步驟9:全速執(zhí)行代碼查看串口調(diào)試助手接收情況。3.串行收發(fā)圖:電腦接收到的數(shù)據(jù)任務(wù)實(shí)施一、修改代碼,將switch語(yǔ)句修改為if語(yǔ)句,并說(shuō)明兩者的區(qū)別。二、若將接收緩存變?yōu)?0即charCommand[10],那么代碼將如何修改。技能拓展3.串行收發(fā)4.開(kāi)始無(wú)線彈音樂(lè)本任務(wù)所需軟件已安裝至電腦可直接使用。本任務(wù)所需硬件:下載器、ZigBee開(kāi)發(fā)板、5V電源適配器、USB下載線、串口線、天線蜂鳴器模塊。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 阿拉善2025年內(nèi)蒙古阿拉善盟融媒體中心引進(jìn)攝像制作急需緊缺人才筆試歷年參考題庫(kù)附帶答案詳解
- 邯鄲河北邯鄲魏縣招聘警務(wù)輔助崗位120人筆試歷年參考題庫(kù)附帶答案詳解
- 蚌埠2025年安徽蚌埠固鎮(zhèn)縣職業(yè)技術(shù)學(xué)校招聘教師42人筆試歷年參考題庫(kù)附帶答案詳解
- 湘西2025年湖南湘西州龍山縣委政法委所屬事業(yè)單位選調(diào)筆試歷年參考題庫(kù)附帶答案詳解
- 河南2025年河南鄭州鐵路職業(yè)技術(shù)學(xué)院招聘17人筆試歷年參考題庫(kù)附帶答案詳解
- 杭州浙江杭州市體育局所屬事業(yè)單位杭州市水上運(yùn)動(dòng)中心招聘編外聘用人員筆試歷年參考題庫(kù)附帶答案詳解
- 廣西2025年廣西醫(yī)科大學(xué)第二附屬醫(yī)院醫(yī)技藥人才招聘筆試歷年參考題庫(kù)附帶答案詳解
- 宿州2025年安徽宿州靈璧縣村衛(wèi)生室(社區(qū)衛(wèi)生服務(wù)站)人員招聘68人筆試歷年參考題庫(kù)附帶答案詳解
- 寧德2025年福建福安市教育局招聘緊缺急需及高層次人才筆試歷年參考題庫(kù)附帶答案詳解
- 職業(yè)人群健康數(shù)據(jù)價(jià)值挖掘
- 消防改造施工組織方案
- 2025年人社窗口工作總結(jié)范文(二篇)
- 鄭東新區(qū)寫(xiě)字樓市場(chǎng)調(diào)研報(bào)告
- 亞馬遜運(yùn)營(yíng)全知識(shí)培訓(xùn)
- 夫妻財(cái)產(chǎn)分割協(xié)議書(shū)范文范本下載
- 中國(guó)的大好河山
- 甘肅省安全員A證考試題庫(kù)及答案
- 離婚登記申請(qǐng)受理回執(zhí)單模板
- 特技演員聘用合同
- 第25課《活板》同步練習(xí)(含答案)
- 數(shù)學(xué)中考復(fù)習(xí)資料四邊形
評(píng)論
0/150
提交評(píng)論