单片机实验:交通灯控制


实验要求
按照电路要求在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赋值出错。还有赋值的二进制是高位到低位与引脚的高位到低位对应。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM