找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3549|回復(fù): 1
收起左側(cè)

單片機通信Proteus仿真實驗

[復(fù)制鏈接]
ID:389070 發(fā)表于 2019-7-30 13:10 | 顯示全部樓層 |閱讀模式
本實驗是設(shè)置八個按鍵在上位機按下,下位機接收到數(shù)據(jù)后執(zhí)行。分別控制八個LED燈,內(nèi)部有介紹一些關(guān)于ASCII可顯示字符的使用。在低一個顯示字符我改動原來是1=31的一個值。改成/=2F...很好理解的,自己多試試改別的也可以。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png

單片機源程序如下:
  1. /********************************************************************
  2. 函數(shù)功能:往串口發(fā)送一字節(jié)數(shù)據(jù)(可通過超級終端顯示出來,超級終端波特率選為9600)。
  3.             超級終端設(shè)置好后,每按下一次S2/S3/S4/S5鍵顯示abcd,松開后均會在超級終端上顯示一個字母"a"。
  4.             入口參數(shù):d: 要發(fā)送的字節(jié)數(shù)據(jù)。
  5. ********************************************************************/


  6. #include <reg52.h>
  7. #define jingzhen     11059200UL     /*使用22.1184M晶體*/
  8. #define botelv   9600UL                      /*波特率定義為9600*/

  9. //定義待顯示字符abcd
  10. unsigned char zifua='/';                        //待顯示字符a。
  11. unsigned char zifub='2';                        //待顯示字符。
  12. unsigned char zifuc='3';                        //待顯示字符。
  13. unsigned char zifud='4';                        //待顯示字符。
  14. unsigned char zifue='5';                        //待顯示字符。
  15. unsigned char zifuf='6';                        //待顯示字符。
  16. unsigned char zifug='7';                        //待顯示字符。
  17. unsigned char zifuh='8';                        //待顯示字符。

  18. volatile unsigned char sending;

  19. //設(shè)置八個獨立按鍵
  20. sbit s1=P2^0;        //按鍵
  21. sbit s2=P2^1;        //按鍵
  22. sbit s3=P2^2;        //按鍵
  23. sbit s4=P2^3;        //按鍵
  24. sbit s5=P2^4;        //按鍵
  25. sbit s6=P2^5;        //按鍵
  26. sbit s7=P2^6;        //按鍵
  27. sbit s8=P2^7;        //按鍵

  28. //設(shè)置for延時函數(shù)
  29. void delay(unsigned char i)
  30. {
  31.         unsigned char j,k;
  32.         for(j=i;j>0;j--)
  33.                 for(k=90;k>0;k--);
  34. }


  35. void init(void)                                //串口初始化
  36. {
  37. EA=0; //暫時關(guān)閉中斷
  38. TMOD&=0x0F;  //定時器1模式控制在高4位
  39. TMOD|=0x20;    //定時器1工作在模式2,自動重裝模式
  40. SCON=0x50;     //串口工作在模式1
  41. TH1=256-jingzhen/(botelv*12*16);  //計算定時器重裝值
  42. TL1=256-jingzhen/(botelv*12*16);
  43. PCON|=0x80;    //串口波特率加倍
  44. ES=1;         //串行中斷允許
  45. TR1=1;        //啟動定時器1
  46. REN=1;        //允許接收
  47. EA=1;         //允許中斷
  48. }

  49. //發(fā)送一個字節(jié)的數(shù)據(jù),形參d即為待發(fā)送數(shù)據(jù)。
  50. void send(unsigned char d)                  
  51. {
  52. SBUF=d; //將數(shù)據(jù)寫入到串口緩沖
  53. sending=1;         //設(shè)置發(fā)送標(biāo)志
  54. while(sending); //等待發(fā)送完畢
  55. }


  56. void main()
  57. {
  58.         init();
  59.         while(1)
  60.         {
  61.                 if(s1==0)            //如果按下S2
  62.                 {
  63.                 delay(20);         //延時
  64.                 if(!s1)           //判斷是否按下
  65.                    {
  66.                    while(!s1);           //循環(huán)檢測S2是否按下并執(zhí)行下一條          
  67.                      send(zifua);    //發(fā)送a
  68.                        }
  69. //                else(s1==1);
  70.                 }

  71.           
  72.                 if(s2==0)
  73.                 {
  74.                 delay(20);
  75.                 if(!s2)
  76.                     {
  77.                      while(!s2);                  
  78.                      send(zifub);
  79.                     }
  80.                 }
  81.             

  82.                 if(s3==0)
  83.                 {
  84.                 delay(20);
  85.                 if(!s3)
  86.                     {
  87.                     while(!s3);                  
  88.                     send(zifuc);
  89.                     }
  90.                 }


  91.                  

  92.                 if(s4==0)
  93.                 {
  94.                 delay(20);
  95.                 if(!s4)
  96.                    {
  97.                     while(!s4);                  
  98.                     send(zifud);
  99.                  }
  100.                 }

  101.                 if(s5==0)
  102.                 {
  103.                 delay(20);
  104.                 if(!s5)
  105.                    {
  106.                     while(!s5);                  
  107.                     send(zifue);
  108.                  }
  109.                 }

  110.                 if(s6==0)
  111.                 {
  112.                 delay(20);
  113.                 if(!s6)
  114.                    {
  115.                     while(!s6);                  
  116.                     send(zifuf);
  117.                  }
  118.                 }

  119.                 if(s7==0)
  120.                 {
  121.                 delay(20);
  122.                 if(!s7)
  123.                    {
  124.                     while(!s7);                  
  125.                     send(zifug);
  126.                  }
  127.                 }

  128.                 if(s8==0)
  129.                 {
  130.                   delay(20);
  131.                  if(!s8)
  132.                    {
  133.                     while(!s8);                  
  134.                     send(zifuh);
  135.                  }
  136.                 }




  137.         }
  138. }


  139. void uart(void) interrupt 4        //串口發(fā)送中斷
  140. {
  141. if(RI)    //收到數(shù)據(jù)
  142. {
  143.   RI=0;   //清中斷請求
  144. }
  145. else      //發(fā)送完一字節(jié)數(shù)據(jù)
  146. {
  147.   TI=0;
  148.   sending=0;  //清正在發(fā)送標(biāo)志
  149. }
  150. }
復(fù)制代碼

所有資料51hei提供下載:
串口通信模擬.zip (63.51 KB, 下載次數(shù): 22)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:634277 發(fā)表于 2019-11-2 21:08 | 顯示全部樓層
感謝共享。。。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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