完善资料让更多小伙伴认识你,还能领取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; |
|
|
|
恩,看到后面才知道,他在前面没说到所以我郁闷,虽然很久了,但还是谢谢你呀 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
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积木平台
11787 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 15:06 , Processed in 0.771037 second(s), Total 81, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号