📄 two18.c
字号:
# include<reg52.h>
# include<VIIC_C51.h>
# include<stdlib.h>
# include<string.h>
//***********************************************************
# define uchar unsigned char
# define uint unsigned int
# define S24C04 0xA0
# define VM x //宏定义VM为7.6km/h /M(平均每个脉冲所等价的速度)
# define c DangerDis //危险距离
# define d SafeDis //安全距离
# define e StartSpeed //启动速度
# define f SafeSpeed //安全速度
# define OLEN 14 //发送缓冲区大小 2006 4 14
uchar idata outbuf[OLEN]; //发送缓冲区
uchar idata *outlast=outbuf; //最后由中断传输出去的字节位置
uchar idata *putlast=outbuf; //最后放入发送缓冲区的字节位置
# define ILEN 8 //接收缓冲区大小
# define SVLEN 8 //距离、速度缓冲区大小
uchar idata inbuf1[ILEN]; //接收缓冲区1
uchar idata inbuf2[ILEN]; //接收缓冲区2
uchar idata inbuf3[14]; //接收缓冲区3 2006 5 11
uchar idata BUF2[SVLEN]; //速度字符串缓存
uchar idata copyinbuf1[SVLEN]; //备份第一路数据
uchar idata copyinbuf2[SVLEN]; //备份第二路数据
uchar idata *inlast1=inbuf1; //最后由中断进入接收缓冲区1的字节位置
uchar idata *inlast2=inbuf2; //最后由中断进入接收缓冲区2的字节位置
uchar idata *inlast3=inbuf3; //最后由中断进入接收缓冲区3的字节位置 2006 5 11
bit bdata outbufsign; //输出缓冲区非空标志 有=1
bit bdata inbufful1; //输入缓冲区1满标志 满=1
bit bdata inbufful2; //输入缓冲区2满标志 满=1
bit bdata inbufful3; //输入缓冲区3满标志 满=1 2006 5 11
bit bdata DBshort; //短距离定标指示 2006 5 21
bit bdata DBlong; //长距离定标指示 2006 5 21
bit bdata ST_ON; //激活测距仪有效标志 2006 5 21
bit bdata DB_ON; //定标有效标志 2006 5 21
bit bdata CS_ON; //参数设置有效标志 2006 5 21
bit bdata order; //显示模块指令数据 2006 5 21
bit bdata r_flag1; //数据接收标志1,当接到数据串第一个字节后变量置1
bit bdata r_flag2; //数据接收标志2,当接到数据串第一个字节后变量置1
bit bdata v_full; //新速度有标志,有新速度置1,取走置0
bit bdata OI; //子串口0、1选择标志量
bit bdata C2; // 2006 5 11
bit bdata s2; //距离调整标志
bit bdata v2; //速度调整标志
bit bdata cutflag; //断油标志
bit bdata brakeflag; //刹车标志
bit bdata blankflag; //恢复正常状态标志
bit bdata door1; //门1
//bit bdata door2; //门2
bit bdata no1come1; //第一路数据到达标志
bit bdata no2come2; //第二路数据到达标志
bit bdata no1wrong1; //第一路数据错误
bit bdata no2wrong2; //第二路数据错误
bit bdata resend1; //数据重发 2006 3 31
bit bdata resend2; //数据重发 2006 3 31
//bit bdata Twosecflag; //两秒定时标志 2006 4 14
bit bdata sky; //对空数据
//接口定义
//***********************************************************
sbit slow1=P0^0; //断油输出端
sbit slow2=P0^1;
sbit slow3=P0^2;
sbit slow4=P0^3;
sbit slow5=P0^4;
//sbit red=P1^1; //短距离定标灯指示 2006 4 14
//sbit green=P1^2; //长距离定标灯指示 2006 4 14
//sbit click=P3^2; //外中断0 2006 4 14
//sbit dial=P3^6; //定标开关 2006 4 14
sbit stop=P0^5 ; //刹车输出端
//sbit alarm=P3^7 ; //声光报警输出端
/*sbit RS = P1^5; //液晶显示接口定义
sbit RW = P1^6;
sbit E = P1^7;
*/
sbit AdrIn0 = P1^3; //子串口0、1、2接收地址
sbit AdrIn1 = P1^4;
sbit AdrOut0 = P0^6; //子串口0、1、2发送地址
sbit AdrOut1 = P0^7;
/* extern void DelayUs(unsigned int delay_tmp); //显示延时
extern void write_com(unsigned char com_data); //写指令子程序
extern void write_data(unsigned char data_tmp); //写数据子程序
extern void write_hz(unsigned char *hz_data, unsigned char nm); //写汉字
extern void write_zf(unsigned char *zf_data, unsigned char nm); //写字符
extern void st_setup(void); //LCD初始化
*/
//固定参数ROM存储,数字包括小数点共七位。
//uchar code CHIN1[] ={0x53,0x3A}; //显示"S:"
//uchar code CHIN2[] ={0x56,0x3A}; //显示"V:"
//uchar code NORMAL[]="正常行使"; //显示"正常行使"
//uchar code SPEED[] ={0x18,0x21}; //超速标志
//uchar code DIST[] ={0x17,0x21}; //危险距离标志
//uchar code CUT5[] ={0x19,0x35}; //断油5路
//uchar code CUT4[] ={0x19,0x34}; //断油4路
//uchar code CUT3[] ={0x19,0x33}; //断油3路
//uchar code CUT2[] ={0x19,0x32}; //断油2路
//uchar code CUT1[] ={0x19,0x31}; //断油1路
//uchar code BRAKE[] ={0x10,0x11}; //刹车标志
//uchar code WHITE1[]={0x20,0x20}; //空两字符
//uchar code WHITE2[]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}; //空八字符
//参数RAM存储
static uchar overflow_10ms; //T0中断溢出次数
static uchar TIsign; //中断向母串口发零以使母子串口波特率协调
static uchar data_number1; //接收的数据个数
static uchar warning1; //判断接收数据正误标志
static uchar data_number2; //接收的数据个数
static uchar warning2; //判断接收数据正误标志
//static uchar data_number3; // 串口3接收的数据个数 2006 5 20
static uchar cutcount; //断油时间计数 2006.3.6
static uchar brakecount; //刹车时间计数 2006.3.6
static uchar brakestatus; //刹车频率设置 2006.3.7
static uchar blankcount; //恢复正常时间计数 2006.3.7
//static uchar alarmlevel; //报警等级 2006.3.9
//static uint alarmcount; //报警时间计数 2006.3.9
//static uchar alarmstatus; //报警频率设置 2006.3.9
static uchar no1count; //第一路数据计数 2006 3 20
static uchar no2count; //第二路数据计数 2006 3 20
static uint no1wrong1count; //等待数据计时 2006 3 31
static uint no2wrong2count; //等待数据计时 2006 3 31
//static uchar int0count; //外中断次数计数 2006 4 14
//static uchar Twoseccount; //2秒计时 2006 4 14
float idata rv=0; //实际速度浮点变量
uint idata x;//=000; //速度脉冲系数 2006 5 21
uint idata c;//=010;//10.0 ; //危险距离 2006 5 21
uint idata d;//=200;//200.0 ; //安全距离 2006 5 21
uint idata e;//=025;//25.0 ; //启动速度
uint idata f;//=120;//120.0 ; //安全速度
uint idata t0;//=225;//0.225; //30km/h 制动距离与速度比
uint idata t1;//=305;//0.305; //40km/h 制动距离与速度比
uint idata t2;//=380;//0.380; //50km/h 制动距离与速度比
uint idata t3;//=450;//0.450; //60km/h 制动距离与速度比
uint idata t4;//=557;//0.557; //70km/h 制动距离与速度比
uint idata t5;//=675;//0.675; //80km/h 制动距离与速度比
uint idata t6;//=756;//0.756; //90km/h 制动距离与速度比
uint idata t7;//=840;//0.840; //100km/h 制动距离与速度比 2006 5 21
uint idata t8;//=927;//0.927; //110km/h 制动距离与速度比 2006 5 21
uint idata t9;//=917;//0.917; //120km/h 制动距离与速度比 2006 5 21
//=====================================================
//函数名称:serial() interrupt 4 串口中断
//功能描述:串口接收、发送数据
//输入:/
//输出:/
//全局变量: outbufsign TIsign OI
// r_flag1 data_number1 inbufful1 no1come1
// r_flag2 data_number2 inbufful2 no2come2
//调用模块: /
//=====================================================
serial() interrupt 4
{
if(TI)
{
TI=0;
if(outbufsign) //缓冲区满标志
{
if(TIsign==0) //TIsign为零发数据
{
if(C2==0)
{
if(OI==0) //如果发给串口0
{
AdrOut0=0; //置串口0地址
AdrOut1=0;
SBUF=*outlast; //未发送完继续发送
outlast++; //最后传出去的字节位置加一
}
else
{
AdrOut0=1; //置串口1地址
AdrOut1=0;
SBUF=*outlast; //未发送完继续发送
outlast++; //最后传出去的字节位置加一
}
}
else
{
AdrOut0=0; //置串口2地址
AdrOut1=1;
SBUF=*outlast;
outlast++;
}
TIsign=3; //置发零个数标志量为三
}
else //否则发零
{
AdrOut0=1; //置母串口地址
AdrOut1=1;
SBUF=0; //发零
TIsign--;
}
if(outlast==outbuf+OLEN) outlast=outbuf; //地址到顶部回到底部
if((putlast==outlast)&&TIsign==0) outbufsign=0; //数据发送完置发送缓冲区空标志
}
}
if(RI)
{
RI=0;
if(AdrIn1==0)
{
if(AdrIn0==0) //串口0接到数据
{
data_number1++; //个数加一
if(data_number1==1) //当接到第一个数据时,标志量置一
{
r_flag1=1;
}
if(data_number1>=7&&data_number1<=14) //截取需要的数字串
{
*inlast1=SBUF; //放入数据
inlast1++; //最后放入的位置加一
}
if(inlast1==inbuf1+ILEN) //地址到顶部回到底部
{
inlast1=inbuf1;
inbufful1=1; //接收缓冲区满置满标志
no1come1=1; //第一路数据到达 2006 3 20
}
}
else //串口1接到数据
{
data_number2++; //个数加一
if(data_number2==1) //当接到第一个数据时,标志量置一
{
r_flag2=1;
}
if(data_number2>=7&&data_number2<=14) //截取需要的数字串
{
*inlast2=SBUF; //放入数据
inlast2++; //最后放入的位置加一
}
if(inlast2==inbuf2+ILEN) //地址到顶部回到底部
{
inlast2=inbuf2;
inbufful2=1; //接收缓冲区满置满标志
no2come2=1; //第二路数据到达 2006 3 20
}
}
}
else //串口2接到数据 2006 5 11
{
if(inbufful3==0) //
{
*inlast3=SBUF; //放入数据
if(*inlast3=='$') // 显示模块指令数据 2006 5 21
{
DB_ON=1;
order=1;
}
if(*inlast3=='*') // 参数设置数据 2006 5 21
{
// inlast3--; //指针减一 2006 5 23
CS_ON=1; //参数设置有效标志 2006 5 21
}
inlast3++; //最后放入的位置加一
if((inlast3==inbuf3+6)&&order==1) // 显示模块数据 2006 5 21
{
inlast3=inbuf3;
inbufful3=1;
order=1;
}
if(inlast3==inbuf3+14) //地址到顶部回到底部 参数设置数据 2006 5 21
{
inlast3=inbuf3;
inbufful3=1; //接收缓冲区满置满标志
}
}
} // 2006 5 11
}
}
//========================================================================================
//函数名称:timer0_ISR() interrupt 1 定时器T0中断
//功能描述:T0中断
//输入:/
//输出:/
//全局变量: overflow_10ms rv v_full
// r_flag1 data_number1 no1come1 warning1
// r_flag2 data_number2 no2come2 warning2
// cutflag cutcount brakeflag brakecount brakestatus
// door1 door2
// blankflag blankcount
// no1count no1wrong1 no2count no2wrong2
//调用模块: /
//========================================================================================
void timer0_ISR(void)interrupt 1
{
overflow_10ms++; //溢出次数加一
TR0=0; //关定时器T0
TH0=0xB8; //置初值
TL0=0x00;
TR0=1; //开定时器T0
//==================================================
//取速度
//==================================================
if(overflow_10ms==20) //溢出次数达到20次,取T1计数值
{
TR1=0; //关计数器T1
overflow_10ms=0; //溢出次数清零
rv=TL1; //取计数值
rv=(rv*VM)/10; //计算所计速度
TL1=0; //计数值T1清零
TR1=1; //开计数器T1
v_full=1; //得新速度,标志量置1
}
//==================================================
//检查距离数据
//==================================================
if(r_flag1==1&&data_number1==16) //常规情况下串口接收中断与T0中断不相遇
{
if(warning1==1) //接到第一次警告
warning1=0; //清零,防止警告累加到下一次接收中
r_flag1=0; //接收标志量清零
data_number1=0; //接收个数标志清零
}
if(r_flag2==1&&data_number2==16)
{
if(warning2==1) //接到第一次警告
warning2=0; //清零,防止警告累加到下一次接收中
r_flag2=0; //接收标志量清零
data_number2=0; //接收个数标志清零
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -