当前位置:文档之家› 用C51编写的红绿灯控制程序

用C51编写的红绿灯控制程序

#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define control XBYTE[0xff20]
#define PA XBYTE[0xff21]
#define PB XBYTE[0xff22]
#define PC XBYTE[0xff23] //8155a b c 口地址
#define control2 XBYTE[0xff2b]
#define PA2 XBYTE[0xff28]
#define PB2 XBYTE[0xff29]
#define PC2 XBYTE[0xff2a] //???????

int m;
uchar key;
int bdata floor; //floor为可以位寻址的变量
sbit dL1=floor^0;
sbit dL2=floor^1;
sbit dL3=floor^2;
bit up; //位变量
bit down; //位变量
sbit door=P1^3;
sbit sign=P1^4;
sbit bell=P1^5; //用等显示
sbit uplight=P1^6;
sbit downlight=P1^7;
sbit P1_0=P1^0;


void delayms(uint x) //可控延时500*x ms
{
uint i,j;
for(i=x;i>0;i--)
for(j=500;j>0;j--);
}
void delay() //延时程序
{
uint z;
for(z=100;z>0;z--);
}


void display() //数码管显示
{
control=0x0f;// ab口定义为输出方式
PA=0xFE; // 送位选数据
switch(m)
{ case 1: PB=0xF9;
break;
case 2: PB=0xA4;
break;
case 4: PB=0xB0;
break;
case 8: PB=0xA4;
break;
default:break; //显示4个数
}
}

void keyscan() //键盘扫描
{
unchar pctemp;
PB=0xff;
PA=~0x01; //PA口输出低电平
pctemp=PC;
switch(pctemp&0x0f){ //PC高位置0
case(0x0e):{
key=1;
break;
}
case(0x0d):{
key=2;
break;
}
case(0x0b):{
key=3;
break;
}
case(0x07):{
key=4;
break;
}
default: break;
}
PA=~0x02;
delayms(1);
pctemp=PC;
switch(pctemp&0x0f){
case(0x0e):{
key=5;
break;
}
case(0x0d):{
key=6;
break;
}
case(0x0b):{
key=7;
break;
}
case(0x07):{
key=8;
break;
}
default: break;
}

}

void direction()
{

if(((m*256)&floor)!=0) {up=0;down=0;}
else if((m*256)>floor) {up=0;down=1;}
else if((m*256)
uplight=!up;
downlight=!down;
}

void destination()
{
if((up==0)&&(down==0))
switch(key)
{
case 1:dL1=1;break;
case 2:dL2=1;break;
case 3:dL3=1;break;
case 4:dL1=1;break;
case 5:dL2=1;break;
case 6:dL2=1;break;
case 7:dL3=1;break;
default:break;
}
else if((up==1)&&(down==0))
switch(m)
{
case 1:switch(key)
{
case 1:break;
case 2:dL2=1;break;
case 3:dL3=1;break;

case 4:break;
case 5:dL2=1;break;
case 6:break;
case 7:dL3=1;break;
default:break;
}
break;
case 2:switch(key)
{
case 1:break;
case 2:break;
case 3:dL3=1;break;
case 4:break;
case 5:break;
case 6:break;
case 7:dL3=1;break;
default:break;
}
break;
case 4:break;
}
else switch(m)
{
case 1:break;
case 2:switch(key)
{
case 1:dL1=1;break;
case 2:break;
case 3:break;
case 4:dL1=1;break;
case 5:break;
case 6:break;
case 7:break;
default:break;
}
break;
case 4:switch(key)
{
case 1:dL1=1;break;
case 2:dL2=1;break;
case 3:break;
case 4:dL1=1;break;
case 5:break;
case 6:dL2=1;break;
case 7:break;
default:break;
}
break;
}

key=0;
}





void lightoff()
{
switch(m)
{
case 1:PA2=PA2|0x09;break;
case 2:PA2=PA2|0x32;break;
case 4:PA2=PA2|0x44;break;
default:break;
}
}



void T0_int(void) interrupt 1
{
TH0=(65536-30000)/256;
TL0=(65536-30000)%256;
P1_0=!P1_0;
}


void T1_int(void) interrupt 3
{
if((up==1)&&(down==0)) m=m*2;
else if((up==0)&&(down==1)) m=m/2;
display();
}

void light()
{
if((up==0)&&(down==0))
switch(key)
{
case 1:PA2=PA2&(~0x01);break;
case 2:PA2=PA2&(~0x02);break;
case 3:PA2=PA2&(~0x04);break;
case 4:PA2=PA2&(~0x08);break;
case 5:PA2=PA2&(~0x10);break;
case 6:PA2=PA2&(~0x20);break;
case 7:PA2=PA2&(~0x40);break;
default:PA2=PA2;break;
}
else if((up==1)&&(down==0))
switch(m)
{
case 1:switch(key)
{

case 1:PA2=PA2;break;
case 2:PA2=PA2&(~0x02);break;
case 3:PA2=PA2&(~0x04);break;
case 4:PA2=PA2;break;
case 5:PA2=PA2&(~0x10);break;
case 6:PA2=PA2;break;
case 7:PA2=PA2&(~0x40);break;
default:PA2=PA2;break;
}
break;
case 2:switch(key)
{
case 1:PA2=PA2;break;
case 2:PA2=PA2;break;
case 3:PA2=PA2&(~0x04);break;
case 4:PA2=PA2;break;
case 5:PA2=PA2;break;
case 6:PA2=PA2;break;
case 7:PA2=PA2&(~0x40);break;
default:PA2=PA2;break;
}
break;
case 4:break;
}
else switch(m)
{
case 1:break;
case 2:switch(key)
{
case 1:PA2=PA2&(~0x01);break;
case 2:PA2=PA2;break;
case 3:PA2=PA2;break;
case 4:PA2=PA2&(~0x08);break;
case 5:PA2=PA2;break;
case 6:PA2=PA2;break;
case 7:PA2=PA2;break;
default:PA2=PA2;break;
}
break;
case 4:switch(key)
{
case 1:PA2=PA2&(~0x01);break;
case 2:PA2=PA2&(~0x02);break;
case 3:PA2=PA2;break;
case 4:PA2=PA2&(~0x08);break;
case 5:PA2=PA2;break;
case 6:PA2=PA2&(~0x20);break;
case 7:PA2=PA2;break;
default:PA2=PA2;break;
}
break;
}
}

void delaydoor(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=30;j>0;j--)
{
keyscan();
light();
destination();
display();
}
}

void open()
{
sign=1;
lightoff();
TR0=0;
door=0;
delaydoor(2500);
TH0=(65536-30000)/256;
TL0=(65536-30000)%256;
TH1=106;
TL1=106;
door=1;
}

void main()
{

floor=0;
key=0;
control2=0x80;
PA2=0xff;
TMOD=0x61;
P1_0=0;
TH0=(65536-30000)/256;//取高八位
TL0=(65536-30000)%256;//取低八位
TH1=106;
TL1=106;
EA=1;
ET0=1;
ET1=1;
TR1=1;
m=1;
display();
while(1)
{
up=0;
down=0;
uplight=~up;
downlight=~down;
while(!key) //检测有无请求
{
keyscan();
display();
light();
}
destination();
dire

ction();
while(floor)
{
if(((floor/256)&m)!=0)
{
open();
floor=floor&(~(m*256));
}
else if(((floor/256)&m)==0)
{
sign=0;
TR0=1;
while(((floor/256)&m)==0)
{
keyscan();
display();
light();
destination();
}
}
}
}
}

相关主题
文本预览
相关文档 最新文档