📄 触摸式人行灯控制器.c
字号:
#include<AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
uchar mn[4];
uchar dd[26];
uchar cnt=130,e=0x00;
uint a,b,c,d,sx=0,i;
uint t1=0,bz=1,bz1=1,bz3=0,bz4=0,bz5=0;
uchar run_fs,cm_1,cm_2,cm_max;
uchar yellow,blue_s,red_all,yellow_s;
uchar rx,fj;
uchar second=0,hour=0;
uchar sd1,sds1,sdg1;
uchar sd2,sds2,sdg2;
uchar sd3,sds3,sdg3;
uchar sd4,sds4,sdg4;
uchar sd5,sds5,sdg5;
uchar code DB[]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0X76,0X40,0X71,0X6D};
uchar code DB1[]={0X00,0X40,0X20,0X10,0X08,0X04,0X02,0X01};
uchar cc1302[]={0x14,0x17,0x12,0x12,0x12,0x07,0x12};
uchar read1302[]={0x13,0x13,0x13,0x13,0x13,0x03,0x13};
//-----------------
sbit ACC0=ACC^0;
sbit ACC7=ACC ^7;
sbit t_clk=P1^5;
sbit t_io=P1^6;
sbit t_rst=P1^7;
//-----------------
void sm(); //扫描
void cs(); //确定初始
void yx(); //触摸
void yx1(); //两相位
void fs(); //发送
void delay(uint time); //延时
//--------------------------
r_bit(); //读一个字节
void w_bit(uchar write); //写一个字节
void w1302(uchar ucaddr,uchar ucda); //写地址/写数据
r1302(uchar ucaddr); //写地址/读数据
void set1302(uchar *pclock); //初始1302
void get1302(); //读1302时,分,秒
void bitw1302r(uchar *pwreg); //写寄存器
void bitr1302r(uchar *prreg); //读寄存器
//######################################################################
void main(void)
{
TMOD=0x21;
TH0=0Xf4;
TL0=0x48;
IE=0x83;
IP=0X02;
TR0=1;
TH1=0Xfa;
TL1=0xfa;
TR1=1;
SCON=0X50;
P1_0=0;
P1_1=0;
//------------------------
bitr1302r(dd);
if(dd[0]!=0x66)
{
dd[0]=0x66;
dd[1]=run_fs=1; //运行方式
dd[2]=cm_1=22; //一次触摸人行的绿灯时间
dd[3]=cm_2=33; //非机的最小通行时间
dd[4]=cm_max=60; //人行的最大通行时间
dd[5]=yellow=3; //黄灯时间
dd[6]=blue_s=4; //绿闪时间
dd[7]=red_all=5; //全红时间
dd[8]=yellow_s=6; //黄灯频率
dd[9]=rx=20; //两相位人行时间
dd[10]=fj=30; //两相位非机时间
dd[11]=sd1=1;
dd[12]=sd2=1;
dd[13]=sd3=1;
dd[14]=sd4=1;
dd[15]=sd5=1;
dd[16]=sds1=0x30;
dd[17]=sds2=0x35;
dd[18]=sds3=0x40;
dd[19]=sds4=0x45;
dd[20]=sds5=0x50;
dd[21]=sdg1=0x06;
dd[22]=sdg2=0x07;
dd[23]=sdg3=0x08;
dd[24]=sdg4=0x09;
dd[25]=sdg5=0x10;
bitw1302r(dd);
set1302(cc1302);
}
else if(dd[0]==0x66)
{
run_fs=dd[1]; //运行方式
cm_1=dd[2]; //一次触摸人行的绿灯时间
cm_2=dd[3]; //非机的最小通行时间
cm_max=dd[4]; //人行的最大通行时间
yellow=dd[5]; //黄灯时间
blue_s=dd[6]; //绿闪时间
red_all=dd[7]; //全红时间
yellow_s=dd[8]; //黄灯频率
rx=dd[9]; //两相位人行时间
fj=dd[10]; //两相位非机时间
sd1=dd[11];
sd2=dd[12];
sd3=dd[13];
sd4=dd[14];
sd5=dd[15];
sds1=dd[16];
sds2=dd[17];
sds3=dd[18];
sds4=dd[19];
sds5=dd[20];
sdg1=dd[21];
sdg2=dd[22];
sdg3=dd[23];
sdg4=dd[24];
sdg5=dd[25];
}
//--------------------
get1302();
a=DB[read1302[2]/0x10];
b=DB[read1302[2]%0x10];
c=DB[read1302[1]/0x10];
d=DB[read1302[1]%0x10];
//------------------------
while(1)
{
switch(run_fs)
{
case 1:P2=P2&0x07|0x88;
delay(60);
if(bz3==88)
{
yx();
bz3=0;
}
else if(bz3!=88)
{if(t1==0)
{ if(bz4==0x00)
{ get1302();
a=DB[read1302[2]/0x10];
b=DB[read1302[2]%0x10];
c=DB[read1302[1]/0x10];
d=DB[read1302[1]%0x10];
//-------------
if(((read1302[2]*0x60+read1302[1])>=(sdg1*0x60+sds1))&&((read1302[2]*0x60+read1302[1])<(sdg2*0x60+sds2)))
run_fs=sd1;
else if(((read1302[2]*0x60+read1302[1])>=(sdg2*0x60+sds2))&&((read1302[2]*0x60+read1302[1])<(sdg3*0x60+sds3)))
run_fs=sd2;
else if(((read1302[2]*0x60+read1302[1])>=(sdg3*0x60+sds3))&&((read1302[2]*0x60+read1302[1])<(sdg4*0x60+sds4)))
run_fs=sd3;
else if(((read1302[2]*0x60+read1302[1])>=(sdg4*0x60+sds4))&&((read1302[2]*0x60+read1302[1])<(sdg5*0x60+sds5)))
run_fs=sd4;
else run_fs=sd5;
}
else if(bz4==0x88)
{ bz4=0x00;
w1302(0x8e,0x00);
w1302(0x80,0x57);
w1302(0x82,second);
w1302(0x84,hour);
w1302(0x8e,0x80);
}
else if(bz4==0x99)
{
bz4=0x00;
//dd[0]=0x88;
dd[1]=run_fs; //运行方式
dd[2]=cm_1; //一次触摸人行的绿灯时间
dd[3]=cm_2; //非机的最小通行时间
dd[4]=cm_max; //人行的最大通行时间
dd[5]=yellow; //黄灯时间
dd[6]=blue_s; //绿闪时间
dd[7]=red_all; //全红时间
dd[8]=yellow_s; //黄灯频率
dd[9]=rx; //两相位人行时间
dd[10]=fj; //两相位非机时间
dd[11]=sd1;
dd[12]=sd2;
dd[13]=sd3;
dd[14]=sd4;
dd[15]=sd5;
dd[16]=sds1;
dd[17]=sds2;
dd[18]=sds3;
dd[19]=sds4;
dd[20]=sds5;
dd[21]=sdg1;
dd[22]=sdg2;
dd[23]=sdg3;
dd[24]=sdg4;
dd[25]=sdg5;
bitw1302r(dd);
}
}
}
break;
case 2:P2=P2&0x07|0x10;
delay(40+yellow_s*2);
P2=P2&0x07;
delay(40+yellow_s*2);
if(bz3==88)
{
yx();
bz3=0;
}
else if(bz3!=88)
{if(t1==0)
{ if(bz4==0x00)
{ get1302();
a=DB[read1302[2]/0x10];
b=DB[read1302[2]%0x10];
c=DB[read1302[1]/0x10];
d=DB[read1302[1]%0x10];
//-----------
if(((read1302[2]*0x60+read1302[1])>=(sdg1*0x60+sds1))&&((read1302[2]*0x60+read1302[1])<(sdg2*0x60+sds2)))
run_fs=sd1;
else if(((read1302[2]*0x60+read1302[1])>=(sdg2*0x60+sds2))&&((read1302[2]*0x60+read1302[1])<(sdg3*0x60+sds3)))
run_fs=sd2;
else if(((read1302[2]*0x60+read1302[1])>=(sdg3*0x60+sds3))&&((read1302[2]*0x60+read1302[1])<(sdg4*0x60+sds4)))
run_fs=sd3;
else if(((read1302[2]*0x60+read1302[1])>=(sdg4*0x60+sds4))&&((read1302[2]*0x60+read1302[1])<(sdg5*0x60+sds5)))
run_fs=sd4;
else run_fs=sd5;
}
else if(bz4==0x88)
{ bz4=0x00;
w1302(0x8e,0x00);
w1302(0x80,0x57);
w1302(0x82,second);
w1302(0x84,hour);
w1302(0x8e,0x80);
}
else if(bz4==0x99)
{
bz4=0x00;
//dd[0]=0x88;
dd[1]=run_fs; //运行方式
dd[2]=cm_1; //一次触摸人行的绿灯时间
dd[3]=cm_2; //非机的最小通行时间
dd[4]=cm_max; //人行的最大通行时间
dd[5]=yellow; //黄灯时间
dd[6]=blue_s; //绿闪时间
dd[7]=red_all; //全红时间
dd[8]=yellow_s; //黄灯频率
dd[9]=rx; //两相位人行时间
dd[10]=fj; //两相位非机时间
dd[11]=sd1;
dd[12]=sd2;
dd[13]=sd3;
dd[14]=sd4;
dd[15]=sd5;
dd[16]=sds1;
dd[17]=sds2;
dd[18]=sds3;
dd[19]=sds4;
dd[20]=sds5;
dd[21]=sdg1;
dd[22]=sdg2;
dd[23]=sdg3;
dd[24]=sdg4;
dd[25]=sdg5;
bitw1302r(dd);
}
}
}
break;
case 3: yx1();
break;
case 4: P2=P2&0x07;
delay(40);
if(bz3==88)
{
yx();
bz3=0;
}
else if(bz3!=88)
{if(t1==0)
{ if(bz4==0x00)
{ get1302();
a=DB[read1302[2]/0x10];
b=DB[read1302[2]%0x10];
c=DB[read1302[1]/0x10];
d=DB[read1302[1]%0x10];
//-----------
if(((read1302[2]*0x60+read1302[1])>=(sdg1*0x60+sds1))&&((read1302[2]*0x60+read1302[1])<(sdg2*0x60+sds2)))
run_fs=sd1;
else if(((read1302[2]*0x60+read1302[1])>=(sdg2*0x60+sds2))&&((read1302[2]*0x60+read1302[1])<(sdg3*0x60+sds3)))
run_fs=sd2;
else if(((read1302[2]*0x60+read1302[1])>=(sdg3*0x60+sds3))&&((read1302[2]*0x60+read1302[1])<(sdg4*0x60+sds4)))
run_fs=sd3;
else if(((read1302[2]*0x60+read1302[1])>=(sdg4*0x60+sds4))&&((read1302[2]*0x60+read1302[1])<(sdg5*0x60+sds5)))
run_fs=sd4;
else run_fs=sd5;
}
else if(bz4==0x88)
{ bz4=0x00;
w1302(0x8e,0x00);
w1302(0x80,0x57);
w1302(0x82,second);
w1302(0x84,hour);
w1302(0x8e,0x80);
}
else if(bz4==0x99)
{
bz4=0x00;
//dd[0]=0x88;
dd[1]=run_fs; //运行方式
dd[2]=cm_1; //一次触摸人行的绿灯时间
dd[3]=cm_2; //非机的最小通行时间
dd[4]=cm_max; //人行的最大通行时间
dd[5]=yellow; //黄灯时间
dd[6]=blue_s; //绿闪时间
dd[7]=red_all; //全红时间
dd[8]=yellow_s; //黄灯频率
dd[9]=rx; //两相位人行时间
dd[10]=fj; //两相位非机时间
dd[11]=sd1;
dd[12]=sd2;
dd[13]=sd3;
dd[14]=sd4;
dd[15]=sd5;
dd[16]=sds1;
dd[17]=sds2;
dd[18]=sds3;
dd[19]=sds4;
dd[20]=sds5;
dd[21]=sdg1;
dd[22]=sdg2;
dd[23]=sdg3;
dd[24]=sdg4;
dd[25]=sdg5;
bitw1302r(dd);
}
}
}
break;
}
}
}
//------------
void yx()
{ uchar x1,by;
for(x1=blue_s,by=blue_s+yellow;x1>0;x1--,by--) //绿闪
{
mn[0]=0xfa;
mn[1]=0x13;
mn[2]=x1;
mn[3]=by;
fs();
if(t1==0)
{ a=DB[x1/10];
b=DB[x1%10];
c=DB[by/10];
d=DB[by%10];
}
P2=P2&0x07|0x88;
delay(60);
P2=P2&0x07|0x80;
delay(60);
}
//------------ //非机黄,人行红
for(x1=yellow;x1>0;x1--,by--)
{
mn[0]=0xfa;
mn[1]=0x23;
mn[2]=x1;
mn[3]=by;
fs();
if(t1==0)
{a=DB[x1/10];
b=DB[x1%10];
c=DB[by/10];
d=DB[by%10];
}
P2=P2&0x07|0x90;
delay(120);
}
//------------ //非机红,人行绿
for(x1=cm_1,by=cm_1+red_all;x1>0;x1--,by--)
{ mn[0]=0xfa;
mn[1]=0x31;
mn[2]=by;
mn[3]=x1;
fs();
if(t1==0)
{
a=DB[by/10];
b=DB[by%10];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -