⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traffic light.c

📁 仿真马路交通灯通过keilproteus进行实时调试
💻 C
字号:
#include <REG52.H>
#include <stdio.h>
#include <stdlib.h>
#include <intrins.h>
#include <ctype.h>
#include <string.h>
#define uint unsigned int		   //定义一下方便使用
#define uchar unsigned char
#define ulong unsigned long

#define waits 100				  //视觉效应差时间
#define delay_sec1 10
#define delay_sec2 20
#define s_a_green     30	 		  //A道3灯正常显示时间(单位--s)
#define s_a_yellow    5     
#define s_a_red       20 	 
#define s_b_green     15	 		  //B道3灯正常显示时间(单位--s)
#define s_b_yellow  5
#define s_b_red     35
#define sec_int1_yellow    5             //行人过街黄灯时间(单位--s)
#define sec_int0_yellow    5             //紧急车辆A,B道黄灯时间(单位--s)
#define sec_int0_red	   15            //紧急车辆A,B道红灯时间(单位--s)
sbit green_a = P1^0;			 //A,B道各灯所用端口号定义
sbit yellow_a = P1^1;
sbit red_a = P1^2;
sbit green_b = P1^5;
sbit yellow_b = P1^6;
sbit red_b = P1^7; 
char flag;
/*视觉效应延时程序*/
void wait(int temp)
{
uint m;
for(m=temp;m>0;m--);
}
/*A道绿灯30s显示程序*/
void disp7seg_a_green()
{
uint i,j, k;
flag = 0;
P1 = 0x7E;
 for(k=s_a_green;k>0;k--)
  {  
	for(i=delay_sec1;i>0;i--)
	{
		for(j=delay_sec2;j>0;j--)
		{
        P0=0x01;
		P2=k/10;
        wait(waits);
		P0=0x02;
		P2=k%10;
        wait(waits);
		P0=0x04;
		P2=(k+5)/10;
        wait(waits);
		P0=0x08;
		P2=(k+5)%10;
        wait(waits);
		}
	}
  }

}
/*A道黄灯5s显示程序*/
void disp7seg_a_yellow()
{
uint i,j,k;
flag = 1;
P1 = 0x7D;
for(k=s_a_yellow;k>0;k--)
 {
	for(i=delay_sec1;i>0;i--)
	{
		for(j=delay_sec2;j>0;j--)
		{
        P0=0x01;
		P2=k/10;
        wait(waits);
		P0=0x02;
		P2=k%10;
        wait(waits);
		P0=0x04;
		P2=k/10;
        wait(waits);
		P0=0x08;
		P2=k%10;
        wait(waits);
		}
	}
  }
}
/*B道绿灯15s显示程序*/
void disp7seg_b_green()
{
uint i,j,k;
 flag = 2;
 P1=0xDB;
 for(k=s_b_green;k>0;k--)
 { 
   for(i=delay_sec1;i>0;i--)
	{
		for(j=delay_sec2;j>0;j--)
		{
        P0=0x01;
		P2=(k+5)/10;
        wait(waits);
		P0=0x02;
		P2=(k+5)%10;
        wait(waits);
		P0=0x04;
		P2=k/10;
        wait(waits);
		P0=0x08;
		P2=k%10;
        wait(waits);
		}
	}
 }
}
/*B道黄灯5s显示程序*/
void disp7seg_b_yellow()
{
uint i,j,k;
flag = 3;
P1=0xBB;
  for(k=s_b_yellow;k>0;k--)
  {   
	for(i=delay_sec1;i>0;i--)
	{
		for(j=delay_sec2;j>0;j--)
		{
        P0=0x01;
		P2=k/10;
        wait(waits);
		P0=0x02;
		P2=k%10;
        wait(waits);
		P0=0x04;
		P2=k/10;
        wait(waits);
		P0=0x08;
		P2=k%10;
        wait(waits);
		}
	}
  }
}
/*行人过街中断服务子程序*/
void ex1_isr (void) interrupt 2
{
uint temp,i,j; 
switch(flag)
{	 
case 0:
wait(0);
break;
case 1:
P1 = 0xBD;
wait(500);//  eliminate the shaking
for(temp=sec_int1_yellow;temp>0;temp--)
{
 for(i=delay_sec1;i>0;i--)
  {
		for(j=delay_sec2;j>0;j--)
		{
         P0 = 0x01;
         P2 = temp/10;
         wait(waits);
         P0 = 0x02;
         P2 = temp%10;
         wait(waits);
         P0 = 0x04;
         P2 = temp/10;
         wait(waits);
         P0 = 0x08;
         P2 = temp%10;
         wait(waits);
        }
  }
}
 P1 = 0x7D;
break;
case 2:
P1 = 0xBD;
wait(500);//  eliminate the shaking
for(temp=sec_int1_yellow;temp>0;temp--)
{
 for(i=delay_sec1;i>0;i--)
  {
		for(j=delay_sec2;j>0;j--)
		{
         P0 = 0x01;
         P2 = temp/10;
         wait(waits);
         P0 = 0x02;
         P2 = temp%10;
         wait(waits);
         P0 = 0x04;
         P2 = temp/10;
         wait(waits);
         P0 = 0x08;
         P2 = temp%10;
         wait(waits);
        }
  }
}
  P1 = 0xDB;
break;
case 3:
wait(0);
break;
}

}
/*紧急车辆中断服务子程序*/
void ex0_isr (void) interrupt 0
{
uint temp1,temp2,i,j;
 P1 = 0xBD;
for(temp1=sec_int0_yellow;temp1>0;temp1--)
{

 //delay1s();
 for(i=delay_sec1;i>0;i--)
	{
		for(j=delay_sec2;j>0;j--)
		{
          P0 = 0x01;
          P2 = temp1/10;
          wait(waits);
          P0 = 0x02;
          P2 = temp1%10;
          wait(waits);
          P0 = 0x04;
          P2 = temp1/10;
          wait(waits);
          P0 = 0x08;
          P2 = temp1%10;
          wait(waits);
        }
    }
}
P1 = 0x7B;
for(temp2=sec_int0_red;temp2>0;temp2--)
 {
    for(i=delay_sec1;i>0;i--)
	 {
		for(j=delay_sec2;j>0;j--)
		{
          P0 = 0x01;
          P2 = temp2/10;
          wait(waits);
          P0 = 0x02;
          P2 = temp2%10;
          wait(waits);
          P0 = 0x04;
          P2 = temp2/10;
          wait(waits);
          P0 = 0x08;
          P2 = temp2%10;
        }
     }
 }
 switch(flag)
 {
  case 0:
  P1 = 0x7E;
  break;
  case 1:
  P1 = 0x7D;
  case 2:
  P1 = 0xDB;
  break;
  case 3:
  P1 = 0xBB;
  break;
 }
}
void main(void)
{
//配置外部中断INT0
IT0 = 1;   // Configure interrupt 0 for falling edge on /INT0 (P3.2)
EX0 = 1;   // Enable EX0 Interrupt
//配置外部中断INT1
IT1 = 1;
EX1 = 1;
//使能全局中断
EA = 1;    // Enable Global Interrupt Flag
while(1)			//主循环
{
disp7seg_a_green();
disp7seg_a_yellow();
disp7seg_b_green();
disp7seg_b_yellow();
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -