📄 main.c
字号:
/////////////////////////////////////////////////////////
#include <absacc.h>
#include <reg51.h>
#include<DATA_define.h>
#include<Send_Receive.h>
#include<Buffer.h>
#include<set.h>
#include<display.h>
void Set_INFO(void)
{
INFO[0]=0;
INFO[1]=2;
INFO[2]=5;
INFO[3]=0;
}
/**** 主程序
*****/
////////////////////////////////////////////////////////////
//5ms定时
void timer0( void ) interrupt 1
{
TR0=0;
ET0=0;
TH0=0xee; // 载入计数初值
TL0=0x00;
output_sel = 0xf0; /*初值,令数码管驱动位无效,指示灯全灭*/
// TR0=1; // 开时钟,保证计时精确
Wireless_int0();
d_time++; // 每5ms对超时标志加1 /%
d_time=d_time%200;//0~199循环计数
if(d_time==D_T)
{
state_flag=C21a;
Rbuffer_point=1;
state=1;
}//判定传输中断,处理
if(d_time==RES_TIME)
{
Adrchange_flag=1;
d_time=0;
if(Adrchange_flag) //掉线
{
bus_control_count++;
bus_control_count=bus_control_count%10;
Set_address(bus_control_count);
TI=1;
Adrchange_flag=0;
}
}//判定掉线,处理
// fir_dis=(Rbuffer[11]-'0')*16+(Rbuffer[12]-'0');
// sec_dis=(Rbuffer[13]-'0')*16+(Rbuffer[14]-'0');
// thi_dis=(Rbuffer[15]-'0')*16+(Rbuffer[16]-'0');
// for_dis=(Rbuffer[17]-'0')*16+(Rbuffer[18]-'0');
Display();//显示信息
TR0=1;
ET0=1;
}
///////////////////////////////////////////////////////////
/////////////////////////////////////////////////////
//主系统的发送接收程序
void Receive_interr(void) interrupt 4//一次串行发送/接收完成后,发出中断申请
{ unsigned char i;
if(RI)///接收完毕
{
RI=0;//清除接收中断
fir_dis=13; ///MARK
d_time=0;//开始计时
FSM();//有限状态机形式的接收数据
if(buffer_flag)//接收完毕
{
////////////////////////////////////////////////
//保存info
if(Get_ADR()==MOTOR_ADR)
{
for(i=0;i< Get_LENGTH()*2;i++)
MOTOR_INFO_DOWN[i]=Rbuffer[i+11];
}
else if(Get_ADR()==CUP_ADR)
{
for(i=0;i<Get_LENGTH()*2;i++)
CUP_INFO_DOWN[i]=Rbuffer[i+11];
}
else if(Get_ADR()==DIST_ADR)
{
for(i=0;i<Get_LENGTH()*2;i++)
DIST_INFO_DOWN[i]=Rbuffer[i+11];
}
else if(Get_ADR()==TOP_ADR)
{
}
////////////////////////////////////////
receivedone_flag=1;
ES=0;
while(d_time<=4);//延时20ms ????????????????????????????????????
/////////////////////////////////////////////////////////////////////////////
bus_control_count++;
bus_control_count=bus_control_count%10;
Set_address(bus_control_count); //
Set_INFO();
Set_BUF();//把信息放入带发送信息
receivedone_flag=0; ///标志复位
TI=0;
Sbuffer_point=0;
SBUF=Sbuffer[0];/////////////
Sbuffer_point++;
ES=1;
//////////////////////////////////////////////////////////////////////////////
}//当接收完毕时,发送反馈信息
}
else if(TI) //发送完毕
{
if(feedbackdone_flag) //当镇发送完毕时复位,等待下一次接收
{
feedbackdone_flag=0;
TI=0;
}
else //当没有发送完毕时,继续发送
{
REN=0;///关闭串行接收
TI=0; //
fir_dis=14;
if(Sbuffer[Sbuffer_point]!=EOI)
{
SBUF=Sbuffer[Sbuffer_point];
Sbuffer_point++;
}
else
{
ES=0;
SBUF=Sbuffer[Sbuffer_point];
Sbuffer_point=0;
REN=1;//运行串行接收
feedbackdone_flag=1;
//////////////////////////////////////////////////////////////
//for_dis=bus_control_count;
bus_control_count++;
bus_control_count=bus_control_count%10;
// if(bus_control_count%2==0)
// bus_control_count--;
Set_address(bus_control_count);
ES=1;
////////////////////////////////////////////////////////////////////
}
d_time=0;
}
}
}
//////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
main()
{
//* 单片机系统初始化 *
P1=0XFF;
P3=0XFF;
//** 中断工作寄存器初始化 **
InitWireless();
//** 定时器工作寄存器初始化 **
PT1=1;//优先级设置
TR1=1;
//////////////////////////////
SCON=0x40;//工作方式1
TMOD=0X21;
TH0=0xee;
TL0=0x00;
TH1=0xfd;//
TR1=1;
ET1=0;
ES=1;
EA=1;
ET0=1;
TR0=1;/*开中断*/
PS=0; //串口工作优先级低
TI=1;
PT0=1;//5ms定时器中断优先级高
Set_BUF();
// RESET_8255=0;//复位无效
// ADDR_8255_control=0x80;//写方式字
///////////////8255控制字///////
/////////////////////////////////////////
//* 主循环,本例中,在T0中断服务程序未被执行的空余时间里,处理机在以下程序中不断循环 *
while(1)
{
Wireless_while();
}
}
////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -