完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我先说现象在设置串行口工作方式SCON的时候,我用的是位寻址顺序为这样 REN=1; SM0=0; SM1=1; 每次复位,RI就自动置1,就,进入串口中断了 但是改为 SM0=0; SM1=1; REN=1; 就ok 我的理解是这样的:这三位都是串行口控制寄存器SCON里的,单片机刚上电时SCON被清零,因为串口方式为0,穿行口为同步移位寄存器的输入/输出方式,当执行完REN = 1这条语句后,它便直接开始从RXD引脚接收数据,并不管它连接的系统有无发送数据这是SM0和SM1还未***作,可单片机串口寄存器已经收到数据,并且已经产生了串口中断。REN位置不同,产生的疑问 但是问题来了,我直接 SM0=0; SM1=0; REN=1; 或者 REN=1; SM0=0; SM1=0; 不会出现复位就进入串口中断的现象??既然是串口方式0所引起的,我直接设为串口方式0,但没有出现位就进入串口中断的现象??和困惑 |
|
相关推荐
11个回答
|
|
一般串口中断的使能都在各种配置之后,防止你说的还没配置完成就产生了中断。还有一个在开启中断之前应该先清除一下接收中断标志位。
|
|
|
|
这应该是一个单片机复位后如何初始化的问题,以及总中断使能该何时打开的问题
|
|
|
|
时序图上应该有画到吧??
|
|
|
|
你换成查询法试试看,我觉得你程序架构有问题。
|
|
|
|
本帖最后由 左天任 于 2017-4-11 22:02 编辑
我试了,加上这两句还是一样 TI=0; RI=0; 你的观点是:没有配置使能接受可能是为触发中断?但是我加上了接收标志清零RI=0;,还是一样,很奇怪 void init() { TMOD=0x20; //定时器工作方式,选择了定时器1,工作方式2 八位初值自动重装的8位定时器。 TH1=0xfd; //定时器1初值 ,设置波特率为9600 晶振11.0529MHZ? TL1=0xfd; TR1=1; //开启定时器1 TI=0; RI=0; REN=1; //允许串行口接收位 SM0=0; SM1=1; //10位异步接收,(8位数据)波特率可变 EA=1; //允许中断(总闸) ES=1; //允许串口中断 } |
|
|
|
本帖最后由 左天任 于 2017-4-11 22:34 编辑
所有的代码,我只改变REN,SM0,SM1复制的顺序,运行的结果不同。 一.初始化的时候,这样写,每次复位,RI就自动置1,就,进入串口中断了,和SCON|=0x50赋值不一样 REN=1; //允许串行口接收位 SM0=0; SM1=1; 二.把串口接受位RI放在工作方式选择SM0,SM1为后面,每次复位,不会进入中断,和SCON|=0x50的效果一样,一切0k SM0=0; SM1=1; REN=1; //允许串行口接收位 void init() { TMOD=0x20; //定时器工作方式,选择了定时器1,工作方式2 八位初值自动重装的8位定时器。 TH1=0xfd; //定时器1初值 ,设置波特率为9600 晶振11.0529MHZ? TL1=0xfd; TR1=1; //开启定时器1 REN=1; //允许串行口接收位 SM0=0; SM1=1; //10位异步接收,(8位数据)波特率可变 EA=1; //允许中断(总闸) ES=1; //允许串口中断 } void main() { init(); while(1) { } } void ser() interrupt 4 { if(RI) //接收数据,手动将RI清0 { RI=0; readByteCounter++; } if(TI) //发送数据 { } } |
|
|
|
|
|
|
|
初始化的步骤错了啊,SM0和SM1应该是在配置波特率的时候就配置好了的啊。应该在REN之前,实际上在配置SM0和SM1的时候我都是字节操作的。 |
|
|
|
这是STC自动生成的代码。 void UartInit(void) //9600bps@11.0592MHz { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xFD; //设定定时初值 TH1 = 0xFD; //设定定时器重装值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 } |
|
|
|
SM0 SM1可以位寻址吗?
|
|
|
|
最后启动TR1,你的TR1启动早了,然后就是你的串口中断允许位ES要在EA后面,你改下试试
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
377 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
536 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
540 浏览 0 评论
950 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1403 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11760 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 06:36 , Processed in 0.897451 second(s), Total 92, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号