51单片机复习003

1、AT89S52单片机 串行通信 概念性部分










2、AT89S52单片机 串行通信配置时用到的寄存器

串行通信的基础配置:


配置1:串行口控制寄存器  SCON  (98H)

SCON : 

SM0SM1SM2RENTB8RB8TIRI

-------------------------------------------------------------------------------------------------------------------

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 :禁止接收数据。

-------------------------------------------------------------------------------------------------------------------

RI、TI : 串行口 接收 / 发送 申请中断标志位
     = 0 :申请中断;
     = 1 :不申请中断。

方式0时:第8位发送或接收完毕时自动置位;
其他方式:发送或接收停止位之前置位。
都是由硬件自动置位,需要由软件进行清零。

-------------------------------------------------------------------------------------------------------------------

配置2:电源控制寄存器  PCON  (97H)
PCON : 
SMODGF1GF0PDIDL

-------------------------------------------------------------------------------------------------------------------

SMOD :在串行通信方式1、2、3中,是波特率加倍位

= 0 :波特率不加倍(书写为:PCON = 0X00 ;)

= 1 :波特率加倍(书写为:PCON = 0X80 ;)

-------------------------------------------------------------------------------------------------------------------

注意:PCON寄存器只有SMOD这一位和串行通信有关。

   PCON寄存器不能按位寻址,只能整体访问。

即:只能书写位:PCON = 0X80 ;  PCON = 0X00 ;(当然这只是在设置串行通信的时候)

-------------------------------------------------------------------------------------------------------------------

串行通信工作在中断模式的配置:

配置3:中断允许寄存器 IE  (0A8H) (串口工作在中断模式下时配置)

IE :

EAET2ESET1EX1ET0EX0

-------------------------------------------------------------------------------------------------------------------

EA : 总中断开关

       = 1 时,允许有中断产生 , = 0 时,禁止全部中断

各具体中断开关 :ET2 ES ET1 EX1 ET0 EX0

       = 1 , 开对应中断 , =0时,禁止对应中断

-------------------------------------------------------------------------------------------------------------------

配置4:中断优先级控制寄存器 IP  (0B8H)(选择性配置)

IP : 

PT2PSPT1PX1PT0PX0

-------------------------------------------------------------------------------------------------------------------

          = 1 设置为高优先级

          = 0 设置为低优先级

  不设置:默认为低优先级

-------------------------------------------------------------------------------------------------------------------

定时器T1产生波特率时的配置(此时T1不能工作在中断模式下,方式2,8位自动重装)

配置5:定时器方式寄存器 TMOD  (89H)

TMOD : (T1----T0)

GATEC/T~M1M0GATEC/T~M1M0

------------------------------------------------------------------------------------------------------

产生串行通信的波特率的设置: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 : 

TF1TR1TF0TR0IE1IT1IE0IT0

------------------------------------------------------------------------------------------------------

产生串行通信的波特率的设置: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 ;	//将串口接收到那朵数据作为函数的返回值
	}

}








  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值