80C51控制8255实现交通灯模拟系统(详)

本文详细介绍了使用80C51单片机和8255芯片构建一个简单的交通灯模拟系统的过程,包括主要功能、流程图、C语言源代码和操作指南。系统设置了正常和紧急放行两种模式,并提供了Keil5项目的创建步骤和Protues8的电路连接示例。
摘要由CSDN通过智能技术生成

80C51控制8255实现交通灯模拟系统(详)

提示:实现的功能较为简单,这个是我的假期大作业(但是这个挺重要的,能为初学者节省不必要的大量时间)



一、🎊主要功能演示视频

8255交通灯

二、🎉主要功能介绍

1.💎流程图

在这里插入图片描述

2.💍文字介绍

用51单片机扩展一片8255,用12个发光二极管模拟一个十字路口的红、绿、黄灯,并设置二个紧急放行按键;正常行驶时,东西或南北方向的灯按绿灯亮7秒,黄灯闪烁3秒,红灯亮10秒;当东西或南北方向的紧急放行按键按下时,禁行方向红灯维持7秒,相对应放行方向为绿灯维持4秒,然后立即变为黄灯闪烁3秒,紧急情况结束后,禁行方向变为绿灯,相对方向变为红灯正常回归循环。


三、🎃源码(C语言附带注释)

#include <reg52.h>          //引入头文件
#include<absacc.h>//为了外部写入数据的头文件

#define uchar unsigned char             //对变量定义名进行简略定义
#define uint unsigned int

#define PA XBYTE[0X0000] //8255A端口地址
#define PB XBYTE[0X0001]//8255B端口地址
#define PC XBYTE[0X0002]//8255C端口地址
#define COM XBYTE[0X0003]//8255A控制口地址

sbit CS = P2^7;//8255 CS片选信号
sbit button1 = P1^0;//紧急开关东西通行
sbit button2 = P1^1;//紧急开关南北通行
    
uint counter = 10;//倒计时10秒
uint state = 0;//状态选择

uint aaa = 0;//输出口存数

//简单的延时程序
void delay_ms(uchar x) 
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}

//控制状态   交通灯盗撩鹉
void traffic_lights()
{
    switch(state)//判断状态,从0开始
		{
		//状态1,东西通行,南北禁止
		case 0:
		    aaa = 0x09;//输出PA,东西绿灯南北红灯
				PA = aaa;
				break;
				//状态2,东西缓速停车,南北禁止通行
		case 1:
		    aaa = 0x0a;//东西黄灯,南北红灯
				PA = aaa;
				delay_ms(1);//闪烁延迟
				aaa = 0x08;//东西不亮,南北红灯
				PA = aaa;
				delay_ms(1);
				break;
				//状态3,东西禁止,南北通行
		case 2:
		    aaa = 0x24;//东西红灯,南北绿灯
				PA = aaa;
				break;
				//状态4,东西禁止,南北缓速停车
		case 3:
		    aaa = 0x14;//东西红灯,南北黄灯
				PA = aaa;
				delay_ms(1);//闪烁延迟
				aaa = 0x04;//东西红灯,南北不亮
				PA = aaa;
				delay_ms(1);
				break;
		}
}

//紧急开关,控制南北或者东西通行
void button()
{
   if(button1 == 0)
	 { 
	    counter = 7;//数码管显示七秒
			state = 0;//变为状态1
	 }
	 if(button2 == 0)
	 {
	    counter = 7;//数码管显示七秒
			state = 2;//变为状态2
	 }
}

//主程序
void main(void)
{
    //片选信号打开
    CS = 0;
		
		//定时器初始化,并启动,延时为20ms
		TMOD = 0x01;
		TH0 = (65536 - 20000)/256;
		TL0 = (65536 - 20000)%256;
		IE = 0x82;
		TR0 = 1;
		//设置8255控制字,PAPBPC口均以方式0输出
		COM=0x80;
		//进入循环
		while(1)
		{
		  button();//判断是否按下紧急开关
		
			traffic_lights();//交通灯亮灭函数
			
			//数码管显示数字
			if(counter == 10)
			{
			   PC = counter;
				 delay_ms(1);
			   PB = counter;
				 delay_ms(1);
			}	
			else
			{
				PB = counter;
				delay_ms(1);
				PC = counter;
				delay_ms(1);
			}
		}
}
 
 //定时器中断函数
void T0_INT () interrupt 1
{
    static uint local_counter = 0;//定义循环次数
		
		TH0 = (65536 - 20000)/256;//设置20ms延迟
		TL0 = (65536 - 20000)%256;
		
		if(local_counter++ >= 50)//20*50=1s
		{
		   local_counter = 0;//循环次数归零
			 
			 counter--;//秒数减一
			 
			 if(state == 0 || state == 2)//关于1,3状态的切换
			 {
			    if(counter == 3)
					{state=(state + 1)%4;}//循环切换
			 }
			 else if(counter == 0)//关于 2,4状态的切换
			 {
			   state = (state +1)%4;//循环切换
			 
			   if(state ==0 || state == 2)//重新为counter置10秒
			   {
				     counter = 10;
			   }
			 }
		}
}

四、🎨(初学者)操作指南

1.🎄我的软件准备

在这里插入图片描述

2.🎋连接实验图

利用protues8连接实验电路图,新建项目等一些基础操作不做赘述。

👓设备图

在这里插入图片描述

🥟80C51连接部分

在这里插入图片描述

🍜8255连接部分

在这里插入图片描述

🍞交通灯部分

在这里插入图片描述

3.🍟二进制文件

利用Keil5,创建AT89C51项目后,编写导入C语言文件,调整输出设置,编译运行成功后,生成.hex(二进制文件),将这个文件导入protues8的80C51单片机即可。

我的Keil5项目大体就是这样
在这里插入图片描述

🧨总结(附百度网盘资源)

链接:https://pan.baidu.com/s/1Rt4ONmYPMZjuHw0gW9HVKQ?pwd=1111
提取码:1111 点我跳转

在这里插入图片描述

如果对您有用,别忘了帮本座点个赞再走啊!!!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值