///////////////////////////////////////////////////////////////////
//新规则交通灯设计/////////////////////////////////////////////////
//设置P3.0,P3.1,P3.2三个按键调节时间,key1(功能键)/////////////
//调节主次通道的时间,key2(减一键),key3(加一键)/////////////////////
//增加串口通信,人机互动//////
////黄山////
#include <reg51.h> //定义头文件
#include <stdio.h>
#define uchar unsigned char //定义无符号变量
#define uint unsigned int //定义有符号变量
uchar count,key1num,flag,a,zg,zr,y,cg,cr,numzg,numzr,numcg,numcr,countser,flagSer,dyflagSer;
sbit key1=P3^3;
sbit key2=P3^1;
sbit key3=P3^2;
sbit zshi=P3^7;
sbit zge=P3^6;
sbit cshi=P3^5;
sbit cge=P3^4;
uchar code dis[]={
0X3f,/*0*/
0X06,/*1*/
0X5b,/*2*/
0X4f,/*3*/
0X66,/*4*/
0X6d,/*5*/
0X7d,/*6*/
0X07,/*7*/
0X7f,/*8*/
0X6f,/*9*/
0X00,/*NULL*/
}; //0-9位七段共阴数码管显示
void delay(uint c) //延时子程序
{
uint i,j;
for(i=0;i<c;i++)
for(j=0;j<100;j++);
}
void init() //初始化子程序
{
TMOD=0x21;//设置定时器0为工作方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0xfd;
TL1=0xfd;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
TR1=1;
REN=1; //允许串口中断,采用串口中断法
SM0=0;
SM1=1;
ES=1;//中断
y=3;
zg=30;
zr=23;
cg=20;
cr=33;
P3=0xff;
P2=0x00;
P1=0x00;
}
void guan() //消影子程序
{
zshi=1;
cshi=1;
zge=1;
cge=1;
}
void display(uchar dat_z,dat_c) //显示子程序
{
zshi=1;
P1=dis[(dat_z)%10];
zshi=0;
delay(5);
guan();
zge=1;
P1=dis[(dat_z)/10];
zge=0;
delay(5);
guan();
cshi=1;
P2=dis[(dat_c)%10];
cshi=0;;
delay(5);
guan();
cge=1;
P2=dis[(dat_c)/10];
cge=0;
delay(5);
}
void displayy(uchar dat)
{
zshi=1;
P1=dis[dat];
zshi=0;
delay(5);
guan();
cshi=1;
P2=dis[dat];
cshi=0;
delay(5);
guan();
}
void displayz(uchar dat_z)
{
zshi=1;
P1=dis[(dat_z)%10];
zshi=0;
delay(5);
guan();
zge=1;
P1=dis[(dat_z)/10];
zge=0;
delay(5);
guan();
}
void displayc(uchar dat_c)
{
cshi=1;
P2=dis[(dat_c)%10];
cshi=0;;
delay(5);
guan();
cge=1;
P2=dis[(dat_c)/10];
cge=0;
delay(5);
guan();
}
void keyscan()
{
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1)
{
if(flag==0)
{
display(zg,cr);
}
if(flag==2)
{
display(cg,zr);
}
}
key1num++;
if(key1num==1)
{
TR0=0;
}
if(key1num==3)
{
TR0=1;
key1num=0;
}
}
}
if(key1num!=0)
{
if(key1num==1)
{
if(key2==0)
{
delay(2);
if(key2==0)
{
while(!key2)
{
if(flag==0)
{
displayz(zg);
}
if(flag==2)
{
displayz(cg);
}
}
if(flag==0)
{
zg++;
}
if(flag==2)
{
cg++;
}
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3)
{
if(flag==0)
{
displayz(zg);
}
if(flag==2)
{
displayz(cg);
}
}
if(flag==0)
{
zg--;
}
if(flag==2)
{
cg--;
}
}
}
}
if(key1num==2)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2)
{
if(flag==0)
{
displayc(cr);
}
if(flag==2)
{
displayc(zr);
}
}
if(flag==0)
{
cr++;
}
if(flag==2)
{
zr++;
}
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3)
{
if(flag==0)
{
displayc(cr);
}
if(flag==2)
{
displayc(zr);
}
}
if(flag==0)
{
cr--;
}
if(flag==2)
{
zr--;
}
}
}
}
}
}
/*
void keyscan() //键盘扫描子程序,KEY1功能键,KEy2减一键,KEY3加一键
{
if(key1==0)
{
delay(5);
if(key1==0)
{
key1num++;
while(!key1)
{
display(num,num1);
}
if(key1num==1)
{
TR0=0;
}
if(key1num==3)
{
key1num=0;
TR0=1;
}
}
}
if(key1num!=0) //先判断功能设置键
{
if(key2==0)
{
delay(5);
if(key2==0)
{
if(key1num==1)
{
while(!key2)
{
displayz(num);
}
num++;
if(num==56)
{
num=0;
}
}
if(key1num==2)
{
while(!key2)
{
displayc(num1);
}
num1++;
if(num1==56)
num1=0;
}
}
}
if(key3==0) //减一键
{
delay(5);
if(key3==0)
{
if(key1num==1)
{
while(!key3)
{
displayz(num);
}
num--;
if(num==0)
{
num=56;
}
}
if(key1num==2)
{
while(!key3)
{
displayc(num1);
}
num1--;
if(num1==0)
num1=56;
}
}
}
}
} */
void shuanfa()
{
if(count==8) //自动倒计时功能
{
count=0;
if(flag==0)
{
zg--;cr--;
if(zg>cr)
{
if(cr==0)
{
if(zg>3)
{
// flag=0;
cr=zg;
y=4;
}
if(zg==3)
{
flag=1;
y=4;
}
}
}
if(zg<cr)
{
if(zg==0)
{
if(cr>3)
{
// flag=0;
zg=cr;
y=4;
}
if(cr==3)
{
flag=1;
y=4;
}
}
}
if(zg==cr)
{
flag=0;
if(zg==0)
{
flag=1;
}
y=4;
}
}
if(flag==1)
{
y--;
if(y==0)
{
flag=2;
}
}
if(flag==2)
{
zr--;cg--;
if(zr>cg)
{
if(cg==0)
{
if(zr>3)
{
// flag=2;
cg=zr;
y=4;
}
if(zr==3)
{
flag=3;
y=4;
}
}
}
if(zr<cg)
{
if(zr==0)
{
if(cg>3)
{
// flag=2;
zr=cg;
y=4;
}
if(cg==3)
{
flag=3;
y=4;
}
}
}
if(zr==cg)
{
flag=2;
if(zr==0)
{
flag=3;
}
}
}
if(flag==3)
{
y--;
if(y==0)
{
flag=0;
zr=23;zg=30;cr=33;cg=20;
}
}
}
if(key1num!=0)
{
if(key1num==1)
{
if(flag==0)
{
displayz(zg);
}
if(flag==2)
{
displayz(cg);
}
}
if(key1num==2)
{
if(flag==0)
{
displayc(cr);
}
if(flag==2)
{
displayc(zr);
}
}
}
if(key1num==0)
{
if(flag==0)
{
P0=0xdd;//红灯
display(zg,cr);
}
if(flag==1)
{
P0=0xd4;
displayy(y);
}
if(flag==2)
{
P0=0xeb;
display(cg,zr);
}
if(flag==3)
{
P0=0xe2;//黄灯
displayy(y);
}
}
}
void serPort()
{
if(countser==1)
{
ES=0;
countser=0;
SBUF=a;
while(!TI);
TI=0;
ES=1;
if(a==0x11)
{
flagSer=1; //标志位
TR0=0; //停止计数器
}
if(a==0xff)
{
TR0=1; //标志位
flagSer=0; //启动
key1num=0;
}
if(flagSer==1)
{
if(a==0x01)
{
key1num=1;
dyflagSer=1;
a=0;
}
if(a==0x02)
{
key1num=2;
dyflagSer=2;
a=0;
}
if(dyflagSer==1)
{
if(flag==0)
{
zg=SBUF;
评论2
最新资源