标题: 求助,两个单片机定时器之间的冲突问题 [打印本页]

作者: zha    时间: 2017-5-2 20:56
标题: 求助,两个单片机定时器之间的冲突问题
用一个光电传感器计数,还有蓝牙控制RGB灯的颜色,两个代码合在一起,分开代码都能用,合起来之后发现蓝牙这部分呢收不到数据,自己觉得是两个定时器之间存在冲突,
求教哪里出了问题!!!!

代码如下    大神帮指点下
[code]

作者: zha    时间: 2017-5-2 21:05
  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.         sbit red   = P2^0;
  17.         sbit LED = P2^2;                                                                                                       
  18.         sbit red1 = P2^1;
  19.        
  20.         sbit RR = P3^5;
  21.         sbit GG = P3^6;
  22.         sbit BB = P3^7;
  23.        
  24.          int PWM_0 = 0;
  25.          int PWM_1 = 0;
  26.          int PWM_2 = 0;
  27.        
  28.         void InitLcd1602();
  29.         void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  30.         void itoa (unsigned int n,unsigned char s[5]);
  31.         void keepred();
  32.        
  33.         void init();   //串口初始化
  34.         void send(unsigned char a);        //单字节发送函数
  35.         void ctrl(); //接收处理函数
  36.         void color();
  37.         void keepPWM();
  38.        
  39.         void delay (unsigned char t) //延时
  40.         {
  41.             unsigned char i;
  42.             while(t--)
  43.             {
  44.                 for(i=0; i<114; i++);
  45.             }
  46.         }
  47.        
  48.         void main()
  49.         {
  50.                 unsigned int sec = 0, i=0, j = 0;       
  51.        
  52.                 unsigned char s[5] ;
  53.                 unsigned char x[6] = "none";
  54.                 init();       
  55.             red = 1;
  56.                 red1 = 1;
  57.                 TMOD = 0x01;
  58.                 TL0 = 0xC9;                //设置定时初值
  59.                 TH0 = 0xFF;
  60.                
  61.                 TR0 = 1;
  62.                 TR1 = 1;
  63.                 EA = 1;
  64.                 ET0 = 1;
  65.                 InitLcd1602();
  66.                
  67.                 sec = 0;
  68.                 itoa(sec, s);
  69.                 LcdShowStr(8, 0, x);
  70.                 while(1)
  71.                 {       
  72.                
  73.                         if(RI==1)                     // 是否有数据到来
  74.                       {
  75.                           LED = 0;
  76.                  RI = 0;
  77.                  tmp = SBUF;
  78.                          ctrl();
  79.                           delay(5);                   // 暂存接收到的数据  
  80.                      }
  81.                         else
  82.                                 LED = 1;
  83.                         keepPWM();           
  84.                         if(flag1s == 1 )                  
  85.                         {
  86.                                        
  87.                                 flag1s = 0;                       
  88.                                 sec++;       
  89.                         }
  90.                         if(flag2s == 1 )                  
  91.                         {
  92.                                        
  93.                             flag2s = 0;       
  94.                                 if(sec > 0)
  95.                                  sec--;
  96.                         }
  97.                         if(sec<=0)
  98.                         {
  99.                         sec = 0;
  100.                         //LED = 0;
  101.                         LcdShowStr(8, 0, x);
  102.                         }
  103.                          else
  104.                         {
  105.                        
  106.                         itoa(sec, s);
  107.                         memset(s, '\0', 5);
  108.                         delay(50);
  109.                         
  110.                         }
  111.                         if(RI == 0)
  112.                         {
  113.                                 //LED = 1;
  114.                                 PWM_0 = PWM_0;
  115.                                 PWM_1 = PWM_1;
  116.                                 PWM_2 = PWM_2;
  117.                                 delay(5);
  118.                         }                               
  119.                 }               
  120.         }
  121.         void keepred()
  122.         {
  123.                
  124.         }
  125.         void LcdWaitReady()
  126.         {
  127.                 unsigned char sta;
  128.        
  129.                 LCD1602_DB = 0xFF;
  130.                 LCD1602_RS = 0;
  131.                 LCD1602_RW = 1;
  132.                 do        {
  133.                         LCD1602_E = 1;
  134.                         sta = LCD1602_DB;
  135.                         LCD1602_E = 0;
  136.                 }while(sta & 0x80);
  137.         }
  138.         void LcdWriteCmd(unsigned char cmd)
  139.         {
  140.                 LcdWaitReady();
  141.                 LCD1602_RS = 0;
  142.                 LCD1602_RW = 0;
  143.                 LCD1602_DB = cmd;
  144.                 LCD1602_E = 1;
  145.                 LCD1602_E = 0;
  146.         }
  147.         void LcdWriteDat(unsigned char dat)
  148.         {
  149.                 LcdWaitReady();
  150.                 LCD1602_RS = 1;
  151.                 LCD1602_RW = 0;
  152.                 LCD1602_DB = dat;
  153.                 LCD1602_E = 1;
  154.                 LCD1602_E = 0;
  155.         }
  156.         void LcdSetCursor(unsigned char x, unsigned char y)
  157.         {
  158.                 unsigned char addr;
  159.                 if(y == 0)
  160.                         addr = 0x00 + x;
  161.                 else
  162.                         addr = 0x40 + x;
  163.                 LcdWriteCmd(addr | 0x80);
  164.         }
  165.         void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
  166.         {
  167.                 LcdSetCursor(x, y);
  168.                 while(*str != '\0')
  169.                 {
  170.                         LcdWriteDat(*str++);   
  171.                 }
  172.         }
  173.         void InitLcd1602()
  174.         {
  175.                 LcdWriteCmd(0x38);
  176.                 LcdWriteCmd(0x0C);
  177.                 LcdWriteCmd(0x06);
  178.                 LcdWriteCmd(0x01);
  179.         }
  180.         void itoa (unsigned int n,unsigned char s[])
  181.         {
  182.             unsigned char temp;
  183.             unsigned int i = 0;
  184.             unsigned int len = 0;            
  185.             while(n != 0)
  186.             {
  187.                 s[i] = (n  % 10) + '0' ;//算出字符
  188.                 n = n / 10;
  189.                        i++;
  190.             }
  191.             s[i] = '\0';
  192.             len = strlen(s);
  193.             for(i = 0; i < len / 2; i++) //前后换顺序
  194.             {
  195.                 temp = s[i];
  196.                 s[i] = s[len - 1 - i];
  197.                 s[len - 1 - i] = temp;
  198.             }
  199.                 LcdShowStr(1, 0, str);
  200.                 LcdWriteCmd(0x01);
  201.                 LcdShowStr(1, 0, str);
  202.                 LcdShowStr(8, 0, s);
  203.                 s[0] = '\0';
  204.         }
  205.         void keepPWM()//保持输出
  206.         {
  207.                         if(PWM_0 <=0)
  208.                         PWM_0 =0;
  209.                         if(PWM_1 <=0)
  210.                         PWM_1 =0;
  211.                         if(PWM_2 <=0)
  212.                         PWM_2 =0;
  213.                         if(PWM_0 >=255)
  214.                         PWM_0 =255;
  215.                         if(PWM_1 >=255)
  216.                         PWM_1 =255;
  217.                         if(PWM_2 >=255)
  218.                         PWM_2 =255;
  219.                        
  220.                
  221.         }
  222.         void init()        //串口初始化
  223.         {
  224.             ES=0;                                                                  //关中断
  225.             SCON = 0x50;                        // REN=1允许串行接受状态,串口工作模式1,
  226.             //10位UART(1位起始位,8位数据位,1位停止位,无奇偶校验),波特率可变
  227.        
  228.             TMOD = 0x20;                        // 定时器1工作于方式2,8位自动重载模式, 用于产生波特率
  229.             TH1=TL1=0xFD;                       // 波特率9600 (本次测试采用晶振为11.0592)
  230.        
  231.             PCON &= 0x7f;                       // 波特率不倍增
  232.             TR1 = 1;                                                          //定时器1开始工作,产生波特率
  233.             //发送标志位置0
  234.             TI=0;                                                                  //接收标志位置0
  235.             RI=0;
  236.             //EA=0;
  237.             ES=1;
  238.         }
  239.        
  240.         /*void send(unsigned char a)        //单字节数据发送
  241.         {
  242.             //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻
  243.             TI=0;
  244.             SBUF=a;
  245.             while(TI==0);
  246.             TI=0;
  247.             if(c%2)                                        //发送指示灯标志,每接收一次,此灯亮灭交替
  248.                 led=1;
  249.             else
  250.                 led=0;
  251.             c++;
  252.         }*/
  253.        
  254.         void ctrl()                            //接收处理函数
  255.         {
  256.                    switch(tmp)
  257.                     {
  258.                     case '1':           //白
  259.                 PWM_0 = 0;
  260.                         PWM_1 = 0;
  261.                         PWM_2 = 0;  
  262.                         //delay(3000);                                 
  263.                 //send(tmp);
  264.                 break;
  265.                     case '2':                                       
  266.                 PWM_0 = 255-128;        //紫
  267.                         PWM_1 = 255;
  268.                         PWM_2 = 255-128;
  269.                         //delay(3000);
  270.                // send(tmp);
  271.                 break;
  272.                            case '3':                                   
  273.                 PWM_0 = 255;        //蓝色
  274.                         PWM_1 = 255;
  275.                         PWM_2 = 0;
  276.                         //delay(3000);
  277.                // send(tmp);
  278.                 break;
  279.                     case '4':                                       
  280.                 PWM_0 = 30;        // 浅蓝
  281.                         PWM_1 = 100;
  282.                         PWM_2 = 255;
  283.                         //delay(3000);
  284.               //  send(tmp);
  285.                 break;
  286.                     case '5':                                       
  287.                 PWM_0 = 255-33;        //        灰
  288.                         PWM_1 = 255-33;
  289.                         PWM_2 = 255-33;
  290.                         //delay(3000);
  291.               //  send(tmp);
  292.                 break;
  293.                         case '6':                                       
  294.                 PWM_0 = 254;        //        白
  295.                         PWM_1 = 254;
  296.                         PWM_2 = 254;
  297.                         //delay(3000);
  298.               //  send(tmp);
  299.                 break;
  300.                         case 'a':
  301.                         PWM_0=PWM_0+5;        //        jiaqiang
  302.                         PWM_1=PWM_1+5;
  303.                         PWM_2=PWM_2+5;
  304.                         break;
  305.                         case 'b':
  306.                         PWM_0=PWM_0-5;        //  jianruo
  307.                         PWM_1=PWM_1-5;
  308.                         PWM_2=PWM_2-5;
  309.                         keepPWM();
  310.                         break;
  311.                         case 'c':           //shanshuo
  312.                         color();
  313.                         break;
  314.                     default:                   //其他,灯全灭
  315.                 PWM_0 = 0;        //hei
  316.                         PWM_1 = 0;
  317.                         PWM_2 = 0;
  318.                // send(tmp);
  319.                    break;
  320.                    }delay(5);       
  321.         }
  322.         void color()
  323.         {
  324.              while(RI==0)
  325.                 {
  326.                 PWM_0 = rand()%255;
  327.                 delay(2);
  328.                 PWM_1 = rand()%255;
  329.                 delay(2);
  330.                 PWM_2 = rand()%255;
  331.                 delay(2);
  332.                 }
  333.         }
  334.        
  335.         void InterruptTimer0() interrupt 1
  336.         {
  337.             TH0 = 0xFC; //重新加载初值
  338.             TL0 = 0x67;
  339.                
  340.             if (red == 0&&red1==1)  
  341.             {
  342.                 delay(99);
  343.                         if(red1==0)
  344.                 flag1s = 1;
  345.             }
  346.             if (red1 == 0&&red == 1)  
  347.             {
  348.                 delay(99);
  349.                         if(red == 0)
  350.                flag2s = 1;
  351.             }
  352.                
  353.                 counter++;
  354.                         if(counter >= 255) counter = 0;
  355.                     if(counter >= PWM_0) RR = 0; else RR = 1;
  356.                     if(counter >= PWM_1) GG = 0; else GG = 1;
  357.                     if(counter >= PWM_2) BB = 0; else BB = 1;       
  358.         }
复制代码

作者: zha    时间: 2017-5-2 21:06
问题就在蓝牙发送的数据接收不到




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1