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++); } }