序列通訊原理及串列埠程式設計實驗
阿新 • • 發佈:2019-01-23
一、兩種通訊方式概念
1.並行通訊
- 傳輸原理:並行通訊時資料的各個位同時傳送,以位元組為單位並行傳輸
- 優點:並行通訊速度快,傳輸的資料寬度可以是1~128位,甚至更寬
- 缺點:並口上導線之間資料同步難處理,佔用引腳資源多
- 傳輸原理:序列通訊的資料是一位一位地址進行傳輸的,在傳輸中每一位資料都佔據一個固定的時間長度。
- 優點:序列通訊傳輸線少,佔用引腳資源少,成本低,適合遠距離傳送
- 缺點:速度相對較慢
- 單工通訊:資料僅能從一臺裝置到另一臺裝置進行單一方向的傳輸。
- 半雙工通訊:資料可以從一臺裝置到另一臺裝置進行傳輸,也可以相反方向傳輸,但不能在同一時刻雙向傳輸資料。
- 全雙工通訊:資料可以在同一時刻從一臺裝置到另一臺裝置進行傳輸,也可以進行相反方向的傳輸,即可以同時雙向傳輸資料。
非同步通訊是指資料是以字元為單位i進行傳送的,字元與字元間的傳送是完全非同步的,位與位之間的傳送基本上是同步的。非同步通訊時,資料是一幀一幀傳送的,每幀資料包含有起始位(“0”)、資料位、奇偶校驗位和停止位(“1”),每幀資料的傳送靠起始位來同步。
3.同步序列通訊方式
同步通訊是指同步傳輸採用字元塊的方式,字元與字元之間、字元內部的位之間都同步,減少了每個字元的控制和錯誤檢測資料位,因而可以具有較高的傳輸速率。
三、串列埠程式設計實驗
1、SCON暫存器工作方式
位 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
功能 |
SM0 |
SM1 |
SM2 |
REN |
TB8 |
RB8 |
TI |
RI |
- RI:接收中斷標誌位——接收結束時,會由硬體置1,向CPU發出中斷請求。(要由軟體復位)
- TI:傳送中斷標誌位——傳送結束時,會由硬體置1,向CPU發出中斷請求。要由軟體復位)
- TB8:用來存放傳送的第9位。
- RB8:用來存放接收的第9位。
- REN:是序列接收允許位——0時:允許序列接收;1時:禁止序列接收
SM0 |
SM1 |
方式 |
說明 |
波特率 |
0 |
0 |
0 |
移位暫存器 |
fosc/12 |
0 |
1 |
1 |
10位非同步收發(8位資料) |
可變 |
1 |
0 |
2 |
11位非同步收發(9位資料) |
fosc/64或fosc/32 |
1 |
1 |
3 |
11位非同步收發(9位資料) |
可變 |
位 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
功能 |
SMOD |
- |
- |
- |
- |
- |
- |
- |
- PCON是沒有位定址的,也就是說不能直接操作SMOD要直接操作PCON暫存器。
- SMOD:是波特率是否加倍的選擇位。——0時:波特率不加倍;1時:波特率加倍。
#include <reg51.h>
#include <intrins.h>
#include "array.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
/*******************************************************************************
* 函式名 :UsartConfiguration()
* 函式功能 :設定串列埠
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
void UsartConfiguration()
{
SCON=0X50; //設定為工作方式1
TMOD=0X20; //設定計數器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //計數器初始值設定,注意波特率是4800的
TL1=0XF3;
ES=1; //開啟接收中斷
EA=1; //開啟總中斷
TR1=1; //開啟計數器
}
void main()
{
UsartConfiguration();
while(1)
{
}
}
/*******************************************************************************
* 函式名 :Delay(unsigned int i)
* 函式功能 : 延時函式
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
void Usart() interrupt 4
{
unsigned char receiveData;
receiveData=SBUF; //出去接收到的資料
RI = 0; //清除接收中斷標誌位
SBUF=receiveData; //將接收到的資料放入到傳送暫存器
while(!TI); //等待發送資料完成
TI=0; //清除傳送完成標誌位
}