外中断串口发送数据问题

michael52   2009-5-26 22:31 楼主
大家好!我是单片机的初学者,现在遇到一个问题无法解决,希望能得到大家的帮忙,谢谢!
如题:
1、我做了一个边沿触发方式的外部中断0,当按键按下不放时按要求串口发送数据.
2、在P2.3口做了个独立式按键S1,当按下时向串口发送相关字符,松开按键时也发送相关字符。
3、出现问题:启动程序后按下外中断0无串口发送,不知道哪里有问题(好像一直运行While循环中(2)以下的代码中),烦请大家帮我看看代码,
看看是程序哪里有问题,还是思路有问题?谢谢!


#include
//#include
//#include
#include
#define uint unsigned int
typedef unsigned int uint2;
sbit p0_0 =P0^0;
sbit p2_0 =P2^0;
sbit p2_1 =P2^1;
sbit p3_2 =P3^2;
bit flag;
bit flagStep;
bit temp;
unsigned char start;
unsigned char stop;
void Send(unsigned char info);
void int_0();
void init(void);
void delay(uint k);

void delay(uint k)
{
uint data i,j;  
        for(i=0;i         {
                for(j=0;j<121;j++)
                {
                        ;
                }
        }
}


void init(void)      
{
        EA=1;   //中断总允许
        EX0=1;  //EX0=0时禁止外部中断;EX0=1时,允许外部中断0;
         IT0=1;  //外部中断0请求方式控制位:IT0=0为电平触发方式,INT0低电平有效;IT0=1时,INT0为边沿触发方式,INT0电平由高到低的负跳变有效。
        //串口设置
        SCON = 0x50; //串口方式1,允许接收
        TMOD = 0x20; //定时器1定时方式2
        TH1 = 0xfd;        //11.0592MHz 9600 波特率
        TL1 = 0xfd;
        TR1 = 1; //启动定时器1
}


//INT0中断  由P3.2引脚产生
void int_0() interrupt 0 using 0
{
        delay(100);   //延时100ms
        if(p3_2==0){flag=!flag;}
       
}
void Send(unsigned char info)
{
        SBUF = info;
        while(!TI);
        TI = 0;                          

}

void main(void)
{
        //
        start='T';
        stop='P';
        flag =0;
        init();
        delay(100);
        //判断程序启动时按键是否在按下状态,然后按相关要求发送数据。
        if (p2_3==0)
        {
                flagStep =0;
        }
        else
        {
                flagStep =1;               
        }
        temp=flagStep;
        //
        if (temp==0)
        {               
            Send('P');
        }
        while(1)
        {               
       
                if(flag)
                {       
                        //控制相关IO断电器动作       
                        p2_1=1;        //TX、RX开路
                        p2_0=1;               //GND 开路
                        delay(10);     //延时10ms

                        p0_0=1;        //子机短路放电、电源2.6V断开
                        delay(1000);   //延时1秒放电
                          
                        p0_0=0;        //子机通电、电源2。6V连接
                        delay(100);    //延时10ms
               
                        p2_1=0;        //TX、RX连接
                        p2_0=0;               //GND 连接
                        delay(2000);   //延时10ms
                        Send('C');
                        flag =0;
                }
                //(2)
                //以下是看S1状态是否有改变,有则按相关要求发送数据。
                delay(50);
                flagStep=p2_3;
                if (temp==flagStep)
                {;}
                else
                {
                        temp=flagStep;
                        if (temp==1)
                        {
                                Send('T');
                        }
                        else
                        {               
                            Send('P');
                        }
                }
               
        }
}

回复评论 (8)

补充:
     串口通信是没有问题的,如果去除上面代码中注解//(2)以下的代码是可以的.加了这些就不行了,不知道为什么?
点赞  2009-5-27 08:27
中断程序里延时100ms貌似有问题
点赞  2009-5-27 09:11
有什么问题?如果去除上面代码中注解//(2)以下的代码是可以的,能说说什么问题吗?
点赞  2009-5-27 12:00
帮顶。
点赞  2009-5-27 12:16
学习,帮顶
点赞  2009-5-29 00:04
延时100ms太长了,没有哪一个中断能容忍这么长时间吧。
点赞  2009-6-1 17:26
中断程序要尽量的短
点赞  2009-6-1 17:29
请看看“外部中断奇怪现象”这个帖子,你的程序有类似问题:I/O口读取问题,函数重载问题。
点赞  2009-6-2 11:33
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复