基于AT89C52单工串行通信系统设计
串行通信基礎
計算機通信大多是指計算機與外部設備或者是計算機之間進行相關信息或者數據進行互換、交換。
串行通信主要有并行通信和串行通信兩種方式。在兩個或者多個微系統交換信息中多采用串行通信方式。
并行通信:通常是將數據字節的各位用多條數據線同時進行數據的傳輸。控制比較簡單,傳輸速度較快;長距離傳輸成本較高。
串行通信:是將數據字節分成一位一位的方式在一根傳輸線上逐個傳輸;傳輸速度沒有并行通信速度快,長距離傳輸成本較低。
串行通信方式
AT89C52單片機的串口一共有4種工作方式,其中工作方式0為同步通信方式外,其余的3種均為異步通信方式。本文章主要講的是異步通信方式中的一種,方式一。
串行通信數據傳輸的方向
數據傳輸方向可分為三種:單工、半雙工、全雙工。
單工指的是數據在傳輸的時候只能一個方向進行傳輸,不可以實現反向傳輸。簡單的說就是只能 A的數據傳輸到B,而B的數據不能傳輸到A。
半雙工指的是數據在傳輸的時候兩個方向都可以進行傳輸,不過要分時進行。也就是說只有 A的數據傳輸到B完成以后 B的數據才可以進行傳到A。
全雙工指的是數據可以同時進行雙向傳輸。也就是在A發送數據給B時,B也可以傳送數據個A。
本文主要介紹的是單工通信的使用示例,程序編寫與相關的仿真電路設計。
仿真電路設計以及單工傳輸工作原理
仿真電路通過proteus仿真軟件進行設計,矩陣鍵盤輸入1~16數字到單片機A,然后單片機A將數據發送到單片機B,通過單片機B連接的數碼管顯示出相應的數字。具體電路設計如下圖所示:
電路工作原理
如圖所示,單片機A、B雙機進行串行通信,雙機的RXD和TXD相互交叉相連,單片機A的P1 IO口連接矩陣按鍵,單片機B的P0 IO口連接一個2*8的數碼管,數碼管段選與位選通過74HC573八路輸出鎖存器進行控制。單片機A只設置為只能發送數據數據但不能接收數據的單工方式。當單片機A讀入到P1口有狀態變化后(也就是有數距輸入),讀取到后通過單片機A串行口發送到單片機B;當單片機B接收到數據后將數據送到P0進行輸出顯示。其中要注意的一點是雙方的晶振頻率均為11.0592MHz。
程序編寫
在編寫相關程序之前我們要先弄清楚單片機A、B兩者各要做什么事情。單片機A需要做的是發送數據和按鍵處理,單片機B需要做的是接收數據和顯示相關數據。所以我們編寫程序可以分開進行編寫。先寫單片機A后寫單片機B。
單片機A程序編寫
單片機A程序編寫可以分為兩個部分來處理,一是數據發送程序。二是按鍵處理程序。
按處理程序
//8x8矩陣按鍵 void dis() {u8 a;DPIO_Key=0x0f;if(DPIO_Key!=0x0f){delay(1000);// 消抖if(DPIO_Key!=0x0f){DPIO_Key=0x0f; //列掃描switch(DPIO_Key){case(0x0e) : num=4;break;case(0x0d) : num=3;break;case(0x0b) : num=2;break;case(0x07) : num=1;break;}DPIO_Key=0xf0; //行掃描switch(DPIO_Key){case(0xe0) : num=12+num;break;case(0xd0) : num=8+num;break;case(0xb0) : num=4+num;break;case(0x70) : num=num;break;}while((a<50)&&(DPIO_Key!=0xf0)) //判斷是否松開{delay(1000);a++;}} } } //數碼管停止顯示 void dis_Key() {if(Key1==0){delay(1000); //消抖if(Key1==0){num=0;}while(!Key1); //判斷按鍵是否松開} }串行通信發送數據程序
//串口通信初始化 void UARTint() {TMOD=0x20; //設置定時器1的工作方式,8位自動重裝TH1=253;TL1=253; //設置9600比特率TR1=1; //啟動定時器1PCON=0x00; //設置比特率不倍增SCON=0x40; //設置通信方式一,并設置成禁止接收數據 } //發送數據 void scen(u8 dat) {SBUF=dat; //將需要發送的數據賦給SBUF發送寄存器進行發送while(TI==0); //判斷數據是否發送完成,TI是發送標志位TI=0; //軟件清零數據發送完成標志位 }單片機B程序編寫
單片機B程序編寫也可以分為兩個部分來編寫,一是數碼管顯示程序,二是串行口數據接收程序。
主程序
//定義頭文件 #include <reg52.h>//定義數據類型 typedef unsigned int u16; typedef unsigned char u8;#define LED P0 //數碼管段碼位碼輸出sbit duan=P2^0; //段碼輸出選擇 sbit wei=P2^1; //位碼選擇輸出u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定義數碼管位碼 u8 code smgwei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定義數碼管段碼0~9 u8 shi,ge; //數據拆分收存儲值 u8 dat; //數據接收存儲變量//定義相關子程序 u8 receive(); void UARTint(); void dispaly();//毫秒級延時函數 void delay(u16 i) {while(i--); }//主程序 void main() {UARTint(); //串行口初始化while(1){dispaly(); //調用數碼管顯示程序receive(); //調用串行口接收程序} }數碼管顯示程序
void dispaly() {if(dat==0) //當dat變量等于0時數碼管不顯示,否則就顯示數值{LED=0xff; //消隱wei=1;LED=smgwei[0]; //發送位碼wei=0;duan=1;LED=0x00; //發送段碼duan=0;delay(50);LED=0xff; //消隱wei=1;LED=smgwei[1]; //發送位碼wei=0;duan=1;LED=0x00; //發送段碼duan=0;delay(50);}else //當dat不等于0數碼管顯示相應數值{LED=0xff; //消隱wei=1;LED=smgwei[0];wei=0;duan=1;LED=smgduan[shi]; //顯示十位duan=0;delay(50);LED=0xff; //消隱wei=1;LED=smgwei[1];wei=0;duan=1;LED=smgduan[ge]; //顯示個位duan=0;delay(50);} }數據接收程序
void UARTint() {wei=0;duan=0;TMOD=0x20; //設置定時器1的工作方式,8位自動重裝TH1=253;TL1=253; //設置9600比特率TR1=1; //啟動定時器1PCON=0x00; //設置比特率不倍增SCON=0x50; //設置通信方式一,并且設置成允許接收模式}u8 receive() //帶返回參數的數據接收程序 {while(RI==0); //RI接收標志{ RI=0;}dat=SBUF; //接收數據存儲到datshi=dat/10; //數據拆分出十位ge=dat%10; //數據拆分出個位return dat; //將數據返回出去,存儲到dat變量 }以上就是單工串行通信的資料,寫的不好,有不懂的和意見都可以留言哦。大家也可以根據這個實力進行修改成半雙工的串行通信。
總結
以上是生活随笔為你收集整理的基于AT89C52单工串行通信系统设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对SRE的理解
- 下一篇: 移动硬盘过满无法加载计算机,容量大的移动