久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2039|回復: 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, 下載次數: 92)

微信圖片木木.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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线不卡 | 亚洲精品视频在线播放 | 午夜欧美| 性一交一乱一透一a级 | 麻豆天堂 | 欧美日韩成人在线观看 | 男女羞羞视频网站 | 国产一级电影在线 | 91精品国产综合久久久亚洲 | 中文精品视频 | 国产三级一区二区 | 中文字幕啪啪 | 91网站在线观看视频 | 99视频在线免费观看 | 色婷婷av777 av免费网站在线 | 午夜精品在线观看 | 国户精品久久久久久久久久久不卡 | 国精产品一区一区三区免费完 | 日本黄色片免费在线观看 | 国产精品中文字幕一区二区三区 | 成人欧美一区二区三区视频xxx | 成人免费av| 亚洲成人免费在线观看 | 国产成人精品综合 | 99久久久国产精品免费消防器 | 99视频在线免费观看 | 中文字幕 在线观看 | 日韩在线一区二区三区 | 国产高清一区二区三区 | 精品视频成人 | 久久中文字幕一区 | 成年人黄色一级片 | 中文字幕在线欧美 | 欧美黄色一区 | 一区在线观看 | 欧美一级在线观看 | 精品欧美乱码久久久久久 | 亚洲日本中文字幕在线 | 国产在线看片 | 国产成人精品免费 | 好婷婷网|