❶ 51單片機的串列口有幾種工作方式它們的幀格式是如何規定的
串列口分四種工作方式,由SM0、SM1二位決定,其定義如下:
SM0、SM1 工作方式 功能描述 波特率
0 0 方式0 8位移位寄存器 Fosc/12
0 1 方式1 10位UART 可變
1 0 方式2 11位UART Fosc/64或fosc/32
1 1 方式3 11位UART 可變
(1)方式0:串列口的工作方式0為移位寄存器I/O方式,可外接移位寄存器,一擴展I/O口,也可外接同步I/O設備。
發送操作:當執行一條「MOV SBUF,A」指令時,啟動發送操作,由TXD輸出移位脈沖,由RXD串列SBUF中的數據。發送完8位數據後自動置TI=1.請求中斷。要繼續發送時,TI必須有指令清零。
接收操作:REN是串列口接收允許控制位。REN=0時禁止接收;REN=1時允許接收。當軟體將REN置「1」時,即開始從RXD埠以fosc/12波特率輸入數據,當接收到8位數據時,將中斷標志RI置「1」。再次接收數據之前,必須用軟體將RI清0。
(2)方式1:串列口位10位通用非同步介面。發送或接收一幀數據信息為10位,包括1位起始位「0」、8位數據位、1位停止位「1」。
發送數據:數據從TXD埠輸出,當數據寫入發送緩沖器SBUF時,就啟動發送器發送。發送完一幀數據後,置中斷標志TI=1,申請中斷,通知CPU可以發送下一個數據了。
接收數據:首先使REN=1(允許接收數據),串列口從RXD接收數據,當采樣到1至0跳變時,確認是起始位「0」,就開始接收一幀數據,當接收完一幀數據時,置中斷標志RI=1,申請中斷,通知CPU從SBUF取走接收到的數據
(3)方式2:串列口為11位非同步通信介面。發送或接收一幀信息包括1位起始位「0」、8位數據位、1位可編程位、1位停止位「1」。
發送數據:發送前,先根據通信協議由軟體設置TB8為「奇偶校驗位」或「數據標識位」,然後將要發送的數據寫入SBUF,即能啟動發送器。發送過程是由執行任何一條以SBUF為目的寄存器的指令而啟動的,把8位數據裝入SBUF,同時還把TB8裝到發送移位寄存器的第9位上,然後從TXD(P3.1)埠輸出一幀數據。
接收數據:先置REN=1,使串列口為允許接收狀態,同時還要將RI清「0」。然後再根據SM2的狀態和所接收到的RB8的狀態決定此串列口在信息到來後是否置R1=1,並申請中斷,通知CPU接收數據。當SM2=0時,不管RB8為「0」還是為「1」,都置RI=1,此串列口將接收發送來的信息。當SM2=1時,且RB8=1,表示在多機通信情況下,接收的信息為「地址幀」, 此時置RI=1, 串列口將接收發來的地址。當SM2=1時,且RB8=0,表示在多機通信情況下,接收的信息為「數據幀」, 但不是發給本從機的,此時RI不置為「1」,因而SBUF中接收的數據幀將丟失。
(4)方式3:為波特率可變的11位非同步通信方式,除了波特率有所區別之外,其餘方式都與方式2相同。
❷ 51單片機從電腦串口接收10位元組的數據,程序用c語言
可靠的接受程序!!從LZ 的display(a1......a10)看出來這程序就不咋樣,如果顯示函數 還是 用 延時做的,可靠的接受程序給LZ 也是 白瞎……
以下是 UART 驅動程序
/***10位非同步收發串口通訊驅動——火柴天堂作品-20130119***/
/***源程序硬體環境:52單片機,11.0592MHz晶振,定時器1作為波特率發生器,通訊波特率9600 bit/s***/
/******/
#define UART_H
#include"REG52.h" //包含52頭文件
#include"UART.h" //包含串口頭文件
#define th1 0xfa //6.51us at 11.0592MHz Fosc for 8bit auto reload mode
static uchar UART_DataR; //串口接收數據寄存器
static uchar bdata Flag=0; //標志位 寄存器
sbit UART_ReFlag=Flag^0; //串口接收標志位 0:無數據 1:新數據
sbit UART_SendFlag=Flag^1; //串口發送標志位 0:空閑中 1:發送中
void UART()interrupt 4 //串口中斷函數
{
if(RI) //若串口接收完成
{
RI=0; //清 串口接收溢出位
UART_DataR=SBUF; //將串口收到的數據存進 UART_DataR
UART_ReFlag=TRUE; //串口接收標志位 置位(有新數據)
}
if(TI) //若串口發送完成
{
TI=0; //清 串口發送溢出位
UART_SendFlag=FALSE; //清串口發送標志位(空閑中)
}
}
void UART_Init() //串口初始化函數
{
SCON=0x50; //選擇通訊方式:10位非同步收發,串口中斷使能
PCON=0x80; //波特率倍頻
TMOD&=0x0f; //定時器1控制位清0
TMOD|=0x20; //定時器1工作模式2(8位自重裝,做波特率發生器)
TH1=th1; //定時器初值
TL1=th1; //定時器初值
TR1=1; //開始計時
ES=1; //允許串口中斷
EA=1; //允許系統中斷
}
bit UART_SendByte(uchar send_data) //串口發送位元組函數,發送內容send_data,返回值:0 操作失敗,1操作成功
{
if(!UART_SendFlag) //若串口空閑中,則
{
SBUF=send_data; //將發送內容 送到 串口寄存器
UART_SendFlag=TRUE; //置位串口發送標志位(進入忙態)
return TRUE; //返回1,操作成功
}
return FALSE; //否則,返回0,操作失敗
}
uchar ASCII_ToHex(uchar ascii_data) //ASCII 轉 Hex 函數
{
uchar hex_data=0; //定義 Hex變數存儲轉換結果
if(ascii_data>='0' && ascii_data<='9') hex_data=ascii_data-'0'; //若 轉換內容為 字元'0-9',則轉成對應數字0-9
else if(ascii_data>='a' && ascii_data<='f') hex_data=ascii_data-'a'+10; //若 轉換內容為 字元'a-f',則轉成數字10-15
else if(ascii_data>='A' && ascii_data<='F') hex_data=ascii_data-'A'+10; //若 轉換內容為 字元'A-F',則轉成數字10-15
return hex_data; //返回轉換結果,非以上字元,不在Hex(0-F)范圍內,默認0
}
bit UART_ReadByte(uchar *p_data,bit data_mode) //串口讀位元組函數,返回值0 無數據,1 有數據,將data_mode模式(ASCII_Mode或HEX_Mode)轉成Hex結果存到p_data指向地址
{
if(!UART_ReFlag) return FALSE; //若無新數據,則返回 0(無數據)
UART_ReFlag=FALSE; //否則,清 串口接收標志位
if(data_mode==HEX_Mode) *p_data=UART_DataR; //Hex模式,將串口接收結果存到p_data指向地址
if(data_mode==ASCII_Mode) *p_data=ASCII_ToHex(UART_DataR); //ASCII模式,將串口接收結果轉成Hex後,存到p_data指向地址
return TRUE; //返回 1(有數據)
}
❸ AT89S51單片機串列口的4種工作方式各有什麼功能和特點
AT89S51單片機串列口有四種工作方式,分別是模式0、模式1、模式2和模式3,下面是各自的功能和特點:
1. 模式0:同步移位輸入/輸出方式
- 功能:在這種模式下,串列埠可以進行同步移位輸入和輸出,即每次只能輸入或輸出一個數據位。
- 特點擾孫:數據傳輸速率較慢,但在數據傳輸過程中,不需要外部時鍾源,因此成本較低。
2. 模式1:非同步移位輸入/輸出方式
- 功能:在這種模式下,串列埠可以進行非同步移位輸入和輸出,即可以一次性輸入或輸出多個數據位。
- 特點:數據傳輸速率較快,但需要外部時鍾源,因此成本較高。
3. 模式2:帶自動波特率檢測的非同步移位輸入/輸出方式
- 功能:在這種模緩盯鏈式下,串列埠可以進行非同步移位輸入和輸出,並自動檢測波特率。
- 特點:數據傳輸速率較快,且可以自動檢測波特率,但需要外部時鍾源,因此成本較高。
4. 模式3:多機通訊方式
- 功能:在這種模式下,串列埠可以進行多機通訊,可以同時收發數據。
- 特點:可以實現多機通訊和數據的同時收發則坦,但需要外部時鍾源,成本較高。
總的來說,不同的工作模式適用於不同的應用場景,需要根據具體的項目需求來選擇合適的工作模式。
❹ 51單片機工作在串列非同步通信方式,波特率為4800,每秒可以傳送多少位元組
假設每幀8位數據位,加上起始位和停止位,每幀就是10位。
每秒最多可以傳輸4800÷10 = 480位元組