📄 bikenew3.c
字号:
#include<STC12C5410AD.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_3=P2^3;
sbit P2_2=P2^2;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_5=P3^5;
sbit P3_4=P3^4;
sbit P3_7=P3^7;
bit idata low_flag1=0,low_flag2=0,load_flag1=0,load_flag2=0,speed_flag1=0,
speed_flag2=0,on_flag1,on_flag2,off_flag1,off_flag2,on_end,cflag,
off_end=1,start_flag=1,stop_flag,turn_flag1,turn_flag2,warn_set,set_flag1,
set_flag2,del_flag1,del_flag2,warn_flag1,warn_flag2,search_flag1, search_flag2,
jdq_flag,delay_flag1,delay_flag2,duo_flag1,duo_flag2,interval_flag1, jiange_flag,
interval_flag2,fs_flag1,fs_flag2,duan_flag=1,chang_flag,jiao_flag1=1,jg_flag,
jiao_flag3=1,jiao_flag4=1,jiao_flag5=1,forbit_flag1,forbit_flag2,force_flag,
tenms_flag,add_flag,msten_flag=1,close_flag=0;
uchar ms_time=0,pluscount=0,ADresult[3],vb_ref,speed_ref,on_rate,speedcount,turn_time,
c[10],k,low_warn,speed_warn,forbit_time1,forbit_time2,f[17];
uint speed_time=0,low_time=0,load_time=0,on_time=0,off_time=0,set_time,del_time,warn_time,
search_time,delay_time,interval_time1,interval_time2,duo_time;
void ADconvert() //ADresult[0]存放Key_turn信号电压值,
{
ADC_CONTR=0xc0;
ADC_CONTR=ADC_CONTR|0x08; //开A/D转换
while(!(ADC_CONTR&0x10)); //等待A/D转换结束
ADC_CONTR=ADC_CONTR&0xc7; //清中断标志位
ADresult[0]=ADC_DATA; //取8位精度
ADC_DATA=0;
ADC_CONTR=0Xc5;
ADC_CONTR=ADC_CONTR|0x08; //开A/D转换
while(!(ADC_CONTR&0x10)); //等待A/D转换结束
ADC_CONTR=ADC_CONTR&0xc7; //清中断标志位
ADresult[2]=ADC_DATA; //取8位精度
ADC_DATA=0;
}
void delay(uint x)
{ uint i;
while(x--)
{for(i=0;i<600;i++) //软件延时大约1ms
{;}
}
}
void close_pwm()
{TR0=0;
CR=0;
k=0;
set_time=0;
del_time=0;
warn_time=0;
search_time=0;
jiao_flag1=1;
jiao_flag3=1;
jiao_flag4=1;
jiao_flag5=1;
close_flag=0;
jg_flag=0;
}
void start_pwm(uint i,uchar n)
{
if(n==1)
{if(jiao_flag1)
{jiao_flag3=0;jiao_flag4=0;jiao_flag5=0;
f[0]=230;f[1]=231;f[2]=232;f[3]=233;f[4]=234;f[5]=235;f[6]=236;
f[7]=237;f[8]=238;f[9]=239;f[10]=240;f[11]=241;f[12]=242;f[13]=243;
if(i<15||i>=27&&i<=40)
{if(tenms_flag)
{TR0=1;
CR=1;
TH0=f[k];
TL0=f[k];
k++;
if(k==14)
k=0;
tenms_flag=0;}
}
else
{TR0=0;
CR=0;
k=0;}
}
}
else if(n==2)
{jiao_flag1=0;jiao_flag3=0;jiao_flag4=0;jiao_flag5=0;
f[0]=226;f[1]=227;f[2]=228;f[3]=229;f[4]=230;f[5]=231;f[6]=232;
f[7]=233;f[8]=234;f[9]=235;f[10]=236;f[11]=237;f[12]=238;f[13]=239;f[14]=240;
if(i<=15)
{if(tenms_flag)
{TR0=1;
CR=1;
TH0=f[k];
TL0=f[k];
k++;
tenms_flag=0;}
}
else
{TR0=0;
CR=0;
k=0;}}
else if(n==3)
{if(jiao_flag3)
{jiao_flag1=0;jiao_flag4=0;jiao_flag5=0;close_flag=1;
if(i<204)
{ f[0]=209;f[1]=207;f[2]=204;f[3]=203;f[4]=201;f[5]=199;f[6]=197;
f[7]=194;f[8]=191;f[9]=188;f[10]=184;f[11]=181;f[12]=178;f[13]=174;f[14]=170;
f[15]=166;f[16]=162;
TR0=1;
CR=1;
if(msten_flag)
{TH0=f[k];
TL0=f[k];
k++;
if(k==17)
k=0;
msten_flag=0;}}
else if(i>=250&&i<650)
{TR0=1;
CR=1;
if(i==250||i==450)
{TH0=129;
TL0=129;}
else if(i==350||i==550)
{TH0=1;
TL0=1;}}
else if(i>=680&&i<984)
{f[0]=227;f[1]=228;f[2]=229;f[3]=230;f[4]=231;f[5]=232;f[6]=233;f[7]=234;f[8]=235;f[9]=236;
TR0=1;
CR=1;
if(i%2==0)
{if(msten_flag)
{TH0=f[k];
TL0=f[k];
if(k==0)
add_flag=1;
if(add_flag)
k++;
if(k==10)
{add_flag=0;
k=9;}
if(add_flag==0)
k--;
msten_flag=0;}}}
else
{TR0=0;
CR=0;
k=0;}
}}
else if(n==4)
{if(jiao_flag4)
{jiao_flag1=0;jiao_flag3=0;jiao_flag5=0;close_flag=1;
f[0]=209;f[1]=207;f[2]=204;f[3]=203;f[4]=201;f[5]=199;f[6]=197;
f[7]=194;f[8]=191;f[9]=188;f[10]=184;f[11]=181;f[12]=178;f[13]=174;f[14]=170;
f[15]=166;f[16]=162;
TR0=1;
CR=1;
if(tenms_flag)
{TH0=f[k];
TL0=f[k];
if(k==0)
add_flag=1;
if(add_flag)
k++;
if(k==17)
{add_flag=0;
k=16;}
if(add_flag==0)
k--;
tenms_flag=0;}}}
else if(n==5)
{if(jiao_flag5)
{jiao_flag1=0;jiao_flag3=0;jiao_flag4=0;
f[0]=230;f[1]=231;f[2]=232;f[3]=233;f[4]=234;f[5]=235;f[6]=236;
f[7]=237;f[8]=238;f[9]=239;f[10]=240;f[11]=241;f[12]=242;f[13]=243;
if(i<28||i>=78&&i<105||i>=155&&i<182||i>=232&&i<259)
{if(tenms_flag)
{TR0=1;
CR=1;
TH0=f[k];
TL0=f[k];
if(k==0)
add_flag=1;
if(add_flag)
k++;
if(k==14)
{add_flag=0;
k=13;}
if(add_flag==0)
k--;
tenms_flag=0;}
}
else
{TR0=0;
CR=0;
k=0;}
}
}
}
void voice_time()
{ if(set_flag1)
start_pwm(set_time,1);
if(set_flag2)
{
set_flag2=0;
close_pwm();} //报警设置提示音每次响2s
if(del_flag1)
{if(close_flag==1)
{TR0=0;
CR=0;
close_flag=0;
k=0;}
warn_flag1=0;
warn_time=0;
search_flag1=0;
search_time=0;
duan_flag=1;
start_pwm(del_time,2);
if(force_flag==0)
P2_7=1;}
if(del_flag2)
{set_flag2=0;
search_flag2=0;
del_flag2=0;
close_pwm();} //报警解除提示音响每次2s
if(warn_flag1)
{duan_flag=0;
start_pwm(warn_time,3);
P2_7=0;
P1_1=0;}
if(warn_flag2)
{ msten_flag=1;
warn_flag2=0;
close_pwm();
interval_flag1=1;
interval_time1=0;
interval_time2=0;
if(force_flag==0)
P2_7=1;
P1_1=1;} //车辆振动时报警提示音每次响8s
if(search_flag1)
start_pwm(search_time,4);
if(search_flag2)
{
search_flag2=0;
close_pwm();} //寻车提示音每次响10s
if(duo_flag1)
{start_pwm(duo_time,5);
}
if(duo_flag2)
{duan_flag=0;
duo_flag2=0;
close_pwm();
delay_flag1=1;
delay_time=0;
}
}
void scan()
{if(P2_4==1)
{warn_set=1;
set_flag1=1;
} //报警设置提示音
if(P3_5==1)
{warn_set=0;
del_flag1=1;
P1_1=1;
} //报警解除提示音
if(P2_5==1) //寻车提示音
search_flag1=1;
if(P2_4==1&&P3_4==1)
{ warn_set=0;
force_flag=0;
P2_7=1;
set_flag1=0;
set_time=0;
close_pwm();
}
if(P2_4==1&&P2_5==1)
{warn_set=0;
P2_7=0;
force_flag=1;
search_flag1=0;
search_time=0;
set_flag1=0;
set_time=0;
close_pwm();
}}
void judgement()
{if(ADresult[0]<=25) //首先判断电动车有没有转弯
{if(speedcount>=speed_ref) //如果检测到超速
{speed_flag1=1;
if(speed_flag2)
{if(speed_warn)
{P3_0=1; //触发TG4,播放欠压语音
speed_flag1=0;
speed_flag2=0;
delay(10);
P3_0=0;
speed_warn--;}}}
else
{speed_flag1=0;
speed_time=0;
speed_warn=3;}
if(P2_6==0) //检测到电压小于下限值
{low_flag1=1;
if(low_flag2) //延时30s之后播放提示音
{ if(low_warn)
{
P1_7=1; //触发TG2,播放提示音
low_flag1=0;
low_flag2=0;
delay(10);
P1_7=0;
low_warn--; }}}
else
{low_flag1=0; //如果在这30s之内电压恢复正常范围则停止计时
low_time=0;
low_warn=3;}
if(P3_1==0) //如果检测到电动车超负载,等待10s播放提示音
{load_flag1=1;
if(load_flag2)
{P1_6=1; // 触发TG3
load_flag1=0;
load_flag2=0;
delay(10);
P1_6=0;}}
else
{load_flag1=0;
load_time=0;}
/* if(delay_flag1)
{if(warn_flag1)
fs_flag1=1;
else fs_flag1=0;}*/
if(delay_flag2)
{delay_flag2=0;
//if(fs_flag1==1)
duan_flag=1;
//else duan_flag=1;
}
/*if(interval_flag1)
{if(warn_flag1)
fs_flag2=1;
else fs_flag2=0;}*/
if(interval_flag2)
{interval_flag2=0;
// if(fs_flag2==0)
duan_flag=1;
// else duan_flag=1;
}
if(warn_set) //当车辆在结束8s报警后3s之内又有振动则连续响8s
{
if(jiange_flag)
{if(P1_4==1)
warn_flag1=1;}
if(delay_flag1)
{if(P1_4==1)
warn_flag1=1;}
if(duan_flag)
{//chang_flag=0;
//当车辆振动时
if(P1_4==1) //开启报警
//delay_flag1=1;
duo_flag1=1;
}}
}
else //当检测到电压大于0.6V时候,P1.0/ADC0 0.5秒钟强推挽输出高电平,
{ //0.5s用做A/D口检测电压
turn_flag1=1;
if(turn_flag2)
{P2_3=1;
turn_flag1=0;
turn_flag2=0; //触发TG5,播放转弯提示音
delay(10);
P2_3=0;}
if(off_end)
{on_flag1=1;
if(on_flag2)
{P1M0=0x24;
P1_0=1;
on_flag1=0;
on_flag2=0;
on_end=1;
off_end=0;}}
if(on_end)
{off_flag1=1;
if(off_flag2)
{P1M0=0x25;
off_flag1=0;
off_flag2=0;
off_end=1;
on_end=0;}}
}
}
void count() interrupt 0 using 0
{pluscount++;}
timer1() interrupt 3 using 3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256; //每10ms中断一次
if(forbit_flag1)
{
if(++forbit_time1==100)
{forbit_time1=0;
forbit_flag1=0;
warn_set=1;}}
if(forbit_flag2)
{
if(++forbit_time2==100)
{forbit_time2=0;
forbit_flag2=0;
warn_set=1;}}
if(interval_flag1)
{if(++interval_time1==100)
{jiange_flag=1;
interval_time1=0;}
if(++interval_time2==400)
{jiange_flag=0;
interval_flag1=0;
interval_flag2=1;
interval_time2=0;}}
if(delay_flag1)
{if(++delay_time==300)
{delay_flag1=0;
delay_flag2=1;
delay_time=0;}}
if(duo_flag1)
{tenms_flag=1;
if(duo_time++==300)
{duo_flag1=0;
duo_flag2=1;
duo_time=0;
tenms_flag=0;}}
if(set_flag1)
{tenms_flag=1;
if(set_time++==85)
{tenms_flag=0;
set_flag1=0;
set_flag2=1;
set_time=0;}}
if(del_flag1)
{tenms_flag=1;
if(del_time++==50)
{tenms_flag=0;
del_flag1=0;
del_flag2=1;
del_time=0;}}
if(warn_flag1)
{msten_flag=1;
if(++warn_time==1000)
{warn_flag1=0;
warn_flag2=1;
warn_time=0;}}
if(search_flag1)
{tenms_flag=1;
if(++search_time==800)
{tenms_flag=0;
search_flag1=0;
search_flag2=1;
search_time=0;}}
if(turn_flag1)
{if(++turn_time==150)
{turn_flag1=0;
turn_flag2=1;
turn_time=0;}}
if(++ms_time==100)
{EX0=0;
speedcount=pluscount;
ms_time=0;
pluscount=0;
EX0=1;} //每一秒钟去读取外部中断0累加的脉冲数
if(on_flag1)
{if(++on_time==49)
{on_flag1=0;
on_flag2=1;
on_time=0;}}
if(off_flag1)
{if(++off_time==50)
{off_flag1=0;
off_flag2=1;
off_time=0;}}
if(low_flag1)
{if(++low_time==3000) //延时30s
{low_flag1=0;
low_flag2=1;
low_time=0;}}
if(load_flag1)
{if(++load_time==1000)
{load_flag1=0;
load_flag2=1;
load_time=0;}}
if(speed_flag1)
{if(++speed_time==1000)
{speed_flag1=0;
speed_flag2=1;
speed_time=0;}}
}
main()
{uchar i;
low_warn=3;
speed_warn=3;
P3_0=P1_6=P1_7=P2_0=P2_1=P2_3=0;
delay(200);
P1_3=0; //语音芯片复位脚低电平有效
P1M0=0X25;
P1M1=0X25; //将P1.0、P1.2设置成开漏模式,用做A/D转换
ADC_CONTR=0Xc0; // 打开A/D转换电源,并设置转换方式为1
delay(1); //初次打开A/D转换电源,需延时1ms,等内部模拟电源稳定后,
//再启动A/D转换
for(i=0;i<3;i++)
{ADC_CONTR=0Xc2;
ADC_CONTR=ADC_CONTR|0x08; //开A/D转换
while(!(ADC_CONTR&0x10)); //等待A/D转换结束
ADC_CONTR=ADC_CONTR&0xc7; //清中断标志位
ADresult[1]=ADC_DATA; //取8位精度
ADC_DATA=0;}
for(i=0;i<3;i++)
{ADC_CONTR=0Xc5;
ADC_CONTR=ADC_CONTR|0x08; //开A/D转换
while(!(ADC_CONTR&0x10)); //等待A/D转换结束
ADC_CONTR=ADC_CONTR&0xc7; //清中断标志位
ADresult[2]=ADC_DATA; //取8位精度
ADC_DATA=0;}
if(ADresult[1]>=205) //判断车轮直径是16cm
speed_ref=110;
else if(ADresult[1]>=154) //判断VB电源值是18cm
speed_ref=98;
else if(ADresult[1]>=103) //判断VB电源值是22cm
speed_ref=80;
else if(ADresult[1]>=52) //判断VB电源值是24cm
speed_ref=74;
TMOD=0x12; //定时器1和计数器0的工作方式
TH1=(65536-10000)/256;
TL1=(65536-10000)%256; //每10ms中断一次
//IP=0x06;
//IPH=0x0c;
AUXR=0x80;
EA=1;ET1=1;TR1=1;EX0=1;IT0=1;
//TO工作在IT高速模式下
CMOD=0x04;
CL=0x00;
CH=0x00;
CCAP0L=128;
CCAP0H=128;
CCAPM0=0x42;
WDT_CONTR=0X3c;
while(1)
{ADconvert();
if(ADresult[2]>=128) //一开锁播放提示音,只播放一次
{if(start_flag)
{
P2_0=1;
delay(10);
P2_0=0;
start_flag=0;
stop_flag=1;}}
else //停车时播放语音提示,
{if(stop_flag)
{
P2_1=1;
delay(10);
P2_1=0;
stop_flag=0;
start_flag=1;}}
scan();
judgement();
voice_time();
WDT_CONTR=0X3c;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -