单片机案例开发——交通灯设计

#include<stcreg.h>
#define uchar unsigned char
#define uint unsigned int

sbit FMQ=P3^4;
sbit QR=P2^7;
sbit QY=P2^6;
sbit QG=P2^5;
sbit HR=P2^7;
sbit HY=P2^6;
sbit HG=P2^5;
sbit ZR=P2^4;
sbit ZY=P2^3;
sbit ZG=P2^2;
sbit YR=P2^4;
sbit YY=P2^3;
sbit YG=P2^2;
sbit SWITCH1=P1^0;
sbit SWITCH2=P1^1;
sbit SWITCH3=P1^2;
sbit SWITCH4=P1^3;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
uchar DAT1,DAT2;			   //显示时间变量
uchar DISP1[2]={0,0};		   //显示缓冲区1,南北
uchar DISP2[2]={0,0};		   //显示缓冲区2,东西
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};

void DISPCLK1(uchar i);
void DISPCLK2(uchar i);

void DEL1MS(uint z)
{
    uint x,y;
	for(x=0;x<z;x++)
	   for(y=0;y<123;y++);
}

void main()
{
     uchar i,j;
	 TCON=0x5;
	 PX1=1;
	 EX0=1;
	 EX1=1;
	 EA=1;

	 P0=0xFF;
	 P1=0xFF;
	 P2=0xFF;
	 P3=0xFF;
	 while(1)
	 {
	    P1=0xFF;
		P2=0xFF;
		DAT1=25;
		DAT2=25;
		QG=0;
		HG=0;
		ZR=0;
		YR=0;

		for(i=0;i<20;i++)
		{
		   for(j=0;j<200;j++)
		   {
		       	DISPCLK1(DAT1);
				DISPCLK2(DAT2);
				DEL1MS(25);		//延时5毫秒
		   }
		   FMQ=1;
		   DAT1=DAT1-1;
		   DAT2=DAT2-1;
		}
		P1=0xFF;
		P2=0xFF;
		ZY=0;
		YY=0;
		QY=0;
		HY=0;

		for(i = 0; i < 5; i++)
		{	
			for(j = 0; j < 200; j++)
			{
				DISPCLK1(DAT1);//显示
				DISPCLK2(DAT2);//显示
				DEL1MS(25);	//延时3毫秒
			}
			QY = ~QY;		//南北向黄灯亮
			HY = ~HY;
			ZY = ~ZY;		//东西方向黄灯亮
			YY = ~YY;  
			FMQ = ~FMQ;		//黄灯时蜂鸣器叫一声
			DAT1 = DAT1 - 1;//完成数字的减1操作,调整好的数字送显存	 
			DAT2 = DAT2 - 1;//完成数字的减1操作,调整好的数字送显存	 
		} 
	
		P1 = 0xff;
		P2 = 0xff;	 
		DAT1 = 15;			//汇编0x20
		DAT2 = 15;			//汇编0x20
		ZG = 0;				//东西方向绿灯亮
		YG = 0;
		QR = 0;				//南北方向红灯亮
		HR = 0;

		for(i = 0; i < 10; i++)//执行15秒
		{	
			for(j = 0; j < 200; j++)
			{
				DISPCLK1(DAT1);//显示
				DISPCLK2(DAT2);//显示
				DEL1MS(25);	//延时3毫秒  
			}
			FMQ = 1;		//蜂鸣器响
			DAT1 = DAT1 - 1;//完成数字的减1操作,调整好的数字送显存 
			DAT2 = DAT2 - 1;//完成数字的减1操作,调整好的数字送显存 
		}

		//最后5秒黄灯闪
		P1 = 0xff;
		P2 = 0xff;			//关所有的灯
		ZY = 0;				//黄灯亮
		YY = 0;
		QY = 0;
		HY = 0;

		for(i = 0; i < 5; i++)
		{	
			for(j = 0; j < 200; j++)
			{
				DISPCLK1(DAT1);//显示
				DISPCLK2(DAT2);//显示
				DEL1MS(25);	//延时3毫秒 		   
			}
			QY = ~QY;		//南北向黄灯亮
			HY = ~HY;
			ZY = ~ZY;		//东西方向黄灯亮
			YY = ~YY;  
			FMQ = ~FMQ;		//黄灯时蜂鸣器叫一声
			DAT1 = DAT1 - 1;//完成数字的减1操作 ,调整好的数字送显存	 
			DAT2 = DAT2 - 1;//完成数字的减1操作 ,调整好的数字送显存	 
		} 
	 }
}

void D_X() interrupt 0 using 0
{
    uchar i,j,temp0,temp1,temp2,temp3;
	EA=0;
	P3_2=1;
	while(!P3_2);
	temp0=DAT1;
	temp1=DAT2;
	temp2=P1;
	temp3=P2;

	DAT1=60;
	DAT2=60;		
	P1=0xff;
	P2=0xff;
	ZG=0;
	YG=0;
	QR=0;
	HR=0;

	for(i=0;i<60;i++)
	{
	    for(j=0;j<200;j++)
		{
		    DISPCLK1(DAT1);
			DISPCLK2(DAT2);
			DEL1MS(25);
		}
		DAT1=DAT1-1;
		DAT2=DAT2-1;
	}
	DAT1=temp0;
	DAT2=temp1;
	P1=temp2;
	P2=temp3;

	EA=1;
}

void N_B() interrupt 2 using 0
{
    uchar i,j,temp0,temp1,temp2,temp3;
	EA=0;
	P3_3=1;
	while(!P3_3);
	temp0=DAT1;
	temp1=DAT2;
	temp2=P1;
	temp3=P2;

	DAT1=60;
	DAT2=60;
	P1=0xff;
	P2=0xff;
	ZR=0;
	YR=0;
	QG=0;
	HG=0;
	for(i=0;i<60;i++)
	{
	    for(j=0;j<200;j++)
		{
		    DISPCLK1(DAT1);
			DISPCLK2(DAT2);
			DEL1MS(25);
		}
		DAT1=DAT1-1;
		DAT2=DAT2-1;
	}
	DAT1=temp0;
	DAT2=temp1;
	P1=temp2;
	P2=temp3;

	EA=1;
}

void DISPCLK1(uchar i)
{
    DISP1[0]=i%10;
	DISP1[1]=i/10;
	P0=table[DISP1[0]];
	SWITCH2=0;
	DEL1MS(2);
	SWITCH2=1;

	P0=table[DISP1[1]];
	SWITCH1=0;
	DEL1MS(2);
	SWITCH1=1;
}

void DISPCLK2(uchar i)
{
    DISP2[0]=i%10;
	DISP2[1]=i/10;
	P0=table[DISP2[0]];
	SWITCH4=0;
	DEL1MS(2);
	SWITCH4=1;

	P0=table[DISP2[1]];
	SWITCH3=0;
	DEL1MS(2);
	SWITCH3=1;
}
展开阅读全文

没有更多推荐了,返回首页