基于单片机的简易红绿灯系统proteus仿真

0、前言

【1】、功能

十字路口的交通灯控制系统,四组灯(红黄绿)对应十字路口的四个方向,用两位的数码管显示剩余的时间。

【2】所用工具

keil-4、proteus-8

1、代码

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit EW_LED2=P2^3;
sbit EW_LED1=P2^2;
sbit SN_LED2=P2^1;
sbit SN_LED1=P2^0;
sbit SN_Yellow=P1^6;
sbit SN_Red=P1^7;
sbit EW_Yellow=P1^2;
sbit EW_Red=P1^3;
bit Flag_SN_Yellow;
bit	Flag_EW_Yellow;
char Time_EW;
char Time_SN;
uchar EW=10,SN=10,EWL=3,SNL=3;
uchar EW1=10,SN1=10,EWL1=3,SNL1=3;
uchar code table[10]={
    
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code s[9]={
    
    0x28,0x48,0x18,0x48,0x82,0x84,0x81,0x84,0x88};
void delay_ms(unsigned int x)
{
    
    
	unsigned int i,j;
	for(i=x;i>0;i--)
	for(j=110;j>0;j--);
}
void Display(void)
{
    
    
	char h,l;
	h=Time_EW/10;
	l=Time_EW%10;
	P0=table[l];
	EW_LED2=1;
	delay_ms(1);
	EW_LED2=0;
	P0=table[h];
	EW_LED1=1;
	delay_ms(1);
	EW_LED1=0;
	h=Time_SN/10;
	l=Time_SN%10;
	P0=table[l];
	SN_LED2=1;
	delay_ms(1);
	SN_LED2=0;
	P0=table[h];
	SN_LED1=1;
	delay_ms(1);
	SN_LED1=0;
}
void timer0(void)interrupt 1 using 1
{
    
    
	static uchar count;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	count++;
	if(count==10)
	{
    
    
		if(Flag_SN_Yellow==1)
		{
    
    SN_Yellow=~SN_Yellow;}
		if(Flag_EW_Yellow==1)
		{
    
    EW_Yellow=~EW_Yellow;}
	}
	if(count==20)
	{
    
    
		Time_EW--;
		Time_SN--;
		if(Flag_SN_Yellow==1)
		{
    
    SN_Yellow=~SN_Yellow;}
		if(Flag_EW_Yellow==1)
		{
    
    EW_Yellow=~EW_Yellow;}
		count=0;
	}
}
void main(void)
{
    
    
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;
	Time_EW=3;
	Time_SN=3;
	while(Time_SN>=0||Time_EW>=0)
	{
    
    
		Flag_EW_Yellow=0;
		P1=s[8];
		Display();
	}
	while(1)
	{
    
    
		Time_EW=EW;
		Time_SN=SN;
		while(Time_SN>=4)
		{
    
    
			Flag_EW_Yellow=0;
			P1=s[0];
			Display();
		}
		P1=0x00;
		while(Time_SN>=0)
		{
    
    
			Flag_SN_Yellow=1;
			EW_Red=1;
			Display();
		}
		EW=EW1;
		SN=SN1;
		EWL=EWL1;
		SNL=SNL1;
		Time_EW=SN;
		Time_SN=EW;
		while(Time_EW>=4)
		{
    
    
			Flag_SN_Yellow=0;
			P1=s[4];
			Display();
		}
		P1=0x00;
		while(Time_EW>=0)
		{
    
    
			Flag_EW_Yellow=1;
			SN_Red=1;
			Display();
		}
		EW=EW1;
		SN=SN1;
		EWL=EWL1;
		SNL=SNL1;
	}
}

2、原理图

在这里插入图片描述

3、过程

【1】根据代码、使用keil4编译生成。hex文件
【2】在proteus8上选择元件,按照原理图连接各元件。
【3】将生成的。hex文件加载进单片机中。
【4】现在就可以点击左下角的三角符号运行。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47192105/article/details/109586376