找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助,,关于单片机代码的问题

[复制链接]
跳转到指定楼层
楼主
ID:169944 发表于 2017-5-2 12:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10黑币
写了两部分的代码,一部分是led屏显示数字的,另一部分是蓝牙控制RBG的,单独的可以用,为什么合在一起,蓝牙那部分用不了了,求助

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


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

使用道具 举报

沙发
ID:169944 发表于 2017-5-2 19:02 | 只看该作者
大神在哪里
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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