📄 remove.c
字号:
#include<reg52.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define Bodrate 0xFF6A// FF6A相对于11.0592M晶振下2400波特率,
/*----------------------LCD函数----------------------*/
sbit RS = P2^7;
sbit RW = P2^6;
sbit EN = P2^5;
sbit Us_t1=P1^0;
sbit Us_t2=P3^7;
sbit CarryWave = P3^4; //红外载波发射控制端
#define DATAPORT P0 // 数据端口
#define busy 0x80 //用于检查写忙信号
void Delayms(uchar x);
void InitLcd(void);
void WriteCommand(uchar cmd,uchar wc);
void WriteData(uchar dat);
void WriteChar(uchar Xpos,uchar Ypos,uchar ch);
void Busy_Wait(void);
/*-------------------------温度传感器驱动--------------------------*/
sbit temp_data = P1^7;
uchar temp1,temp2,temptxd0,temptxd1,temp[2];
void Delay15( void );
void Delay60( void );
void Delay100ms( void );
void Write0TS( void );
void Write1TS( void );
bit ReadTS( void );
void ResetTS( void );
void WriteBTS( unsigned char byte ) ;
unsigned char ReadBTS( void );
void InitTS( void );
void GetTempTS( void );
/*------------------------公共函数-----------------------*/
uchar idata disbuf[32];
uchar Test;
uchar test_ok;
uchar x;
uchar ready;
uchar AB;
uchar LR;
uchar LR_EN;
void Timer50ms_Init(void);
void NoReceive50ms_Init(void);
/*------------------------串口函数---------------------*/
uchar over;
void Serial_Init(void);
void Serial_usdata(void);
/**********************主程序****************************/
void main(void)
{
uchar k;
CarryWave=1;
P1 = 0xff;
InitTS(); //温度传感器初始化
Serial_Init(); //串口初始化
InitLcd(); //液晶初始化
Timer50ms_Init(); //定时器初始化
ready=0;
Test=0;
WriteChar(0,0,'A');
WriteChar(2,0,'L');
WriteChar(8,0,'R');
WriteChar(14,0,'T');
WriteChar(15,0,'=');
WriteChar(0,1,'B');
WriteChar(2,1,'L');
WriteChar(8,1,'R');
temptxd1 =0; //为温度传输取参考值
temptxd0 =0;
while(1)
{
k=49;
while(!ready)
{
if(++k>=50)
{
k=0;
GetTempTS(); //测温
temp[1] = temp1 / 10;
temp[0] = temp1 % 10;
WriteChar(14,1,temp[1]+48);
WriteChar(15,1,temp[0]+48);
}
//CarryWave=1;
ES=0; //查询固定端
SBUF = 'A';
while(!TI);
TI=0;
ES=1;
//CarryWave=0;
Delayms(45);
}
while(!Test); //测量成功或超时则退出循环
TR1=0;
if(test_ok==1) //测量成功
{
if(AB==0&&LR==0)
{
WriteChar(3,0,disbuf[3]);
WriteChar(4,0,disbuf[2]);
WriteChar(5,0,disbuf[1]);
WriteChar(6,0,disbuf[0]);
}
if(AB==0&&LR==1)
{
WriteChar(9,0,disbuf[11]);
WriteChar(10,0,disbuf[10]);
WriteChar(11,0,disbuf[9]);
WriteChar(12,0,disbuf[8]);
}
if(AB==1&&LR==0)
{
WriteChar(3,1,disbuf[19]);
WriteChar(4,1,disbuf[18]);
WriteChar(5,1,disbuf[17]);
WriteChar(6,1,disbuf[16]);
}
if(AB==1&&LR==1)
{
WriteChar(9,1,disbuf[27]);
WriteChar(10,1,disbuf[26]);
WriteChar(11,1,disbuf[25]);
WriteChar(12,1,disbuf[24]);
}
}
Test=0;
test_ok = 0;
ready = 0;
}
}
/*****************定时50ms发送一次超声波***********************/
void Timer50ms_Init(void)
{
TMOD = ( TMOD & 0xf0 ) | 0x01; /*定时器0,方式1,16位*/
TH0 = ( -10000 ) >> 8;
TL0 = -10000;
TR0 = 0;
ET0 = 1;
}
void Timer1_Interrupt( void ) interrupt 1 using 1
{
uchar a;
TL0=-10000;
TH0=(-10000)>>8;
//CarryWave=1; //发载波
ES=0;
if(AB==0) SBUF = 'S'; //发开计时信号
else SBUF = 's';
while(!TI);
TI = 0;
ES=1;
//CarryWave=0;
if(LR==0) //使用左边的超声头发射超声波
{
Us_t1=1;
for(a=0;a<30;a++);
Us_t1=0;
}
if(LR==1) //使用右边的超声头发射超声波
{
Us_t2=1;
for(a=0;a<30;a++);
Us_t2=0;
}
TR0=0;
NoReceive50ms_Init(); //无响应定时
TR1=1;
}
/*---------------------无响应定时------------------------------*/
void NoReceive50ms_Init(void)
{
TMOD = ( TMOD & 0x0f ) | 0x10; /*定时器1,方式1,16位*/
TH1 = ( -50000 ) >> 8;
TL1 = -50000;
TR1 = 0;
ET1 = 1;
x=0;
}
void NoReceive50ms_Interrupt(void) interrupt 3 using 3
{
TH1 = ( -50000 ) >> 8;
TL1 = -50000;
TR1 = 0;
Test = 1;
}
/****************串口函数*******************/
//T2CON的定义如下,通信波特率发生器方式 //
// 用作波特率发生器 //
// 0x35...... TR2 = 1,开始计数;CP/RL2=1,不自动重装,但被CRLK和//
// CTLK/CRLK的设立而忽略 //
// C/T2 = 0,使用内部时钟 //
// EXEN2 = 0,忽略外部T2EX(P1.1) //
// EXF2受控于EXEN2的状态,置1时一个外部T2EX的负脉冲//
// 将引发T2中断。不刷新备用寄存器 //
// CTLK = 1,引用为发送时钟源(波特率发生器) //
// CRLK = 1,引用为接收时钟源,强制自动重装初值。 //
// 当计数器溢出时并不设立标志TF2,所以不引发中断 //
// 如果设定了允许CT2中断视作无效 //
//--------------------------------------------------------------//
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 k,turn,addrdata,numdata;
uchar a,b,c,d;
RI=0;
if(SBUF=='A') //固定端A回应
{
if(turn==0) //左发射头到A接收头的距离的测量
{
LR=0;
AB=0;
}
if(turn==1) //右发射头到A接收头的距离的测量
{
LR=1;
AB=0;
}
if(turn==2) //左发射头到B接收头的距离的测量
{
LR=0;
AB=1;
}
if(turn==3) //右发射头到B接收头的距离的测量
{
LR=1;
AB=1;
}
if(++turn>=4) turn=0;
a=0;
b=0;
c=0;
d=0;
LR_EN=0;
ready=1;
TR0=1;
ES=0;
if(temptxd0!=temp[0]) //当温度发生改变时,将温度值发给固定端
{
for(k=0;k<2;k++)
{
SBUF=temp[0]|0XE0;
while(!TI);
TI = 0;
for(k=0;k<20;k++)
{
_nop_();
}
}
temptxd0 = temp[0];
}
if(temptxd1!=temp[1])
{
for(k=0;k<2;k++)
{
SBUF=temp[1]|0XF0;
while(!TI);
TI = 0;
for(k=0;k<20;k++)
{
_nop_();
}
}
temptxd1 = temp[1];
}
ES=1;
over=0;
goto recdata;
}
addrdata=SBUF&0XF0; //取出地址,0XA0为个位数,0XB0为十位数,0XC0为百位数,0XD0为千位数
numdata=SBUF&0X0F; //取出数据;
if( (addrdata>=0XA0)&&(addrdata<=0XD0)&&(numdata>=0X00)&&(numdata<=0X09) )
{
addrdata-=0XA0;
addrdata>>=4;
if(AB==0&&LR==0)
{
if(a==0) disbuf[addrdata] = numdata+48;
if(a==1) disbuf[addrdata+4]=numdata+48;
if(++a>=2) a=0;
if(addrdata==3&&a==0) over=1;
}
if(AB==0&&LR==1)
{
if(b==0) disbuf[addrdata+8] = numdata+48;
if(b==1) disbuf[addrdata+12]=numdata+48;
if(++b>=2) b=0;
if(addrdata==3&&b==0) over=1;
}
if(AB==1&&LR==0)
{
if(c==0) disbuf[addrdata+16] = numdata+48;
if(c==1) disbuf[addrdata+20]=numdata+48;
if(++c>=2) c=0;
if(addrdata==3&&c==0) over=1;
}
if(AB==1&&LR==1)
{
if(d==0) disbuf[addrdata+24] = numdata+48;
if(d==1) disbuf[addrdata+28]=numdata+48;
if(++d>=2) d=0;
if(addrdata==3&&d==0) over=1;
}
}
if(over==1) //接收完数据则进行校错
{
if(AB==0&&LR==0)
{
if(disbuf[0]!=disbuf[4])//个位错则要求固定端重传个位数
{
ES=0;
SBUF='0';
while(!TI);
TI = 0;
ES=1;
}
if( disbuf[1]!=disbuf[5] )//十位错则要求固定端重传十位数
{
ES=0;
SBUF='1';
while(!TI);
TI = 0;
ES=1;
}
if( disbuf[2]!=disbuf[6] )//百位错则要求固定端重传百位数
{
ES=0;
SBUF='2';
while(!TI);
TI = 0;
ES=1;
}
if( disbuf[3]!=disbuf[7] ) //千位错则要求固定端重传千位数
{
ES=0;
SBUF='3';
while(!TI);
TI = 0;
ES=1;
}
if( (disbuf[0]==disbuf[4])&&(disbuf[1]==disbuf[5])
&&(disbuf[2]==disbuf[6])&&(disbuf[3]==disbuf[7]) )
{
TR0=0;
Test = 1;
test_ok=1;
over=0;
}
}
if(AB==0&&LR==1)
{
if(disbuf[8]!=disbuf[12])
{
ES=0;
SBUF='0';
while(!TI);
TI = 0;
ES=1;
}
if(disbuf[9]!=disbuf[13])
{
ES=0;
SBUF='1';
while(!TI);
TI = 0;
ES=1;
}
if( disbuf[10]!=disbuf[14] )
{
ES=0;
SBUF='2';
while(!TI);
TI = 0;
ES=1;
}
if(disbuf[11]!=disbuf[15])
{
ES=0;
SBUF='3';
while(!TI);
TI = 0;
ES=1;
}
if( (disbuf[8]==disbuf[12])&&(disbuf[9]==disbuf[13])
&&(disbuf[10]==disbuf[14])&&(disbuf[11]==disbuf[15]) )
{
TR0=0;
Test = 1;
test_ok=1;
over=0;
}
}
if(AB==1&LR==0)
{
if(disbuf[16]!=disbuf[20])
{
ES=0;
SBUF='0';
while(!TI);
TI = 0;
ES=1;
}
if(disbuf[17]!=disbuf[21])
{
ES=0;
SBUF='1';
while(!TI);
TI = 0;
ES=1;
}
if( disbuf[18]!=disbuf[22] )
{
ES=0;
SBUF='2';
while(!TI);
TI = 0;
ES=1;
}
if(disbuf[19]!=disbuf[23])
{
ES=0;
SBUF='3';
while(!TI);
TI = 0;
ES=1;
}
if( (disbuf[16]==disbuf[20])&&(disbuf[17]==disbuf[21])
&&(disbuf[18]==disbuf[22])&&(disbuf[19]==disbuf[23]) )
{
TR0=0;
Test = 1;
test_ok=1;
over=0;
}
}
if(AB==1&LR==1)
{
if(disbuf[24]!=disbuf[28])
{
ES=0;
SBUF='0';
while(!TI);
TI = 0;
ES=1;
}
if(disbuf[25]!=disbuf[29])
{
ES=0;
SBUF='1';
while(!TI);
TI = 0;
ES=1;
}
if( disbuf[26]!=disbuf[30] )
{
ES=0;
SBUF='2';
while(!TI);
TI = 0;
ES=1;
}
if(disbuf[27]!=disbuf[31])
{
ES=0;
SBUF='3';
while(!TI);
TI = 0;
ES=1;
}
if( (disbuf[24]==disbuf[28])&&(disbuf[25]==disbuf[29])
&&(disbuf[26]==disbuf[30])&&(disbuf[27]==disbuf[31]) )
{
TR0=0;
TR1=0;
Test = 1;
test_ok=1;
over=0;
}
}
}
recdata:;
}
}
/****************温度传感器子程序******************/
void delay15( void )
{
unsigned char i;
for ( i=0; i<8; i++ );
}
void delay60( void )
{
unsigned char i;
for ( i=0; i<30; i++ );
}
void delay100ms( void )
{
unsigned char a,b,c;
for( a=0; a<8; a++ )
for( b=0; b<25; b++ )
for( c=0; c<250; c++ );
}
void Write0TS( void )
{
temp_data = 1;
temp_data = 0;
Delay15();
Delay15();
Delay15();
Delay15();
temp_data = 1;
_nop_();
_nop_();
}
void Write1TS( void )
{
temp_data = 1;
temp_data = 0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
temp_data = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Delay15();
Delay15();
Delay15();
}
bit ReadTS( void )
{
bit b;
temp_data = 1;
temp_data = 0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
temp_data = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
b = temp_data;
Delay15();
Delay15();
Delay15();
_nop_();
_nop_();
return b;
}
void ResetTS( void )
{
unsigned char i;
temp_data = 1;
temp_data = 0;
for( i=0; i<8; i++ )
Delay60();
temp_data = 1;
while( temp_data );
for( i=0; i<8; i++ )
Delay60();
}
void WriteBTS( unsigned char byte )
{
unsigned char i;
for( i=0; i<8; i++ )
{
if( byte & 0x01) Write1TS();
else Write0TS();
byte = byte >> 1;
}
}
unsigned char ReadBTS( void )
{
unsigned char i,j;
bit b;
j = 0;
for( i=0; i<8; i++ )
{
b = ReadTS();
if( b ) j+=1;
j = _cror_(j,1);
}
return j;
}
void InitTS( void )
{
ResetTS();
WriteBTS(0xcc);
WriteBTS(0x4e);
WriteBTS(0x64);
WriteBTS(0x8a);
WriteBTS(0x1f);
}
void GetTempTS( void )
{
ResetTS();
WriteBTS(0xcc);
WriteBTS(0x44);
Delay100ms();
ResetTS();
WriteBTS(0xcc);
WriteBTS(0xbe);
temp2 = ReadBTS();
temp1 = ReadBTS();
ReadBTS();
ReadBTS();
ReadBTS();
ReadBTS();
ReadBTS();
ReadBTS();
ReadBTS();
temp1 <<= 4;
temp1 += ( temp2 & 0xf0 )>>4;
}
/****************LCD函数***************/
void WriteCommand(uchar cmd,uchar wc)
{
if(wc==1) Busy_Wait();
DATAPORT=cmd;
RS=0;
RW=0;
EN=0;
_nop_();
EN=1;
}
void WriteData(uchar dat)
{
Busy_Wait();
DATAPORT=dat;
RS=1;
RW=0;
EN=0;
_nop_();
EN=1;
}
void WriteChar(uchar Xpos,uchar Ypos,uchar ch)
{
uchar tmp;
Xpos&=0x0f;
Ypos&=0x01;
tmp=Xpos;
if(Ypos==1) tmp+=0x40;
tmp|=0x80;
WriteCommand(tmp,1);
WriteData(ch);
}
void Busy_Wait(void)
{
DATAPORT=0XFF;
RS=0;
RW=1;
EN=0;
_nop_();
EN=1;
while(DATAPORT&busy);
}
void InitLcd(void)
{
Delayms(15); //延时15ms
WriteCommand(0x38,0);
Delayms(5);
WriteCommand(0x38,0);
Delayms(5);
WriteCommand(0x38,1);
WriteCommand(0x06,1);
WriteCommand(0x0c,1);
WriteCommand(0x01,1);
}
void Delayms(uchar x) //延时Xms
{
uchar i,j,k;
for(i=0;i<x;i++)
for(j=0;j<2;j++)
for(k=0;k<250;k++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -