单片机交通灯c程序 只有红绿灯 和数码显示

要c++程序 哥哥们 姐姐们

参考《51单片机C语言创新教程》温子祺等著。

源码转自:《51单片机C语言创新教程》。

/*实验名称:交通灯实验

 *描    述:交通灯实验要求红灯亮15秒,绿灯亮10秒,黄灯亮5秒,

           当红灯切换为绿灯或者绿灯切换为红灯,

   要实现灯闪烁。红灯、绿灯、黄灯的点亮持续时间可以通过串口来修改,

   并在下一个循环中更新数值。

 *作    者:温子祺

 *修改日期:2010/5/4

 *说    明:代码注释与讲解详见《51单片机C语言创新教程》温子祺等著,北京航空航天大学出版社

 */

#include "stc.h"

typedef unsigned char   UINT8;

typedef unsigned int UINT16;

typedef unsigned long   UINT32;  

typedef char            INT8;

typedef int             INT16;

typedef long            INT32;

   

#define TIMER0_INITIAL_VALUE 5000

#define HIGH               1

#define LOW                0

#define ON                 1

#define OFF                0

#define SEG_PORT           P0

#define LS164_DATA(x)      {if((x))P0_4=1;else P0_4=0;}         

#define LS164_CLK(x)       {if((x))P0_5=1;else P0_5=0;} 

#define NORTH_R_LIGHT(x)   {if((x))P2_0=0;else P2_0=1;}

#define NORTH_Y_LIGHT(x)   {if((x))P2_1=0;else P2_1=1;}

#define NORTH_G_LIGHT(x)   {if((x))P2_2=0;else P2_2=1;}

#define SOUTH_R_LIGHT(x)   {if((x))P2_3=0;else P2_3=1;}

#define SOUTH_Y_LIGHT(x)   {if((x))P2_4=0;else P2_4=1;}

#define SOUTH_G_LIGHT(x)   {if((x))P2_5=0;else P2_5=1;}

#define TRAFFIC_STATUS_1   0

#define TRAFFIC_STATUS_2   1

#define TRAFFIC_STATUS_3   2

 

#define UART_MARKER        0xEE    

UINT8  Timer0IRQEvent=0;

UINT8  Time1SecEvent=0;

UINT8  Time500MsEvent=0;

UINT8  TimeCount=0;

UINT8  SegCurPosition=0;

UINT8  LightOrgCount[4]={15,5,15,5};

UINT8  LightCurCount[4]={15,5,15,5};

UINT8  TrafficLightStatus=0;

code UINT8  SegCode[10]   ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

     UINT8  SegBuf[4]     ={0};

code UINT8  SegPosition[4]={0x07,0x0b,0x0d,0x0e};

typedef struct _LIGHT_VAL

{

    UINT8 Head;   

    UINT8 val[4]; 

}LIGHT_VAL;

typedef union _LIGHT_VAL_EX

{

     LIGHT_VAL lv;

     UINT8    p[5]; 

}LIGHT_VAL_EX;

void LS164Send(UINT8 byte)

{

   UINT8 j;

   for(j=0;j<=7;j++)

   {

     if(byte&(1<<(7-j)))

     {

    LS164_DATA(HIGH);

 }

 else

 {

    LS164_DATA(LOW);

 }

     LS164_CLK(LOW); 

     LS164_CLK(HIGH);

       

   }

}

void RefreshDisplayBuf(UINT8 s1)  //刷新显示缓存

{

SegBuf[0] = s1%10;

SegBuf[1] = s1/10;

SegBuf[2] = s1%10;

SegBuf[3] = s1/10;

}

void SegDisplay(void)

{

   UINT8  t;

   

   t = SegCode[SegBuf[SegCurPosition]]; 

   SEG_PORT |= 0x0f;

   LS164Send(t); 

   SEG_PORT = (SEG_PORT|0x0f) & SegPosition[SegCurPosition];

   if(++SegCurPosition>=4) 

   {

    SegCurPosition=0;

   }

  

}

void TimerInit(void)

{

   TH1 = 0;

   TL1 = 0; 

   TH0 = (65536-TIMER0_INITIAL_VALUE)/256;

   TL0 = (65536-TIMER0_INITIAL_VALUE)%256; //定时1MS

   TMOD = 0x51; /*01010001 T1计数,T0定时*/

  

}

void Timer0Start(void)

{

     TR0 = 1; //启动计时器1 

 ET0 = 1;

}

void Timer0Stop(void)

{

     TR0 = 0; //启动计时器1 

     ET0 = 0;  

}

void PortInit(void)

{

 P0=P1=P2=P3=0xFF;

}

void UartInit(void)

{

SCON=0x40;

T2CON=0x34;

RCAP2L=0xD9;

RCAP2H=0xFF;

REN=1;

    ES=1;

}

void UartSendByte(UINT8 byte)

{

SBUF=byte;

    while(TI==0);

    TI=0;

}

void UartPrintfString(INT8 *str)

{

while(str && *str)

    {

UartSendByte(*str++);

    }

}

void main(void)

{

    UINT8 i=0;

PortInit();

TimerInit();

    Timer0Start();

    UartInit();

    RefreshDisplayBuf(LightCurCount[0]);

    EA=1;

    NORTH_R_LIGHT(ON);

    SOUTH_G_LIGHT(ON);

while(1)

    {

if(Timer0IRQEvent)

            Timer0IRQEvent=0;

            TimeCount++;

  

            if(TimeCount>=200)

            {

TimeCount=0;

if(LightCurCount[0])

                {

                    TrafficLightStatus=0;

                }

else if(LightCurCount[1])

                {

                    TrafficLightStatus=1;

                }

else if(LightCurCount[2])

                {   

                    TrafficLightStatus=2;

                }

                else if(LightCurCount[3])

                {

TrafficLightStatus=3;

                }

                

                else 

                {

                   for(i=0;i<4;i++)

                   {

                     LightCurCount[i]=LightOrgCount[i];

                   }

                   TrafficLightStatus=0;

                }

switch(TrafficLightStatus)

{

case 0:

                    {

                        NORTH_R_LIGHT(ON);

                        SOUTH_R_LIGHT(OFF);

                        NORTH_G_LIGHT(OFF);

                        SOUTH_G_LIGHT(ON);

NORTH_Y_LIGHT(OFF);

                        SOUTH_Y_LIGHT(OFF);

                    }

                    break;

                    

                    case 1:

                    {

                        if(LightCurCount[1]%2)

                        {

   NORTH_R_LIGHT(ON);

                           SOUTH_G_LIGHT(ON);

                        }

                        else

                        {

   NORTH_R_LIGHT(OFF);

                           SOUTH_G_LIGHT(OFF);

                        }

NORTH_Y_LIGHT(ON);

                        SOUTH_Y_LIGHT(ON);

                    }

                    break;

                    case 2:

                    {

                        NORTH_R_LIGHT(OFF);

                        SOUTH_R_LIGHT(ON);

                        NORTH_G_LIGHT(ON);

                        SOUTH_G_LIGHT(OFF);

NORTH_Y_LIGHT(OFF);

                        SOUTH_Y_LIGHT(OFF);

                    }

                    break;

                       

                    case 3:

                    {

                        if(LightCurCount[3]%2)

                        {

   NORTH_G_LIGHT(ON);

                           SOUTH_R_LIGHT(ON);

                        }

                        else

                        {

   NORTH_G_LIGHT(OFF);

                           SOUTH_R_LIGHT(OFF);

                        }

NORTH_Y_LIGHT(ON);

                        SOUTH_Y_LIGHT(ON);

                    }

                    break;  

                    

                   default:break;                  

                }

                RefreshDisplayBuf(LightCurCount[TrafficLightStatus]);

                LightCurCount[TrafficLightStatus]--;

            }

            

SegDisplay();

        }

        

    }

}

void UartIRQ(void)interrupt 4 

{

  static UINT8 cnt=0;

  static LIGHT_VAL_EX LightValEx;

  if(RI)

  {   

     RI=0;

 LightValEx.p[cnt++]=SBUF;

     if(LightValEx.lv.Head == UART_MARKER)

     {  

if(cnt>=5)

        {

for(cnt=1;cnt<5;cnt++)

            {

LightOrgCount[cnt-1]=LightValEx.lv.val[cnt]; 

                LightCurCount[cnt-1]=LightValEx.lv.val[cnt];

               

            }

            cnt=0;

            UartPrintfString("设置交通灯完成\r\n");

        }

     }

     else

     {

cnt=0;

     }

  

  }

}

void Timer0IRQ(void) interrupt 1 

{

ET0 =  0;

TH0 = (65536-TIMER0_INITIAL_VALUE)/256;

    TL0 = (65536-TIMER0_INITIAL_VALUE)%256; //定时1MS

Timer0IRQEvent=1;

    

ET0 =  1;

}

=====================================================================

坐等拿分!

追问

where 数码显示 is

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-03
增加2个I/O线, 来控制双向的黄灯!

单片机交通灯c程序 只有红绿灯 和数码显示
描 述:交通灯实验要求红灯亮15秒,绿灯亮10秒,黄灯亮5秒,当红灯切换为绿灯或者绿灯切换为红灯,要实现灯闪烁。红灯、绿灯、黄灯的点亮持续时间可以通过串口来修改,并在下一个循环中更新数值。作 者:温子祺 修改日期:2010\/5\/4 说 明:代码注释与讲解详见《51单片机C语言创新教程》温子...

c51单片机c语言交通灯的程序
使用C语言为C51单片机编写交通灯控制程序是完全可行的,通过合理地设置定时器、I\/O端口以及逻辑控制,可以实现交通灯的定时切换和状态显示。接下来,我将详细解释如何为C51单片机使用C语言编写交通灯控制程序。首先,我们需要了解C51单片机的基本结构和资源,包括其I\/O端口、定时器\/计数器等。通常,交通灯系...

基于51单片机控制交通灯的电路图与C语言程序
红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。三、硬件电路设计 此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管...

单片机交通灯汇编语言程序,只需红黄绿灯顺序亮就行了
\/\/交通灯切换 void Traffic_Light(){ switch(Operation_Type){ case1: \/\/东西向绿灯与南北向红灯亮 RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;DelayMS(2000);Operation_Type=2;break;case2: \/\/东西向黄灯闪烁,绿灯关闭 DelayMS(300);YELLOW_A=~YELLOW_A;GR...

c51单片机c语言交通灯的程序
void display();\/\/显示子程序 void logo(); \/\/开机LOGO void Buzzer();\/\/主程序 void main(){ TMOD=0X01;TH0=0XD8;TL0=0XF0;EA=1;ET0=1;TR0=1;EX0=1;EX1=1;logo();P2=0Xc3;\/\/ 开始默认状态,东西绿灯,南北黄灯 sec_nb=sec_dx+5;while(1){ key(); \/\/调用按键扫描程序...

编程加实践(单片机):求利用89C51 CPU编写红绿灯程序
回答:^_^,安装一个KEILC程序,它的安装目录下面有一个交通灯的完整例子 ^_^

单片机中十字路口交通信号灯的过程,内容,原理?
再根据实际车流量通过8051芯片的P3口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示(交通灯信号通过P1口输出,显示时间通过P0口输出至双位数码管)。本系统设计周期短、可靠性高、实用性强、操作简单、维护方便、扩展功能强。关键词:单片机、MCS-51系列单片机AT89C51、交通灯 ...

求一个用汇编语言编写单片机简易交通灯程序。求高手帮下忙谢谢了...
;1.工作寄存器 ;R2设置为定时器定时中断次数,R6、R7用于延时程序中的寄存器 ;2.片内存储单元 ;30H、31H作为两组数码管显示数据存储单元;32H、33H作为交通灯初始状态存储单元;40H、41H作为交通灯显示数据存储单元 ;3.标志位 ;00H:南北通行标志位 ; 01H:东西通行标志位;02H:紧急事件标志位 ;--...

...帮忙设计一个交通灯控制的C语言程序。谢谢。。(汇编指令太麻烦咯...
sbit YELLOW_A = P0^1;sbit GREEN_A = P0^2;sbit RED_B = P0^3;sbit YELLOW_B = P0^4;sbit GREEN_B = P0^5;uchar Flash_Count = 0, Operation_Type=1;void DelayMS(uint x){ uchar i;while (x--) for (i=0;i<120;i++);} void Traffic_Light(){ switch (Operation...

通过89s51单片机实现交通灯
通过89s51单片机实现交通灯东西红灯亮南北绿灯亮15s,东西红灯亮南北黄灯闪烁5s,东西绿灯亮南北红灯亮15s,东西等闪烁南北红等亮5s的循环控制点亮,选用单片机I\/O口的线控制各盏灯。... 通过89s51单片机实现交通灯东西红灯亮南北绿灯亮15s,东西红灯亮南北黄灯闪烁5s,东西绿灯亮南北红灯亮15s,东西等闪烁南北红等亮5s的循...

相似回答