nrf24l01芯片做的單片機無線輸液監測系統的全部資料分享給大家
程序和原理圖
0.png (43.04 KB, 下載次數: 44)
下載附件
2017-8-7 23:28 上傳
0.png (6.4 KB, 下載次數: 45)
下載附件
2017-8-7 23:29 上傳
0.png (64 KB, 下載次數: 48)
下載附件
2017-8-7 23:28 上傳
0.png (62.56 KB, 下載次數: 56)
下載附件
2017-8-7 23:28 上傳
所有資料51hei提供下載:
程序和原理圖.zip
(440.51 KB, 下載次數: 69)
2017-8-7 22:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
單片機源程序如下:
- /*-----------------------------------------------
- 名稱:外部中斷0電平觸發
- 內容:通過中斷接口P3.2連接的獨立按鍵測試,按一次P1口的LED燈反向,
- 這里使用電平觸發,所以一直按鍵不松開和一次按鍵效果不相同,按下會看到燈全部亮
- 說明中斷一直在作用,用示波器看則是高頻方波
- ------------------------------------------------*/
- #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include <intrins.h>
- #include "nrf24l01.h"
- typedef bit BOOL ;//用BOOL代替bit
- sbit rs = P3^7; //復位端
- sbit rw = P3^6; //寫數據端
- sbit ep = P3^5; //使能端
- sbit led = P1^6;
- uchar cisu = 0;
- uchar code dis1[] = {"NO1"};
- uchar code dis3[] = {'0','1','2','3','4','5','6','7','8','9'};
- uchar code dis2[] = {"count:"};
- int count = -1;
- bit flag = 0,t0_flag = 0;
- uchar shuju = 0;
- uint time_count = 0;
- void display_1602(void);
- void delay(uchar ms)
- {
- uchar i;
- while(ms--)
- {
- for(i = 0; i< 250; i++)
- {
- _nop_();
- _nop_(); //空執行消耗CPU時間達到等待的效果
- _nop_();
- _nop_();
- }
- }
- }
- /*******************LCD側忙函數********************/
- BOOL lcd_bz()
- {
- BOOL result;
- rs = 0;
- rw = 1;
- ep = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result = (BOOL)(P0 & 0x80); //檢測P0最高位是否為1
- ep = 0;
- return result;//返回側忙結果
- }
- void lcd_wcmd(uchar cmd)
- { // 寫入指令數據到LCD
- while(lcd_bz());
- rs = 0;
- rw = 0;
- ep = 0;
- _nop_();
- _nop_();
- P2 = cmd; //將8位指令通過P0口傳給1602
- _nop_();
- _nop_();//用于產生一個脈沖寬度
- _nop_();
- _nop_();
- ep = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- ep = 0;
- }
- void lcd_pos(uchar pos)
- {
- lcd_wcmd(pos | 0x80);
- }
- void lcd_wdat(uchar dat)
- { //寫入字符顯示數據到LCD
- while(lcd_bz());
- rs = 1;
- rw = 0;
- ep = 0;
- P2 = dat;//將8位數據通過P0口傳給1602
- _nop_();
- _nop_();
- _nop_(); //用于產生一個脈沖寬度
- _nop_();
- ep = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- ep = 0;
- }
- void lcd_init()
- {
- lcd_wcmd(0x38); ////16*2顯示,5*7點陣,8位數據
- delay(1);
- lcd_wcmd(0x0c); //顯示開,關光標
- delay(1);
- lcd_wcmd(0x06); //移動光標
- delay(1);
- lcd_wcmd(0x01); //清除LCD的顯示內容
- delay(1);
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
- TH0=(65535- 50000)/256; //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
- TL0=(65535- 50000)%256;
- ET0=1; //定時器中斷打開
- // TR0=1; //定時器開關打開
- EA=1; //全局中斷開
- EX0=1; //外部中斷0開
- IT0=1; //邊緣
- }
- void main(void)
- {
- uchar tx_buf[4]={0x00,0x00,0x00,0x00};//必須是4位數組
- uchar i,ge,shi,bai;
- led = 1;
- NRF24L01Int();
- lcd_init(); //初始化LCD
- Init_Timer0();
- lcd_pos(0X00); //設置顯示位置為第一行的第5個字符
- i = 0;
- while(dis1[i] != '\0')
- { //顯示字符"welcome!"
- lcd_wdat(dis1[i]);
- i++;
- }
- delay(100);
- lcd_pos(0x40); //設置顯示位置為第二行第0個字符
- i = 0;
- while(dis2[i] != '\0')
- {
- lcd_wdat(dis2[i]); //顯示字符" www*PRECHIN*com "
- i++;
- }
- // while(1)
- // {
- // NRFSetTxMode(tx_buf);
- // while (CheckACK());
- // }
- while(1)
- {
-
- if(flag == 1)
- {
- // ge = (shuju)/2%10;
- // shi = (shuju)/2/10%10;
- // bai = (shuju)/2/100;
- // tx_buf[0] = bai;
- // tx_buf[1] = shi;
- // tx_buf[2] = ge;
-
- ge = (shuju)/2%10;//進行數據處理
- shi = (shuju)/2/10%10;//進行數據處理
- bai = (shuju)/2/100;//進行數據處理
- tx_buf[0] = shuju/2;//進行數據處理
- tx_buf[1] = shuju/2;//進行數據處理
- tx_buf[2] = 0x01;//從機編號
- tx_buf[3] = cisu++;//計發送次數
- /* 數據發送6次 防止有數據丟失 */
- NRFSetTxMode(tx_buf);
- while (CheckACK());
- delay(1);
- NRFSetTxMode(tx_buf);
- while (CheckACK());
- delay(1);
- NRFSetTxMode(tx_buf);
- while (CheckACK());
- delay(1);
- NRFSetTxMode(tx_buf);
- while (CheckACK());
- delay(1);
- NRFSetTxMode(tx_buf);
- while (CheckACK());
- delay(1);
- NRFSetTxMode(tx_buf);
- while (CheckACK());
- delay(1);
- /*進行液晶屏顯示部分設置*/
- lcd_pos(0x48);
- lcd_wdat(dis3[ge]);
- lcd_pos(0x47);
- lcd_wdat(dis3[shi]);
- lcd_pos(0x46);
- lcd_wdat(dis3[bai]);
- /*LED燈的控制部分*/
- led = 0;
- delay(200);
- led = 1;
- delay(200);
- led = 0;
- delay(200);
- led = 1;
- EA = 1;
- flag = 0;
- t0_flag = 0;
- }
- // if((count>=0)&&(count % 2 == 0))
- // {
- // ge = (count)/2%10;
- // shi = (count)/2/10%10;
- // bai = (count)/2/100;
- // lcd_pos(0x48);
- // lcd_wdat(dis3[ge]);
- // lcd_pos(0x47);
- // lcd_wdat(dis3[shi]);
- // lcd_pos(0x46);
- // lcd_wdat(dis3[bai]);
- // }
- }
- }
- /*------------------------------------------------
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
|