51单片机学习笔记(六)_串口中断通信+定时器2串口中断
时间:11-20
来源:互联网
点击:
51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2
#includevoid 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工作方式为方式2TH1=0xfd; //给定时器高位装初值TL1=0xfd; //给定时器低位装初值TR1=1; //开定时器//以上是设置波特率SM0=0; //设置串口通讯方式为方式1SM1=1; REN=1; //串口是否接收数据的开关EA=1; //总中断打开,采用查询法时不用打开中断ES=1; //串口中断开关,采用查询法时不用打开中断}*///单片机时钟周期:11.0592MHz 以时钟T2作为波特率发生器void SerialInit(){PCON &= 0x7F; //波特率不倍速 SMOD=0SCON = 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++);}}
51单片机串口中断通信定时 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)