|
水庫無線傳輸- 附錄C
- 顯示電路程序
- #include <reg51.h>
- #include <intrins.h>
- #define u8 unsigned char
- #define u16 unsigned int
- sbit rs = P2^6; //寄存器選擇輸入
- sbit e = P2^7; //液晶使能控制
- sbit MDO=P1^3;
- sbit SCK=P1^4;
- sbit CE=P1^5;
- sbit IRQ=P1^2;
- sbit MDI=P1^1;
- sbit CSN=P1^0;
- sbit key1=P1^6;
- sbit key2=P1^7;
- sbit key3=P3^2;
- sbit key4=P3^3;
- sbit buzzer=P2^5;
- u8 code table1[16]=" WELCOME TO USE ";
- u8 code table2[16]="Upper limit ";
- u8 code table3[16]=" Connected ";
- u8 code table4[16]="Lower limit ";
- u8 code table5[16]=" Disconnected ";
- u8 i,MAX,MIN,height,H;
- u8 menu,cont,n,m,x,y;
- bit star,lose,mode;
- bit key1_press,key2_press,key3_press,key4_press;
- bit s1,s2,s3,s4;
- u8 tx[6],rx[6];
- u16 wait;
- void Delay15us() //@12.000MHz
- {
- unsigned char i;
- i = 5;
- while (--i);
- }
- void delay(u16 i)
- {
- while(i--)
- Delay15us();
- }
- void write_com(u8 com) //函數功能:寫指令
- {
- e=0;
- rs=0;
- P0=com;
- delay(10);
- e=1;
- delay(20);
- e=0;
- }
- void write_data(u8 dat) //函數功能:寫數據
- {
- e=0;
- rs=1;
- P0=dat;
- delay(10);
- e=1;
- delay(20);
- e=0;
- }
- void init1602(void) //函數功能:初始化1602
- {
- delay(300);
- write_com(0x38);
- delay(100);
- write_com(0x38);
- delay(100);
- write_com(0x38);
- write_com(0x38);
- write_com(0x01);
- write_com(0x01);
- write_com(0x06);
- write_com(0x0c);
- }
- u8 SPI(u8 byte) //以下為無線模塊的控制程序,比較復雜。SPI模擬程序
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- MDI=(byte&0x80);//單片機輸出最高位數據
- SCK=1; //時鐘信號的上升沿后無線模塊讀取新數據
- byte<<=1; //數據左移
- byte|=MDO; //單片機讀取數據
- SCK=0; //時鐘信號的下降沿后無線模塊輸出新數據
- }
- return byte;
- }
- void REG_write(u8 address,u8 command) //寫配置寄存器
- {
- CSN=0; //選中無線模塊
- SPI(0x20+address); //地址
- SPI(command); //命令
- CSN=1; //停止操作
- }
- void FIFO_read(u8 DATA_IN[]) //讀取接收數據緩沖區
- {
- CSN=0;
- SPI(0x61); //讀取命令
- DATA_IN[0]=SPI(0); //讀取數據
- DATA_IN[1]=SPI(0);
- DATA_IN[2]=SPI(0);
- DATA_IN[3]=SPI(0);
- DATA_IN[4]=SPI(0);
- DATA_IN[5]=SPI(0);
- CSN=1;
- }
- void FIFO_write(u8 DATA_OUT[])
- {
- CSN=0;
- SPI(0xa0);
- SPI(DATA_OUT[0]);
- SPI(DATA_OUT[1]);
- SPI(DATA_OUT[2]);
- SPI(DATA_OUT[3]);
- SPI(DATA_OUT[4]);
- SPI(DATA_OUT[5]);
- CSN=1;
- }
- void NRF_init()
- {
- CE=0; //先關閉模塊,才能寫命令寄存器
- SCK=0;
-
- REG_write(0x01,0x00); //不允許自動應答
- REG_write(0x02,0x01); //使用P0信道通信,使用默認地址
- REG_write(0x04,0x00); //不允許自動應答
- REG_write(0x05,66); //使用第64頻道,總計128頻道,可自定義
- REG_write(0x06,0x27); //250kbps,0dBm
- REG_write(0x11,6);//每次信號6字節數據
- CE=1;
- }
- void RX_mode()
- {
- CE=0; //先關閉模塊,才能寫命令寄存器
- REG_write(0x00,0x3b); //CRC,8 bit,Power on,RX
- CE=1;
- }
- void TX_mode()
- {
- CE=0;
- REG_write(0x00,0x0a);
- CE=1;
- }
- main()
- {
- delay(100);
- init1602();
- NRF_init();
- TX_mode();
- write_com(0x80);
- for(i=0;i<16;i++)
- {
- write_data(table1[i]);
- }
- delay(50000);
- FIFO_write(tx);
- IP=0x08; //T1優先級
- star=1;MAX=70;MIN=40;tx[2]=MIN;mode=1;
- TR1=1;
- TR0=1;
- IE=0x8a;
- while(1);
- }
- void ET0_isr()interrupt 1
- {
- TL0 = 0xB0; //設置定時初值50ms
- TH0 = 0x3C;
- n++;
- if(n==1)
- {
- TX_mode();
- FIFO_write(tx);
- delay(100);
- RX_mode();
- }
- else if(n==10) //200ms
- {
- n=0;
- lose=0;
- if(IRQ==0)
- {
- FIFO_read(rx); //讀取接收數據
- CE=0;
- REG_write(0x07,0x40); //清除無線模塊中斷信號
- CE=1;
- }
- else lose=1;
-
- x=100-MIN;
- y=100-MAX;
- if(height>x||height<y||lose)buzzer=0;
- else buzzer=1;
-
- if(key1_press)
- {
- key1_press=0;
- menu++;
- if(menu>2)menu=0;
- star=1;
- }
- if(key4_press)
- {
- key4_press=0;
-
- if(mode)mode=0,tx[5]=0x55;
- else mode=1,tx[5]=0;
- }
-
- if(menu==0)
- {
-
- star=0;
- write_com(0x80);
- if(lose)
- {
- for(i=0;i<16;i++)
- {
- write_data(table5[i]);
- }
- }
- else
- { for(i=0;i<16;i++)
- {
- write_data(table3[i]);
- }
-
- }
-
-
-
- write_com(0x80+0x40);
-
- write_data('H');
- write_data('e');
- write_data('i');
- write_data('g');
- write_data('h');
- write_data('t');
- write_data(':');
-
- H=rx[0];
- if(H>90)H=90;
- height=100-H;
- if(height<100)write_data(' ');
- else write_data(height/100+48);
- write_data(height%100/10+48);
- write_data(height%10+48);
- write_data('m');
- write_data(' ');
- if(mode)
- {
- write_data('A');
- write_data('u');
- write_data('t');
- write_data('o');
- }
- else
- {
- write_data('P');
- write_data('u');
- write_data('m');
- write_data('p');
- }
- write_data((u8)mode+48);
- }
- else if(menu==1)
- {
- if(star)
- {
- star=0;
- write_com(0x80);
-
- for(i=0;i<16;i++)
- {
- write_data(table2[i]);
- }
- }
-
- write_com(0x80+0x40);
- if(key2_press) //調整最大值
- {
- key2_press=0;
- MIN++;
- }
- if(key3_press)
- {
- key3_press=0;
- MIN--;
- }
-
- tx[2]=MIN;
-
- write_data('<');
- write_data('=');
- write_data(x%100/10+48);
- write_data(x%10+48);
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
-
-
- }
- else if(menu==2)
- {
- if(star)
- {
- star=0;
- write_com(0x80);
- for(i=0;i<16;i++)
- {
- write_data(table4[i]);
- }
- }
-
- write_com(0x80+0x40);
- if(key2_press) //調整角度最大值
- {
- key2_press=0;
- MAX++;
- }
- if(key3_press)
- {
- key3_press=0;
- MAX--;
- }
-
- write_data('>');
- write_data('=');
- write_data(y%100/10+48);
- write_data(y%10+48);
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
- write_data(' ');
-
-
- }
-
- }
-
- }
- void ET1_isr()interrupt 3
- {
- TL1 = 0xf0; //設置定時初值10ms
- TH1 = 0xd8;
-
-
-
- if(key1) //按鍵檢測
- {
- if(s1)
- {
- s1=0;
- key1_press=1;
- }
- }
- else s1=1;
-
- if(key2)
- {
- if(s2)
- {
- s2=0;
- key2_press=1;
- }
- }
- else s2=1;
- if(key3)
- {
- if(s3)
- {
- s3=0;
- key3_press=1;
- }
- }
- else s3=1;
- if(key4)
- {
- if(s4)
- {
- s4=0;
- key4_press=1;
- }
- }
- else s4=1;
- }
- 控制電路程序
- #include <reg51.h>
- #include <intrins.h>
- #define u8 unsigned char
- #define u16 unsigned int
- sbit trig=P1^7;
- sbit echo=P1^6;
- sbit relay= P1^0; //繼電器
- u8 height,MIN,n;
- sbit MDO=P2^3;
- sbit SCK=P2^4;
- sbit CE=P2^5;
- sbit IRQ=P2^2;
- sbit MDI=P2^1;
- sbit CSN=P2^0;
- u8 i;
- u8 tx[6],rx[6];
- u8 last,t,fast;
- u16 h;
- void Delay15us() //@12.000MHz
- {
- unsigned char i;
- i = 5;
- while (--i);
- }
- void delay(u16 i)
- {
- while(i--)
- Delay15us();
- }
- u8 SPI(u8 byte) //以下為無線模塊的控制程序,比較復雜。SPI模擬程序
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- MDI=(byte&0x80);//單片機輸出最高位數據
- SCK=1; //時鐘信號的上升沿后無線模塊讀取新數據
- byte<<=1; //數據左移
- byte|=MDO; //單片機讀取數據
- SCK=0; //時鐘信號的下降沿后無線模塊輸出新數據
- }
- return byte;
- }
- void REG_write(u8 address,u8 command) //寫配置寄存器
- {
- CSN=0; //選中無線模塊
- SPI(0x20+address); //地址
- SPI(command); //命令
- CSN=1; //停止操作
- }
- void FIFO_read(u8 DATA_IN[]) //讀取接收數據緩沖區
- {
- CSN=0;
- SPI(0x61); //讀取命令
- DATA_IN[0]=SPI(0); //讀取數據
- DATA_IN[1]=SPI(0);
- DATA_IN[2]=SPI(0);
- DATA_IN[3]=SPI(0);
- DATA_IN[4]=SPI(0);
- DATA_IN[5]=SPI(0);
- CSN=1;
- }
- void FIFO_write(u8 DATA_OUT[])
- {
- CSN=0;
- SPI(0xa0);
- SPI(DATA_OUT[0]);
- SPI(DATA_OUT[1]);
- SPI(DATA_OUT[2]);
- SPI(DATA_OUT[3]);
- SPI(DATA_OUT[4]);
- SPI(DATA_OUT[5]);
- CSN=1;
- }
- void NRF_init()
- {
- CE=0; //先關閉模塊,才能寫命令寄存器
- SCK=0;
-
- REG_write(0x01,0x00); //不允許自動應答
- REG_write(0x02,0x01); //使用P0信道通信,使用默認地址
- REG_write(0x04,0x00); //不允許自動應答
- REG_write(0x05,66); //使用第64頻道,總計128頻道,可自定義
- REG_write(0x06,0x27); //250kbps,0dBm
- REG_write(0x11,6);//每次信號6字節數據
- CE=1;
- }
- void RX_mode()
- {
- CE=0; //先關閉模塊,才能寫命令寄存器
- REG_write(0x00,0x3b); //CRC,8 bit,Power on,RX
- CE=1;
- }
- void TX_mode()
- {
- CE=0;
- REG_write(0x00,0x0a);
- CE=1;
- }
- main()
- {
- delay(100);
- NRF_init();
- RX_mode();
- MIN=40;
- TMOD=0x01;
- IE=0x82;
- TR0=1;
- while(1)
- {
-
- }
- }
- void ET0_isr()interrupt 1
- {
- TL0 = 0xB0; //設置定時初值50ms
- TH0 = 0x3C;
-
- if(IRQ==0)
- {
- FIFO_read(rx); //讀取接收數據
- CE=0;
- REG_write(0x07,0x40); //清除無線模塊中斷信號
- CE=1;
- MIN=rx[2];
- TX_mode();
- FIFO_write(tx);
- delay(100);
- RX_mode();
- }
- /*
-
- */
- n++;
- trig=1;
- delay(30);
- trig=0;
- height=0;
- while(!echo);
- while(echo)
- {
- height++;
- if(height>250)break;
- }
- h+=height;
- if(n==10)
- {
- n=0;
- h=h/10;
- tx[0]=h;
-
-
- t++;
- if(t>4)
- {
- t=0;
- if(h-15<MIN)
- {
-
- if(last-MIN>15)fast=1;
- else fast=0;
- last=MIN;
- }
- else fast=0,last=MIN+15;
-
- }
-
- if(h<MIN||rx[5]==0x55||fast)
- {
- relay=0;
- }
- else relay=1;
- h=0;
- }
- }
復制代碼
|
-
-
程序.docx
2018-5-13 11:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
22.4 KB, 下載次數: 6, 下載積分: 黑幣 -5
|