>_
這是在上一個的基礎上通過按鍵發(fā)送4種不同命令來控制接收端的LED燈亮的改進版(上一個:http://www.cnblogs.com/zjutlitao/p/3840013.html),這里俺把按鍵發(fā)命令給去掉,然后加入一個串口通信的功能,PC通過串口給發(fā)送端發(fā)送命令,然后發(fā)送端通過無線將命令發(fā)給接收端來實現(xiàn)控制,這里接收端和上一個例程中的一樣,只是在發(fā)送端的代碼里去除了按鍵控制,變成了串口控制。
>_
>_
>_
由于這里的接收端的代碼和上一個一樣,所以不做介紹(惜墨如金呀,哈哈~~),下面就發(fā)送端進行介紹:
1 /*------------------------------------------------
2 定義UART_Init函數(shù)
3 ------------------------------------------------*/
4 void UART_Init(void)
5 {
6 SCON = 0x50; // 設定串行口工作方式,8位數(shù)據(jù)位,允許接收
7 T2CON = 0x34; //設置定時器2,作為波特率發(fā)生器
8 RCAP2L = 0XDC; //9600波特率的低8位
9 RCAP2H = 0XFF; //9600波特率的高8位
10 ES = 1; //允許串口中斷
11 EA = 1; //允許總中斷
12 }
這里是串口初始化函數(shù),采用定時器2作為波特率發(fā)生器,允許串口中斷(我采用發(fā)送就是循環(huán)發(fā)送策略,而接受通過觸發(fā)中斷來改變標志符,在主函數(shù)里再判斷標志符來判斷是否收到數(shù)據(jù),預知更多詳情,請繼續(xù)瀏覽,哈哈)
1 /*------------------------------------------------
2 定義UART_Send_Byte函數(shù)
3 ------------------------------------------------*/
4 void UART_Send_Byte(uchar byte)
5 {
6 SBUF=byte; //緩沖區(qū)裝載要發(fā)送的字節(jié)數(shù)據(jù)
7 while(TI==0); //等待發(fā)送完畢,TI標志位會置1
8 TI=0; //清零發(fā)送完成標志位
9 }
這是我定義的一個發(fā)送一個字符的串口發(fā)送函數(shù),大致意思就是把待發(fā)送數(shù)據(jù)給SBUF,然后等待標志位TI為1,即發(fā)送完畢,最后別忘清0!
1 /*------------------------------------------------
2 串口接收中斷服務程序
3 ------------------------------------------------*/
4 void UART(void) interrupt 4
5 {
6 if(RI) //檢測接收完成標志位置1
7 {
8 RI=0; //清零接收完成標志位
9 a=SBUF; //讀取接收到的數(shù)據(jù)
10 uart_flag = 1; //中斷標志位置1
11 }
12 }
上一個函數(shù)負責發(fā)送,這一個是負責接收的函數(shù),對的,這里采用的是串口接收中斷,當觸發(fā)串口中斷時,判斷是否RI為1,即接收完成與否,如果接收完成就把緩沖SBUF中的數(shù)據(jù)給全局變量a,然后置接收標志uart_flag為1,并RI清0.
1 /*------------------------------------------------
2 main函數(shù)
3 ------------------------------------------------*/
4 void main()
5 {
6 LED6=1; //初始燈6熄滅
7 uart_flag=0; //串口標志初始為0
8 init_NRF24L01(); //初始化24L01
9 UART_Init(); //初始化串口
10
11 while(NRF24L01_Check()) //檢查不到24l01則報警
12 {
13 beep=0;
14 delay_ms(200);
15 beep=1;
16 delay_ms(200);
17 }
18 while(1)
19 {
20 RX_Mode(); //接收模式
21 while(!nRF24L01_RxPacket(Rx_Buf)) //等待接收數(shù)據(jù),返回1則接收到數(shù)據(jù),在等待接收數(shù)據(jù)期間,可以隨時變成發(fā)送模式
22 {
23 if(uart_flag==1) //當串口接受標志為1表示有數(shù)據(jù)過來
24 {
25 ES=0; //關串口中斷
26
27 TX_Mode(); //發(fā)送模式
28 Tx_Buf1[0]=a-'0'; //將串口數(shù)據(jù)給發(fā)送緩沖區(qū)
29 nRF24L01_TxPacket(Tx_Buf1); //發(fā)送命令數(shù)據(jù)24L01
30 UART_Send_Byte('O'); //向串口發(fā)送已經傳送
31 UART_Send_Byte('K');
32 UART_Send_Byte(':');
33 UART_Send_Byte(a);
34 UART_Send_Byte('n');
35 LED6=0;
36 delay_ms(300);
37 LED6=1;
38 delay_ms(300); //發(fā)送后LED1閃一下
39
40 ES=1; //允許串口中斷
41 uart_flag=0; //中斷標志位置0
42 break; //退出最近的循環(huán),從而變回接收模式,這句關鍵
43 }
44 }
45 if(Rx_Buf[0]==1) //若接收到對應的數(shù)據(jù)則實現(xiàn)對應功能
46 {
47 Rx_Buf[0]=0; //清空數(shù)據(jù)
48 LED6=0;
49 delay_ms(300);
50 LED6=1;
51 delay_ms(300); //接收到數(shù)據(jù) 后閃爍
52 }
53 }
54 }
主函數(shù)中先初始化串口和24L01,然后檢測24L01是否存在,若不存在就響鈴,接著進入主循環(huán),設置24L01為接收模式,循環(huán)檢測是否收到數(shù)據(jù),如果收到數(shù)據(jù)直接跳到第45行對信息處理作出相應動作,如果沒有收到數(shù)據(jù)就一直執(zhí)行循環(huán)體內的代碼,循環(huán)體內不斷檢查uart_flag是否為1,即是否收到了數(shù)據(jù),當收到了數(shù)據(jù)就關閉串口中斷,將收到的數(shù)據(jù)發(fā)送出去,并回復PC端,并使LED6閃爍一次?!綪C端為1,2,3,4】
>_
l如果24L01用reg51那么兩個設備都要用reg51,如果用reg52就都得用reg52!
lPC通過串口發(fā)送給單片機命令[相當于協(xié)調器],單片機把命令通過24L01無線發(fā)送給另一個單片機,另一個單片機控制燈LED1,LED2,LED3,LED4閃爍。