找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3102|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

以兩片單片機(jī)為例簡(jiǎn)述單片機(jī)的串口通信的仿真與源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
以兩片單片機(jī)為例簡(jiǎn)述單片機(jī)的串口通信 程序+仿真+詳細(xì)注釋

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar i=1,ACK=1;

  5. void delay(uint i)                          //延時(shí)函數(shù)
  6. {
  7.    uchar j;
  8.    while(i--)
  9.    for(j=110;j>0;j--);
  10. }

  11. uchar kbscan()                //鍵盤掃描函數(shù)
  12. {
  13. uchar sccode,recode;         //定義行、列
  14. P1=0xf0;                     //高四位作為輸入先寫1
  15. if((P1&0xf0)!=0xf0)                  //判斷是否按鍵按下
  16.    {                                                 
  17.         delay(10);                                  //延時(shí)消抖
  18.         if((P1&0xf0)!=0xf0)                  //再次判斷判斷有沒(méi)有按鍵按下
  19.         {
  20.          sccode=0xfe;
  21.          while((sccode&0x10)!=0)
  22.          {
  23.           P1=sccode;
  24.           if((P1&0xf0)!=0xf0)     //判斷當(dāng)前行是否有按鍵按下
  25.           {
  26.            recode=P1&0xf0;        //保留高四位輸入值
  27.            sccode=sccode&0x0f;    //保留第低四位的值
  28.            return(recode+sccode);
  29.           }
  30.                   else
  31.                   sccode=(sccode<<1)|0x01;
  32.          }
  33.         }
  34.    }
  35.           return 0;
  36. }

  37. send()interrupt 4        //串行口通信中斷
  38. {
  39.   if(TI==1&&ACK==1)
  40.   {
  41.     TI=0;
  42.     if(i==0|i==0x22|i==0x44|i==0x66|i==0x88|i==0xaa|i==0xcc|i==0xdd|i==0xee)                        //有按鍵按下,需要修改波特率
  43.     {
  44.           ACK=0;
  45.           SBUF=i;           //修改波特率
  46.         }
  47.     else if(i==11)                //循環(huán)發(fā)送,發(fā)了十一個(gè)字符后重新發(fā)
  48.         {
  49.        i=1;
  50.            SBUF=1;
  51.         }
  52.         else
  53.         {
  54.       i++;
  55.       SBUF=i;               //正常發(fā)送數(shù)據(jù)
  56.     }
  57.   }
  58.   else if(RI==1)           //接收回應(yīng)的信號(hào)
  59.     {
  60.            RI=0;
  61.            ACK=SBUF;           //接收回應(yīng)信號(hào) 修改初值 觸發(fā)串口通信中斷
  62.            TI=1;
  63.            TH1=TL1=i;
  64.            i=1;
  65.         }
  66. }

  67. void main()
  68. {
  69.   TMOD=0x20;                   //定時(shí)器1 工作方式2
  70.   TH1=0x00;
  71.   TL1=0x00;            //置初值
  72.   TR1=1;
  73.   EA=1;
  74.   ES=1;                //使T1開(kāi)始工作;開(kāi)總中斷、串行中斷
  75.   SCON=0x50;           //計(jì)數(shù)器1 工作方式1
  76.   SBUF=i;  
  77.   while(1)
  78.   {
  79.     while(kbscan())
  80.            {
  81.             switch(kbscan())                        //不同的按鍵對(duì)應(yīng)不同的波特率
  82.                 {
  83.             case 0xeb:i=0x00;break;                // 1
  84.                 case 0xdb:i=0x22;break;            // 2  
  85.                 case 0xbb:i=0x44;break;                // 3
  86.                 case 0xed:i=0x66;break;                // 4
  87.                 case 0xdd:i=0x88;break;                // 5
  88.                 case 0xbd:i=0xaa;break;                // 6
  89.                 case 0xee:i=0xcc;break;                // 7
  90.                 case 0xde:i=0xdd;break;                // 8
  91.                 case 0xbe:i=0xee;break;                // 9
  92.             }
  93.            }
  94.   }
  95. }
復(fù)制代碼

所有資料51hei提供下載:
20161111144-李作鑫-串口通信.rar (100.45 KB, 下載次數(shù): 45)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:482614 發(fā)表于 2019-8-4 07:07 | 只看該作者
這個(gè)正是我在網(wǎng)上苦苦搜尋的關(guān)于單片機(jī)串口仿真的帖子,今天我必須把它拿走,樓主好人吶,謝謝了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表