📄 fix.c
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Bodrate 0xFF6A // FF6A相对于11.0592M晶振下2400波特率,
#define SLAVE 'A'
sbit CarryWave = P3^4; //红外载波发射控制端
uchar disbuf[4]; /*显示数据缓冲区*/
uchar Counter_H,Counter_L; /*计数高低8位TH1,TL1*/
uint Distance;
uchar Test_ok; /*收到超声波标识符*/
uchar ready;
uchar sum;
uchar i;
uchar AB;
uchar temp0,temp1,temp[4];
void Count_Init(void);
void Caculate( uchar Timer_High,uchar Timer_Low);
void Hexbcd( uint span);
void Serial_Usdata(void);
void Serial_Init(void);
/*----------------------主函数--------------------------------*/
void main(void)
{
//P2=0XFF;
CarryWave=1;
Count_Init(); //计数器初始化
Serial_Init(); //串口初始化
Test_ok=0;
while(1)
{
if(Test_ok==1) //收到超声波
{
Caculate(Counter_H,Counter_L);
Hexbcd(Distance);
TR0 = 0;
EX0 = 0;
EX1 = 0;
ready = 0;
Test_ok=0;
}
}
}
/*----------------------计时器--------------------------------*/
void Count_Init(void)
{
TMOD = ( TMOD & 0xF0 ) | 0x01; /*定时器0,方式1,16位*/
TH0 = 0;
TL0 = 0;
TR0 = 0;
ET0 = 0;
EX0 = 0;
EX1 = 0;
IT0 = 0;
IT1 = 0;
}
/*---------------超声波接收程序(外部中断0)-----------------------*/
void Ura_Interrupt (void) interrupt 0 using 0
{
TR0 = 0;
EX0 = 0;
Counter_H = TH0;
Counter_L = TL0;
TH0 = 0;
TL0 = 0;
AB=0;
Test_ok = 1;
}
/*---------------超声波接收程序(外部中断1)-----------------------*/
void Urb_Interrupt( void ) interrupt 2 using 2
{
TR0 = 0;
EX1 = 0;
Counter_H = TH0;
Counter_L = TL0;
TH0 = 0;
TL0 = 0;
AB=1;
Test_ok = 1;
}
/*-------------------------------修正声速,计算距离-----------------------------------*/
void Caculate( uchar Timer_High,uchar Timer_Low)
{
unsigned long int TimeSpan,Sound_Speed;
unsigned char correct_x,correct_y;
Sound_Speed = 33140+61*(10*temp1+temp0);
TimeSpan = Timer_High * 256 + Timer_Low;
if(AB==0) //数据校正
{
correct_x=50;
correct_y=102;
}
else
{
correct_x=40;
correct_y=101;
}
Distance =(TimeSpan*Sound_Speed/100000+correct_x)*correct_y/100;
}
/*数据转换函数: 将转换后的数据存入显示缓冲区以供发送*/
void Hexbcd( uint span)
{
uchar m,n;
disbuf[3] = (span/1000)|0XD0;
span = span%1000;
disbuf[2] = (span/100)|0XC0;
span = span%100;
disbuf[1] = (span/10)|0XB0;
span = span%10;
disbuf[0] = (span/1)|0XA0;
if( (disbuf[3]|disbuf[2]|disbuf[1]) != 0XF0 ) //当距离值前三位数中不全为时发送数据
{
ES=0;
for(m=0;m<2;m++)
{
SBUF = disbuf[0];
while(!TI);
TI = 0;
for(n=0;n<50;n++)
{
_nop_();
}
}
for(m=0;m<2;m++)
{
SBUF = disbuf[1];
while(!TI);
TI = 0;
for(n=0;n<50;n++)
{
_nop_();
}
}
for(m=0;m<2;m++)
{
SBUF = disbuf[2];
while(!TI);
TI = 0;
for(n=0;n<50;n++)
{
_nop_();
}
}
for(m=0;m<2;m++)
{
SBUF = disbuf[3];
while(!TI);
TI = 0;
for(n=0;n<50;n++)
{
_nop_();
}
}
ES=1;
}
}
void Serial_Init(void) //串口初始化
{
T2CON = 0x35; // 0b0011 0101 16位串行波特率
// 发生器,自动重装
TH2 = (unsigned char )(Bodrate>>8) ;
TL2 = (unsigned char )(Bodrate & 0xff);
RCAP2H = (unsigned char )(Bodrate>>8) ;
RCAP2L = (unsigned char )(Bodrate & 0xff);
TR2 = 1; // 启动时钟
SCON = 0x50; // 0b0111 1010 第一种工作方式
// 8位单机通信
ES = 1; // 允许通信中断
EA = 1; // 中断打开
}
void Serial_Interrupt(void) interrupt 4 using 1
{
if(RI)
{
uchar i,rdata,addrdata,numdata;
RI=0;
rdata=SBUF;
if(rdata==SLAVE) //收到查询信号
{
Test_ok = 0;
// CarryWave=1; //回应
ES=0;
SM2=0;
SBUF=SLAVE;
while(!TI);
TI=0;
ES=1;
i=0;
// CarryWave=0;
goto recdata;
}
if(rdata>=0XE0) //接收温度数据
{
addrdata=rdata&0XF0;
numdata=rdata&0X0F0;
if( (numdata>=0X00)&&(numdata<=0X09) )
{
addrdata-=0XE0;
if(addrdata==0) temp[i]=numdata;
if(addrdata==1) temp[i+2]=numdata;
if(++i>=2) i=0;
if(i==0)
{
if(temp[0]==temp[1]) temp0=temp[0];
if(temp[2]==temp[3]) temp1=temp[2];
}
}
goto recdata;
}
if(rdata=='S') //收到开计时信号
{
TR0=1;
EX0=1;
goto recdata;
}
if(rdata=='s')
{
TR0=1;
EX1=1;
goto recdata;
}
if(rdata=='0') //出错重传
{
// CarryWave=1;
ES=0;
SBUF = disbuf[0];
while(!TI);
TI = 0;
ES=1;
// CarryWave=0;
}
if(rdata=='1')
{
// CarryWave=1;
ES=0;
SBUF = disbuf[1];
while(!TI);
TI = 0;
ES=1;
// CarryWave=0;
}
if(rdata=='2')
{
// CarryWave=1;
ES=0;
SBUF = disbuf[2];
while(!TI);
TI = 0;
ES=1;
// CarryWave=0;
}
if(rdata=='3')
{
// CarryWave=1;
ES=0;
SBUF = disbuf[3];
while(!TI);
TI = 0;
ES=1;
// CarryWave=0;
}
recdata:;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -