1、AT89S52单片机 串行通信 概念性部分
2、AT89S52单片机 串行通信配置时用到的寄存器
串行通信的基础配置:
配置1:串行口控制寄存器 SCON (98H)
SCON :
SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
-------------------------------------------------------------------------------------------------------------------
SM0 SM1
0 0 : 方式0 : 8位移位寄存器。
波特率固定为: fosc/12 (即:一个机器周期)
经常配合“串入并出”、“并入串出”移位寄存器一起使用扩展接口。
如74HC164 、 74hc165 等。
0 1 : 方式1 : 10位异步收发 (1+8+1位)。波特率可变。
注意:起始位0和结束位1都是单片机自动加上去的,发送端自动
添加,接收端自动去掉。
1 0 : 方式2 : 11位异步收发 。(1+8+1+1位)
波特率固定为:focs * 1/32 或 1/64
1 1 : 方式3 : 11位异步收发。(1+8+1+1位)。波特率可变。
-------------------------------------------------------------------------------------------------------------------
SM2 : 串行口通信的控制位。(作为方式2、3的附加控制位)
-------------------------------------------------------------------------------------------------------------------
RB8 : 在方式2、3中是:收到的数据的第九位。
多机通信时:RB8 = 0 :表示接收到的是数据
= 1 :表示接收到的是地址
TB8 : 在方式2、3中是:发送的数据的第九位。
多机通信时:RB8 = 0 :表示发送的是数据
= 1 :表示发送的是地址
RB8 、TB8 也作为接收发送的奇偶校验位。
-------------------------------------------------------------------------------------------------------------------
REN : 串行口接收数据允许位。
= 1 :可以接收数据;
= 0 :禁止接收数据。
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
SMOD | — | — | — | GF1 | GF0 | PD | IDL |
-------------------------------------------------------------------------------------------------------------------
SMOD :在串行通信方式1、2、3中,是波特率加倍位。
= 0 :波特率不加倍(书写为:PCON = 0X00 ;)
= 1 :波特率加倍(书写为:PCON = 0X80 ;)
-------------------------------------------------------------------------------------------------------------------
注意:PCON寄存器只有SMOD这一位和串行通信有关。
PCON寄存器不能按位寻址,只能整体访问。
即:只能书写位:PCON = 0X80 ; PCON = 0X00 ;(当然这只是在设置串行通信的时候)
-------------------------------------------------------------------------------------------------------------------
串行通信工作在中断模式的配置:
配置3:中断允许寄存器 IE (0A8H) (串口工作在中断模式下时配置)
IE :
EA | — | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
-------------------------------------------------------------------------------------------------------------------
EA : 总中断开关
= 1 时,允许有中断产生 , = 0 时,禁止全部中断
各具体中断开关 :ET2 ES ET1 EX1 ET0 EX0
= 1 , 开对应中断 , =0时,禁止对应中断
-------------------------------------------------------------------------------------------------------------------
配置4:中断优先级控制寄存器 IP (0B8H)(选择性配置)
IP :
— | — | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
-------------------------------------------------------------------------------------------------------------------
= 1 设置为高优先级
= 0 设置为低优先级
不设置:默认为低优先级
-------------------------------------------------------------------------------------------------------------------
定时器T1产生波特率时的配置(此时T1不能工作在中断模式下,方式2,8位自动重装)
配置5:定时器方式寄存器 TMOD (89H)
TMOD : (T1----T0)
GATE | C/T~ | M1 | M0 | GATE | C/T~ | M1 | M0 |
------------------------------------------------------------------------------------------------------
产生串行通信的波特率的设置:TMOD = 0X20 ;
(下方关于TMOD的信息仅供参考理解)
------------------------------------------------------------------------------------------------------
M1 ,M0
= 0 0 工作方式0:13位定时器(主要和老单片机8048、8748等兼容);
= 0 1 工作方式1:16位定时器;
= 1 0 工作方式2: 可自动重装的8位定时器;
= 1 1 工作方式3: 将T0分为2个8位的定时器,但此时T1不能工作。
------------------------------------------------------------------------------------------------------
C/T~ : 定时器/计数器 选择位
= 1 : 外部事件计数器 (对T0/T1对应管脚的负脉冲进行计数)
= 0 : 片时钟定时器 (对机器周期脉冲计数来实现定时)
------------------------------------------------------------------------------------------------------
GATE : 门控置位
= 0 : Timer的启动/停止由软件对 TR0/TR1 写 1 或 0 来控制
= 1 : Timer的启动/停止由外部中断INTx 和 软件对TRx写 1 或 0 共同控制
(INTx 和 TRx 同时为1时,Tx运行,否则不运行)
------------------------------------------------------------------------------------------------------
配置6:定时器/中断控制寄存器 TCON (88H)
TCON :
TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
------------------------------------------------------------------------------------------------------
产生串行通信的波特率的设置:TR1 = 1 ;
(下方关于TCON的信息仅供参考理解)
---------------------------------------------------------------------------------------------------------
TF1 、TF0 : 定时器0、1溢出中断申请标志位
= 0 没溢出 , = 1 溢出-->申请中断-->进入中断后标志位自动清零
IR1 、 IR0 : 定时器运行的启动/停止控制位
= 0 停止运行 , = 1 启动定时器
---------------------------------------------------------------------------------------------------------
IE0 、IE1 : 外部中断的中断请求标志位
= 0 无外部中断申请 , =1有外部中断INT0 或 INT1中断申请
IT0 , IT1 : 外部中断请求的触发方式的设置位
= 0 低电平触发 , = 1 负跳变触发(下降沿触发)
---------------------------------------------------------------------------------------------------------
3、串行通信初始化函数
01、串行通信,查询模式,收发数据
/******************************************************************************
* 名称:Serial_Init()
* 功能:初始化串口 ,工作方式1,波特率9600
* 参数:无
* 返回:无
******************************************************************************/
void Serial_Init(void)
{
/*-------------串行通信初始化,定时器T1产生波特率,工作方式2------------*/
//1、配置串口控制寄存器 SCON (98H)
// SCON : SM0, SM1, SM2, REN, TB8, RB8, TI, RI
SCON = 0x50 ; // 0101 0000 工作方式1,10位异步接发,波特率自定,
// 起始位和停止位芯片自动加上和去掉,用户只需发送8位数据就行
// REN 串行口接收允许控制位
//2、配置电源控制寄存器 PCON (97H) 和波特率相关 , 寄存器PCON不能按位赋值
// PCON : SMOD, - , - , - , GF1, GF0, PD, IDL
PCON = 0x80 ; //波特率加倍 (不加倍,可不配置PCON,或 PCON = 0x00 ;)
//3、配置中断允许寄存器 IE (0A8H)
// IE: EA, - , ET2, ES, ET1, EX1, ET0, EX0
/*---若要串行通信工作在中断的状态下,则按一下配置,否则不配置寄存器IE---*/
//EA = 1 ; //开总中断
//ES = 1 ; //允许串口ES产生中断
//4、配置定时器T1,产生自定的波特率
//4.1、配置定时器方式寄存器 TMOD :
// TMOD: GATE, C/T~, M1, M0,| GATE, C/T~, M1, M0 (T1 | T0)
TMOD = 0x20 ; //0010 0000 :T1 定时器 ,工作方式2: 8位自动重装定时器
//4.2、给定时器赋初值 :
TL1 = 0xFA ; //定时器T1产生波特率:9600
TH1 = TL1 ;
//4.3、配置 定时器/中断 控制寄存器 TCON :
// TCON: TF1, TR1, TF0, TR0,| IE1, IT1, IE0, IT0
TR1 = 1 ; //运行定时器T1
}
02、串行通信,查询模式,只发送不接收
其实就是在上面的初始化函数中关掉REN : REN = 0 ;
/******************************************************************************
* 名称:Serial_Init()
* 功能:初始化串口 ,工作方式1 ,波特率9600
* 参数:无
* 返回:无
******************************************************************************/
void Serial_Init(void)
{
/*-------------串行通信初始化,定时器T1产生波特率,工作方式2------------*/
//1、配置串口控制寄存器 SCON (98H)
// SCON : SM0, SM1, SM2, REN, TB8, RB8, TI, RI
SCON = 0x40 ; // 0100 0000 工作方式1,10位异步接发,波特率自定,
// 要用的位将其置 1 ;不用的位将其默认为 0 ;
// 起始位和停止位芯片自动加上和去掉,用户只需发送8位数据就行
// REN 串行口接收允许控制位 = 1 ,允许接收数据
// = 0 , 禁止接收数据
//2、配置电源控制寄存器 PCON (97H) 和波特率相关 , 寄存器PCON不能按位赋值
// PCON : SMOD, - , - , - , GF1, GF0, PD, IDL
PCON = 0x80 ; //波特率加倍 (不加倍,可不配置PCON,或 PCON = 0x00 ;)
//3、配置中断允许寄存器 IE (0A8H)
// IE: EA, - , ET2, ES, ET1, EX1, ET0, EX0
/*---若要串行通信工作在中断的状态下,则按一下配置,否则不配置寄存器IE---*/
//EA = 1 ; //开总中断
//ES = 1 ; //允许串口ES产生中断
//4、配置定时器T1,产生自定的波特率
//4.1、配置定时器方式寄存器 TMOD :
// TMOD: GATE, C/T~, M1, M0,| GATE, C/T~, M1, M0 (T1 | T0)
TMOD = 0x20 ; //0010 0000 :T1 定时器 ,工作方式2: 8位自动重装定时器
//4.2、给定时器赋初值 :
TL1 = 0xFA ; //定时器T1产生波特率:9600
TH1 = TL1 ;
//4.3、配置 定时器/中断 控制寄存器 TCON :
// TCON: TF1, TR1, TF0, TR0,| IE1, IT1, IE0, IT0
TR1 = 1 ; //运行定时器T1
}
03、串行通信,中断模式,收发数据
/******************************************************************************
* 名称:Serial_Receive()
* 功能:从串口接收一个字节的数据(8位)
* 参数:无
* 返回:unsigned char get_data :返回接收到的数据
******************************************************************************/
unsigned char Serial_Receive(void)
{
unsigned char get_data ;
if(RI == 1) //RI == 1 表示有数据从串口传来,暂时存放在SBUF寄存器中
{
RI = 0 ; //清空串行接收数据申请中断标志位
get_data = SBUF ;
P0 = get_data ; //P0口的LED灯显示从串口接收的数据
Serial_Send(get_data) ; //调用函数将接收到的数据通过串口发送出去
return get_data ; //将串口接收到那朵数据作为函数的返回值
}
}