完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位朋友帮忙看一下
下面是51单片机串口通信的一个数据发送例程,想问一下定时器T0关闭后程序还会继续运行进入中断函数吗?主要是中断函数中,串行接收处理起始位不为零,终止接收那里不太明白, else //串行接收数据 { if(cnt == 0) //处理起始位 { if(!PRXD) //起始位为零时,清零接受缓冲器,准备接受数据位 { RxdBuf = 0; cnt++; } else //起始位不为零时,终止接收 TR0 = 0; //关闭T0 } 假设遇到干扰信号,一开始PRXD=0,而中断里再次判断时PRXD=1,中断函数就执行上面else那段吧,主函数停留在while(!RxdEnd); 程序怎样继续往下运行呢?我目前想到的是可以再进入中断,但是从哪里开始计时就不明白了,或者其他地方我没考虑到吗,小白入门望指教 #include ***it PRXD = P3^0; //接收引脚定义 ***it PTXD = P3^1; //发送引脚定义 unsigned char TxdBuf = 0; //发送缓冲 unsigned char RxdBuf = 0; //接收缓冲 bit RxdOrTxd = 0; //指示当前状态是接收还是发送 bit RxdEnd = 0; //接收结束标志 bit TxdEnd = 0; //发送结束标志 void ConfigUART(unsigned int baud); //配置波特率函数 void StartRXD(); void StartTXD(unsigned char dat); void main() { EA = 1; //开总中断 ConfigUART(9600); // 设置波特率为9600 while(1) { while(PRXD); //检测低电平,如果是高电平,会一直等待,直到PRXD=0 StartRXD();启动接收 while(!RxdEnd); //RxdEnd=1时,十位数据接收完毕 StartTXD(RxdBuf+1); //数据接收完毕开始发送 while(!TxdEnd); //TedEnd=1时,十位数据发送完毕 } } void ConfigUART(unsigned int baud) //波特率配置函数 { TMOD &= 0xF0; //清零T0控制位 TMOD |= 0x02; // T0 设置为自动重装模式 TH0 = 256-(11059200/12)/baud; //计算T0重载值 } void StartRXD() //接收启动函数 { TL0 = 256-((256-TH0)>>1); //接收启动时T0设置为半个波特率周期,以便获得较稳定信号 ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 RxdEnd = 0; // 清零接受结束标志,开始接收数据 RxdOrTxd = 0; //当前状态设置为接收 } void StartTXD(unsigned char dir) //数据发送函数 { TxdBuf = dir; //待发送数据保存到缓冲区 TL0 = TH0; //定时器初值重载 ET0 = 1; //使 能T0中断 TR0 = 1; //启动T0 TxdEnd = 0; //清零发送结束标志,开始发送数据 PTXD = 0; //发送起始位 RxdOrTxd = 1; //当前状态设置为发送 } void Interrupt() interrupt 1 //中断函数 { static unsigned char cnt = 0; //接收或发送计数 if(RxdOrTxd) //串行发送数据 { cnt++; if(cnt <= 8) //低位先依次发送8位数据 { PTXD = TxdBuf & 0x01; TxdBuf >>= 1; } else if(cnt == 9) //8位数据发送完毕,停止发送 PTXD = 1; else //发送结束 { cnt = 0; //复位bit计数器 TR0 = 0; //关闭T0 TxdEnd = 1 ; //置发送标志为结束 } } else //串行接收数据 { if(cnt == 0) //处理起始位 { if(!PRXD) //起始位为零时,清零接受缓冲器,准备接受数据位 { RxdBuf = 0; cnt++; } else //起始位不为零时,终止接受 TR0 = 0; //关闭T0 } else if(cnt<=8) //处理8位数据位 { RxdBuf >>= 1; //低位在先,将之前接受的数据右移 if(PRXD) //接受脚为1时缓冲器最高位置1,为零时不处理 RxdBuf|= 0x80; cnt++; } else停止处理 { cnt = 0; //复位bit计数器 TR0 = 0; //关闭T0 if(PRXD) //停止位为1时,方认为数据有效 RxdEnd =1; //设置接受结束标志 } } } |
|
相关推荐
1个回答
|
|
相应的中断关闭之后是不会再进入中断服务函数了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11780 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 09:14 , Processed in 0.965069 second(s), Total 73, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号