日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

两个51单片机之间进行串行通信

發布時間:2023/12/15 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两个51单片机之间进行串行通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、項目分析
  • 二、程序設計
  • 三、硬件設計
  • 四、功能實現展示
  • 總結

前言:利用a單片機按鍵按下發送數值給單片機b,b單片機收到對應的數值,來控制從單片機b的P1口,點亮對于的8位LED燈。

提示:本次博主都把軟件和硬件全部介紹,也希望對大家有幫助,有什么好的意見或者建議,能告訴博主將會十分感激。


一、項目分析

兩個單片機都使用串口方式1進行通信,并且必須保證兩單片機通信波特率完全一致,否則接受不到正確的數。在發送數據時,向SBUF中寫入一個數據后,使用 “while(!TI);” 等待是否發送完畢,因為當發送完畢后,TI被硬件置1,然后才退出 “while(!TI);” 接下來在將TI手動清零,同理,在接受數據時,在中斷服務程序中也需要將接受中斷標志位RI置零。

二、程序設計

a完成發送,b完成接收。編寫程序設置a,令SM0=0,SM1=1(串行口工作方式1)。設置b,令SM0=0,SM1=1,REN=1,使接收允許。

(1)a單片機程序[數據發送程序]

#include <reg51.h> //單片機頭文件//宏定義 #define uint unsigned int #define uchar unsigned char//位聲明 sbit k1=P2^0; sbit k2=P2^1; sbit k3=P2^2; sbit k4=P2^3; sbit k5=P2^4; sbit k6=P2^5; sbit k7=P2^6; sbit k8=P2^7;//函數聲明 void Usart_Init(void); void DelayMs(uint xms); void Send_Data(uchar Key_val); void Keyscan(void);//主函數 void main() {while(1) //循環{Keyscan();} }//串口中斷初始化 void Usart_Init(void) {TMOD=0X20;//定時器1方式2TH1=0xF3; //計數器初始值設置,注意波特率是4800TL1=0xF3;TR1=1;//打開定時器SM0=0;//設置串口工作方式SM1=1;EA=1;//打開總中斷ES=1;//打開串口中斷 }//延時函數 void DelayMs(uint xms) { uchar i,j; for(i=xms;i>0;i--)for(j=110;j>0;j--); }//發送數據函數 void Send_Data(uchar Key_val) {SBUF=Key_val; //將要發送的數據存入發送緩沖器中while(!TI); //若發送中斷標志位沒有置1(正在發送數據),就等待TI=0; //若發送完成,TI自動置1,這里把它清零 }//按鍵函數 void Keyscan(void) {uchar Val; //定義局部變量if(k1==0) //如果按下k1{DelayMs(10);//消抖if(k1==0) //確認按下k1{Usart_Init(); Val=0;}while(!k1); //等待按鍵釋放Send_Data(Val); //發送“0”}if(k2==0) //如果按下k2{DelayMs(10);//消抖if(k2==0) //確認按下k2{Usart_Init();Val=1;}while(!k2); //等待按鍵釋放Send_Data(Val); //發送“1”}if(k3==0) //如果按下k3{DelayMs(10);//消抖if(k3==0) //確認按下k3{Usart_Init();Val=2; //發送“2”}while(!k3); //等待按鍵釋放Send_Data(Val);}if(k1==4) //如果按下k4{DelayMs(10);//消抖if(k4==0) //確認按下k4{Usart_Init();Val=3; //發送“3”}while(!k4); //等待按鍵釋放Send_Data(Val);}if(k5==0) //如果按下k5{DelayMs(10);//消抖if(k5==0) //確認按下k5{Usart_Init();Val=4;}while(!k5); //等待按鍵釋放Send_Data(Val); //發送“4”}if(k6==0) //如果按下k6{DelayMs(10);//消抖if(k6==0) //確認按下k6{Usart_Init();Val=5;}while(!k6); //等待按鍵釋放Send_Data(Val); //發送“6”}if(k7==0) //如果按下k7{DelayMs(10);//消抖if(k7==0) //確認按下k7{Usart_Init();Val=6;}while(!k7); //等待按鍵釋放Send_Data(Val); //發送“7”}if(k8==0) //如果按下k8{DelayMs(10);//消抖if(k8==0) //確認按下k8{Usart_Init();Val=7;}while(!k8); //等待按鍵釋放Send_Data(Val); //發送“7”} }

(2)b單片機程序[數據接收程序]

#include <reg52.h> //單片機頭文件//宏定義 #define uint unsigned int #define uchar unsigned char//位聲明 sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3; sbit led4=P1^4; sbit led5=P1^5; sbit led6=P1^6; sbit led7=P1^7;//定義全局變量 uchar i;//函數聲明 void Uart_init();//主函數 void main() {Uart_init(); //串口初始化while(1); }//串口初始化函數 void Uart_init() {TMOD=0X20;//定時器1方式2TH1=0xF3; //計數器初始值設置,注意波特率是4800TL1=0xF3;TR1=1;//打開定時器SM0=0;//設置串口工作方式SM1=1;REN=1;EA=1;//打開總中斷ES=1;//打開串口中斷 }//串口中斷服務函數 void uart() interrupt 4 {uchar receiveData;i=SBUF; switch(i){case 0: //收到“0”led0=0;break;case 1: //收到“1”led1=0;break;case 2: //收到“2”led2=0;break;case 3: //收到“3”led3=0;break;case 4: //收到“4”led4=0;break;case 5: //收到“5”led5=0;break;case 6: //收到“6”led6=0;break;case 7: //收到“7”led7=0;break;default:P2=0XFF;break;}receiveData=SBUF; //出去接收到的數據RI=0; //清除接收中斷標志位 }

三、硬件設計

a單片機與b單片機連線(把這兩個程序分別燒寫到兩塊板子上,然后用連接線分別連接兩個板子的發送引腳和接收引腳。)

a單片機 → b單片機
TXD(P3.1) → RXD(P3.0)
RXD(P3.0) → TXD(P3.1)
GND → GND

四、功能實現展示


總結

本次課程設計我主要研究的是單片機雙機通信實驗,使我學習到了最大的是51單片機的串口中斷程序的編寫,在實驗中需要用到兩個單片機作為主從機來控制信號的接受與發送。還學習到了單片機在使用中斷的時候,如果有中斷申請的話,硬件電路會自動把單片機里接受發送中斷的TI和RI置1。雖然在這段時間里每天都那么繁忙,但是在這忙碌的過程中卻得到了許多的收獲。
堅持不一定成功,但放棄就一定失敗!

總結

以上是生活随笔為你收集整理的两个51单片机之间进行串行通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。