15年10个月前IP:未同步
284764
1楼
可以用变量计数的方式啊,我技术不咋地,但是我写过几个交通灯,给你一个switch流的程序做参考吧(用keil咯)
/*********************************************************                              
-------------------------------------------------------
** 编写人:Flynn                   文件名:交通灯.c
** 描述:带倒计时的交通灯
******************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define w_xuan P2                //宏定义P2口为w_xuan,表示位选
sbit dx_red= P3^0;                //定义交通指示灯P3.0-P3.5
sbit dx_yellow=P3^1;
sbit dx_green=P3^2;
sbit nb_red=P3^3;
sbit nb_yellow =P3^4;
sbit nb_green=P3^5;

sbit key1=P1^0;                    //定义按键,满足紧急情况的指挥
sbit key2=P1^1;
sbit key3=P1^2;

/***********************
延时程序:delay()
功能:用于延时
***********************/
void delay(uint dly)
{
    uint i,j;
    for(i=dly;i>0;i--)
      for(j=250;j>0;j--);
}
uint b=28,c=25,ten1,one1,ten2,one2,temp1=0,temp2=0;  
uchar code a[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uint deng,xianshi,jishu;


/***********************
显示函数:disp()
功能:用于显示倒计时
***********************/
void disp(uint shi1,uint ge1,uint shi2,uint ge2)
{
          ten1=b/10;
          one1=b%10;
          
          ten2=c/10;
          one2=c%10;

        w_xuan=0xff;
        P0=a[ge1];
        w_xuan=0xfe;
        delay(2);
        w_xuan=0xff;
        P0=a[shi1];
          w_xuan=0xfd;
        delay(2);

        w_xuan=0xff;
        P0=a[ge2];
        w_xuan=0xef;
        delay(2);
        w_xuan=0xff;
        P0=a[shi2];
          w_xuan=0xdf;
        delay(2);
}

/***********************
按键函数:anjian()
功能:用于紧急情况的处理
***********************/
void anjian(void)
{
    if(!key1)
    {
        delay(10);
    while(!key1)
            {
                EA=0;
                nb_red=0;
                dx_red=0;
                nb_green=1;
                dx_green=1;
                nb_yellow=1;
                dx_yellow=1;
            }
    }
    if(!key2)
    {
        delay(10);    
     while(!key2)
     {
                 EA=0;
                nb_red=0;
                dx_red=1;
                nb_green=1;
                dx_green=0;
                nb_yellow=1;
                dx_yellow=1;
     }
    }
    if(!key3)
    {
        delay(10);
     while(!key3)
     {
                 EA=0;
                nb_red=1;
                dx_red=0;
                nb_green=0;
                dx_green=1;
                nb_yellow=1;
                dx_yellow=1;
     }    
    }
         EA=1;        
}

/***********************
初值函数:shuma_dis(void)
功能:用于给数码管倒计时赋初值
***********************/
void shuma_dis(void)
{

            if(xianshi>=200)
          {  
            xianshi=0;
            jishu++;
            b--;
            c--;
            if(b==0)
           {
               temp1=temp1+1;
            if(temp1==3)
            temp1=0;
        
             switch(temp1)
             {
                 case 0:b=28;break;
                case 1:b=25;break;
                case 2:b=3;break;    
             }
            }

            if(c==0)
            {  temp2=temp2+1;
             if(temp2==3)
             temp2=0;
            
            switch(temp2)
            {
            case 0:c=25;break;
            case 1:c=3;break;
            case 2:c=28;break;
            }

            }
           }
}
/***********************
交通灯指示函数:j_t_deng(void)
功能:用于处理交通灯的四种状态
***********************/
void j_t_deng(void)
{
    switch(deng)
        {
            case 0: dx_red=0;
                    nb_green=0;
                    dx_green=1;
                    nb_red=1;
                    dx_yellow=1;

                    break;

            case 1: dx_green=1;
                    nb_green=1;
                    nb_yellow=0;
                    nb_red=1;
                    dx_red=0;
                    break;

               case 2: dx_red=1;
                    dx_green=0;
                    nb_yellow=1;
                    nb_red=0;
                    nb_green=1;
                    break;

            case 3: nb_red=0;
                    dx_green=1;
                    dx_yellow=0;
                    nb_green=1;
                    dx_red=1;
                    break;
        }
    switch(jishu)
    {
        case 25:deng=1;break;
        case 28:deng=2;break;
        case 53:deng=3;break;
        case 56:deng=0;jishu=0;break;    
    }    
}
/***********************
初始化函数:ini()
功能:用于初始化定时器
***********************/
void ini(void)
{
    TMOD=0X01;
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;
    EA=1;
    ET0=1;
    TR0=1;
}
/***********************
主函数
***********************/
main()
{    
    ini();//初始化函数
    while(1)
    {
            anjian();
          disp(ten1,one1,ten2,one2);
            shuma_dis();
            j_t_deng();        
    }
    
}
void shijian() interrupt 1
{
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;
    xianshi++;
    
}
评论
文号 / 284764

一表人才
名片发私信
学术分 0
总主题 11 帖总回复 92 楼拥有证书:进士 笔友
注册于 2010/06/22 22:05:29最后登录 2019/05/05 17:57:45
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:0

个人简介

暂未填写
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的