蓝桥杯串口2应用

#include<reg51.h>

/* 串口2只能选定时器2作为波特率发生器 */

//注意串口2:RXD2~P1^0,TXD2~P1^1

//根据芯片手册说明,在单片机1T模式下(不12分频)串口在模式0(8位USART)波特率 = Sysclk/(65536-[T2H,T2L])/4
//这个宏定义就是根据波特率来就算定时器应该设定的初值
#define Baud_Rate(baud) (65536 - 11059200/4/baud) 

//定义寄存器
sfr AUXR = 0x8e; //辅助寄存器
sfr T2H = 0xD6;	 //定时器2的高八位寄存器
sfr T2L = 0xD7;	 //定时器2的低八位寄存器
sfr S2CON = 0x9a; //USART2控制寄存器
sfr S2BUF = 0x9b; //USART2数据寄存器

void usart2_Init(unsigned int baud){
	/*
	S2CON:(只介绍和这里相关的)
		最高位:模式选择位,0为模式0(默认),1为模式1
		第五位:允许串行口接受位
		最低位(S2RI):接收中断请求标志位
		第二位(S2TI):发送中断请求标志位
	*/
	S2CON=0x10;
	T2L = (unsigned char)(Baud_Rate(baud));
	T2H = (unsigned char)(Baud_Rate(baud)>>8);
	//开启定时器2 AUXR第五位是定时器2的开启位,第三位就是选择(当为1时)1T模式/12T模式
	//这里选择的是1T模式(不12分频),如果要用12T模式,模特率就要在后面的式子再除以12
	AUXR |= 0x14; 
}


void main(){
	//定义变量
	unsigned char dat;
	//初始化
	usart2_Init(9600);
	while(1){
	
			//S2CON最低位是接收标志位
			if(S2CON&0x01){
			S2CON&=0xfe; //清除接收标志位
			dat = S2BUF;
			S2BUF = dat;
			while((S2CON&0x02)==0); //等待发送完毕
			S2CON&=0xfd; //清除发送标志位
		}
		
	}

}















猜你喜欢

转载自blog.csdn.net/private_void_main/article/details/79695862