画外音:Windows Live Writer客户端连不到csdn的服务端,只好网页写了。但是……搜狗输入法在chrome浏览器里面居然不能用搜狗输入法在bolg编辑框里面输入中文,看来只好下载Google输入法用了。看来离Google人更近一步了。
正事开始了。
看陌生代码还是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的功能了,看看貌似没问题。嗯嗯略过
然后就是传感器端的温度和光照模块的调试,实际测试看来数据还是不对啊,赶紧改啦。
先发表了,没空在这边码字堆博客了,要调试的东西多着呢