找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3899|回复: 13
打印 上一主题 下一主题
收起左侧

红绿灯程序

  [复制链接]
跳转到指定楼层
楼主
ID:57439 发表于 2013-12-2 10:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求大神给个红绿灯的程序
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2013-12-6 00:06 | 只看该作者
51hei论坛里面有很多这样的例子:http://www.51hei.com/bbs/dpj-19195-1.html
回复

使用道具 举报

板凳
ID:64610 发表于 2014-7-31 21:49 | 只看该作者
可以根据红绿灯的原理自己写嘛,先从最简单的倒数一段时间后亮灯开始,慢慢扩展,这样可以锻炼一下自己的能力,而不是直接求程序

评分

参与人数 2威望 +50 黑币 +51 收起 理由
setst + 1
admin + 50 + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:66965 发表于 2014-10-5 10:16 | 只看该作者
最简易的红绿灯,

简易红绿灯.rar

290.28 KB, 下载次数: 70

回复

使用道具 举报

5#
ID:67014 发表于 2014-10-6 21:12 | 只看该作者
网上很多
回复

使用道具 举报

6#
ID:111634 发表于 2016-12-13 21:00 | 只看该作者
本帖最后由 zl2168 于 2016-12-13 21:04 编辑

若图方便可靠,可看张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行书中电路和程序设计有详细说明,程序语句条条有注解。
实例29 模拟交通灯
实例30 带限行时间显示的模拟交通灯
Proteus仿真一下,确认有效。
缩短亮灯时间,是为了仿真演示,便于观看,否则,你等得不耐烦了,实际应用时,可可修改延长。
实例29 模拟交通灯.rar (35.12 KB, 下载次数: 77)
实例30 带限行时间显示模拟交通灯.rar (40.64 KB, 下载次数: 80)



回复

使用道具 举报

7#
ID:154547 发表于 2016-12-13 22:08 | 只看该作者
交通灯程序
#include<reg51.h>

sbit B_R=P1^0;
sbit B_Y=P1^1;
sbit B_G=P1^2;
sbit N_R=P1^3;
sbit N_Y=P1^4;
sbit N_G=P1^5;
sbit X_R=P1^6;
sbit X_Y=P1^7;
sbit X_G=P3^1;
sbit D_R=P3^3;
sbit D_Y=P3^4;
sbit D_G=P3^5;
sbit KeyStop=P3^0;
sbit KeyStar=P3^2;

unsigned char code LedChar[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char LedBuff[]={0xFF,0xFF,0xFF,0xFF};
unsigned char timeBN=17,timeXD=20;
unsigned char j=2,i=1;                                //切换灯的标志,j是北南方向,i是东西方向
bit flag=0;//一秒标志
bit sleep=1;



void LedScan();
void ChooseLed();
void KeyAction();
void delay_1ms(unsigned int time);

void main()
{
        EA=1;
        IT0=1;
        EX0=1;
        TMOD=0x01;
        TH0=0xFC;
        TL0=0x67;
        ET0=1;
        TR0=1;
        while(1)
        {
                LedBuff[0]=LedChar[timeBN%10];        //个
                LedBuff[1]=LedChar[timeBN/10];        //十
                LedBuff[2]=LedChar[timeXD%10];
                LedBuff[3]=LedChar[timeXD/10];

                LedScan();                                                //亮灯函数
                KeyAction();                                        //按键功能函数
                if(flag==1)
                {
                        ChooseLed();                                //改变数码管值,切换灯函数
                        flag=0;
                }
        }
}


void LedScan()
{
        switch(j)                                                                                         //南北
        {
                case 0:B_Y=0;N_Y=0; B_G=1;N_G=1;B_R=1;N_R=1;break;                     //黄
                case 1:B_R=0;N_R=0;B_G=1;N_G=1;B_Y=1;N_Y=1;break;                         //红
                case 2:B_G=0;N_G=0;B_Y=1;N_Y=1;B_R=1;N_R=1;break;                    //绿                  
        }
        switch(i)                                                                                        //东西
        {
                case 0:X_Y=0;D_Y=0;X_G=1;D_G=1;X_R=1;D_R=1;break;                     //黄
                case 1:X_R=0;D_R=0;X_G=1;D_G=1;X_Y=1;D_Y=1;break;                         //红
                case 2:X_G=0;D_G=0;X_Y=1;D_Y=1;X_R=1;D_R=1;break;                    //绿                  
        }
}

void delay_1ms(unsigned int time)
{
        unsigned char k;
        while(time--)
        {
                for(k=124;k>0;k--);
        }
}

void KeyAction()
{
        static unsigned char backup=1;
                if(KeyStop!=backup)
                {
                        delay_1ms(5);
                        if(KeyStop!=backup)
                        {
                                if(backup==0)
                                {
                                        TR0=0;
                                        P2=0xFF;
                                        while(sleep)
                                        {       
                                                B_Y=0;N_Y=0;X_Y=0;D_Y=0;
                                                B_G=1;N_G=1;X_R=1;D_R=1;
                                                B_R=1;N_R=1;X_G=1;D_G=1;        
                                        }
                                                sleep=~sleep;
                                }       
                                backup=KeyStop;
                        }
                }       
}


void ChooseLed()
{
        static unsigned char x=0,y=0;
        timeBN--;                                                  //南北一开始是绿灯17秒
        timeXD--;                                                  //东西一开始是红灯20秒
        if(timeBN==-1)
        {
                switch(x)
                {
                        case 0:timeBN=2; j=0;x++;break;//黄
                        case 1:timeBN=20;j=1;x++;break;//红
                        case 2:timeBN=17; j=2;x=0;break;//绿
                }
        }
        if(timeXD==-1)
        {
                switch(y)
                {
                        case 0:timeXD=17;i=2;y++;break;//绿
                        case 1:timeXD=2;i=0;y++;break;//黄
                        case 2:timeXD=20;i=1;y=0;break;//红
                }
        }               
}

void interruptTime0() interrupt 1
{
        static unsigned int cnt=0;                           //计数
        static unsigned char n=0;

        TH0=0xFC;                                                           //1ms
        TL0=0x67;
        cnt++;
        if(cnt>=1000)
        {
                cnt=0;
                flag=1;                                                                         
        }

        P0=0xFF;
        switch(n)
        {
//                case 0:P2=0x7F;P0=LedBuff[2];n++;break;
//                case 1:P2=0xBF;P0=LedBuff[3];n++;break;
//                case 2:P2=0xDF;P0=LedBuff[2];n++;break;
//                case 3:P2=0xEF;P0=LedBuff[3];n++;break;
//                case 4:P2=0xF7;P0=LedBuff[0];n++;break;
//                case 5:P2=0xFB;P0=LedBuff[1];n++;break;
//                case 6:P2=0xFD;P0=LedBuff[0];n++;break;
//                case 7:P2=0xFE;P0=LedBuff[1];n=0;break;
            case 0:P2=0x80;P0=LedBuff[2];n++;break;
                case 1:P2=0x40;P0=LedBuff[3];n++;break;
                case 2:P2=0x20;P0=LedBuff[2];n++;break;
                case 3:P2=0x10;P0=LedBuff[3];n++;break;
                case 4:P2=0x08;P0=LedBuff[0];n++;break;
                case 5:P2=0x04;P0=LedBuff[1];n++;break;
                case 6:P2=0x02;P0=LedBuff[0];n++;break;
                case 7:P2=0x01;P0=LedBuff[1];n=0;break;
        }

}

void int0_inter() interrupt 0
{
        sleep=~sleep;
        TR0=1;
}


交通灯.zip

109.84 KB, 下载次数: 19

回复

使用道具 举报

8#
ID:154557 发表于 2016-12-13 22:31 | 只看该作者
可以根据红绿灯的原理自己写嘛,先从最简单的倒数一段时间后亮灯开始,慢慢扩展,这样可以锻炼一下自己的能力,而不是直接求程序
回复

使用道具 举报

9#
ID:154585 发表于 2016-12-14 08:53 | 只看该作者
不知道
回复

使用道具 举报

10#
ID:154899 发表于 2016-12-15 09:07 | 只看该作者
/*****************************************************
回复

使用道具 举报

11#
ID:154899 发表于 2016-12-15 09:07 | 只看该作者
小妹仔 发表于 2016-12-15 09:07
/*****************************************************

/*****************************************************
       十字路口交通灯控制

******************************************************/

#define        uchar        unsigned char
#define        uint        unsigned int
#include        <reg52.h>
/*****定义控制位**********************/
sbit    Time_Show_LED2=P2^5;//Time_Show_LED2控制位
sbit    Time_Show_LED1=P2^4;//Time_Show_LED1控制位
sbit        EW_LED2=P2^3;        //EW_LED2控制位
sbit        EW_LED1=P2^2;        //EW_LED1控制位
sbit        SN_LED2=P2^1;        //SN_LED2控制位
sbit        SN_LED1=P2^0;        //SN_LED1控制位
sbit    SN_Yellow=P1^6;//SN黄灯
sbit    EW_Yellow=P1^2;//EW黄灯
sbit    EW_Red=P1^3;//EW红灯
sbit    SN_Red=P1^7;//SN红灯
sbit    EW_ManGreen=P3^0;//EW人行道绿灯
sbit    SN_ManGreen=P3^1;//SN人行道绿灯
sbit    Special_LED=P2^6;//交通正常指示灯
sbit    Busy_LED=P2^7;//交通繁忙指示灯
sbit    Nomor_Button=P3^5;//交通正常按键
sbit    Busy_Btton=P3^6;//交通繁忙按键
sbit    Special_Btton=P3^7;//交通特殊按键  
sbit    Add_Button=P3^3;//时间加
sbit    Reduces_Button=P3^4;//时间减
bit     Flag_SN_Yellow; //SN黄灯标志位
bit     Flag_EW_Yellow;//EW黄灯标志位
char        Time_EW;//东西方向倒计时单元
char        Time_SN;//南北方向倒计时单元
uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式
uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的变量
uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段选码
uchar code S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};//交通信号灯控制代码
/**********************延时子程序************************/
void        Delay(uchar         a)
        {
                uchar        i;
                i=a;
                while(i--){;}
        }
/*****************显示子函数**************************/
void        Display(void)
        {
                char h,l;
                h=Time_EW/10;
                l=Time_EW%10;
              P0=table[l];
                EW_LED2=1;
                Delay(2);
                EW_LED2=0;
            P0=table[h];
                EW_LED1=1;
                Delay(2);
                EW_LED1=0;

                h=Time_SN/10;
                l=Time_SN%10;
                P0=table[l];
                SN_LED2=1;
                Delay(2);
                SN_LED2=0;
            P0=table[h];
                SN_LED1=1;
                Delay(2);
                SN_LED1=0;
               

                h= EW1/10;
                l= EW1%10;
                P0=table[l];
                Time_Show_LED1=1;
                Delay(2);
        Time_Show_LED1=0;
                P0=table[h];
                Time_Show_LED2=1;
                Delay(2);
            Time_Show_LED2=0;
}
/**********************外部0中断服务程序************************/

void        EXINT0(void)interrupt 0 using 1
        {
                EX0=0; //关中断

if(Add_Button==0) //时间加
       {
            EW1+=5;
            SN1+=5;
              if(EW1>=100)
                           {
                             EW1=99;
                             SN1=79;
               }
            }
if(Reduces_Button==0) //时间减
       {
            EW1-=5;
            SN1-=5;
            if(EW1<=40)
              {
                             EW1=40;
                 SN1=20;
               }
                               
                    }

if(Nomor_Button==0)//测试按键是否按下,按下为正常状态
        {
            EW1=60;
            SN1=40;
                        EWL1=19;
                        SNL1=19;
                        Busy_LED=0;//关繁忙信号灯
                        Special_LED =0;//关特殊信号灯
            }
if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态
        {
                    EW1=45;
            SN1=30;
                        EWL1=14;
                        SNL1=14;
                        Special_LED=0;//关特殊信号灯
                        Busy_LED=1;//开繁忙信号灯
               
        }
if(Special_Btton==0)//测试按键是否按下,按下为特殊状态
        {
                    EW1=75;
            SN1=55;
                        EWL1=19;
                        SNL1=19;
                        Busy_LED=0;//关繁忙信号灯
                    Special_LED =1;//开特殊信号灯
                  
            }                                       
                EX0=1;//开中断
        }
/**********************T0中断服务程序*******************/
        void timer0(void)interrupt 1 using 1
{
        static uchar count;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
       
        if(count==10)
        {
          if(Flag_SN_Yellow==1) //测试南北黄灯标志位
          {SN_Yellow=~SN_Yellow;}
          if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
          {EW_Yellow=~EW_Yellow;}
        }
        if(count==20)
        {
        Time_EW--;
        Time_SN--;
        if(Flag_SN_Yellow==1)//测试南北黄灯标志位
            {SN_Yellow=~SN_Yellow;}
        if(Flag_EW_Yellow==1)//测试东西黄灯标志位
            {EW_Yellow=~EW_Yellow;}
        count=0;
        }
       
}
/*********************主程序开始**********************/
void        main(void)

{
        Busy_LED=0;
        Special_LED=0;
        IT0=1;        //INT0负跳变触发       
    TMOD=0x01;//定时器工作于方式1
        TH0=(65536-50000)/256;//定时器赋初值
        TL0=(65536-50000)%256;
        EA=1; //CPU开中断总允许
        ET0=1;//开定时中断
        EX0=1;//开外部INTO中断
    TR0=1;//启动定时

     while(1)

{                                /*******S0状态**********/
                                EW_ManGreen=0;        //EW人行道禁止
                    SN_ManGreen=1;//SN人行道通行
                Flag_EW_Yellow=0;           //EW关黄灯显示信号
                                Time_EW=EW;       
                                Time_SN=SN;               
                                while(Time_SN>=5)
                            {P1=S[0];         //SN通行,EW红灯
                         Display();}
                                /*******S1状态**********/
                            P1=0x00;
                                while(Time_SN>=0)
                           {Flag_SN_Yellow=1;         //SN开黄灯信号位
                            EW_Red=1;      //SN黄灯亮,等待左拐信号,EW红灯
                         
                             Display();
                                }
                                /*******S2状态**********/
                            Flag_SN_Yellow=0; //SN关黄灯显示信号
                                Time_SN=SNL;
                                while(Time_SN>=5)
                                {P1=S[2];//SN左拐绿灯亮,EW红灯
                                 Display();}

                          /*******S3状态**********/
                                P1=0x00;
                                while(Time_SN>=0)
                           {Flag_SN_Yellow=1;        //SN开黄灯信号位
                            EW_Red=1;      //SN黄灯亮,等待停止信号,EW红灯
                                  
                            Display();}


                           /***********赋值**********/
                                EW=EW1;
                                SN=SN1;
                                EWL=EWL1;
                                SNL=SNL1;


                                /*******S4状态**********/
                                EW_ManGreen=~EW_ManGreen;//EW人行道通行
                    SN_ManGreen=~SN_ManGreen;//SN人行道禁止
                                Flag_SN_Yellow=0;  //SN关黄灯显示信号
                                Time_EW=SN;
                                Time_SN=EW;
                            while(Time_EW>=5)
                            {P1=S[4];         //EW通行,SN红灯
                                 Display();}
                                /*******S5状态**********/
                                P1=0X00;
                                while(Time_EW>=0)
                           {Flag_EW_Yellow=1;//EW开黄灯信号位
                            SN_Red=1;//EW黄灯亮,等待左拐信号,SN红灯       
                            Display();}
                                /*******S6状态**********/
                                Flag_EW_Yellow=0;            //EW关黄灯显示信号
                                Time_EW=EWL;
                                while(Time_EW>=5)
                                {P1=S[6];//EW左拐绿灯亮,SN红灯
                                 Display();}

                                /*******S7状态**********/
                                P1=0X00;
                                while(Time_EW>=0)
                           {Flag_EW_Yellow=1; //EN开黄灯信号位
                            SN_Red=1;//EW黄灯亮,等待停止信号,SN红灯       
                            Display();}
                       
                                    /***********赋值**********/
                            EW=EW1;
                                SN=SN1;
                                EWL=EWL1;
                                SNL=SNL1;
                        }

        }
回复

使用道具 举报

12#
ID:154912 发表于 2016-12-15 09:49 | 只看该作者
#include <reg52.h>  
bit red,green,yellow,turnred;          //
定义红、黄、绿及转红标志

code unsigned char tab[]=  
    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
    //
共阴数码管
0-9  
unsigned char Dis_Shiwei;//
定义十位

unsigned char Dis_Gewei; //
定义个位
  
void delay(unsigned int cnt)          //
用于动态扫描数码管的延时程序

{  
while(--cnt);
}
main()
{  
TMOD |=0x01;//
定时器设置
10ms in 12M crystal
定时器
0
,工作方式
1

16
位定时器
  
TH0=0xd8;            //65535-10000=55535=D8F0
(十六进制
)
TL0=0xf0;  
IE= 0x82; //
中断控制,
EA=1
开总中断,
ET0=1
:定时器
0
中断允许

TR0=1;    //
开定时器
0
中断
  
P1=0xfc;//
红灯亮,根据红黄绿接灯的顺序。

red =1;
while(1)
{  
P0=Dis_Shiwei;//
显示十位,这里实现用
8
位数码管,即左
1


P2=0;  
delay(300);//
短暂延时
  
P0=Dis_Gewei; //
显示个位,左数,
2


P2=1;  
      
  
delay(300);
}  
}  
/********************************/
/*      
定时中断
                */
/********************************/
void tim(void) interrupt 1 using 1
{  
static unsigned char second=60,count; //
初值
60  
TH0=0xd8;//
重新赋值,
10
毫秒定时

TL0=0xf0;
count++;  
if (count==100)
    {  
    count=0;  
    second--;//
秒减
1
if(second==0)  
    { //
这里添加定时到
0
的代码

,可以是灯电路,继电器吸合等,或者执行
一个程序
  
       if(red)   //
红灭,先转黄

      {  
    red=0;yellow=1;
          second=4;  
    P1=0xF3;//
黄灯亮
4
秒,黄灯为过渡灯,再根据情况转绿或转红

   }  
    else if(yellow && !turnred)
      {  
    yellow=0;green=1;
          second=25;  
    P1=0xCF;//
绿灯亮
25
秒,

   }  
    else if(green)
      {  
   yellow=1;green=0;
         second=4;  
   P1=0xF3;//
黄灯亮
4


   turnred=1;
   }  
       else
if(yellow
&&
turnred)   //
绿灯灭,转黄灯,后红灯,
turnred=1

  
      {  
      red=1;yellow=0;  
  
  
   P1=0xFC;//
红灯亮
60


         second=60;  
   turnred=0;   //
接下来是转黄,绿。

   }  
    }  
Dis_Shiwei=tab[second/10];//
十位显示值处理

    Dis_Gewei=tab[second%10]; //
个位显示处理

回复

使用道具 举报

13#
ID:154926 发表于 2016-12-15 10:23 | 只看该作者
daisy.sun 发表于 2016-12-13 22:08
交通灯程序
#include

好人啊 层主 我现在巨需要!!!!
回复

使用道具 举报

14#
ID:154568 发表于 2016-12-15 12:41 | 只看该作者
可以搜一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表