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

[复制链接]
5107|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

查看全部评分

 楼主| fox_lin 发表于 2012-8-9 22:23 | 显示全部楼层
4# xoyo
其实我是不太懂您这句话的。关闭了中断,单片机查询标志位,查到了中断请求,然后响应之?
xoyo 发表于 2012-8-9 23:20 | 显示全部楼层
没有用中断,只是用查询方式处理的
菜鸟同学 发表于 2012-8-10 00:35 | 显示全部楼层
你这个没的啥子中断啊,串口就是一个单片机内部模块,你把数据送给SBUF 数据就进入移位寄存器,有时钟来就会发送出去。ES 置不置位只是说当放送或者接收完成,中断发生改变PC值跳到固定的串口中断地址而已。
TI是发送数据完就自动置一,但是必须人为清零,这个只是取决与你打开中断会不会一直响应中断造成中断死机。
总之本菜鸟认为 TI就是一个给用户使用中断的标志位手段,实际于串口发送没多大关系。
有时钟,有数据,一切就OK,数据就出来,但是这样的数据不是我们想要的。时钟太快硬件速度跟不上。数据的格式就会变的畸形。睡觉。
yiucing 发表于 2012-8-10 10:25 | 显示全部楼层
当发送完成后,TI就置1,与ES状态没关系
zhuanghaiyang 发表于 2012-8-10 12:23 | 显示全部楼层
ES=0;只是不进入串行中断,标志位还是会置位的,你可以写个串行中断的函数试一试,保证进不去,
张永标张标 发表于 2012-8-10 16:52 | 显示全部楼层
 楼主| fox_lin 发表于 2012-8-10 17:36 | 显示全部楼层
7# 菜鸟同学
谢谢指导,我会仔细琢磨的
 楼主| fox_lin 发表于 2012-8-10 17:37 | 显示全部楼层
8# kimfufree
谢谢指导,我回去再仔细看看书。
 楼主| fox_lin 发表于 2012-8-10 17:40 | 显示全部楼层
9# yiucing 您说的我明白的,谢谢您的指导。
 楼主| fox_lin 发表于 2012-8-10 17:43 | 显示全部楼层
10# zhuanghaiyang
亲啊,其实例程后面是有一个串口中断函数的,我实际调试中,在这个TI=1后,是进入了这个串口中断函数的。
快乐小小鱼 发表于 2012-8-10 19:00 | 显示全部楼层
TI是中断标志,如果中断开了,并且中断发生了,硬件会置TI成1,并进入中断;如果中断没有开呢?硬件还是会置TI为1,但是不会进入中断的!记住它是中断标志,不是中断开关!
 楼主| fox_lin 发表于 2012-8-10 19:49 | 显示全部楼层
16# 快乐小小鱼
有申请中断,但是ES为0,中断不给予响应,是不?
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

查看全部评分

 楼主| fox_lin 发表于 2012-8-11 07:15 | 显示全部楼层
18# ningling_21
3Q,有些眉目了。
完完全全 发表于 2012-8-12 17:03 | 显示全部楼层
我想也明白了。我以前做过一个时钟:在中断里用串口对164扫描led乱码
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

粉丝
快速回复 在线客服 返回列表 返回顶部