完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是郭天翔《新概念51单片机C语言教程》里的一个例子6.5.1,
#include #define uint unsigned int #define uchar unsigned char uchar flag,a,i; uchar code table[]="i get "; void init() { TMOD=0x20; TH1=0xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init(); while(1) { if(flag==1) { ES=0; //关闭串口中断 for(i=0;i<6;i++) { SBUF=table[i]; while(!ti); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser()interrupt 4 { RI=0; a=SBUF; flag=1; } 教程里的这个例子下载运行是,为什么在电复位时,在串口调试软件的接受发送缓冲区会自动输出table的“i get ”? 如果把if语句里的ES=0去掉,就不会这样。但是教程里说,如果在if语句里不把串口中断关掉,在接下来的发送数据完成后,会触发中断。flag又会值1,再次发送数据,这样会进入死循环。 可是我去掉ES=0这句后,结果是我给一次SBUF发送一次数据,接受区就输出一次,并没有出现死循环.... 哪位高手能告诉我??谢谢 |
|
相关推荐
6个回答
|
|
上电时 flag没有清0, flag里的数据不确定。去掉ES=0,不会进入死循环,但a里的数据就不是电脑发下来的数据了,因为每次TI=1时都会触发中断。如果flag=0;这句摆在前面就会进入死循环。
|
|
|
|
你还是先看看单片机关于这块的工作原理吧。。。
|
|
|
|
{:9:}{:9:}{:9:}{:9:}{:9:}{:9:}{:9:}{:9:}{:9:}{:9:}
|
|
|
|
|
|
|
|
你往下看到例6.6.1中有解释这问题;
1,将REN=1; SM0=0; SM1=1; 改成:SM0=0; SM1=1; REN=1; 或者 2,不要对SCON寄存器进位操作,而是直接对整个寄存器进行设置,如SCON=0x50; |
|
|
|
恩,看到后面才知道,他在前面没说到所以我郁闷,虽然很久了,但还是谢谢你呀 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序
218 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十七章 image图像对比实验
204 浏览 0 评论
231 浏览 0 评论
449 浏览 0 评论
关于RT-Thread studio添加freemodbus控件失败的问题
628 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11635 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-7 22:31 , Processed in 0.644019 second(s), Total 81, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号