串口通信是單片機(jī)一個(gè)重要的部分,單片機(jī)和PC,單片機(jī)和單片機(jī)之間的通信大都用串口。單片機(jī)的串口是全雙工異步串口通信方式。通過TXD(P3.1)發(fā)送,RXD(P3.0)引腳接收輸入。串口傳送數(shù)據(jù)是一幀一幀發(fā)送的,它有四種工作方式,同時(shí)也可以做并行I/O的擴(kuò)展。 圖上是串口的結(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 '打開串口 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); } |
|