使用80C51控制8255实现详细的交通灯模拟系统

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

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


文章目录

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

  • 一、🎊主要功能演示视频

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

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用80C51控制8255实现详细的交通灯模拟系统

    发表评论