找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3169|回復(fù): 0
收起左側(cè)

光電計(jì)數(shù)和藍(lán)牙控制RGB的程序問題,急急急!!

[復(fù)制鏈接]
ID:169944 發(fā)表于 2017-5-9 12:14 | 顯示全部樓層 |閱讀模式
我要寫一個(gè)藍(lán)牙控制RGB變色和兩個(gè)光電傳感器計(jì)數(shù)的程序
單個(gè)的模塊可以實(shí)現(xiàn),但是我在往一起合的時(shí)候,就不能了
而且發(fā)現(xiàn)功能會(huì)互相影響,求大神幫我改一下代碼,說一下
思路,怎么才能兩個(gè)同時(shí)運(yùn)行,,很急..
  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);        //單字節(jié)發(fā)送函數(shù)
  36.         void ctrl(); //接收處理函數(shù)
  37.         void color();
  38.         void keepPWM();
  39.         
  40.         void delay (unsigned char t) //延時(shí)
  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;                //設(shè)置定時(shí)初值
  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)                     // 是否有數(shù)據(jù)到來
  74.                       {   
  75.                  RI = 0;
  76.                  tmp = SBUF;
  77.                          ctrl();
  78.                           delay(5);                   // 暫存接收到的數(shù)據(jù)  
  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;                                                                  //關(guān)中斷
  214.             SCON = 0x50;                        // REN=1允許串行接受狀態(tài),串口工作模式1,
  215.             //10位UART(1位起始位,8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn)),波特率可變
  216.         
  217.             TMOD = 0x20;                        // 定時(shí)器1工作于方式2,8位自動(dòng)重載模式, 用于產(chǎn)生波特率
  218.             TH1=TL1=0xFD;                       // 波特率9600 (本次測試采用晶振為11.0592)
  219.         
  220.             PCON &= 0x7f;                       // 波特率不倍增
  221.             TR1 = 1;                                                          //定時(shí)器1開始工作,產(chǎn)生波特率
  222.             //發(fā)送標(biāo)志位置0
  223.             TI=0;                                                                  //接收標(biāo)志位置0
  224.             RI=0;
  225.             //EA=0;
  226.            ES=1;
  227.         }
  228.         
  229.         /*void send(unsigned char a)        //單字節(jié)數(shù)據(jù)發(fā)送
  230.         {
  231.             //注意:若單片機(jī)TXD(P3.1)無上拉能力,必須在P3.1端接上拉電阻。本次測試需要接上拉電阻
  232.             TI=0;
  233.             SBUF=a;
  234.             while(TI==0);
  235.             TI=0;
  236.             if(c%2)                                        //發(fā)送指示燈標(biāo)志,每接收一次,此燈亮滅交替
  237.                 led=1;
  238.             else
  239.                 led=0;
  240.             c++;
  241.         }*/
  242.         
  243.         void ctrl()                            //接收處理函數(shù)
  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;        //藍(lán)色
  261.                         PWM_1 = 255;
  262.                         PWM_2 = 0;
  263.                         LED = ~LED;
  264.                 break;
  265.                     case '4':                                       
  266.                 PWM_0 = 30;        // 淺藍(lán)
  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.         {                                                           //隨機(jī)顏色
  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)                             //兩個(gè)光電判斷人進(jìn)出
  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.         }
復(fù)制代碼


相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表