51单片机之T2定时器串口通信

版权声明:本文为Trinity原创文章,未经Trinity允许不得转载 https://blog.csdn.net/Caoyang_He/article/details/88385971

最近在完成一个物联网的作业,使用stc89c52作为主控芯片,完成一个智能远程交通灯的设计,其中大部分代码都是用的别人现成的,但是我发现要使用远程通信,就要使用串口,但是T0和T1已经被占用了。
好在使用的是52芯片,比51要多一个定时器。所以我在网上也是看了很多资料,许多都不能运行,我在进行部分修改后,终于在keli和proteus上实现了仿真测试。以下是我的代码和设计的电路。


               		       
/*-----------------------------------------------------------------------------
* 实 验 名		 : RS232串口试验
* 实验说明     : 单片机串口接收数据控制灯亮灭
* 连接方式     : 
* 注    意		 : 该试验使用的晶振是11.0592
*******************************************************************************/

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

uchar PuZh[36] = "hello world";

//--定义使用的IO--//

sbit LED=P2^0;


//--声明全局函数--//   
void UsartConfiguration();
void Delay_1ms(uint i);


/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无 * 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
	uchar i;
  uchar receive_data;
	
  EA = 0;
	
  if(RI == 1) //当硬件接收到一个数据时,RI会置位
	{ 		
		RI = 0;
		receive_data = SBUF;//接收到的数据
			
		if(receive_data == '1')	 
		{
				LED =0;//接收到1亮灯
		}
		else
		{
				LED =1; //其他情况灯灭
		}
		
	}
		
		for(i=0; i<36; i++)
		{
			SBUF = PuZh[i];   //将要发送的数据放入到发送寄存器
			while(!TI);		    //等待发送数据完成
			TI=0;			        //清除发送完成标志位
			Delay_1ms(1);
		}
		EA = 1;
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		   : 主函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void main()
{

	UsartConfiguration();//初始化串口
	
	while(1);	
}
	
/*******************************************************************************
* 函 数 名       : UsartConfiguration()
* 函数功能		   : 设置串口
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void UsartConfiguration()
{	

	T2MOD = 0x01; 	//自动重载
	T2CON = 0x30; 	//T2用做发送接收时钟
	TH2 = 0xFF;  	//9600波特率,11.0592Mhz晶振
	TL2 = 0xDC; 
	RCAP2H = 0xFF; 
	RCAP2L = 0xDC; 
	SCON = 0x50; 	//串口方式1,1个起始位,1个停止位,8位数据,可变波特率
	PCON = 0X00;	//波特率不加倍
 	TR2 = 1;  		//启动T2 
	ES = 1;         //开串口中断
  	EA = 1;         //开总中断
}


/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms
* x * 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
  uchar x,j;
  
  for(j=0;j<i;j++)
    for(x=0;x<=148;x++);
}

由于不是用的自己电脑来画的图,所以就没有办法贴出图片,但是要是有空的话,我一定把图贴出来。但是我还说一下设计的大概思路,就是一个最小单片机系统RX端接compim的RX端,TX接compim的TX端,然后LED接P2口的0端。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Caoyang_He/article/details/88385971
今日推荐