打印

向各位请教一个51单片机中断的问题。

[复制链接]
4294|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fox_lin|  楼主 | 2012-8-9 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 fox_lin 于 2012-8-9 21:53 编辑

最近在了解51单片机,看到讲串口通讯部分的,在看例程的时候想到一个问题。
例程如下:
void main()
{
    uchar i;
    init(); //定时器工作方式、初值,中断控制函数
    while(1)
    {
       if(flag==1) //标志位,为1时则串口有数据输入
       {
           ES=0; //此处关闭了串口中断。我的疑问就在这里开始
           for(i=0;i<6;i++)
            {
               SBUF=table;
               while(!TI);
               TI=0;
             } //送显一串固定的数组数据,table是一个六个字符的数组数据,不知道为什么,帖子里显示不出表示数组的方括号
            SBUF=a; //送显一个不固定的字符
            while(!TI);
            TI=0; /* 我的疑问是:既然已经关闭了串口中断,此处TI如果不置零、也没有下一句的ES=1,为什么我调试时单片机依然会响应这个中断请求?*/
            ES=1;
            flag=0;
         }
     }
}

代码贴的有点乱,大家包涵点,还望明白人给指点个,谢谢了。

相关帖子

沙发
fox_lin|  楼主 | 2012-8-9 21:55 | 只看该作者
估计没人愿意看那破代码的。。好吧,我的疑问是:为什么在 串口中断控制位ES=0 后,单片机依然会响应  TI=1 这个中断申请?

使用特权

评论回复
板凳
fox_lin|  楼主 | 2012-8-9 22:13 | 只看该作者
来个明眼人帮助一下吧。。。

使用特权

评论回复
地板
xoyo| | 2012-8-9 22:20 | 只看该作者
关闭了中断,采用查询方式

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fox_lin + 1
5
fox_lin|  楼主 | 2012-8-9 22:23 | 只看该作者
4# xoyo
其实我是不太懂您这句话的。关闭了中断,单片机查询标志位,查到了中断请求,然后响应之?

使用特权

评论回复
6
xoyo| | 2012-8-9 23:20 | 只看该作者
没有用中断,只是用查询方式处理的

使用特权

评论回复
7
菜鸟同学| | 2012-8-10 00:35 | 只看该作者
你这个没的啥子中断啊,串口就是一个单片机内部模块,你把数据送给SBUF 数据就进入移位寄存器,有时钟来就会发送出去。ES 置不置位只是说当放送或者接收完成,中断发生改变PC值跳到固定的串口中断地址而已。
TI是发送数据完就自动置一,但是必须人为清零,这个只是取决与你打开中断会不会一直响应中断造成中断死机。
总之本菜鸟认为 TI就是一个给用户使用中断的标志位手段,实际于串口发送没多大关系。
有时钟,有数据,一切就OK,数据就出来,但是这样的数据不是我们想要的。时钟太快硬件速度跟不上。数据的格式就会变的畸形。睡觉。

使用特权

评论回复
8
yiucing| | 2012-8-10 10:25 | 只看该作者
当发送完成后,TI就置1,与ES状态没关系

使用特权

评论回复
9
zhuanghaiyang| | 2012-8-10 12:23 | 只看该作者
ES=0;只是不进入串行中断,标志位还是会置位的,你可以写个串行中断的函数试一试,保证进不去,

使用特权

评论回复
10
张永标张标| | 2012-8-10 16:52 | 只看该作者
实践

使用特权

评论回复
11
fox_lin|  楼主 | 2012-8-10 17:36 | 只看该作者
7# 菜鸟同学
谢谢指导,我会仔细琢磨的

使用特权

评论回复
12
fox_lin|  楼主 | 2012-8-10 17:37 | 只看该作者
8# kimfufree
谢谢指导,我回去再仔细看看书。

使用特权

评论回复
13
fox_lin|  楼主 | 2012-8-10 17:40 | 只看该作者
9# yiucing 您说的我明白的,谢谢您的指导。

使用特权

评论回复
14
fox_lin|  楼主 | 2012-8-10 17:43 | 只看该作者
10# zhuanghaiyang
亲啊,其实例程后面是有一个串口中断函数的,我实际调试中,在这个TI=1后,是进入了这个串口中断函数的。

使用特权

评论回复
15
快乐小小鱼| | 2012-8-10 19:00 | 只看该作者
TI是中断标志,如果中断开了,并且中断发生了,硬件会置TI成1,并进入中断;如果中断没有开呢?硬件还是会置TI为1,但是不会进入中断的!记住它是中断标志,不是中断开关!

使用特权

评论回复
16
fox_lin|  楼主 | 2012-8-10 19:49 | 只看该作者
16# 快乐小小鱼
有申请中断,但是ES为0,中断不给予响应,是不?

使用特权

评论回复
17
ningling_21| | 2012-8-10 22:40 | 只看该作者
16# 快乐小小鱼  
有申请中断,但是ES为0,中断不给予响应,是不?
fox_lin 发表于 2012-8-10 19:49


补充:ES为0时,不会再有串口中断会向CPU申请,更谈不上响应了,此时只是在查询(等待)标志位TI变为1...

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fox_lin + 1
18
fox_lin|  楼主 | 2012-8-11 07:15 | 只看该作者
18# ningling_21
3Q,有些眉目了。

使用特权

评论回复
19
完完全全| | 2012-8-12 17:03 | 只看该作者
我想也明白了。我以前做过一个时钟:在中断里用串口对164扫描led乱码

使用特权

评论回复
20
836865502| | 2013-3-4 21:31 | 只看该作者
我也发现了,即使ES关了但会发生中断
#include<reg52.h>
void serie() interrupt 4
{
RI=0;
P2=SBUF;
}
void main()
{
unsigned char N=0xff;
EA=1;
ET1=1;
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
SCON=0X50;
TR1=1;
while(1)
{            
   if(N!=P1)
   {
   N=P1;
   SBUF=N;
   while(!TI);
   TI=0;
   }
}
}
很是纠结,希望大侠帮忙点亮

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

15

帖子

1

粉丝