两个51单片机之间进行串行通信
文章目錄
- 一、項(xiàng)目分析
- 二、程序設(shè)計(jì)
- 三、硬件設(shè)計(jì)
- 四、功能實(shí)現(xiàn)展示
- 總結(jié)
前言:利用a單片機(jī)按鍵按下發(fā)送數(shù)值給單片機(jī)b,b單片機(jī)收到對(duì)應(yīng)的數(shù)值,來(lái)控制從單片機(jī)b的P1口,點(diǎn)亮對(duì)于的8位LED燈。
提示:本次博主都把軟件和硬件全部介紹,也希望對(duì)大家有幫助,有什么好的意見(jiàn)或者建議,能告訴博主將會(huì)十分感激。
一、項(xiàng)目分析
兩個(gè)單片機(jī)都使用串口方式1進(jìn)行通信,并且必須保證兩單片機(jī)通信波特率完全一致,否則接受不到正確的數(shù)。在發(fā)送數(shù)據(jù)時(shí),向SBUF中寫(xiě)入一個(gè)數(shù)據(jù)后,使用 “while(!TI);” 等待是否發(fā)送完畢,因?yàn)楫?dāng)發(fā)送完畢后,TI被硬件置1,然后才退出 “while(!TI);” 接下來(lái)在將TI手動(dòng)清零,同理,在接受數(shù)據(jù)時(shí),在中斷服務(wù)程序中也需要將接受中斷標(biāo)志位RI置零。
二、程序設(shè)計(jì)
a完成發(fā)送,b完成接收。編寫(xiě)程序設(shè)置a,令SM0=0,SM1=1(串行口工作方式1)。設(shè)置b,令SM0=0,SM1=1,REN=1,使接收允許。
(1)a單片機(jī)程序[數(shù)據(jù)發(fā)送程序]
#include <reg51.h> //單片機(jī)頭文件//宏定義 #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;//函數(shù)聲明 void Usart_Init(void); void DelayMs(uint xms); void Send_Data(uchar Key_val); void Keyscan(void);//主函數(shù) void main() {while(1) //循環(huán){Keyscan();} }//串口中斷初始化 void Usart_Init(void) {TMOD=0X20;//定時(shí)器1方式2TH1=0xF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800TL1=0xF3;TR1=1;//打開(kāi)定時(shí)器SM0=0;//設(shè)置串口工作方式SM1=1;EA=1;//打開(kāi)總中斷ES=1;//打開(kāi)串口中斷 }//延時(shí)函數(shù) void DelayMs(uint xms) { uchar i,j; for(i=xms;i>0;i--)for(j=110;j>0;j--); }//發(fā)送數(shù)據(jù)函數(shù) void Send_Data(uchar Key_val) {SBUF=Key_val; //將要發(fā)送的數(shù)據(jù)存入發(fā)送緩沖器中while(!TI); //若發(fā)送中斷標(biāo)志位沒(méi)有置1(正在發(fā)送數(shù)據(jù)),就等待TI=0; //若發(fā)送完成,TI自動(dòng)置1,這里把它清零 }//按鍵函數(shù) void Keyscan(void) {uchar Val; //定義局部變量if(k1==0) //如果按下k1{DelayMs(10);//消抖if(k1==0) //確認(rèn)按下k1{Usart_Init(); Val=0;}while(!k1); //等待按鍵釋放Send_Data(Val); //發(fā)送“0”}if(k2==0) //如果按下k2{DelayMs(10);//消抖if(k2==0) //確認(rèn)按下k2{Usart_Init();Val=1;}while(!k2); //等待按鍵釋放Send_Data(Val); //發(fā)送“1”}if(k3==0) //如果按下k3{DelayMs(10);//消抖if(k3==0) //確認(rèn)按下k3{Usart_Init();Val=2; //發(fā)送“2”}while(!k3); //等待按鍵釋放Send_Data(Val);}if(k1==4) //如果按下k4{DelayMs(10);//消抖if(k4==0) //確認(rèn)按下k4{Usart_Init();Val=3; //發(fā)送“3”}while(!k4); //等待按鍵釋放Send_Data(Val);}if(k5==0) //如果按下k5{DelayMs(10);//消抖if(k5==0) //確認(rèn)按下k5{Usart_Init();Val=4;}while(!k5); //等待按鍵釋放Send_Data(Val); //發(fā)送“4”}if(k6==0) //如果按下k6{DelayMs(10);//消抖if(k6==0) //確認(rèn)按下k6{Usart_Init();Val=5;}while(!k6); //等待按鍵釋放Send_Data(Val); //發(fā)送“6”}if(k7==0) //如果按下k7{DelayMs(10);//消抖if(k7==0) //確認(rèn)按下k7{Usart_Init();Val=6;}while(!k7); //等待按鍵釋放Send_Data(Val); //發(fā)送“7”}if(k8==0) //如果按下k8{DelayMs(10);//消抖if(k8==0) //確認(rèn)按下k8{Usart_Init();Val=7;}while(!k8); //等待按鍵釋放Send_Data(Val); //發(fā)送“7”} }(2)b單片機(jī)程序[數(shù)據(jù)接收程序]
#include <reg52.h> //單片機(jī)頭文件//宏定義 #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;//函數(shù)聲明 void Uart_init();//主函數(shù) void main() {Uart_init(); //串口初始化while(1); }//串口初始化函數(shù) void Uart_init() {TMOD=0X20;//定時(shí)器1方式2TH1=0xF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800TL1=0xF3;TR1=1;//打開(kāi)定時(shí)器SM0=0;//設(shè)置串口工作方式SM1=1;REN=1;EA=1;//打開(kāi)總中斷ES=1;//打開(kāi)串口中斷 }//串口中斷服務(wù)函數(shù) 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; //出去接收到的數(shù)據(jù)RI=0; //清除接收中斷標(biāo)志位 }三、硬件設(shè)計(jì)
a單片機(jī)與b單片機(jī)連線(把這兩個(gè)程序分別燒寫(xiě)到兩塊板子上,然后用連接線分別連接兩個(gè)板子的發(fā)送引腳和接收引腳。)
a單片機(jī) → b單片機(jī)
TXD(P3.1) → RXD(P3.0)
RXD(P3.0) → TXD(P3.1)
GND → GND
四、功能實(shí)現(xiàn)展示
總結(jié)
本次課程設(shè)計(jì)我主要研究的是單片機(jī)雙機(jī)通信實(shí)驗(yàn),使我學(xué)習(xí)到了最大的是51單片機(jī)的串口中斷程序的編寫(xiě),在實(shí)驗(yàn)中需要用到兩個(gè)單片機(jī)作為主從機(jī)來(lái)控制信號(hào)的接受與發(fā)送。還學(xué)習(xí)到了單片機(jī)在使用中斷的時(shí)候,如果有中斷申請(qǐng)的話,硬件電路會(huì)自動(dòng)把單片機(jī)里接受發(fā)送中斷的TI和RI置1。雖然在這段時(shí)間里每天都那么繁忙,但是在這忙碌的過(guò)程中卻得到了許多的收獲。
堅(jiān)持不一定成功,但放棄就一定失敗!
總結(jié)
以上是生活随笔為你收集整理的两个51单片机之间进行串行通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机课艺术字四周型怎么弄,Word.文
- 下一篇: 计算机在艺术娱乐的应用,计算机技术在艺术