單片機實驗:交通燈控制

實驗要求

按照電路要求在Protues中設計電路圖,或者使用開發板。編程實現如下功能:
用單片機端口作輸出口,控制四個方向共12個發光二極管亮滅,模擬交通燈管理。功能描述如下:初始態爲四個路口的紅燈全亮之後,東西路口的綠燈亮,南北路口的紅燈亮,東西路口方向通車,延時一段時間後東西路口的綠燈熄滅,黃燈開始閃爍,閃爍若干次後,東西路口紅燈亮,而同時南北路口的綠燈亮,南北路口方向開始通車,延時一段時間後,南北路口的綠燈熄滅,黃燈開始閃爍,閃爍若干次後,再切換到東西路口方向,之後重複以上過程。

代碼

#include <reg52.h>
#include <absacc.h>

#define PA	 XBYTE[0x7FFC]   //PA端口地址
#define PB	 XBYTE[0x7FFD]		
#define PC	 XBYTE[0x7FFE]
#define COM	 XBYTE[0x7FFF]

char code dx516[3] _at_ 0x003b;

unsigned char Second[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};  
unsigned char count = 0, total = 0;

/**************8255初始化******************************/
void init_8255(void)
{
	COM = 0x80;	// C = out B=out A = out
	PA = 0xFF;
	PB = 0xFF;

}

/**************定時器1初始化******************************/
void init_T1(void)
{
	TMOD = 0x10; //定時器1,模式1
  TH1 = 0x3c; // 定時爲50ms
  TL1 = 0xb0;       
  ET1 = 1;  //允許定時器中斷1
  EA = 1;	//開總中斷
  TR1 = 1;	
}

//-------------------
// 函數名稱: void delay_s(unsigned t)
// 函數功能: 利用定時器延時t*0.5秒子程序
//-------------------
void delay_s(unsigned char t)
{  
	TR1 = 1;//啓動定時
	total = t * 10;
	count = 0;
	while(1)
	{
	  if(count == total)//定時時間到
		{
			count = 0;	
			total = 0;
			TR1 = 0;
			return;
		}
	}
}

void timer1() interrupt 3       //定時器1
{     
	TR1 = 0;
	TH1 = 0x3c;   	// 定時爲50ms
	TL1 = 0xb0;
	count++;
	TR1 = 1;
}

void main(void)
{
	unsigned char i = 0;
	init_8255();
	init_T1();
	while(1)
	{			
		for(i = 10;i > 0;i--)
		{
			PC = Second[i];			
			if(i < 4)//最後三秒東西方向綠燈和南北方向紅燈閃爍。
			{
				PA = 0xFF;
				PB = 0xFF;				
	      		delay_s(1);
	     		PA =0xf6;
				PB = 0xdb;
	      		delay_s(1); 	
			}
			else
			{
				PA = 0xf6;	//東西綠燈亮
	     		PB = 0xdb;	//南北紅燈亮 
				delay_s(2);
    		}
		}
		
		for(i = 3;i > 0; i--)	 //閃爍三秒
		{
			PC = Second[i];
			PA = 0xed;//東西黃燈亮
			PB = 0xed;//南北黃燈亮				
	    	delay_s(1);
			PA = 0xFF;
			PB = 0xFF;    
	    	delay_s(1); 
		}
	 
		for(i = 10;i > 0;i--)
		{
			PC = Second[i];			
			if(i < 4)			//最後三秒南北方向綠燈和東西方向紅燈閃爍
			{
				PA = 0xFF;
				PB = 0xFF;	
	      		delay_s(1);
				PA = 0xDB;  
	      		PB = 0xf6;  
	      		delay_s(1); 	
			}
			else
			{
				PA = 0xdb;	 //東西紅燈亮
	      		PB =0xf6;   //南北綠燈亮
				delay_s(2);
      		}
		}
		
		for(i = 3;i > 0;i--)	  //閃爍三秒
		{
			PC = Second[i];
			PA = 0xed; //東西黃燈亮
			PB = 0xed;  //南北黃燈亮				
	    	delay_s(1);
			PA = 0xff;
			PB = 0xff;    
	   		delay_s(1); 
		}
	}	
} 

protues仿真

東西方向綠燈和南北方向紅燈:
在這裏插入圖片描述
東西南北方向黃燈閃爍三秒:
在這裏插入圖片描述
東西方向紅燈和南北方向綠燈:
在這裏插入圖片描述

總結

起初數碼管數字和紅綠燈不變化,後來發現是定時器初始化爲定時器1,模式1時TMOD賦值出錯。還有賦值的二進制是高位到低位與引腳的高位到低位對應。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章