找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2346|回复: 1
打印 上一主题 下一主题
收起左侧

nrf24l01无线输液监测系统 单片机程序与原理图

[复制链接]
跳转到指定楼层
楼主
nrf24l01芯片做的单片机无线输液监测系统的全部资料分享给大家
程序和原理图




所有资料51hei提供下载:
程序和原理图.zip (440.51 KB, 下载次数: 69)



单片机源程序如下:
  1. /*-----------------------------------------------
  2.   名称:外部中断0电平触发
  3.   内容:通过中断接口P3.2连接的独立按键测试,按一次P1口的LED灯反向,
  4.         这里使用电平触发,所以一直按键不松开和一次按键效果不相同,按下会看到灯全部亮
  5.                 说明中断一直在作用,用示波器看则是高频方波
  6. ------------------------------------------------*/
  7. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  8. #include <intrins.h>
  9. #include "nrf24l01.h"
  10. typedef bit BOOL ;//用BOOL代替bit
  11. sbit rs        = P3^7; //复位端
  12. sbit rw = P3^6; //写数据端
  13. sbit ep = P3^5;        //使能端
  14. sbit led = P1^6;
  15. uchar cisu = 0;
  16. uchar code dis1[] = {"NO1"};
  17. uchar code dis3[] = {'0','1','2','3','4','5','6','7','8','9'};
  18. uchar code dis2[] = {"count:"};
  19. int count = -1;
  20. bit flag = 0,t0_flag = 0;
  21. uchar shuju = 0;
  22. uint time_count = 0;
  23. void display_1602(void);
  24. void delay(uchar ms)
  25. {                                                       
  26.         uchar i;
  27.         while(ms--)
  28.         {
  29.                 for(i = 0; i< 250; i++)
  30.                 {
  31.                         _nop_();
  32.                         _nop_(); //空执行消耗CPU时间达到等待的效果
  33.                         _nop_();
  34.                         _nop_();
  35.                 }
  36.         }
  37. }

  38. /*******************LCD侧忙函数********************/
  39. BOOL lcd_bz()
  40. {                                               
  41.         BOOL result;
  42.         rs = 0;
  43.         rw = 1;
  44.         ep = 1;
  45.         _nop_();
  46.         _nop_();
  47.         _nop_();
  48.         _nop_();
  49.         result = (BOOL)(P0 & 0x80); //检测P0最高位是否为1
  50.         ep = 0;
  51.         return result;//返回侧忙结果       
  52. }

  53. void lcd_wcmd(uchar cmd)
  54. {                                                        // 写入指令数据到LCD
  55.         while(lcd_bz());
  56.         rs = 0;
  57.         rw = 0;
  58.         ep = 0;
  59.         _nop_();
  60.         _nop_();       
  61.         P2 = cmd; //将8位指令通过P0口传给1602
  62.         _nop_();
  63.         _nop_();//用于产生一个脉冲宽度
  64.         _nop_();
  65.         _nop_();
  66.         ep = 1;
  67.         _nop_();
  68.         _nop_();
  69.         _nop_();
  70.         _nop_();
  71.         ep = 0;               
  72. }

  73. void lcd_pos(uchar pos)
  74. {                                               
  75.         lcd_wcmd(pos | 0x80);
  76. }

  77. void lcd_wdat(uchar dat)       
  78. {                                                        //写入字符显示数据到LCD
  79.         while(lcd_bz());
  80.         rs = 1;
  81.         rw = 0;
  82.         ep = 0;
  83.         P2 = dat;//将8位数据通过P0口传给1602
  84.         _nop_();
  85.         _nop_();
  86.         _nop_(); //用于产生一个脉冲宽度
  87.         _nop_();
  88.         ep = 1;
  89.         _nop_();
  90.         _nop_();
  91.         _nop_();
  92.         _nop_();
  93.         ep = 0;       
  94. }

  95. void lcd_init()
  96. {       
  97.         lcd_wcmd(0x38);          ////16*2显示,5*7点阵,8位数据
  98.         delay(1);
  99.         lcd_wcmd(0x0c);          //显示开,关光标
  100.         delay(1);
  101.         lcd_wcmd(0x06);          //移动光标
  102.         delay(1);
  103.         lcd_wcmd(0x01);          //清除LCD的显示内容
  104.         delay(1);
  105. }
  106. void Init_Timer0(void)
  107. {
  108. TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  109. TH0=(65535- 50000)/256;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
  110. TL0=(65535- 50000)%256;
  111. ET0=1;           //定时器中断打开
  112. //  TR0=1;           //定时器开关打开
  113.         EA=1;          //全局中断开
  114.   EX0=1;         //外部中断0开
  115.   IT0=1;         //边缘
  116. }
  117. void main(void)
  118. {       
  119.   uchar tx_buf[4]={0x00,0x00,0x00,0x00};//必须是4位数组
  120.         uchar i,ge,shi,bai;
  121.   led = 1;
  122.         NRF24L01Int();
  123.         lcd_init();                                //初始化LCD       
  124.         Init_Timer0();
  125.         lcd_pos(0X00);                                //设置显示位置为第一行的第5个字符
  126.         i = 0;
  127.         while(dis1[i] != '\0')
  128.         {                                                //显示字符"welcome!"
  129.                 lcd_wdat(dis1[i]);
  130.                 i++;
  131.         }
  132.                  delay(100);
  133.                 lcd_pos(0x40);                        //设置显示位置为第二行第0个字符
  134.         i = 0;
  135.         while(dis2[i] != '\0')
  136.         {
  137.                 lcd_wdat(dis2[i]);        //显示字符"  www*PRECHIN*com  "
  138.                 i++;
  139.         }
  140. //         while(1)
  141. //         {
  142. //                                          NRFSetTxMode(tx_buf);
  143. //                                  while (CheckACK());
  144. //         }
  145.   while(1)
  146.   {
  147.                
  148.                 if(flag == 1)
  149.                 {
  150. //                          ge = (shuju)/2%10;
  151. //                         shi = (shuju)/2/10%10;
  152. //             bai = (shuju)/2/100;
  153. //                         tx_buf[0] = bai;
  154. //                         tx_buf[1] = shi;
  155. //                         tx_buf[2] = ge;
  156.                        
  157.                   ge = (shuju)/2%10;//进行数据处理
  158.                         shi = (shuju)/2/10%10;//进行数据处理
  159.             bai = (shuju)/2/100;//进行数据处理
  160.                         tx_buf[0] = shuju/2;//进行数据处理
  161.                         tx_buf[1] = shuju/2;//进行数据处理
  162.                         tx_buf[2] = 0x01;//从机编号
  163.                         tx_buf[3] = cisu++;//计发送次数
  164.                         /* 数据发送6次 防止有数据丢失  */
  165.                                 NRFSetTxMode(tx_buf);
  166.                                 while (CheckACK());
  167.                           delay(1);
  168.                                 NRFSetTxMode(tx_buf);
  169.                                 while (CheckACK());
  170.                           delay(1);
  171.                                 NRFSetTxMode(tx_buf);
  172.                                 while (CheckACK());
  173.                           delay(1);
  174.                                 NRFSetTxMode(tx_buf);
  175.                                 while (CheckACK());
  176.                           delay(1);
  177.                                 NRFSetTxMode(tx_buf);
  178.                                 while (CheckACK());
  179.                           delay(1);
  180.                                 NRFSetTxMode(tx_buf);
  181.                                 while (CheckACK());
  182.                           delay(1);               
  183.                 /*进行液晶屏显示部分设置*/               
  184.                 lcd_pos(0x48);
  185.                 lcd_wdat(dis3[ge]);
  186.                 lcd_pos(0x47);
  187.                 lcd_wdat(dis3[shi]);
  188.                 lcd_pos(0x46);
  189.                 lcd_wdat(dis3[bai]);
  190.                 /*LED灯的控制部分*/
  191.                 led = 0;
  192.                  delay(200);       
  193.                                  led = 1;
  194.                  delay(200);
  195.                                  led = 0;
  196.                  delay(200);       
  197.                                  led = 1;
  198.                           EA = 1;
  199.                           flag = 0;
  200.                           t0_flag = 0;
  201.                 }
  202. //                 if((count>=0)&&(count % 2 == 0))
  203. //                 {
  204. //                         ge = (count)/2%10;
  205. //                         shi = (count)/2/10%10;
  206. //             bai = (count)/2/100;
  207. //                         lcd_pos(0x48);
  208. //                 lcd_wdat(dis3[ge]);
  209. //                 lcd_pos(0x47);
  210. //                 lcd_wdat(dis3[shi]);
  211. //                 lcd_pos(0x46);
  212. //                 lcd_wdat(dis3[bai]);
  213. //                 }                       
  214.   }
  215. }
  216. /*------------------------------------------------
  217. ……………………

  218. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-8-7 23:35 | 只看该作者
一对二数据中转
  1. /****************************************Copyright (c)****************************************************
  2. **                                       辽宁科技大学
  3. **                                    
  4. **                                         电子协会
  5. **
  6. **--------------File Info---------------------------------------------------------------------------------
  7. ** File Name:           main.c
  8. ** Last modified Date:
  9. ** Last Version:
  10. ** Description:         主函数
  11. **
  12. **--------------------------------------------------------------------------------------------------------
  13. ** Created By:          王恺
  14. ** Created date:        2013/03/28
  15. ** Version:             V1.0
  16. ** Descriptions:                 NRF24L01无线模块测试程序
  17. **                                                波特率:4800
  18. **--------------------------------------------------------------------------------------------------------
  19. ** Modified by:
  20. ** Modified date:
  21. ** Version:
  22. ** Description:
  23. **
  24. *********************************************************************************************************/


  25. /*********************************************************************************************************
  26.   包含头文件
  27. *********************************************************************************************************/
  28. #include "reg51.h"
  29. #include "intrins.h"
  30. #include "nrf24l01.h"
  31. #include "main.h"

  32.   bit no1 = 0,no2 = 0;
  33.   sbit key1 = P3^2;
  34.         unsigned char rx_buf1[4]={0x99,0x99,0x99,0x99};        //必须是4位数组
  35.         unsigned char rx_buf2[4]={0x99,0x99,0x99,0x99};        //必须是4位数组
  36.         unsigned char rx_buf[4]={0x00,0x00,0x00,0x00};        //必须是4位数组

  37. void UART_Send_Str(unsigned char *s);
  38. void SendByte(unsigned char dat);

  39. /*------------------------------------------------
  40.                     串口初始化
  41. ------------------------------------------------*/
  42. void UART_Init(void)
  43. {

  44.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  45.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  46.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
  47.     TR1   = 1;                  // TR1:  timer 1 打开                        
  48.     EA    = 1;                  //打开总中断
  49.    // ES    = 1;                  //打开串口中断
  50. }  
  51. void Delay10ms()                //@12.000MHz
  52. {
  53.         unsigned char i, j;

  54.         i = 117;
  55.         j = 184;
  56.         do
  57.         {
  58.                 while (--j);
  59.         } while (--i);
  60. }



  61. /*********************************************************************************************************
  62. ** Function name:       main
  63. ** Descriptions:        主函数(接收)
  64. ** input parameters:    无
  65. ** output parameters:   无
  66. ** Returned value:                无
  67. //*********************************************************************************************************/
  68. void main()
  69. {
  70.          
  71.         uchar number = 0,i = 1,j=0,k = 0;

  72.          uchar number1 = 0;
  73.    uchar data1[20] = {0};

  74.         NRF24L01Int();
  75.         UART_Init();
  76.         /*
  77.          *        接收
  78.          */
  79.         while (1)
  80.         {


  81.                         if(no1 == 0)
  82.                         {
  83.                           s_dizhi(0);//设置地址
  84.                                 NRF24L01Int();
  85.                 NRFSetRXMode();//设置为接收模式
  86.                 if (NRFRevDate(rx_buf))//开始接受数
  87.                   {       

  88.                           SendByte(65); //A
  89.                                 SendByte(70); //F
  90.                           SendByte(rx_buf[0]); //此为数据       
  91.                                 SendByte(rx_buf[1]); //此为数据       
  92.                                 SendByte(rx_buf[2]); //从机编码               
  93.                                 SendByte(rx_buf[3]);   //从机发送的次数       
  94.                                 SendByte(70); //F
  95.                           SendByte(65); //A
  96.                                 NRF24L01Int();//进行初始化并且切换地址扫描
  97. //                                 if(dizhi == 1)no1 = 1;
  98. //                                 if(dizhi == 2)no2 = 1;

  99.             }
  100.                         }
  101.                 if(no2 == 0)
  102.                         {
  103.                           s_dizhi(1);//设置地址
  104.                                 NRF24L01Int();
  105.                  NRFSetRXMode();//设置为接收模式
  106.                 if (NRFRevDate(rx_buf))//开始接受数
  107.                   {       
  108.                           SendByte(65); //A
  109.                                 SendByte(70); //F
  110.                           SendByte(rx_buf[0]);  //此为数据               
  111.                                 SendByte(rx_buf[1]);  //此为数据               
  112.                                 SendByte(rx_buf[2]);  //从机编码               
  113.                                 SendByte(rx_buf[3]);  //从机发送的次数       
  114.                                 SendByte(70); //F
  115.                           SendByte(65); //A
  116.         NRF24L01Int();
  117. //                                 if(dizhi == 1)no1 = 1;
  118. //                                 if(dizhi == 2)no2 = 1;

  119.             }
  120.                         }
  121.        
  122.         }
  123. }

  124.    void SendByte(unsigned char dat)
  125. {
  126. SBUF = dat;
  127. while(!TI);
  128.       TI = 0;
  129. }
  130. /*------------------------------------------------
  131.                     发送一个字符串
  132. ------------------------------------------------*/
  133. void UART_Send_Str(unsigned char *s)
  134. {
  135. while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
  136.   {
  137.   SendByte(*s);
  138.   s++;
  139.   }
  140. }
  141. /*------------------------------------------------
  142.                      串口中断程序
  143. ------------------------------------------------*/
  144. void UART_SER (void) interrupt 4 //串行中断服务程序
  145. {
  146.     unsigned char Temp;          //定义临时变量
  147.    
  148.    if(RI)                        //判断是接收中断产生
  149.      {
  150.           RI=0;                      //标志位清零
  151.           Temp=SBUF;                 //读入缓冲区的值
  152.           P1=Temp;                   //把值输出到P1口,用于观察
  153.       SBUF=Temp;                 //把接收到的值再发回电脑端
  154.          }
  155.    if(TI)                        //如果是发送标志位,清零
  156.      TI=0;
  157. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表