80C51控制8255实现交通灯模拟系统(详)-创新互联

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

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

创新互联专注于中大型企业的成都网站设计、网站建设和网站改版、网站营销服务,追求商业策划与数据分析、创意艺术与技术开发的融合,累计客户1000+,服务满意度达97%。帮助广大客户顺利对接上互联网浪潮,准确优选出符合自己需要的互联网运用,我们将一直专注品牌网站制作和互联网程序开发,在前进的路上,与客户一起成长!

文章目录
  • 80C51控制8255实现交通灯模拟系统(详)
  • 一、🎊主要功能演示视频
  • 二、🎉主要功能介绍
    • 1.💎流程图
    • 2.💍文字介绍
  • 三、🎃源码(C语言附带注释)
  • 四、🎨(初学者)操作指南
    • 1.🎄我的软件准备
    • 2.🎋连接实验图
    • 3.🍟二进制文件
  • 🧨总结(附百度网盘资源)


一、🎊主要功能演示视频

8255交通灯

二、🎉主要功能介绍 1.💎流程图

在这里插入图片描述

2.💍文字介绍

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


三、🎃源码(C语言附带注释)
#include  //引入头文件
#include//为了外部写入数据的头文件

#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 点我跳转

在这里插入图片描述

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:80C51控制8255实现交通灯模拟系统(详)-创新互联
链接URL:http://hbruida.cn/article/djhgig.html