畫外音:Windows Live Writer客戶端連不到csdn的服務端,只好網頁寫了。但是……搜狗輸入法在chrome瀏覽器里面居然不能用搜狗輸入法在bolg編輯框里面輸入中文,看來只好下載Google輸入法用了??磥黼xGoogle人更近一步了。
正事開始了。
看陌生代碼還是source insight方便,而且剛開始用沒多久,還處于蜜月期,總覺得這工具相當不錯的啦。當然,Linux平臺還是vim+ctags用起來爽。調用關系顯示的很清楚,只是屏幕小了點,看著確實少了點,上網本,就將就點吧。
兩個單片機,兩個文件代碼。第一件事就是找main函數。呃,main函數放在最后,跟個人習慣很不一樣。
- void main(void)
- {
- WDTCTL=WDTPW+WDTHOLD;
- _DINT();
- Init_Port1();
- IO_Init();
- LCD_Init();
- CLEAR();
- ……
- }
第一件事是殺狗,嗯嗯,以后一直要記得。
先禁止中斷,然后把該初始化的初始化好,單片機才能好好工作么~
然后是端口和芯片的初始化,由于功能比較單一,只要三個初始化函數就好了。
然后是顯示開機界面的顯示,液晶屏顯示還是很不錯的
- key11='M';
-
-
- writechinese(0x80,"XX大學");
- writechinese(0x90,"XX學院");
- writechinese(0x88,"無線監測模擬裝置");
- Delayus(100000);
- CLEAR();
- writechinese(0x80,"調試接收模式");
-
-
- keyflg=0;
- bostart=0x00;
- boflg=0x00;
- key_Init();
順便設置了一下初始參數和鍵盤接口,下面就是設置無線接收模塊的設置(根據函數名猜功能,畢竟第一步是把main函數看完)
- Init_nRF24L01_IO();
- nRF24L01_RX_MODE();
- nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);
- nRF24L01_Flush_RX_FIFO();
- nRF24L01_CE_1;
- _EINT();
IO接口設置好,無線模塊模式設置好,再把接收的內存區設置好,然后開啟中斷。
啦啦啦,之后就開始等著另一片發數據過來處理。
- do
- {
- key11='w' ;
- key_read();
- }
- while(1);
類似消息循環模式,不過是死循環,看來要關機就只能直接斷電了,反正小東西玩不壞,嘿嘿~
第二個發射模塊的單片機程序就相對簡單點,就是少了幾行代碼。具體的沒跟蹤進去看,看來兩個功能的差距就在key_read()函數里面了。
- key_Init();
- Init_nRF24L01_IO();
- _EINT();
- do
- {
- key11='w' ;
- key_read();
- }
- while(1);
main函數結束了,然后就是各個函數進去看了
先看看接收和發送這兩個中斷函數
- #pragma vector=PORT1_VECTOR
- __interrupt void P1_ISR(void)
- {
- _DINT();
- P1IFG=0;
- P1IE=0;
- P1IES=0;
- Delayus(500);
- CLEAR();
- writechinese(0x80,"正在接收");
- nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_STATUS,0x4e);
- nRF24L01_Read_Rx_Payload(Rx_Buff,3);
- nRF24L01_Flush_RX_FIFO();
- print_data();
- writechinese(0x88,"接收成功");
- IO_Init();
- Init_Port1();
- _EINT();
- }
- #pragma vector=PORT1_VECTOR
- __interrupt void P1_ISR(void)
- {
- _DINT();
- P1IFG=0;
- P1IE=0;
- P1IES=0;
- Delayus(500);
- writechinese(0x88,"發送成功");
- IO_Init();
- Init_Port1();
- _EINT();
- }
#pragma這個不熟悉,呃……看來C語言沒學好。
不寫了,先到這里,明天慢慢看。
(key_read()函數怎么看怎么想重寫,風格問題吧)
====================================================================
第二天了。。。
花了大力氣把key_read()函數重寫了一遍,個人感覺舒服多了,把大量的if-else改為switch,應該好理解多了。
順便把變量key11改為keyCol,這個看起來就明白多了。
- void key_read()
- {
-
-
- P6OUT=0x18 ;
- Delayus(100);
- key0=P5IN&0x70 ;
-
- switch ( key0 )
- {
- case 0x30:
- keyCount = '1';
- switch ( keyflg )
- {
- case 0:
- CLEAR();
- writechinese(0x80,"單獨探測節點");
- writechinese(0x90,"1-選擇1#節點");
- writechinese(0x88,"2-選擇2#節點");
- writechinese(0x98,"g-返回主菜單");
- keyflg=1 ;
- break;
- case 1:
- CLEAR();
- writechinese(0x80,"尋檢1#節點");
-
- writechinese(0x90,"d-確認,g-返回");
- keyflg=2 ;
- break;
- }
- break;
- case 0x40:
- keyCount = '2';
- switch ( keyflg )
- {
- case 0:
- CLEAR();
- writechinese(0x80,"輪尋模式");
- writechinese(0x90,"d-確認,g-返回");
- keyflg=4 ;
- break;
- case 1:
- CLEAR();
- writechinese(0x80,"尋檢2#節點");
- writechinese(0x90,"d-確認,g-返回");
- keyflg=3 ;
- break;
- }
-
- case 0x50:
- keyCount = '3' ;
- break;
- case 0x60:
- keyCount = '4' ;
- break;
- }
- if ( keyCount )
- {
- Delayus(KEY_DEALY);
- }
-
-
-
- P6OUT=0x20 ;
- Delayus(100);
- key0=P5IN&0x70 ;
- switch ( key0 )
- {
- case 0x30:
- keyCount='5' ;
- CLEAR();
- nRF24L01_TX_MODE();
- nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Tx_Address,5);
- writechinese(0x80,"正在發送");
- nRF24L01_Flush_TX_FIFO();
- nRF24L01_Set_Tx_Address(nRF24L01_W_REGISTER+nRF24L01_TX_ADDR,Tx_Address,5);
-
- nRF24L01_Write_Tx_Payload(Tx_Payload,3);
-
- nRF24L01_Transmit_Data();
-
- print_data();
- break;
- case 0x40:
- {
- ulong buffer ;
- uchar i ;
- keyCount='6' ;
- CLEAR();
- writechinese(0x80,"當前溫度");
- buffer=convert();
- print_tmp(buffer);
- for(i=0;i<8;i++)
- {
- Tx_Payload[1]=Tx_Payload[1]<<1 ;
- if(buffer&BITF?1:0)
- Tx_Payload[1]|=1 ;
- buffer=buffer<<1 ;
- }
- for(i=0;i<8;i++)
- {
- Tx_Payload[0]=Tx_Payload[0]<<1 ;
- if(buffer&BITF?1:0)
- Tx_Payload[0]|=1 ;
- buffer=buffer<<1 ;
- }
-
- }
- break;
- case 0x50:
- keyCount = '7' ;
- break;
- case 0x60:
- keyCount = '8' ;
- break;
- }
- if ( keyCount)
- {
- Delayus(KEY_DEALY);
- }
-
-
-
-
- P6OUT=0x28 ;
- Delayus(100);
- key0=P5IN&0x70 ;
- switch ( key0 )
- {
- case 0x30:
- keyCount = '9' ;
- break;
- case 0x40:
- keyCount = 'A' ;
- break;
- case 0x50:
- keyCount = 'B' ;
- break;
- case 0x60:
- keyCount = 'C' ;
- break;
- }
-
- if ( keyCount)
- {
- Delayus(KEY_DEALY);
- }
-
-
-
-
- P6OUT=0x30 ;
- Delayus(100);
- key0=P5IN&0x70 ;
- switch ( key0 )
- {
- case 0x30:
- keyCount = 'D';
- switch ( keyflg )
- {
- case 2:
-
- CLEAR();
- writechinese(0x80,"發送1#節點請求");
- nRF24L01_TX_MODE();
- nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Tx_Address1,5);
- nRF24L01_Flush_TX_FIFO();
- nRF24L01_Set_Tx_Address(nRF24L01_W_REGISTER+nRF24L01_TX_ADDR,Tx_Address1,5);
-
- nRF24L01_Write_Tx_Payload(Tx_Payload,3);
-
- nRF24L01_Transmit_Data();
-
-
- Init_nRF24L01_IO();
- nRF24L01_RX_MODE();
-
- nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);
- nRF24L01_Flush_RX_FIFO();
- nRF24L01_CE_1 ;
- key_isr=1 ;
- _EINT();
- do
- {
- keyCount='w' ;
- key_read();
-
- }
- while(1);
-
- break;
- case 3:
-
- CLEAR();
- writechinese(0x80,"發送2#節點請求");
- nRF24L01_TX_MODE();
- nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Tx_Address2,5);
- nRF24L01_Flush_TX_FIFO();
- nRF24L01_Set_Tx_Address(nRF24L01_W_REGISTER+nRF24L01_TX_ADDR,Tx_Address2,5);
-
- nRF24L01_Write_Tx_Payload(Tx_Payload,3);
-
- nRF24L01_Transmit_Data();
-
- Init_nRF24L01_IO();
- nRF24L01_RX_MODE();
-
- nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);
- nRF24L01_Flush_RX_FIFO();
- nRF24L01_CE_1 ;
- key_isr=1 ;
- _EINT();
- do
- {
- keyCount='w' ;
- key_read();
-
- }
- while(1);
-
- break;
- case 4:
-
- CLEAR();
- writechinese(0x80,"發送1#節點請求");
-
- keyflg=2 ;
-
- Delayus(20000);
- writechinese(0x80,"發送2#節點請求");
-
- keyflg=3 ;
- _EINT();
- break;
- }
- break;
- case 0x40:
- keyCount = 'E' ;
- break;
- case 0x50:
- keyCount = 'F' ;
- break;
- case 0x60:
- keyCount = 'G' ;
- CLEAR();
- writechinese(0x80,"江南大學");
- writechinese(0x90,"通信與控制工程");
- writechinese(0x88,"無線監測模擬裝置");
- Delayus(100000);
- CLEAR();
- writechinese(0x80,"選擇接受模式");
- writechinese(0x90,"1-單獨探測節點");
- writechinese(0x88,"2-輪巡模式");
- keyflg=0 ;
- Delayus(30000);
- Init_nRF24L01_IO();
- break;
- }
-
-
- if ( keyCount)
- {
- Delayus(KEY_DEALY);
- }
-
- }
dealyus(uint)函數里面用了宏定義,不然鍵盤延遲太嚴重了,以后慢慢調試。
下面就看的是NRF2401的功能了,看看貌似沒問題。嗯嗯略過
然后就是傳感器端的溫度和光照模塊的調試,實際測試看來數據還是不對啊,趕緊改啦。
先發表了,沒空在這邊碼字堆博客了,要調試的東西多著呢