找回密码
 立即注册

QQ登录

只需一步,快速开始

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

光电计数和蓝牙控制RGB的程序问题,急急急!!!

[复制链接]
跳转到指定楼层
楼主
ID:169944 发表于 2017-5-9 12:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我要写一个蓝牙控制RGB变色和两个光电传感器计数的程序
单个的模块可以实现,但是我在往一起合的时候,就不能了
而且发现功能会互相影响,求大神帮我改一下代码,说一下
思路,怎么才能两个同时运行,,很急..
  1.         #include <reg52.h>
  2.         #include <string.h>
  3.         #include <intrins.h>
  4.         
  5.         #define LCD1602_DB  P0
  6.         
  7.         unsigned char tmp;
  8.         unsigned int c=0;
  9.         unsigned char flag1s = 0;
  10.         unsigned char flag2s = 0;
  11.         unsigned char counter = 0;//jishu
  12.         unsigned char str[] = "COUNT: ";
  13.         sbit LCD1602_RS = P1^0;
  14.         sbit LCD1602_RW = P1^1;
  15.         sbit LCD1602_E = P1^5;
  16.         
  17.         sbit red   = P2^0;
  18.         sbit LED = P2^2;                                                                                                        
  19.         sbit red1 = P2^1;
  20.         
  21.         sbit RR = P3^5;
  22.         sbit GG = P3^6;
  23.         sbit BB = P3^7;
  24.         
  25.          int PWM_0 = 0;
  26.          int PWM_1 = 0;
  27.          int PWM_2 = 0;
  28.         
  29.         void InitLcd1602();
  30.         void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  31.         void itoa (unsigned int n,unsigned char s[5]);
  32.         void keepred();
  33.         
  34.         void init();   //串口初始化
  35.         void send(unsigned char a);        //单字节发送函数
  36.         void ctrl(); //接收处理函数
  37.         void color();
  38.         void keepPWM();
  39.         
  40.         void delay (unsigned char t) //延时
  41.         {
  42.             unsigned char i;
  43.             while(t--)
  44.             {
  45.                 for(i=0; i<114; i++);
  46.             }
  47.         }
  48.         
  49.         void main()
  50.         {
  51.                 unsigned int sec = 0, i=0, j = 0;        
  52.         
  53.                 unsigned char s[5] ;
  54.                 unsigned char x[6] = "none";
  55.                 init();        
  56.             red = 1;
  57.                 red1 = 1;
  58.                 TMOD = 0x21;
  59.                 TL0 = 0xC9;                //设置定时初值
  60.                 TH0 = 0xFF;               
  61.                 TR0 = 1;               
  62.                 ET0 = 1;
  63.                 ET1 = 1;
  64.                 EA = 1;
  65.                 InitLcd1602();
  66.                
  67.                 sec = 0;
  68.                 itoa(sec, s);
  69.                 LcdShowStr(8, 0, x);
  70.                 while(1)
  71.                 {        
  72.                         keepPWM();
  73.                         if(RI==1)                     // 是否有数据到来
  74.                       {   
  75.                  RI = 0;
  76.                  tmp = SBUF;
  77.                          ctrl();
  78.                           delay(5);                   // 暂存接收到的数据  
  79.                      }
  80.                                     
  81.                         else if(flag1s == 1 )                  
  82.                         {               
  83.                                 flag1s = 0;                        
  84.                                 sec++;        
  85.                         }
  86.                         else if(flag2s == 1 )                  
  87.                         {               
  88.                             flag2s = 0;        
  89.                                 if(sec > 0)
  90.                                  sec--;
  91.                         }
  92.                         else if(sec<=0)
  93.                         {
  94.                         sec = 0;
  95.                         
  96.                         LcdShowStr(8, 0, x);
  97.                         }
  98.                          else
  99.                         {
  100.                         
  101.                         itoa(sec, s);
  102.                         memset(s, '\0', 5);
  103.                         delay(50);
  104.                         
  105.                         }
  106.                         if(RI == 0)
  107.                         {
  108.                                 PWM_0 = PWM_0;
  109.                                 PWM_1 = PWM_1;
  110.                                 PWM_2 = PWM_2;
  111.                                 delay(5);
  112.                         }
  113.                         delay(5);                                
  114.                 }               
  115.         }

  116.         void LcdWaitReady()
  117.         {
  118.                 unsigned char sta;
  119.         
  120.                 LCD1602_DB = 0xFF;
  121.                 LCD1602_RS = 0;
  122.                 LCD1602_RW = 1;
  123.                 do        {
  124.                         LCD1602_E = 1;
  125.                         sta = LCD1602_DB;
  126.                         LCD1602_E = 0;
  127.                 }while(sta & 0x80);
  128.         }
  129.         void LcdWriteCmd(unsigned char cmd)
  130.         {
  131.                 LcdWaitReady();
  132.                 LCD1602_RS = 0;
  133.                 LCD1602_RW = 0;
  134.                 LCD1602_DB = cmd;
  135.                 LCD1602_E = 1;
  136.                 LCD1602_E = 0;
  137.         }
  138.         void LcdWriteDat(unsigned char dat)
  139.         {
  140.                 LcdWaitReady();
  141.                 LCD1602_RS = 1;
  142.                 LCD1602_RW = 0;
  143.                 LCD1602_DB = dat;
  144.                 LCD1602_E = 1;
  145.                 LCD1602_E = 0;
  146.         }
  147.         void LcdSetCursor(unsigned char x, unsigned char y)
  148.         {
  149.                 unsigned char addr;
  150.                 if(y == 0)
  151.                         addr = 0x00 + x;
  152.                 else
  153.                         addr = 0x40 + x;
  154.                 LcdWriteCmd(addr | 0x80);
  155.         }
  156.         void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
  157.         {
  158.                 LcdSetCursor(x, y);
  159.                 while(*str != '\0')
  160.                 {
  161.                         LcdWriteDat(*str++);   
  162.                 }
  163.         }
  164.         void InitLcd1602()
  165.         {
  166.                 LcdWriteCmd(0x38);
  167.                 LcdWriteCmd(0x0C);
  168.                 LcdWriteCmd(0x06);
  169.                 LcdWriteCmd(0x01);
  170.         }
  171.         void itoa (unsigned int n,unsigned char s[])
  172.         {
  173.             unsigned char temp;
  174.             unsigned int i = 0;
  175.             unsigned int len = 0;            
  176.             while(n != 0)
  177.             {
  178.                 s[i] = (n  % 10) + '0' ;//算出字符
  179.                 n = n / 10;
  180.                        i++;
  181.             }
  182.             s[i] = '\0';
  183.             len = strlen(s);
  184.             for(i = 0; i < len / 2; i++) //前后换顺序
  185.             {
  186.                 temp = s[i];
  187.                 s[i] = s[len - 1 - i];
  188.                 s[len - 1 - i] = temp;
  189.             }
  190.                 LcdShowStr(1, 0, str);
  191.                 LcdWriteCmd(0x01);
  192.                 LcdShowStr(1, 0, str);
  193.                 LcdShowStr(8, 0, s);
  194.                 s[0] = '\0';
  195.         }
  196.         void keepPWM()//保持输出
  197.         {
  198.                         if(PWM_0 <=0)
  199.                         PWM_0 =0;
  200.                         if(PWM_1 <=0)
  201.                         PWM_1 =0;
  202.                         if(PWM_2 <=0)
  203.                         PWM_2 =0;
  204.                         if(PWM_0 >=255)
  205.                         PWM_0 =255;
  206.                         if(PWM_1 >=255)
  207.                         PWM_1 =255;
  208.                         if(PWM_2 >=255)
  209.                         PWM_2 =255;
  210.         }
  211.         void init()        //串口初始化
  212.         {
  213.             ES=0;                                                                  //关中断
  214.             SCON = 0x50;                        // REN=1允许串行接受状态,串口工作模式1,
  215.             //10位UART(1位起始位,8位数据位,1位停止位,无奇偶校验),波特率可变
  216.         
  217.             TMOD = 0x20;                        // 定时器1工作于方式2,8位自动重载模式, 用于产生波特率
  218.             TH1=TL1=0xFD;                       // 波特率9600 (本次测试采用晶振为11.0592)
  219.         
  220.             PCON &= 0x7f;                       // 波特率不倍增
  221.             TR1 = 1;                                                          //定时器1开始工作,产生波特率
  222.             //发送标志位置0
  223.             TI=0;                                                                  //接收标志位置0
  224.             RI=0;
  225.             //EA=0;
  226.            ES=1;
  227.         }
  228.         
  229.         /*void send(unsigned char a)        //单字节数据发送
  230.         {
  231.             //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻
  232.             TI=0;
  233.             SBUF=a;
  234.             while(TI==0);
  235.             TI=0;
  236.             if(c%2)                                        //发送指示灯标志,每接收一次,此灯亮灭交替
  237.                 led=1;
  238.             else
  239.                 led=0;
  240.             c++;
  241.         }*/
  242.         
  243.         void ctrl()                            //接收处理函数
  244.         {
  245.                    switch(tmp)
  246.                     {
  247.                     case '1':           //白
  248.                 PWM_0 = 0;
  249.                         PWM_1 = 0;
  250.                         PWM_2 = 0;  
  251.                         LED = ~LED;
  252.                 break;
  253.                     case '2':                                       
  254.                 PWM_0 = 255-128;        //紫
  255.                         PWM_1 = 255;
  256.                         PWM_2 = 255-128;
  257.                         LED = ~LED;
  258.                 break;
  259.                            case '3':                                   
  260.                 PWM_0 = 255;        //蓝色
  261.                         PWM_1 = 255;
  262.                         PWM_2 = 0;
  263.                         LED = ~LED;
  264.                 break;
  265.                     case '4':                                       
  266.                 PWM_0 = 30;        // 浅蓝
  267.                         PWM_1 = 100;
  268.                         PWM_2 = 255;
  269.                         LED = ~LED;
  270.                 break;
  271.                     case '5':                                       
  272.                 PWM_0 = 255-33;        //        灰
  273.                         PWM_1 = 255-33;
  274.                         PWM_2 = 255-33;
  275.                         LED = ~LED;
  276.                 break;
  277.                         case '6':                                       
  278.                 PWM_0 = 254;        //        mie
  279.                         PWM_1 = 254;
  280.                         PWM_2 = 254;
  281.                         LED = ~LED;
  282.                 break;
  283.                         case 'a':
  284.                         PWM_0=PWM_0+5;        //        jiaqiang
  285.                         PWM_1=PWM_1+5;
  286.                         PWM_2=PWM_2+5;
  287.                         break;
  288.                         case 'b':
  289.                         PWM_0=PWM_0-5;        //  jianruo
  290.                         PWM_1=PWM_1-5;
  291.                         PWM_2=PWM_2-5;
  292.                         keepPWM();
  293.                         break;
  294.                         case 'c':           //shanshuo
  295.                         
  296.                         color();
  297.                         LED = ~LED;
  298.                         break;
  299.                     default:                   //其他,灯全灭
  300.                 PWM_0 = 0;        //hei
  301.                         PWM_1 = 0;
  302.                         PWM_2 = 0;
  303.                // send(tmp);
  304.                    break;
  305.                    }delay(5);        
  306.         }
  307.         void color()
  308.         {                                                           //随机颜色
  309.              while(RI==0)
  310.                 {
  311.                 PWM_0 = rand()%255;
  312.                 delay(2);
  313.                 PWM_1 = rand()%255;
  314.                 delay(2);
  315.                 PWM_2 = rand()%255;
  316.                 delay(2);
  317.                 }
  318.         }
  319.         
  320.         void InterruptTimer0() interrupt 1
  321.         {
  322.             TH0 = 0xFC;
  323.                 TL0 = 0x67;
  324.                
  325.            if (red == 0&&red1==1)                             //两个光电判断人进出
  326.             {
  327.                 delay(99);
  328.                         if(red1==0)
  329.                 flag1s = 1;
  330.             }
  331.             if (red1 == 0&&red == 1)  
  332.             {
  333.                 delay(99);
  334.                         if(red == 0)
  335.                flag2s = 1;
  336.             }
  337.                
  338.                 counter++;
  339.                         if(counter >= 255) counter = 0;                                   //三路pWM输出
  340.                     if(counter >= PWM_0) RR = 0; else RR = 1;
  341.                     if(counter >= PWM_1) GG = 0; else GG = 1;
  342.                     if(counter >= PWM_2) BB = 0; else BB = 1;        
  343.         }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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