找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3754|回復: 0
收起左側

52單片機雙機通信Proteus仿真程序

[復制鏈接]
ID:618434 發(fā)表于 2020-5-18 08:17 | 顯示全部樓層 |閱讀模式
在PROTEUS上采用雙單片機A和B,采取TXD連接另一個單片機的RXD,建立一對一通信A外接4個按鍵,編號1~3;B外接一個數(shù)碼管,平時顯示0。 A按鍵后,B顯示相應鍵號0.3秒;

進階要求1:A的TXD與B的RXD間加入按鍵開關K,通過K的ON/OFF來控制通信連接的有效和無效;
                  運行中,K由ON改為OFF,通信無效時,B不響應A的按鍵表示通信未建立;

進階2:通信無效時,B顯示9,表示通信無效;運行中K由OFF改為ON,系統(tǒng)自動回復正常
1,首先考慮資源分配
波特率設置要用定時器1自動重裝載模式。
定時器1用于產(chǎn)生10ms中斷
定時器2用來產(chǎn)生20ms中斷
故可選用89c52單片機
2:主函數(shù)完成3個定時器初始化函數(shù),之后在while(1)休眠或啥也不干。
3:定時器2中斷服務函數(shù):
自動重裝載模式不需要重置本定時器
按鍵掃描函數(shù)獲取鍵號,若無按鍵鍵號為0
重置并啟動超時定時器(tim0)
根據(jù)S_OK狀態(tài)點亮LED(S_OK=0時點亮)
4:接收中斷模塊
S_OK置1
關閉超時定時器
5:10ms定時中斷模塊
S_OK=0
關閉超時定時器
接收B板模塊
同樣需要3個定時器
1:main函數(shù)中三個定時器初始化
2:接收中斷
直接顯示鍵號,開啟0.3s定時器
重置啟動超時定時器
發(fā)送信息給A板
3:0.3s定時中斷
關閉本定時器
顯示0
4:超時中斷函數(shù)
S_OK=0
數(shù)碼管顯示9
關閉本定時器
關閉0.3s定時器

發(fā)送A板主函數(shù)文件程序示例。完整程序和proteus圖見附件。
51hei.png

單片機源程序如下:
  1. #include <reg52.h>
  2. #include"init.h"

  3. //sfr T2MOD=0XC9;


  4. void send(uchar num); //聲明子函數(shù)的時候要加分號
  5. void delay(int z)        //晶振11.592.延時z毫秒
  6. {
  7.   uint x,y;
  8.   for(x=z;x>0;x--)
  9.   for(y=110;y>0;y--);
  10. }
  11. void key()
  12. {
  13.         if(key3==0)
  14.         flash=4;
  15.         else if(key2==0)
  16.         flash=3;
  17.         else if(key1==0)
  18.         flash=2;
  19.         else if(key0==0)
  20.         flash=1;
  21.         else
  22.         flash=0;

  23. }







  24. void send(uchar num)
  25. {
  26.   SBUF=num;      //把發(fā)送的內容寫進sbuf,自動發(fā)送 ,發(fā)送數(shù)據(jù)時TI為0,!0為1
  27.   while(!TI);   //!邏輯非,發(fā)送完數(shù)據(jù),發(fā)送完數(shù)據(jù)時TI為1.!1為0,停止發(fā)送
  28. // led=1;
  29.   TI=0;             //TI需要軟件清零
  30. }

  31. void tim0() interrupt 1//超時中斷
  32. {
  33.          static unsigned char count;
  34.                                            //定義變量,記錄中斷次數(shù)
  35. //         TH0=0xd8;  
  36. //          TL0=0xf0;           //定時器重置,一幀數(shù)據(jù)一來一回兩個多毫秒,定時10ms夠了
  37.         S_OK=0;                           //進入超時中斷,說明通信已經(jīng)中斷
  38.         led=1;
  39.         led2=1;
  40.         TR0=0;                           //通信已經(jīng)中斷,關閉超時定時器        
  41. //        count++;
  42. //        if(count==50)
  43. //         {
  44. //        led2=~led2;
  45. //        count=0;
  46. //        }
  47. }
  48. void receive() interrupt 4        
  49.                                                  //串行接收和發(fā)送中斷           
  50. {
  51.      if(RI==1)
  52.          {
  53.          S_OK=1;                        //進入接收中斷說明通信正常   
  54.      RI = 0;                        //RI要手動清0
  55.          led=0;
  56.          led2=0;
  57.          TR0=0;                                //關閉超時定時器
  58.          }
  59.          if(TI==1)
  60.          {
  61.                 TI=0;
  62. //                TH0=0xd8;  
  63. //          TL0=0xf0;  
  64. TH0=0xec;  
  65.           TL0=0x78;
  66.         TR0=1;   
  67.          }
  68.   }
  69. void timer_T2() interrupt 5       //中斷函數(shù)
  70. {
  71.     static unsigned char count1;     //定義變量,記錄中斷次數(shù)
  72.     TF2=0;                      //軟件清零定時器2溢出標志位
  73.         
  74.     count1++;
  75.         
  76.          
  77.          
  78.                                    //重置并啟動超時定時器
  79.                                          //根據(jù)S_OK點亮led3
  80.     if(count1==3)      
  81.     {
  82.     key();                           //掃描按鍵
  83.         SBUF=flash;       //發(fā)送一次鍵號key();                           //掃描按鍵
  84.         
  85.         count1=0;         //清零
  86.       
  87.     }
  88. }







  89. void main()
  90. {
  91.    //待運行一次的初始化函數(shù)
  92.         tim2init();
  93.         tim1init() ;
  94.            tim0init();
  95.         TR0=0;
  96.         led=0;
  97.         led2=0;
  98.         led3=0;
  99.           while(1)
  100.            {
  101. //                    send(flash);
  102. //           if(S_OK==0)
  103. //           led3=1;
  104. //           else
  105. //           led3=0;
  106.                   //key();   

  107.                   
  108.            }
  109. }
復制代碼
全部資料51hei下載地址:
程序源碼和原理圖.rar (105.97 KB, 下載次數(shù): 33)

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表