📄 at89c51.c
字号:
#include <reg51.h>
#include "AT89C51.h"
float dis_data=555;
//uint n_data=0;//////用于调试//////
//uchar code array1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xb9,0xbf};
/////不带小数点///////0/////1////2///3////4/////5////6////7///8/////9////+////-/////////
//uchar code array2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
/////带小数点/////////0/////1////2///3////4/////5////6////7///8/////9/////////////////
uchar n=0;
uchar a=0;
uchar temp=0;
uchar temp1=0;
uchar temp2=0;
uchar temp3=0;
uchar temp4=0;
///////////////////////////////////////////////////////////////////////////////
void AT89C51_initialize(void)
{
EA =1;////打开中断总开关///////
EX0=1;////打开中断0////
// PX0=1;
IT0=1;/////设置下降沿触发/////
/////////////////////////////////////////////
ET0=1;/////允许T0中断/////
// PT0=1;
ET1=1;/////允许T1中断/////
// PT1=1;
TMOD=0x11;////T0、T1都工作在模式1,16位/////
TH0=0; TL0=0; TR0=0;/////设置初值为0,暂时不要启动T0//////
// TH1=0xc5; TL1=0x68; TR1=0;////定时15ms,暂时不要启动T1//////
// TH1=0xe4; TL1=0xa8; TR1=0;////定时7ms,暂时不要启动T1//////
}
////////////////////引导码核对函数///////////////////////////////////////////////////////////////
bit Check_leader(void)
{
uint lead_time;
while(P31==0);////引导码的脉冲还没有结束,等待/////
TR0=0; /////脉冲结束,关闭T0///////////////
lead_time=TH0*256+TL0;///////计算脉冲的宽度///////
if((lead_time>2500)&&(lead_time<3200)) return(1); /////判断是否是引导码////
else {
//dis_data=111;////用于调试//////
return(0);
}
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////接收位数据函数//////////////////////////////////////////////////////////////
bit Receive_bitdata(void)
{
uint data_time;
while(P31==0);////位信息脉冲还没有结束,等待/////
TR0=0; /////脉冲结束,关闭T0///////////////
data_time=TH0*256+TL0;///////计算脉冲的宽度///////
if((data_time>250)&&(data_time<650))
{
Jizai_data(0);
return(1);
} ///如果为逻辑0信息,并记录/////
// else return(0);
if((data_time>1200)&&(data_time<1650))
{
Jizai_data(1);
return(1);
}///如果为逻辑1信息,并记录/////
// else return(0);
if((data_time<250)||(data_time>1650)) return(0); ///如果为非位信息数据,放弃,/////
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////记录接收的位数据函数//////////////////////////////////////////////////////////////
bit Jizai_data(bit bitdata)
{
temp=temp<<1;////左移////
if(bitdata==1) temp=temp|0x01;/////先发送的是数据的最高位,发送和接收要对应//////////
else temp=temp&0xfe;
a++;////接收一位信息,m的值加1,m代表接收了几个位信息/////////
//dis_data=temp;
//if(bitdata==1) dis_data=1;/////先发送的是数据的最高位,发送和接收要对应//////////
// else dis_data=0;
if(a==8) {temp1=temp;temp=0;}/////接收到一个字节信息,将数据转给temp1///////
if(a==16) {temp2=temp;temp=0;}/////接收到第2个字节信息,将数据转给temp2///////
if(a==24) {temp3=temp;temp=0;}/////接收到第3个字节信息,将数据转给temp3///////
if(a==32) {temp4=temp;temp=0;a=0;}/////接收到第4个字节信息,将数据转给temp4,////////////
//////////一次完整的数据传输结束,m的值归0///////
return(1);
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////核对接收的数据是否正确函数//////////////////////////////////////////////////////////////
bit Check_Receive_data(void)
{
if((temp1==~temp2)&&
(temp3==~temp4))//&&(temp1==0xaa)
return(1); /////注意temp3是传送过来的有效、需要取用的数据值///////
else return(0);
}
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////////红外线接收处理函数///////////////////////////////////////////////////////////////////////////////////
void Receive_Infrared_Process(void)
{
if(n==33) //////如果接收完1侦数据(1个字节数据)////////
{
if(Check_Receive_data())
{
P_data1=temp1; P_data2=temp3;//////经过校验正确,取用//////
if (P_data1 >= 0x80) {dis_data=-((~P_data1)*256+(~P_data2)+1)*0.0625;}
else{dis_data=(P_data1*256+P_data2)*0.0625; }
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -