找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助:hc05控制rgb的颜色变化

[复制链接]
跳转到指定楼层
楼主
ID:169944 发表于 2017-4-20 14:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做了一个app控制的rgb小灯颜色,是用蓝牙hc05,能够控制几种颜色了,问题是只能够通过延时来实现灯的亮,延时一到就灭了,请问怎么改才能变成只要发送了命令就一直亮,只有接收到下一个
命令才改变颜色,很急,求思路
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. unsigned char tmp;
  4. unsigned int c=0;

  5. sbit RR = P1^0;
  6. sbit GG = P1^1;
  7. sbit BB = P1^2;
  8. sbit led = P1^3;

  9. unsigned char PWM_0 = 0;
  10. unsigned char PWM_1 = 0;
  11. unsigned char PWM_2 = 0;

  12. unsigned char counter = 0;//jishu

  13. void init();   //串口初始化
  14. void send(unsigned char a);        //单字节发送函数
  15. void ctrl(); //接收处理函数
  16. void delay (unsigned char t) //延时
  17. {
  18.     unsigned char i;
  19.     while(t--)
  20.     {
  21.         for(i=0; i<114; i++);
  22.     }
  23. }
  24. void main()
  25. {
  26.     EA = 1;
  27.     TMOD = 0x01;
  28.         TL0 = 0xC9;                //设置定时初值
  29.         TH0 = 0xFF;
  30.         ET0 = 1;
  31.         TR0 = 1;
  32.         init();
  33.     while(1)
  34.     {
  35.         if(RI==1)                     // 是否有数据到来
  36.         {
  37.             RI = 0;
  38.             tmp = SBUF;                   // 暂存接收到的数据
  39.             ctrl();
  40.         }
  41.     }
  42. }

  43. void init()        //串口初始化
  44. {
  45.     ES=0;                                                                  //关中断
  46.     SCON = 0x50;                        // REN=1允许串行接受状态,串口工作模式1,
  47.     //10位UART(1位起始位,8位数据位,1位停止位,无奇偶校验),波特率可变

  48.     TMOD = 0x20;                        // 定时器1工作于方式2,8位自动重载模式, 用于产生波特率
  49.     TH1=TL1=0xFD;                       // 波特率9600 (本次测试采用晶振为11.0592)

  50.     PCON &= 0x7f;                       // 波特率不倍增
  51.     TR1 = 1;                                                          //定时器1开始工作,产生波特率
  52.     //发送标志位置0
  53.     TI=0;                                                                  //接收标志位置0
  54.     RI=0;

  55.     //EA=0;
  56.     ES=1;
  57.         RR = 1;
  58.     GG = 1;
  59.     BB = 1;
  60. }

  61. void send(unsigned char a)        //单字节数据发送
  62. {
  63.     //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻
  64.     TI=0;
  65.     SBUF=a;
  66.     while(TI==0);
  67.     TI=0;
  68.     if(c%2)                                        //发送指示灯标志,每接收一次,此灯亮灭交替
  69.         led=1;
  70.     else
  71.         led=0;
  72.     c++;
  73. }

  74. void ctrl()                            //接收处理函数
  75. {
  76.     switch(tmp)
  77.     {
  78.     case '1':           //hong
  79.         PWM_0 = 220;
  80.                 PWM_1 = 20;
  81.                 PWM_2 = 60;  
  82.                 delay(3000);                                 
  83.         send(tmp);
  84.         break;
  85.     case '2':                                       
  86.         PWM_0 = 128;        //zi
  87.                 PWM_1 = 0;
  88.                 PWM_2 = 128;
  89.                 delay(3000);
  90.         send(tmp);
  91.         break;
  92.     case '3':                                   
  93.         PWM_0 = 0;        //lan
  94.                 PWM_1 = 0;
  95.                 PWM_2 = 255;
  96.                 delay(3000);
  97.         send(tmp);
  98.         break;
  99.     case '4':                                       
  100.         PWM_0 = 30;        // qian lan
  101.                 PWM_1 = 144;
  102.                 PWM_2 = 255;
  103.                 delay(3000);
  104.         send(tmp);
  105.         break;
  106.     case '5':                                       
  107.         PWM_0 = 49;        //hui
  108.                 PWM_1 = 79;
  109.                 PWM_2 = 79;
  110.                 delay(3000);
  111.         send(tmp);
  112.         break;
  113.     default:                   //其他,灯全灭
  114.         PWM_0 = 0;        //hei
  115.                 PWM_1 = 0;
  116.                 PWM_2 = 0;
  117.         send(tmp);
  118.     }
  119. }
  120. void InterruptTimer0() interrupt 1
  121. {
  122.         TL0 = 0xC9;                //设置定时初值
  123.         TH0 = 0xFF;       

  124.         counter++;

  125.     if(counter >= 255) counter = 0;
  126.     if(counter >= PWM_0) RR = 0; else RR = 1;
  127.     if(counter >= PWM_1) GG = 0; else GG = 1;
  128.     if(counter >= PWM_2) BB = 0; else BB = 1;

  129. }
复制代码


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

使用道具 举报

沙发
ID:169944 发表于 2017-4-20 15:02 | 只看该作者
求教啊,大神在哪里
回复

使用道具 举报

板凳
ID:184237 发表于 2017-7-21 23:13 | 只看该作者
hc 05 模块里面state 端口与en 端口可以不接是吧,那这两个端口有什么用呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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