找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串中通讯问题

[复制链接]
跳转到指定楼层
楼主
大神们真心请教,搞不明白,,按健按了,1或2或3,在把这数值发给电脑串口,,串口接收显示的是01 00或  01 00,为什么呀,他发了几次?

  1. #include <reg51.h>
  2. #define led P2
  3. #define shumaguan P0
  4. #define anjian P1
  5. sbit ls138A= P2^2;
  6. sbit ls138B= P2^3;
  7. sbit ls138C= P2^4;
  8. unsigned char b ;biaozhi; c;
  9. void chuankou()
  10. {
  11. SCON=0X50;                        //设置为工作方式1
  12.         TMOD=0X20;                        //设置计数器工作方式2
  13.         PCON=0X80;                        //波特率加倍
  14.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  15.         TL1=0XF3;
  16.         ES=1;                                                //打开接收中断
  17.         EA=1;                                                //打开总中断
  18.         TR1=1;
  19. }

  20. unsigned char code shuzu[]={ 0x3f  ,0x06 , 0x5b , 0x4f , 0x66,
  21. 0x6d  ,0x7d  , 0x07 , 0x7f , 0x6f } ;// 0--8数字
  22. void ls138shuju()         
  23. {
  24.         ls138A= 0;
  25.     ls138B= 0;
  26.     ls138C= 0;
  27. }
  28. void yanshi (unsigned int u)
  29. {
  30. while(u--)        ;
  31. }

  32. void shuzihanshu()
  33. {
  34.    unsigned char v ;
  35.                                                            


  36.          ls138shuju();
  37.         /************* 扫描最右侧一例*************/
  38.          anjian=0XFE; //把1111 1110赋于按键,高4位与低4位组成纵横矩阵
  39.             v=anjian;    //        anjian赋于V
  40.          v=v&0XF0;    //v于1111 0000相&取出高4位,如高4位有0说明有按健按下,
  41.          if(v!=0XF0)         //有按键按下高4位不等于1111会进入if
  42.            {
  43.              yanshi (200);
  44.              v=anjian;   //把1111 1110赋于按键,高4位与低4位组成纵横矩阵
  45.              v=v&0XF0;          //v于1111 0000相&取出高4位,如高4位有0说明有按健按下
  46.              if(v!=0XF0) //有按键按下高4位不等于1111会进入if
  47.                {
  48.                  switch(v)
  49.                        {
  50.                              case 0X70 :        b=4; shumaguan=shuzu[b]; break ;
  51.                                 case 0XB0 :        b=8; shumaguan=shuzu[b]; break ;         
  52.                        }
  53.                 }
  54.          while(v!=0XF0) // v!=0XF0说明按键没有弹起,条件为真进入循环。
  55.               {
  56.                 v=anjian;    //再次把anjian实际状态值给V
  57.                 v=v&0XF0;   // v=v&0XF0;取出高4位,如按健弹起高4位为1111
  58.               }
  59.          yanshi (200);                      // whil`(v!=0XF0), v等于0XF0条件为假退出循环
  60.         }
  61.         /************* 扫描最右侧第二例*************/   
  62.            anjian=0XFD; //把1111 1101赋于按键,高4位与低4位组成纵横矩阵
  63.         v=anjian;    //        anjian赋于V
  64.         v=v&0XF0;    //v于1111 0000相&取出高4位,如高4位有0说明有按健按下,
  65.         if(v!=0XF0)         //有按键按下高4位不等于1111会进入if
  66.           {
  67.             yanshi (200);
  68.             v=anjian;   //把1111 1110赋于按键,高4位与低4位组成纵横矩阵
  69.             v=v&0XF0;          //v于1111 0000相&取出高4位,如高4位有0说明有按健按下
  70.             if(v!=0XF0) //有按键按下高4位不等于1111会进入if
  71.               {
  72.                 switch(v)
  73.                       {
  74.                             case 0X70 :        b=3; shumaguan=shuzu[b]; break ;
  75.                                case 0XB0 :        b=7; shumaguan=shuzu[b]; break ;         
  76.                       }
  77.               }
  78.          while(v!=0XF0) // v!=0XF0说明按键没有弹起,条件为真进入循环。
  79.               {
  80.                 v=anjian;    //再次把anjian实际状态值给V
  81.                 v=v&0XF0;   // v=v&0XF0;取出高4位,如按健弹起高4位为1111
  82.               }                      // while(v!=0XF0), v等于0XF0条件为假退出循环
  83.          yanshi (200);
  84.         }
  85.         /************* 扫描最右侧第三例*************/   
  86.            anjian=0XFB; //把1111 1101赋于按键,高4位与低4位组成纵横矩阵
  87.         v=anjian;    //        anjian赋于V
  88.         v=v&0XF0;    //v于1111 0000相&取出高4位,如高4位有0说明有按健按下,
  89.         if(v!=0XF0)         //有按键按下高4位不等于1111会进入if
  90.           {
  91.             yanshi (100);
  92.             v=anjian;   //把1111 1110赋于按键,高4位与低4位组成纵横矩阵
  93.             v=v&0XF0;          //v于1111 0000相&取出高4位,如高4位有0说明有按健按下
  94.             if(v!=0XF0) //有按键按下高4位不等于1111会进入if
  95.               {
  96.                 switch(v)
  97.                       {
  98.                             case 0X70 :        b=2; shumaguan=shuzu[b]; break ;
  99.                                case 0XB0 :        b=6; shumaguan=shuzu[b]; break ;         
  100.                       }
  101.               }
  102.          while(v!=0XF0) // v!=0XF0说明按键没有弹起,条件为真进入循环。
  103.               {
  104.                 v=anjian;    //再次把anjian实际状态值给V
  105.                 v=v&0XF0;   // v=v&0XF0;取出高4位,如按健弹起高4位为1111
  106.               }                      // while(v!=0XF0), v等于0XF0条件为假退出循环
  107.          yanshi (100);
  108.          
  109.         }
  110.    /************* 扫描最右侧第四例*************/   
  111.            anjian=0XF7; //把1111 1101赋于按键,高4位与低4位组成纵横矩阵
  112.         v=anjian;    //        anjian赋于V
  113.         v=v&0XF0;    //v于1111 0000相&取出高4位,如高4位有0说明有按健按下,
  114.         if(v!=0XF0)         //有按键按下高4位不等于1111会进入if
  115.           {
  116.             yanshi (100);
  117.             v=anjian;   //把1111 1110赋于按键,高4位与低4位组成纵横矩阵
  118.             v=v&0XF0;          //v于1111 0000相&取出高4位,如高4位有0说明有按健按下
  119.             if(v!=0XF0) //有按键按下高4位不等于1111会进入if
  120.               {
  121.                 switch(v)
  122.                       {
  123.                              case 0X70 :        b=1; shumaguan=shuzu[b];break ;
  124.                                case 0XB0 :        b=5; shumaguan=shuzu[b]; break ;         
  125.                       }
  126.                                  
  127.                }
  128.           while(v!=0XF0) // v!=0XF0说明按键没有弹起,条件为真进入循环。
  129.               {
  130.                 v=anjian;    //再次把anjian实际状态值给V
  131.                 v=v&0XF0;   // v=v&0XF0;取出高4位,如按健弹起高4位为1111
  132.               }                      // while(v!=0XF0), v等于0XF0条件为假退出循环
  133.           yanshi (100);
  134.          }


  135. }
  136. void main()
  137. {
  138.   shumaguan=shuzu[0];
  139.   while(1)
  140.        {
  141.                  chuankou();
  142.                 shuzihanshu();
  143.                         switch(b)
  144.                         {
  145.                                              case (1) : led=0X63;SBUF=b;while(!TI);TI=0; b=0;break ;  //按健值 发送给电脑串口
  146.                                            case (2) : led=0XA3;SBUF=b;while(!TI);TI=0; b=0;break ;
  147.                                         case (3) : led=0XC3;SBUF=b;while(!TI);TI=0; b=0;break ;
  148.                                         case (4) : led=0XE2;SBUF=b;while(!TI);TI=0; b=0;break ;
  149.                                         case (5) : led=0XE1;SBUF=b;while(!TI);TI=0; b=0;break ;
  150.              }
  151.                         if(biaozhi==1)
  152.                         {
  153.                          SBUF=c;while(!TI);TI=0;  // 单片机接收电脑发来的值再返回给电脑串口,
  154.                          biaozhi=0;
  155.                         }
  156.        }
  157. }

  158. void RX() interrupt 4
  159. {
  160. RI=0;
  161. c=SBUF;  //单片机接收电脑发来的值,
  162. biaozhi=1;

  163. }
复制代码




微信图片木木.jpg (98.65 KB, 下载次数: 76)

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

使用道具 举报

沙发
ID:474677 发表于 2019-2-18 11:33 | 只看该作者
图片上12345,串口不是把键值都发出给PC了吗?看起来工作挺正常
回复

使用道具 举报

板凳
ID:64817 发表于 2019-2-18 13:21 | 只看该作者
iofree 发表于 2019-2-18 11:33
图片上12345,串口不是把键值都发出给PC了吗?看起来工作挺正常

我是这里不明白,,按1 按健,把1发给电脑串口,电脑收到是01 00,,不知道 这个如何理解,,,再比如两个单片机学习板直接通讯,一个板子发按键1值,那么另一个板子收01,,还是收01 00.,,,,谢
回复

使用道具 举报

地板
ID:213173 发表于 2019-2-18 13:55 | 只看该作者
改这样试试

#include <reg51.h>
#define led P2
#define shumaguan P0
#define anjian P1
sbit ls138A= P3^2;
sbit ls138B= P3^3;
sbit ls138C= P3^4;
unsigned char code shuzu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 0--9数字
unsigned char key;//
bit biaozhi=0;

void chuankou()        //4800bps@12.000MHz
{
        PCON=0X80;//波特率加倍
        SCON=0X50;//设置为工作方式1
        TMOD=0X20;//设置计数器工作方式2
        TH1=0XF3; //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
//        ES=1;     //打开接收中断
//        EA=1;     //打开总中断
        TR1=1;
}

void ls138shuju()   //数码管动态显示函数   
{
        static unsigned char i=0;
        static unsigned int count=0;
        if(++count>=100)
        {
                count=0;
                shumaguan=0x00;//消隐
                switch(i)
                {
                        case 0: ls138A=0;ls138B=0;ls138C=0;shumaguan=shuzu[key/10];i++;break;
                        case 1: ls138A=1;ls138B=0;ls138C=0;shumaguan=shuzu[key%10];i=0;break;
        /*
                        case 2: ls138A=0;ls138B=1;ls138C=0;shumaguan=shuzu[];i++;break;
                        case 3: ls138A=1;ls138B=1;ls138C=0;shumaguan=shuzu[];i++;break;
                        case 4: ls138A=0;ls138B=0;ls138C=1;shumaguan=shuzu[];i++;break;
                        case 5: ls138A=1;ls138B=0;ls138C=1;shumaguan=shuzu[];i++;break;
                        case 6: ls138A=0;ls138B=1;ls138C=1;shumaguan=shuzu[];i++;break;
                        case 7: ls138A=1;ls138B=1;ls138C=1;shumaguan=shuzu[];i=0;break;
        */
                }
        }
}
/*
void yanshi (unsigned int u)
{
        while(u--);
}
*/
void keyscan()                                        //按键扫描程序
{
        static bit sign=0;                        //按键自锁标志
        static unsigned int count=0;        //消抖计数变量                       
        unsigned char num=0;                                //临时变量
        anjian=0xf0;                                        //赋值anjian 1111 0000
        if(anjian!=0xf0)                                //检测有按键按下
        {
                count++;                                //消抖计数
                if((count>=500)&&(sign==0))//100~1000,根据主循环周期调整约10~20ms
                {                       
                        sign=1;                                //按键自锁标志置1
                        num=anjian;                                //保存anjian值xxxx 0000,x为0或1
                        num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
                        anjian=num;                                //赋值anjian xxxx 1111
                        num=anjian;                                //保存anjian值xxxx xxxx
                        switch(num)
                        {
                                case 0xee: key= 1; break;
                                case 0xde: key= 2; break;
                                case 0xbe: key= 3; break;
                                case 0x7e: key= 4; break;
                                case 0xed: key= 5; break;
                                case 0xdd: key= 6; break;
                                case 0xbd: key= 7; break;
                                case 0x7d: key= 8; break;
                                case 0xeb: key= 9; break;
                                case 0xdb: key=10; break;
                                case 0xbb: key=11; break;
                                case 0x7b: key=12; break;
                                case 0xe7: key=13; break;
                                case 0xd7: key=14; break;
                                case 0xb7: key=15; break;
                                case 0x77: key=16; break;
                        }
                        biaozhi=1;
                }
        }
        else                                                //键抬起
        {
                sign=0;                                //按键自锁标志清0
                count=0;                                //消抖计数清0
        }
}
void main()
{
        chuankou();        //初始化串口
        while(1)
        {
                keyscan();//按键扫描
                ls138shuju();//2位数码管显示键值
                led=~key;                //8个LED显示键值
                if(biaozhi==1)//键值通过串口发送给电脑
                {
                        biaozhi=0;
                        SBUF=key;  
                        while(!TI);
                        TI=0;
                }
        }
}
/*
void RX() interrupt 4
{
        RI=0;
        c=SBUF;  //单片机接收电脑发来的值,
        biaozhi=1;
}*/
回复

使用道具 举报

5#
ID:338762 发表于 2019-2-18 18:15 | 只看该作者
这个程序不是你自己写的吧?你定义的是什么
回复

使用道具 举报

6#
ID:477863 发表于 2019-2-18 19:49 | 只看该作者
串口工具接收选ASCII
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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