📄 traffic light.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 + -