51单片机|51单片机 (6)串口中断通信+定时器2串口中断
【若有疑问错误或版权等问题请联系我】
【转载请注明出处:http://blog.csdn.net/leytton/article/details/48442129】
【51单片机|51单片机 (6)串口中断通信+定时器2串口中断】51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2
#include 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++);
}
}
转载于:https://www.cnblogs.com/leytton/p/8253344.html
推荐阅读
- 单片机|单片机初学者做项目为什么这么难(单片机初学者心得有哪些)
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- 单片机|keil把源代码生成lib的方法
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- 单片机|Arduino、arm、树莓派、单片机四者有什么不同()
- axios配置和实现请求中断
- LUA|单片机脚本语言移植lua到stm32MDK
- Android|Android 应用与HC-06蓝牙单片机控制LED灯(下)
- 驱动调试小结
- 微商怎么推广(订单才不会中断?)