從零開(kāi)始學(xué)單片機(jī)(九)串口通信
圖上是串口的結(jié)構(gòu)圖。
SBUF是數(shù)據(jù)緩沖寄存器,發(fā)送和接收用的是一個(gè)地址,但是不用擔(dān)心沖突,讀只能從接收緩沖區(qū),寫只能在發(fā)送緩沖區(qū)里。
寄存器SCON(SM0 SM1 SM2 REN TB8 RB8 TI RI)
SM0和SM1: 工作方式選擇(0-3),方式1和方式3使用T1產(chǎn)生波特率,方式0和方式2是固定速率。
SM2 :在方式2和方式3的多級(jí)通信控制位
REN:允許串行接收控制位,0禁止接收
TB8:對(duì)于方式2和方式3,是發(fā)送的第9位
RB8:對(duì)于方式2和方式3,是接收的第9位;對(duì)于方式1,是接收到的停止位
TI:發(fā)送中斷標(biāo)志,發(fā)送完一幀后置位,必須由軟件清零
RI:發(fā)送中斷標(biāo)志,接收完一幀后置位,必須由軟件清零
寄存器PCON(最高位SMOD)
SMOD=1時(shí),波特率加倍
程序:PC與單片機(jī)通信,PC發(fā)送字符,單片機(jī)接收后返回給PC
PC端程序,VB編寫,使用MSCOMM控件
Private Sub Command1_Click()
MSComm1.Output = Text1.Text 發(fā)送數(shù)據(jù)
End Sub
Private Sub Form_Load()
MSComm1.CommPort = 4 設(shè)置串口的端口號(hào)
MSComm1.Settings = "9600,n,8,1" 設(shè)置串口的波特率等參數(shù)
MSComm1.RThreshold = 1 設(shè)置最小接收的字節(jié)數(shù)
MSComm1.PortOpen = True 打開(kāi)串口
End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Text2.Text = Text2.Text & MSComm1.Input 接收數(shù)據(jù)
End Select
End Sub
單片機(jī)程序:
#include
void UartInit();
void UartSendChar(unsigned char ch);
void main(void)
{
UartInit();
while(1);
}
void UartInit()
{
SCON = 0x50; // SCON: 模式1
TMOD = 0x20; // TMOD: 定時(shí)器1 模式2
PCON = 0x00; // SMOD=0;
TH1 = 0xFD; // Baud:9600 波特率=2SMOD×fosc/(32×12×(256-TH1))
TL1 = 0xFD;
IE = 0x90;
TR1 = 1;
EA = 1;
}
void UartSendChar(unsigned char ch)
{
SBUF = ch;
while(TI==0);
TI=0;
}
void UartRec() interrupt 4
{
unsigned char ch;
ch = SBUF;
if(RI)
{
RI = 0;
UartSendChar(ch);
}
}
評(píng)論