#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,应该是可以啊,怎么到外部中断就卡死了! |