一、需要了解的寄存器
1.SCON:串行通信控制寄存器(可以字节寻址,也可以位寻址)
位地址9FH9EH9DH9CH9BH9AH99H98HSCONSM0SM1SM2(多机通信:【0:双机,1:多级】)REN(接受控制:【0:禁止,1为允许】)TB(发送数据第9位)RB(接收数据第9位)TI(发生中断标志位)RI(接收中断标志)PS:其中SM0和SM1为工作方式选择位,可选择四种工作方式:
SM0SM1方式说明波特率000移位寄存器fosc/1201110位异步收发器(8位数据)可变10211位异步收发器(9位数据)fosc/64或fosc/3211311位异步收发器(9位数据)可变PS:
(1)TI/RI在任何工作方式下都必须由软件清0
(2)单片机复位时,SCON所有位均清0
2.PCON:电源控制寄存器
PCOND7D6D5D4D3D2D1D0位名称SMODGF1GF0PDIDL(1)SMOD的作用:在串口工作模式为1、2、3下,其SMOD=1,则波特率加倍。SMOD=0,则波特率不加倍。
3.IE:中断允许控制寄存器
ES:串口中断控制允许位,ES=0,串口中断禁止,ES=1,串口中断允许
二、串口通信需要知识
1.异步通信和同步通信的区别
(1)异步通信:异步在于,发送方和接受方用的时钟不一样,控制其发送和接收。传输的字符有间隙,并且间隙任意。
(2)同步通信,同步在于,发送方和接收方要协调好各自的时钟,要能使得双方的时钟都能达到同步要求。而且传输的字符之间不留间隙。
2.串口通信的机制
(1)单工:只能发送或者接收,其中一种。
(2)半双工:能发送和接收,但是两者不能同时进行。
(3)全双工:能发送和接收,两者可以同时进行。
3.比特率:每秒传输的比特的位数。单位是:bit/s,简称:bps。
4.串行接口结构:
逻辑上:发送SBUF和接收SBUF是指的同一个。但是物理上,其分别指的不一样。
eg:SBUF=a;则该SBUF指的是发送SBUF.
a=SBUF,则该SBUF指的是接收SBUF将数据赋值给变量a了。
5.波特率的计算公式:
方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)
三、51串口通信实践代码:
/*
串口收发程序,把发送的数据接收后用P1口的LED灯以二进制的形式显示
并且蜂鸣器发出提示声,再把接收的数据加1发出。
操作流程:
(1)使用STC ISP 软件界面上的串口助手。选择对应的串口号
(2)设置波特率为9600,选择HEX模式发送和接收
*/
#include <reg52.h>#define uchar unsigned char
#define uint unsigned intsbit beep = P2^3;//蜂鸣器接口
uchar num;//发送暂存变量void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--);
}
void UART_init()
{TMOD = 0x20; //T1工作模式2,8位自动重装TH1 = 0xfd;TL1 = 0xfd; //波特率为9600TR1 = 1; //启动T1定时器SM0 = 0;SM1 = 1; //串口工作方式1 10位异步REN = 1; //串口允许接收EA = 1; //开总中断ES = 1; //开串口中断
}
void main()
{UART_init(); //串口初始化while(1);
}void UART() interrupt 4
{if(RI) //检测是否接收完成{num = SBUF; //num 取出接收缓冲器的值P1 = SBUF;beep = 0;delay(100);beep = 1;//蜂鸣器发出滴提示声num++;//把接收的数据加1并发送RI = 0;SBUF = num; while(!TI);TI = 0;}
}
/*
串口收发程序,把发送的数据接收后用P1口的LED灯以二进制的形式显示
并且蜂鸣器发出提示声,再把接收的数据加1发出。
操作流程:
(1)使用STC ISP 软件界面上的串口助手。选择对应的串口号
(2)设置波特率为9600,选择HEX模式发送和接收
*/
#include <reg52.h>#define uchar unsigned char
#define uint unsigned intsbit beep = P2^3;//蜂鸣器接口
uchar num;//发送暂存变量void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--);
}
void UART_init()
{TMOD = 0x20; //T1工作模式2,8位自动重装TH1 = 0xfd;TL1 = 0xfd; //波特率为9600TR1 = 1; //启动T1定时器SM0 = 0;SM1 = 1; //串口工作方式1 10位异步REN = 1; //串口允许接收EA = 1; //开总中断ES = 1; //开串口中断
}
void main()
{UART_init(); //串口初始化while(1);
}void UART() interrupt 4
{if(RI) //检测是否接收完成{num = SBUF; //num 取出接收缓冲器的值P1 = SBUF;beep = 0;delay(100);beep = 1;//蜂鸣器发出滴提示声num++;//把接收的数据加1并发送RI = 0;SBUF = num; while(!TI);TI = 0;}
}
更多推荐
串口,理论,通信
发布评论