STC系列芯片的串口通信编程

STC系列芯片的串口通信编程

本人使用的是基于STC15F2K60S2芯片的开发板。

开发板上有关串口通讯的有:TMOD(定时器寄存器)、CSON(串口通信寄存器)、PCON(开发板电源控制寄存器)以及与51系列单片机区别最大的AUXR(分频寄存器)四种,其中以SCON最重要,其他的只是稍微设置下即可,串口通信初始化乍看很难,但沉下心来仔细研究,相信什么都难不倒我们。

1、TMOD(定时器寄存器)
有单片机基础的想必都知道应该怎么设置,这里我设置的是定时器1,自动重载模式

	TMOD=0x20;  //定时器1工作方式2(自动重载)
	TH1=0XFD;
	TL1=0XFD;  //设置初始值,该初值在晶振频率为11.0592Hz的前提下波特率为9600
    //PCON=0X80;   //波特率加倍,加倍为9600    可选用

波特率的计算比较繁琐,我们这里直接使用了最常用的波特率设置

2、SCON(串口通信寄存器)
串口通信最重要的寄存器,可位寻址
CSON
关于SM0,SM1:我们在这里只需要了解SM0,SM1是设置串口的工作模式的,这个大部分情况我们选择模式2,即SM0=0,SM1=1;

关于REN:串口是否允许中断,这里我们选择允许,即REN=1;

关于TI,RI,主要是在程序内部使用,作为串口读写数据完毕的标志,串口读写完毕后会由硬件将他们置1,编程中需我们手动清零
STC系列芯片的串口通信编程_第1张图片
STC系列芯片的串口通信编程_第2张图片

	SM0=0;
	SM1=1;    //串口通信选择方式2
	REN=1;   //开启串口通信
	//SCON=0x50;     两者等价

3、PCON(开发板电源控制寄存器)
PCON第7位控制波特率是否倍频,即PCON=0x80,波特率加倍,PCON=0x00或者不设置,波特率不加倍

4、AUXR(分频寄存器)
最后一个,也是STC芯片和51芯片在串口通信上不同的地方
STC系列芯片的串口通信编程_第3张图片常用的就最后两位,选择定时器0或者定时器1是否12分频
我们这里选择定时器1为1T,所以设置AUXR=0x40;
Ps:一定注意,STC系列的芯片一定要设置AUXR,AUXR=0x40;也好,AUXR=0x00;也好,一定要设置!!!不然串口通信无法实现,本人亲测

最后,贴出我的代码,希望对需要的人有所帮助

/*************************************************************************
*测试程序:
*程序功能:上位机每发送一个字节开发板的全部led灯都切换一次状态
*开发板led初始状态为熄灭

*标签:串口读取程序 循环查询
*************************************************************************/

#include "STC15F2K60S2.H"

#define Y4 P2=((P2&0x1f)|0x80)
#define Y5 P2=((P2&0x1f)|0xa0)
#define Y6 P2=((P2&0x1f)|0xc0)
#define Y7 P2=((P2&0x1f)|0xe0)

void uart_init()
{
//	SM0=0;
//	SM1=1;    //串口通信选择方式2
//	REN=1;   //开启串口通信
	SCON=0X50;
	
	TMOD=0x20;  //定时器1工作方式2(自动重载)
	TH1=0XFD;
	TL1=0XFD;  //设置初始值,该初值在晶振频率为11.0592Hz的前提下波特率为9600
	
	TR1=1;  //开启定时器1
	EA=1;  //CPU允许中断
  ES=1; //允许串口中断
  PCON=0X80;   //波特率加倍,为9600
	AUXR = 0x00;
}



int i=1;

void main()
{
	Y4;P0=0xff;
	Y5;P0=0x00;
	uart_init();
	while(1)
	{
		while(!RI);  //当接收到 字节接收完成 的标志时
		if(i%2==1){Y4;P0=0x00;}
		else {Y4;P0=0xff;}
		i++;
		RI=0;   //软件复位
	}
}

``

你可能感兴趣的:(STC系列芯片的串口通信编程)