找回密码
 立即注册

QQ登录

只需一步,快速开始

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

串口以固定格式发送信号给51单片机来控制多盏LED亮灭

[复制链接]
跳转到指定楼层
楼主
ID:538334 发表于 2019-10-30 18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10黑币
单片小白刚接触单片机不久,看见单片机可以通过串口通信来实现控制功能,就想通过串口触摸屏输出信号来实现控制多个LED,遂借来一个串口屏进行试验,发现串口屏只是输出了一串数字(A5 5A 06 83 00 01 01 00 01),查了下串口屏说明,对数字串做出如下解释:一二位为帧头(A5 5A),第三位为字节长度(06),第四位为读指令(83),后五位为字节位(00 01 01 00 01),多开关的话后五位会有所不同以区分是哪个开关发出的信号;现本人只能做到串口有信号来只有一个LED亮灭,不知如何写代码让单片机能识别这串数字来控制不同的LED亮灭,代码如下,还望各位高手斧正、赐教。

单片机源程序如下:

#include <reg52.h>                               //载入头文件

typedef unsigned int u16;                    //定义一些用到的函数
typedef unsigned char u8;
uchar i;

sbit led0=P0^0;                                                //定义LED管脚
sbit led1=P0^1;
sbit led2=P0^2;
sbit led3=P0^3;

void UsartInit()                            //初始化串口数据9600
{
   TMOD = 0x20;
   SCON = 0x50;
   TH1 = TL1 = 0xFD;
   PCON = 0x00;
   EA = 1;
   ES = 1;
   TR1 = 1;
}

void main()                                            
{
                   led0=0;                                            
                   led1=0;
                   led2=0;
                   led3=0;
               UsartInit();                           
                   while(1);
}

void Usart() interrupt 4                           //中断函数
{
                            u8receiveData;
                            i=SBUF;
                                     switch(i)
                                      {
                                        Case  ' ?  ':led0=~led0;
                                        case   '  ?  ':led1=~led1;
                                        case   '  ?  ':led2=~led2;
                                        case   '  ? ':led3=~led3;
                                      }
                            receiveData=SBUF;
                            RI=0;
                            SBUF=receiveData;
                            while(!TI);
                            TI=0;
}


最佳答案

查看完整内容

给你写一个串口接收固定长度字符串示例参考,需要按串口屏按键的定义修改。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2019-10-30 18:04 | 只看该作者
给你写一个串口接收固定长度字符串示例参考,需要按串口屏按键的定义修改。
  1. #include <reg51.h>

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. sbit led0=P1^0;
  5. sbit led1=P1^1;
  6. sbit led2=P1^2;
  7. sbit led3=P1^3;

  8. u8 rec_buf[9];
  9. bit flag=0;

  10. void InitUART()
  11. {
  12.     TMOD = 0x20;
  13.     SCON = 0x50;
  14.     TH1 = 0xFA;
  15.     TL1 = TH1;
  16.     PCON = 0x80;
  17.     EA = 1;
  18.     ES = 1;
  19.     TR1 = 1;
  20. }
  21. void main()
  22. {
  23.         u8 i;
  24.         InitUART();
  25.         while(1)
  26.         {
  27.                 if(flag==1)
  28.                 {
  29.                         flag=0;
  30.                         //以下需要按自定义协议解析数据,这是随便写的示范
  31.                         i=rec_buf[4]+rec_buf[5]+rec_buf[6]+rec_buf[7]+rec_buf[8];
  32.                         switch(i)
  33.                         {
  34.                                 case 0:led0=~led0;break;
  35.                                 case 1:led1=~led1;break;
  36.                                 case 2:led2=~led2;break;
  37.                                 case 3:led3=~led3;break;
  38.                         }       
  39.                 }
  40.         }
  41. }

  42. void UARTInterrupt() interrupt 4
  43. {
  44.         static u8 num=0;                //静态变量
  45.         RI=0;                                                //接收中断请求标志位清0
  46.         rec_buf[num]=SBUF;        //接收到的数据保存在缓存数组
  47. //        SBUF=rec_buf[num];        //返回收到的数据
  48. //        while(!TI);
  49. //        TI=0;
  50.         if(rec_buf[0]==0xA5)        //验证数据头第1字节
  51.         {
  52.                 num++;
  53.                 if(num==2)
  54.                 {
  55.                         if(rec_buf[1]!=0x5A)//验证数据头第2字节
  56.                                 num=0;                //否则从第1字节重新接收字符串
  57.                 }
  58.                 if(num>=9)
  59.                 {
  60.                         flag=1;                        //接收完成标志置1
  61.                         num=0;
  62.                 }
  63.         }
  64. }
  65. //A5 5A 06 83 00 01 01 00 01
复制代码

评分

参与人数 1黑币 +5 收起 理由
kill_ha_ha + 5 谢谢总工给出的示例,让我等小白能迅速学习

查看全部评分

回复

使用道具 举报

板凳
ID:235200 发表于 2019-10-30 19:34 | 只看该作者
switch(i)
                                      {
                                        Case  ' ?  ':led0=~led0;
                                        case   '  ?  ':led1=~led1;
                                        case   '  ?  ':led2=~led2;
                                        case   '  ? ':led3=~led3;
}
接收到的数据不只是一个,应该把所有数据都接收完放在一个缓冲区,而且接收缓字区数据前5个字节,剩下的字节数,每一个字节去控制一个LED灯,switch语句中的case未区分不同的数据

评分

参与人数 1黑币 +5 收起 理由
kill_ha_ha + 5 谢谢总工给出的解决方案

查看全部评分

回复

使用道具 举报

地板
ID:610681 发表于 2019-10-30 20:17 | 只看该作者
你好!
要想控制,需要后五位(00 01 01 00 01)数据来完成;
串口屏共设定多少个按键?每个按键的输出都是什么?

评分

参与人数 1黑币 +5 收起 理由
kill_ha_ha + 5 谢谢助工的热心回答

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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