有关AT89C52外部中断的一些问题

[复制链接]
2376|12
手机看帖
扫描二维码
随时随地手机跟帖
woaimcu123|  楼主 | 2014-12-18 15:55 | 显示全部楼层 |阅读模式
本帖最后由 woaimcu123 于 2014-12-18 17:08 编辑

目的:使用外部中断,在进入中断服务程序后,向串口发送数据;
硬件:AT89c52,郭天祥的开发板
现象:单片机P1口接了8个led灯,进入外部中断服务程序后,点亮一个小灯,表明进入,并且向串口发送数据,但是将串口发送程序(没有用串口中断,直接用查询法)写在外部中断程序或是主程序中,小灯都不亮,将串口发送程序屏蔽掉以后,小灯亮了;将外部中断改为定时器中断后,一切正常;
程序如下:
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar i,flag,num;
void init()
{   
    //设置外部中断
    EA=1;
    IT0=1;
    EX0=1;
   TMOD=0x20;
    SCON=0x50;        //确定串口的工作方式
    TH1=0xfd;         //串口波特率                                                                                                                                                   o
    TL1=0xfd;
    ES=1;                //开串口中断
   TR1=1;                //启动定时器1
     i=1;
}
void txbyte(uchar temp)
{
    SBUF=temp;
    while(TI==0);
    TI=0;
}
void main()
{
     init();
     while(1)
     {
         if(flag)
         {
             flag=0;
             P1=0XFb;
         }
     }
}
void time0() interrupt 0
{
         //ES=0;
        //txbyte(0x30+i);
        //ES=1;
        i++;
        if(i==10)
           i=0;
         P1=0xfe;
        flag=1;
               
}
望高手解惑


相关帖子

ayb_ice| | 2014-12-18 16:17 | 显示全部楼层
你连个串口中断程序都没有,除非不开中断
其次,既然使用了串口中断,T1肯定是要初始化的,
你这都乱哄哄的,

使用特权

评论回复
woaimcu123|  楼主 | 2014-12-18 16:21 | 显示全部楼层
ayb_ice 发表于 2014-12-18 16:17
你连个串口中断程序都没有,除非不开中断
其次,既然使用了串口中断,T1肯定是要初始化的,
你这都乱哄哄的 ...

高手,串口没用中断,直接用
void time0() interrupt 0
{
     SBUF=num;
     while(TI==0);
     TI=0;
}
在外部中断程序中,直接向串口发送数据

使用特权

评论回复
ningling_21| | 2014-12-18 16:41 | 显示全部楼层
woaimcu123 发表于 2014-12-18 16:21
高手,串口没用中断,直接用
void time0() interrupt 0
{

你的 ES =1; 和你这样查询发送就已经冲突了...

使用特权

评论回复
woaimcu123|  楼主 | 2014-12-18 16:49 | 显示全部楼层
ningling_21 发表于 2014-12-18 16:41
你的 ES =1; 和你这样查询发送就已经冲突了...

我刚试了下,在init()和外部中断函数中,将ES=1屏蔽掉,也没有效果啊

使用特权

评论回复
ayb_ice| | 2014-12-18 17:02 | 显示全部楼层
woaimcu123 发表于 2014-12-18 16:21
高手,串口没用中断,直接用
void time0() interrupt 0
{

都说过了,查询就不要开串口中断
其次你的定时器设置对了吗,做波特率时必须用模式2

使用特权

评论回复
ayb_ice| | 2014-12-18 17:02 | 显示全部楼层
woaimcu123 发表于 2014-12-18 16:21
高手,串口没用中断,直接用
void time0() interrupt 0
{

都说过了,查询就不要开串口中断
其次你的定时器设置对了吗,做波特率时必须用模式2

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
woaimcu123 + 1 很给力!
woaimcu123|  楼主 | 2014-12-18 17:10 | 显示全部楼层
ayb_ice 发表于 2014-12-18 17:02
都说过了,查询就不要开串口中断
其次你的定时器设置对了吗,做波特率时必须用模式2

将TMOD=0x20;将ES=1;屏蔽掉了

使用特权

评论回复
woaimcu123|  楼主 | 2014-12-18 17:15 | 显示全部楼层
ayb_ice 发表于 2014-12-18 17:02
都说过了,查询就不要开串口中断
其次你的定时器设置对了吗,做波特率时必须用模式2

高手一言惊醒我,将TMOD给误设置了,非常感谢高手

使用特权

评论回复
woaimcu123|  楼主 | 2014-12-18 17:16 | 显示全部楼层
ningling_21 发表于 2014-12-18 16:41
你的 ES =1; 和你这样查询发送就已经冲突了...

今天没威望了,明天给你高手,非常感谢帮助,温暖

使用特权

评论回复
wang168506| | 2014-12-18 17:23 | 显示全部楼层
你明白了?我咋糊涂了捏,你进的是外部中断0,依靠什么触发的呢?

使用特权

评论回复
wang168506| | 2014-12-18 17:25 | 显示全部楼层
还有外部中断0  你咋弄得是timer0 捏  搞不懂额  

使用特权

评论回复
ningling_21| | 2014-12-19 08:58 | 显示全部楼层
wang168506 发表于 2014-12-18 17:25
还有外部中断0  你咋弄得是timer0 捏  搞不懂额

只是函数名字,实际功能没什么影响

使用特权

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

本版积分规则

9

主题

17

帖子

0

粉丝