找回密码
 立即注册

QQ登录

只需一步,快速开始

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

实现将车位实时数据上传到云平台(通过BC95,平台是云透传)

[复制链接]
跳转到指定楼层
楼主
ID:373095 发表于 2020-4-8 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
  4. sbit beep = P1^4; //蜂鸣器IO口定义
  5. sbit hw_jin = P2^1;   //红外传感器IO口定义
  6. sbit hw_chu = P2^0;   //红外传感器IO口定义
  7. uchar menu_1;              //设置参数用
  8. int i,b,p,j,x;
  9. char xdata jssjs1[10];
  10. char receive_ser;     //串口接收到的数据
  11. char code str1[]="AT\r\n";          // 联机指令,返回"OK" ,4位
  12. char code str2[]="AT+NSOCR=DGRAM,17,10000,1\r\n";   // 创建UDP通信 Socket,27位         10000为本地端口号
  13. char code str3[]="AT+NSOST=0,115.29.240.46,6000,29,65703d3634344b57504c4d54345739453237352670773d313233343536\r\n";    //发送注册码,93位      
  14. char code str4[]="AT+NSORF=0,10\r\n";  // 将发送注册码之后云平台返回的数值OK从NB101模块中读取出来,清空NB101模块 ,15位  
  15. char code str5[]="AT+NSOST=0,115.29.240.46,6000,6,";    //发送数据到云平台,32位
  16. char str6[15];
  17. void yzsj();
  18. void Init_Serialport1(); //初始化串口程序
  19. void lianjie();   //发送联机指令
  20. void udp();  //发送创建udp通道
  21. void zcm();  //发送注册码
  22. void fadqzl();   //发送读取云平台返回数据指令(从NB101中)
  23. void Delay1ms(unsigned int y);        //延时程序,y为1000时延时1S
  24. void cwsj();
  25. uint num;  //计的数
  26. uint jin,chu;
  27. uchar set_num = 99; // 设置总的车位         
  28. sbit red   = P1^3;           //红色发光二极管定义
  29. sbit green = P1^5;           //绿色发光二极管定义
  30. /***********************1ms延时函数*****************************/
  31. void delay_1ms(uint q)
  32. {
  33.         uint i,j;
  34.         for(i=0;i<q;i++)
  35.                 for(j=0;j<120;j++);
  36. }
  37. sbit rs=P1^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  38. sbit rw=P1^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  39. sbit e =P1^2;         //片选信号   下降沿触发
  40. /********************************************************************
  41. * 名称 : delay_uint()
  42. * 功能 : 小延时。
  43. * 输入 : 无
  44. * 输出 : 无
  45. ***********************************************************************/
  46. void delay_uint(uint q)
  47. {
  48.         while(q--);
  49. }
  50. /********************************************************************
  51. * 名称 : write_com(uchar com)
  52. * 功能 : 1602命令函数
  53. * 输入 : 输入的命令值
  54. * 输出 : 无
  55. ***********************************************************************/
  56. void write_com(uchar com)
  57. {
  58.         e=0;
  59.         rs=0;
  60.         rw=0;
  61.         P0=com;
  62.         delay_uint(25);
  63.         e=1;
  64.         delay_uint(100);
  65.         e=0;
  66. }
  67. /********************************************************************
  68. * 名称 : write_data(uchar dat)
  69. * 功能 : 1602写数据函数
  70. * 输入 : 需要写入1602的数据
  71. * 输出 : 无
  72. ***********************************************************************/
  73. void write_data(uchar dat)
  74. {
  75.         e=0;
  76.         rs=1;
  77.         rw=0;
  78.         P0=dat;
  79.         delay_uint(25);
  80.         e=1;
  81.         delay_uint(100);
  82.         e=0;        
  83. }
  84. /***********************lcd1602上显示两位十进制数************************/
  85. void write_sfm4(uchar hang,uchar add,uint date)
  86. {
  87.         if(hang==1)   
  88.                 write_com(0x80+add);
  89.         else
  90.                 write_com(0x80+0x40+add);
  91.         write_data(0x30+date/1000%10);
  92.         write_data(0x30+date/100%10);
  93.         write_data(0x30+date/10%10);
  94.         write_data(0x30+date%10);        
  95. }
  96. /***********************lcd1602上显示这字符函数************************/
  97. void write_string(uchar hang,uchar add,uchar *p)
  98. {
  99.         if(hang == 1)   
  100.                 write_com(0x80+add);
  101.         else
  102.                 write_com(0x80+0x40+add);
  103.         while(1)                                                                                                                 
  104.         {
  105.                 if(*p == '\0')  break;
  106.                 write_data(*p);
  107.                 p++;
  108.         }        
  109. }
  110. /***********************lcd1602初始化设置************************/
  111. void init_1602()        //lcd1602初始化
  112. {
  113.         write_com(0x38);        
  114.         write_com(0x0c);
  115.         write_com(0x06);
  116.         delay_uint(1000);
  117.         write_string(1,0,"   SY:0000       ");        
  118.         write_string(2,0," J:0000  C:0000   ");        
  119.         write_sfm4(2,2,jin);  //显示进车数
  120.         write_sfm4(1,8,num);  //显示剩余车位
  121.         write_sfm4(2,12,chu);  //显示出车数
  122. }
  123. /********************独立按键程序*****************/
  124. uchar key_can;         //按键值
  125. void key()             //独立按键程序
  126. {
  127.         static uchar key_new;
  128.         key_can = 20;               //按键值还原
  129.         P3 |= 0xf0;
  130.         if((P3 & 0xf0) != 0xf0)                //按键按下
  131.         {
  132.                 delay_1ms(1);                     //按键消抖动
  133.                 if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
  134.                 {                                                //确认是按键按下
  135.                         key_new = 0;
  136.                         switch(P3 & 0xf0)
  137.                         {
  138.                                 case 0xd0: key_can = 3; break;           //得到k1键值
  139.                                 case 0xb0: key_can = 2; break;           //得到K2键值
  140.                                 case 0x70: key_can = 1; break;           //得到k3键值
  141.                         }
  142.                 }                        
  143.         }
  144.         else
  145.                 key_new = 1;        
  146. }
  147. /****************按键处理数码管显示函数***************/
  148. void key_with()
  149. {
  150.         if(key_can == 1)        //设置键
  151.         {
  152.                 menu_1 ++;
  153.                 if(menu_1 >= 2)
  154.                 {
  155.                         menu_1 = 0;
  156.                         init_1602();  //lcd1602初始化        
  157.                 }
  158.                 if(menu_1 == 1)                                 //初始化显示
  159.                 {
  160.                         write_string(1,0,"     SET Z       ");
  161.                         write_string(2,0,"                 ");
  162.                 }
  163.         }
  164.         if(menu_1 == 0)                           //倒计时器按键操作开始 暂停
  165.         {                 
  166.                 if(key_can == 2)  //清零
  167.                 {
  168.                         num = 0;
  169.                         jin = 0;
  170.                         chu = 0;
  171.                         num  = set_num - jin + chu;          //计算剩余车位
  172.                         write_sfm4(2,2,jin);  //显示进车数
  173.                         write_sfm4(1,8,num);  //显示剩余车数
  174.                         write_sfm4(2,12,chu);  //显示出车数
  175.                 }
  176.         }
  177.         if(menu_1 == 1)                                //设置倒计时器开始数
  178.         {
  179.                 if(key_can == 2)
  180.                 {
  181.                         set_num ++ ;                // 设置数加
  182.                         if(set_num > 99)
  183.                                 set_num = 99;        //最大加到99        
  184.                 }
  185.                 if(key_can == 3)
  186.                 {
  187.                         set_num -- ;                // 设置数减
  188.                         if(set_num <= 1)
  189.                                 set_num = 1;        //最大减到1
  190.                 }
  191.                 write_sfm4(2,5,set_num);  //显示设置车位数
  192.                 write_com(0x80+0x40+7);             //将光标移动到秒个位
  193.                 write_com(0x0f);                    //显示光标并且闪烁        
  194.         }
  195.         beep = 0;          //打开蜂鸣器
  196.         delay_1ms(50);
  197.         beep = 1;          //关闭蜂鸣器
  198.         
  199. }  
  200. /******************红外计数**********************/           
  201. void hw_jin_dis()        //红外计数
  202. {
  203.         if(hw_jin == 0)                //计数
  204.         {
  205.                 delay_1ms(1);                     //消抖动
  206.                 if(hw_jin == 0)
  207.                 {                                                //确认
  208.                         jin ++;
  209.                         if(jin >= 9999)
  210.                                 jin = 9999;
  211.                         num  = set_num - jin + chu;          //计算剩余车位
  212.                         write_sfm4(2,3,jin);  //显示进车数
  213.                         write_sfm4(1,7,num);  //显示剩余车位
  214.                         if(num == 0)                  //为0时报警
  215.                         {
  216.                                 beep = 0;
  217.                                 delay_1ms(200);
  218.                                 beep = 1;                                                
  219.                                 delay_1ms(200);
  220.                                 beep = 0;
  221.                                 delay_1ms(200);
  222.                                 beep = 1;                                                
  223.                                 delay_1ms(200);
  224.                                 beep = 0;
  225.                                 delay_1ms(200);
  226.                                 beep = 1;                                                
  227.                         }
  228.                 }                        
  229.         }
  230. }
  231. /******************红外计数**********************/           
  232. void hw_chu_dis()        //红外计数
  233. {
  234.         if(hw_chu == 0)                //计数
  235.         {
  236.                 delay_1ms(1);                     //消抖动
  237.                 if(hw_chu == 0)
  238.                 {                                                //确认
  239.                         chu ++;
  240.                         if(chu >= 9999)
  241.                                 chu = 9999;
  242.                         num  = set_num - jin + chu;          //计算剩余车位
  243.                         if(num>=99)
  244.                                 num=99;
  245.                         write_sfm4(2,11,chu);  //显示出车数
  246.                         write_sfm4(1,7,num);  //显示剩余车位
  247.                 }
  248.         }
  249. }
  250. uchar nnum;
  251. /******************主程序**********************/           
  252. void main()
  253. {
  254.         init_1602();        //lcd1602初始化
  255.         Init_Serialport1();        //串口初始化
  256.          x=1;
  257.          if(x==1) lianjie();   //发送联机指令
  258.          if(x==2) udp();  //发送创建udp通道
  259.          if(x==3) zcm();  //发送注册码
  260.         while(1)
  261.         {
  262.                 key();                           //按键扫描函数
  263.                 if(key_can < 10)        key_with();    //按键执行函数
  264.             hw_jin_dis();        //红外计数        
  265.                 hw_chu_dis();        //红外计数        
  266.                 if(num == 0)
  267.                 {
  268.                         red  = 0;  green = 1; //车位为0 红灯亮
  269.                 }else
  270.                 {
  271.                         red  = 1;  green = 0; //绿灯亮
  272.                 }
  273.                     str6[0]='5';
  274.                         str6[1]='3';        //存储 S
  275.                         str6[2]='5';
  276.                         str6[3]='9';        //存储 Y
  277.                         str6[4]='3';        
  278.                         str6[5]='a';        //存储 :

  279.                         str6[6]='3';
  280.                         str6[7]='0'+num/100;
  281.                         str6[8]='3';
  282.                         str6[9]='0'+num/10;
  283.                         str6[10]='3';
  284.                         str6[11]='0'+num%10;                        
  285.                         str6[12]='\r';        //存储\r
  286.                         str6[13]='\n';        //存储\n
  287.                                  
  288.            b=0;
  289.            p=0;
  290.            if(x==5) yzsj();           //发送数据
  291.            if(x==6) cwsj();    //发送车位数据
  292.            Init_Serialport1();
  293.            while(p!=0);                                                               
  294.                 delay_1ms(100);

  295.         }
  296. }
  297. void Init_Serialport1()  //初始化串口1(Serial port)
  298. {
  299. TMOD=0x20;
  300. PCON=0X00;                        //波特率不加倍
  301. TH1=0xFD;
  302. TL1=0xFD;
  303. TR1=1;
  304. SCON=0x50;
  305. EA=1;
  306. ES=1;
  307. }

  308. void Serial_port1() interrupt 4           //串口中断
  309. {           
  310.    if(RI==1)
  311.     {
  312.                 RI=0;
  313.                 receive_ser=SBUF;
  314.                                 jssjs1[b]=receive_ser;
  315.                                 b++;
  316.                                 if(b>=6)
  317.                                         {
  318.                                                 b=0;
  319.                                                  p=1;
  320.                                         }
  321.         }        
  322. }
  323. void lianjie()   //发送联机指令
  324. {
  325.    for(j=0;j<=3;j++)
  326.         {
  327.           SBUF=str1[j];
  328.              while(!TI);                                 //等待发送数据完成
  329.           TI=0;
  330.         }
  331.         x=2;                                 
  332.         delay_1ms(2000);
  333. }
  334. void udp()  //发送创建udp通道
  335. {
  336.          for(j=0;j<=26;j++)
  337.         {
  338.         SBUF=str2[j];
  339.         while(!TI);                                 //等待发送数据完成
  340.         TI=0;                 
  341.         }
  342.         x=3;                 
  343.          delay_1ms(2000);
  344. }
  345. void zcm()  //发送注册码
  346. {
  347.    for(j=0;j<=92;j++)
  348.         {
  349.         SBUF=str3[j];
  350.         while(!TI);                                 //等待发送数据完成
  351.         TI=0;                                 
  352.         }
  353.         x=5;
  354.         delay_1ms(2000);
  355. }
  356. void yzsj()        //发送数据“hello”到云平台
  357. {
  358.    for(j=0;j<=31;j++)
  359.         {
  360.         SBUF=str5[j];
  361.         while(!TI);                                 //等待发送数据完成
  362.         TI=0;
  363.         }
  364.         x=6;
  365. }
  366. void cwsj()   //发送车位数据
  367. {
  368.    for(j=0;j<=13;j++)
  369.         {
  370.         SBUF=str6[j];
  371.         while(!TI);                                 //等待发送数据完成
  372.         TI=0;
  373.         }
  374.         x=5;
  375. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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