打印

我的模拟串口怎么只接收一次,第二次就卡在外部中断里了

[复制链接]
1448|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laocuo1142|  楼主 | 2014-8-7 14:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<intrins.h>
#include <math.h>
#include <stdio.h>

sbit P0_4=P0^4;

sbit BT_RXD=P3^2;                       //接收
sbit BT_TXD=P1^5;                       //发送

sbit AP_EN=P1^4;                        //射频使能

sbit RS=P0^0;
sbit RW=P0^1;
sbit E=P0^2;
sbit BF=P2^7;

#define uchar  unsigned char
#define uint unsigned int
#define SomeNop();{_nop_();_nop_();}
#define Rec_Byte 16                     //最大接收字节

unsigned char fT0out=0;                 //超出溢出标志位,时间到1/9600秒
unsigned char RecData[16];              //接收数据缓存区
unsigned char RecCount=0;               //接收数据计数器

unsigned char Rxdata;
unsigned char Rxcnt;

unsigned int  fdisplay,flag ;//显示标志
unsigned char DataAlarm ;//报警位
unsigned char DataH         ;        //数据高 8位
unsigned char DataL         ;        //数据低 8位
unsigned char TempH         ;        // 温度高8位
unsigned char TempL         ;        // 温度低8位
unsigned char DataCRC ;        //        校验位
unsigned int falarm ;//报警标志

unsigned char code mun_to_char[]={"0123456789"};

void Jiexishuju(void);
void delay52us();

/*函数功能:延时1ms*/
void delay1ms()
{
    unsigned char i,j;
                for(i=0;i<10;i++)
                        for(j=0;j<33;j++)
                                    ;
}
/*函数功能:延时若干秒,入口参数:n*/
void delay (unsigned char n)
  {
    unsigned char i;
    for (i=0;i<n;i++)
        delay1ms();
  }
/*函数功能:延时52us*/
void delay52us()
{
        unsigned char i;
        for(i=0;i<78;i++);
}
/*发送单个字节*/
void SendByte(unsigned char b )//TXdata
{
        unsigned char i=8;
        TH1=(256-96);                           //赋初值  
        TL1=TH1;                               
    ET1=0;                              //关定时器中断响应
    TR1=1;                              //开定时器
    BT_TXD=0;                           //起始位0                        
    while(!TF1);                        //等待1/9600,等待起始位发送完毕,跳出循环
    TF1=0;                              //清溢出标志
    while(i--)
        {
                if(b&1) {BT_TXD=1;}             //相同就发送1
                else    {BT_TXD=0;}             //不同就发送0
                while(!TF1);
        TF1=0;
                b>>=1;                          //先发最低位,在来一个数据右移1位
        }   
        BT_TXD=1;                           //结束位1
    while(!TF1);
    TF1=0;
    TR1=0;       
}

/*外部中断0,判断开始接受,一些数据初始化*/
void INT0_service(void) interrupt 0
{
    P0_4=!P0_4;
        EX0=0;
        delay52us();//延时1/19200秒
        TR1=1;  //开定时器
    Rxcnt=0;
    Rxdata=0;              
}
/*外部中断0初始化*/
void INT0_init()
{
//        EA=1;
        EX0=1;
        IT0=0;                              //下降沿触发       
}
/*定时器初始化,计数方式2*/
void Time1_init(void)
{   
        TMOD=0x20;                      //T1方式2,8位自动重装
    TR1=0;
    TF1=0;
        TH1=(256-96);                   //赋初值  
        TL1=TH1;                        //有下降沿时,开始1/9600秒进行计数
        ET1=1;
//                EA=1;
}

/*定时器T1中断*/
void T1_int() interrupt 3
{
    Rxcnt++;
    if(Rxcnt<=8)                        //前8次进入定时器,收8位数据
        {
                Rxdata>>=1;
                if(BT_RXD==1) Rxdata|=0x80;
        }
        else                                //第9次进入,收停止位,关定时器,开外部中断0,清计数器,对数据进行保存
        {               
        EX0=1;                          //开外部中断
                Rxcnt=0;                        //接收计数清零
                TR1=0;                          //关定时器
                RecData[RecCount]=Rxdata;
                RecCount++;       
        if(RecCount>=2)                 //判断数据前两位数据
                {   
                        if((RecData[0]==0x68)&&(RecData[1]==0xaa))
                        {                 
                                if(RecCount>=8)
                                {
                                        flag=1;                    //满足条件
                                }                                                                       
                        }
            else
            {
                RecCount=0;
            }
         }
                else
                {
                        if(RecData[0]!=0x68)
                        {
                                RecCount=0;
                        }       
                }
        }       
   
}               
/*主函数*/
void main (void)
{
    unsigned char i;
    AP_EN=1;
        delay(120);
    INT0_init();                          //判断起始位外部中断0初始化
    delay(10);
        Time1_init();                         //T1定时器初始化
    delay(10);
    BT_RXD=1;
    BT_TXD=1;
    EA=1;       
        while(1)
        {
        if(flag==1)
        {
             flag=0;
             for(i=0;i<8;i++)
                     {
                              SendByte(RecData[i]);
                 }
        }
        }
}
我把flag=0去掉,就可以正常收发。在主程序if后面加break跳出循环,但是我直接flag=0,为什么不行,清了这个标志,我在下一次进入定时器中断再置1,应该是可以啊,怎么到外部中断就卡死了!

相关帖子

沙发
yzjgod| | 2014-8-7 15:22 | 只看该作者
if后面加break跳出while(1)了,程序跑飞,当然出错

使用特权

评论回复
板凳
longmaodo| | 2014-8-7 15:57 | 只看该作者
那你一定是定时器T1中断函数中的flag = 1这句没进去呗

使用特权

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

本版积分规则

1195

主题

5227

帖子

12

粉丝