當前位置:編程學習大全網 - 編程語言 - 單片機C語言程序,要求南北亮綠燈22S,東西亮紅燈25S,求大神指導

單片機C語言程序,要求南北亮綠燈22S,東西亮紅燈25S,求大神指導

圖看不太清楚,妳可以參考這個程序,如果IO口有所差別,稍作修改就可以了。

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P3^0; //東西向指示燈

sbit YELLOW_A=P3^1;

sbit GREEN_A=P3^2;

sbit RED_B=P3^3; //南北向指示燈

sbit YELLOW_B=P3^4;

sbit GREEN_B=P3^5;

sbit KEY1=P1^0;

sbit KEY2=P1^1;

sbit KEY3=P1^2;

//延時倍數,閃爍次數,操作類型變量

uchar Flash_Count=0,Operation_Type=1,LEDsng,LEDsns,LEDewg,LEDews,discnt;

uint Time_Count=0,timeew,timens;

uchar ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

void displaysn()

{

LEDsng=((timens-Time_Count)/20)%10;

LEDsns=((timens-Time_Count)/20)/10;

LEDewg=0x10;

LEDews=0x10;

}

void displayew()

{

LEDewg=((timeew-Time_Count)/20)%10;

LEDews=((timeew-Time_Count)/20)/10;

LEDsng=0x10;

LEDsns=0x10;

}

//定時器0 中斷函數

void T0_INT() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

switch(Operation_Type)

{

case 1: //東西向綠燈與南北向紅燈亮

if((Time_Count%20)==0)displayew();

RED_A=0;YELLOW_A=0;GREEN_A=1;

RED_B=1;YELLOW_B=0;GREEN_B=0;

if(++Time_Count!=timeew) return;

Time_Count=0;

Operation_Type=2;

break;

case 2: //東西向黃燈開始閃爍,綠燈關閉

LEDewg=0x0;

LEDews=0x0;

if(++Time_Count!=10) return;

Time_Count=0;

YELLOW_A=~YELLOW_A;GREEN_A=0;

if(++Flash_Count!=10) return; //閃爍

Flash_Count=0;

Operation_Type=3;

break;

case 3: //東西向紅燈與南北向綠燈亮

if((Time_Count%20)==0)displaysn();

RED_A=1;YELLOW_A=0;GREEN_A=0;

RED_B=0;YELLOW_B=0;GREEN_B=1;

if(++Time_Count!=timens) return;

Time_Count=0;

Operation_Type=4;

break;

case 4: //南北向黃燈開始閃爍,綠燈關閉

LEDsng=0x0;

LEDsns=0x0;

if(++Time_Count!=8) return;

Time_Count=0;

YELLOW_B=~YELLOW_B;GREEN_A=0;

if(++Flash_Count!=10) return; //閃爍

Flash_Count=0;

Operation_Type=1;

break;

}

}

void t1_isr() interrupt 3

{

TR1=0;

TH1=(65536-3000)/256;

TL1=(65536-3000)%256;

TR1=1;

switch(discnt)

{

case 0:

P2=0x02;

P0=ledtab[LEDewg];

break;

case 1:

P2=0x01;

P0=ledtab[LEDews];

break;

case 2:

P2=0x08;

P0=ledtab[LEDsng];

break;

case 3:

P2=0x04;

P0=ledtab[LEDsns];

break;

default:discnt=0;break;

}

discnt++;

discnt&=0x03;

}

void delay()

{

uint i;

for(i=0;i<1000;i++);

}

//主程序

void main()

{

TMOD=0x11; //T0 方式1

EA=1;

ET0=1;

TR0=1;

TH1=(65536-3000)/256;

TL1=(65536-3000)%256;

TR1=1;

ET1=1;

timeew=20*25;

timens=20*22;

Time_Count=0;

Operation_Type=1;

while(1)

{

if(KEY1==0) //按壹南北下加1S

{

delay();

if(KEY1==0)

{

while(KEY1==0);

TR0=0;

timens+=20;

LEDsng=(timens/20)%10;

LEDsns=(timens/20)/10;

}

}

if(KEY2==0) //按壹東西加1S

{

delay();

if(KEY2==0)

{

while(KEY2==0);

TR0=0;

timeew+=20;

LEDewg=(timeew/20)%10;

LEDews=(timeew/20)/10;

}

}

if(KEY3==0) //啟動

{

delay();

if(KEY3==0)

{

while(KEY2==0);

TR0=1;

Time_Count=0;

}

}

}

}

  • 上一篇:成都多小區現低價轉讓高配電腦詐騙拆開沒顯卡!
  • 下一篇:中文編程
  • copyright 2024編程學習大全網