51单片机 (6)串口中断通信+定时器2串口中断

【若有疑问错误或版权等问题请联系我】 

【转载请注明出处:http://blog.csdn.net/leytton/article/details/48442129

51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2

#include <reg52.h>


void DelayMs(unsigned int i);
void SerialInit();
void SendByte(unsigned char sbyte);
void SendString(unsigned char *pstr);


void main(void)
{
		SerialInit();
		while(1);	  //注:必需要无限循环
}


/*
//单片机时钟周期:11.0592MHz   以时钟1作为波特率发生器
void SerialInit(){
 TMOD=0x20;   //设置T1工作方式为方式2
 TH1=0xfd; //给定时器高位装初值
 TL1=0xfd; //给定时器低位装初值
 TR1=1;  //开定时器
             //以上是设置波特率
 SM0=0;  //设置串口通讯方式为方式1
 SM1=1;  
 REN=1;  //串口是否接收数据的开关

 EA=1; //总中断打开,采用查询法时不用打开中断
 ES=1; //串口中断开关,采用查询法时不用打开中断
}
*/
//单片机时钟周期:11.0592MHz	   以时钟T2作为波特率发生器
void SerialInit(){
 	 PCON &= 0x7F;      //波特率不倍速 SMOD=0
     SCON = 0x50;       //方式1,8位数据,可变波特率,接收允许
     T2CON  = 0x34;   
     RCAP2H = 0xFF;    
     RCAP2L = 0xDC;  
     TH2    = 0xFF;  
     TL2    = 0xDC;
	   
	 EA=1; //总中断打开,采用查询法时不用打开中断 
     ES = 1;          //串口中断开关,采用查询法时不用打开中断

}


//串口中断函数:
void SerialPortInte(void) interrupt 4 //采用串口中断法收发数据
{
	 unsigned char rbyte;
	 if(RI){     //RI=1,判定为串口接收到了数据,RI要清零,
         RI=0;
		 rbyte=SBUF; 
		 if(rbyte==0x0A){ 	  
		    SendString("换行");
		 }else if(rbyte==0x0D){
		 	SendString("回车");
		 }else{
		 	SendByte(rbyte); 
		 }
		 	
     }

}

//串口发送一个字节:
void SendByte(unsigned char sbyte)
{ 
     SBUF=sbyte; //发送数据
     while(!TI); //等待发送完成
     TI=0; //清零发送标志位
}
 
//串口发送一个字符串:
void SendString(unsigned char *pstr) //定义指针
{
     while(*pstr!='\0') //字符串是否发完
     {
         SendByte(*pstr);//发送字符串数据
         pstr++; //指向下一个字符
     }
}

void DelayMs(unsigned int i)  //延时i ms
{
    unsigned int j;
    while(i--)
    {
        for(j = 0; j < 125; j++);
    }
}


posted @ 2015-09-14 18:55  Leytton  阅读(799)  评论(0编辑  收藏  举报