lonespeaker 2021-07-01 20:43 采纳率: 28.6%
浏览 239
已采纳

求一个51单片机交通灯程序?

img

img
仿真硬件要求如上两图
程序要求如下:
1.利用定时器中断产生倒计时,用数码显示机动车交通灯每个灯次的倒计时。
2.每个路口交通变化顺序为:机动车用交通灯:绿灯亮,绿灯闪烁3次,1秒/次, 黄灯闪烁3次,1秒/次,红灯亮;行人用交通灯:绿灯亮,绿灯闪烁3次,1 秒/次(与机动车交通灯同步),红灯亮(无黄灯闪烁过程),绿灯闪烁的同 时用蜂鸣器对行人进行提示。
3.设置三个按键,分别是"设置"、"增大〃、"减小"。用外部中断对第一 次按下"设置"进行响应,东西方向的数码管闪烁显示该方向绿灯时间,再 次按下设置,则东西、南北方向的数码管闪烁切换。按下增大、减小,则使 相应方向的绿灯时间做出调整,并在数码管上显示。再次按下设置完成调整。
4.绿灯时间范围为10秒〜20秒。
希望得到一个完整的程序

  • 写回答

3条回答 默认 最新

  • soar3033 2021-07-03 09:10
    关注
    #include<reg52.h>
    #define              uint unsigned int;
    #define  uchar unsigned char;
    
    void  DigitalTube();   //数码管显示函数
    void  InterruptT0();              //内部中断0
    
    sbit  P10 = P1^0;                            //红绿灯引脚的初始化
    sbit  P11 = P1^1;
    sbit  P12 = P1^2;
    sbit  P13 = P1^3;
    sbit  P14 = P1^4;
    sbit  P15 = P1^5;
    
    sbit  P16 = P1^6;                            //数码管使能控制
    sbit  P17 = P1^7;
    sbit  P20 = P2^0;
    sbit  P21 = P2^1;
    
    sbit  K22 = P2^2;                 //按键22
    sbit  K23 = P2^3;
    sbit  K24 = P2^4;
    sbit dula = P2^5;
    
    uint LedBuf[10] = {
                                  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                                0x80,0x90
    };                            //0~9的数字显示共阳
    
    uint Kflag = 1;                              //按键24的标志
    uint LedNumNS = 27;                 //南北的数字显示
    uint LedNumEW = 30;                 //东西的数字显示
    uint i = 0;
    uint j = 0;
    uint j1 = 0;
    uint k = 0;
    uint g = 0;
    uint z = 0;                                          //计数及状态的变量
    
    uint LedTime1 = 30;
    uint LedTime2 = 27;
    uint LedTime3 = 30;
    uint LedTime4 = 27;
    
    uint Kf22 = 1;              //按键前一个状态的值
    uint Kf23 = 1;
    uint Kf24 = 1;
    uint KSta24 = 1;              //按键的当前值
    uint KSta23 = 1;
    uint KSta22 = 1;  
    uchar Kflag22 = 0;              //按键22的switch函数参数
    
    void main()
    {
                  EA = 1;                                          //开总中断
                  ET0 = 1;                            //开内部中断0
                  TR0 = 1;
                  TMOD = 0x01;                 //方式1
                  TH0 = 0xFC;
                  TL0= 0x67; //1ms中断
                  P1 = 0xEE;                            //
    
                  while(1)
                  {
                                DigitalTube();              //数码管显示
                  }
    
    }
    
    
    void InterruptT0() interrupt 1
    {
                                                            TH0 = 0xFC;
                                                            TL0 = 0x67; //1ms中断            
                                                            i++;            
                                                            k++;
                                             
                                                            KSta24 = K24;                                //按键K24  夜间模式
                                                            if(Kf24 != KSta24)                            //按键有动作
                                                            {
                                                                          if(Kf24 == 1)                            //按键按下
                                                                          {
                                                                                        Kflag = !Kflag;                           
                                                                          }
                                                                          Kf24 = KSta24;
                                                            }
                                             
    
    
                                              KSta23 = K23;                                //按键K23  增减时长
                                              if(Kf23 != KSta23)                            //按键有动作
                                              {
                                                            if(Kf23 == 1)                            //按键按下
                                                            {
                                                            //              LedTime = LedTime +2;
                                                                          LedTime1 = LedTime1 +5;              //32  34 36 38 30
                                                                          LedTime2 = LedTime2 +5;              //25  23 21  19 17
                                                                          LedTime3 = LedTime3 +5;
                                                                          LedTime4 = LedTime4 +5;
                                                                          if(LedTime1 >=60)
                                                                                        {
                                                                                                      LedTime1 = 10;
                                                                                                      LedTime2 = 7;
                                                                                                      LedTime3 = 10;
                                                                                                      LedTime4 = 7;
                                                                                        }            
                                                                          LedNumEW = LedTime1;
                                                                          LedNumNS = LedTime2;
                                                            }
                                                            Kf23= KSta23;
                                              }
                               
    
    
                                              KSta22 = K22;                                //按键K22  某方向长时间红灯
                                              if(Kf22 != KSta22)                            //按键有动作
                                              {
                                                            if(Kf22 == 1)                            //按键按下
                                                            {
                                                                          Kflag22 ++;            
                                                                          if(Kflag22>= 3)            
                                                                                        {
                                                                                        Kflag22 = 0;
                                                                                        }
    
                                                                          switch(Kflag22)
                                                                          {
                                                                                        case 1:
                                                                                                      LedTime1 = 50;
                                                                                  LedTime2 = 47;              //case2
                                                                                                      LedTime3 = 20;
                                                                                                      LedTime4 = 17; //case1
    
                                                                                                      LedNumEW = LedTime1;
                                                                                                      LedNumNS = LedTime2;
    
    
                                                                                            break;
                                                                                        case 2:            
                                                                                                      LedTime1 = 20;
                                                                                  LedTime2 = 17;                //case2
                                                                                                      LedTime3 = 50;
                                                                                                      LedTime4 = 47;              //case1
    
                                                                                                      LedNumEW = LedTime1;
                                                                                                      LedNumNS = LedTime2;
                                                                                                      break;
                                                                                        case 0:            
                                                                         
                                                                                                      LedTime1 = 30;
                                                                                  LedTime2 = 27;
                                                                                                      LedTime3 = 30;
                                                                                                      LedTime4 = 27;
                                                                                                      LedNumEW = LedTime1;
                                                                                                      LedNumNS = LedTime2;
                                                                                        break;
                                                                          }
    
                                                            }
                                                            Kf22 = KSta22;
                                              }
                                             
    
                  if(j >= 200)
                                {
                                              j  = 0;
                                              j1++;
                                }
    
    
                  if(i >= 1000)
                  {
                                i = 0;
                                LedNumNS--;              //27
                                LedNumEW--;              //30
                                switch(g)
                                {                                            //刚开始东西红  南北绿
                                              case 0:                                                                                                                   //********2
                                                            if(LedNumEW == 3)                                                           //*****3
                                                            {
                                                                                        P14 = ! P14;   //绿灯灭
                                                            if(Kf24 == Kflag)                            P15 = ! P15;   //黄灯亮
                                                                                        LedNumNS = 3;
                                                            }            
                                                            if(LedNumEW == 0)
                                                            {
                                                                          LedNumNS =  LedTime3;              //   30东西绿南北红的时间
                                                                          LedNumEW =               LedTime4;              //  27
                                                                          P12 = ! P12;                 //东西绿灯亮
                                                                          P10 = ! P10;                //东西红灯灭
                                                                          P13 = ! P13;                              //nanbei红灯亮
                                                                if(Kf24 == Kflag)
                                                                          P15 = ! P15;                //南北黄灯灭
                                                                          g = 1;
                                                            }            
                                                            break;
    
                                              case 1:                                                                                                                              //******4
                                                            if(LedNumNS == 3)                 //黄灯亮
                                                                          {
                                                                       P12 = !P12;
                                                                                           P11 = !P11;            
                                                                                           LedNumEW = 3;
                                                                          }
                                                            if(LedNumNS == 0)                                                                         //********5
                                                            {
                                                                          LedNumEW = LedTime1;//重新赋值
                                                                          LedNumNS = LedTime2;
                                                            if(Kf24 == Kflag)              P11 = !P11;                 //南北黄灯灭
                                                                          P10 = !P10;                //dongxi红灯亮
                                                                          P14 = !P14;
                                                                          P13 = !P13;
                                                                          g = 0;
                                                            }
                                                            break;
                                   }
                               
    
                      if(Kf24 != Kflag)                                                        //夜间模式
                                {
                                              if(j1 % 2 == 0)
                                              {
                                                            P11 = ! P11;            
                                                            P15 = ! P15;
                                    }                                                          //所有方向黄灯闪烁
                                }                             
                  }                                                                       
    }
    
    
    
    
    void  DigitalTube()                            //数码管
    
    {                    
                  switch(z)
                  {
                                              case 0:                                                                      //第一个数码管显示数字
                                             
                                                  P0 =0xFF;                            //防止数字显示混乱
                                                            dula = 1;
                                                            P0 = LedBuf[LedNumEW / 10];              //十位
                                                            P20 = 0;
                                                            P17 = 0;
                                                            P21 = 0;
                                                            P16 = 1;
                                                            dula = 0;
                                                            z++;            
                                                            break;                             
                
                                              case 1:                                                          //第二个数码管亮
                                                               P0 =0xFF;
                                                            dula = 1;
                                                            P0 = LedBuf[LedNumEW % 10];              //个位
                                                            P16 = 0;
                                                            P20 = 0;
                                                            P21 = 0;
                                                            P17 = 1;
                                                            dula = 0;
                                                  z++;
                                                            break;
                               
                                              case 2:                                                        //第三个数码管亮
                                                  P0 =0xFF;
                                                            dula = 1;
                                                            P0 = LedBuf[LedNumNS / 10]; //十位
                                                            P21 = 0;
                                                            P16 = 0;
                                                            P17 = 0;                                            //关闭2
                                                            P20 = 1;                                            //使能第3个数码管
                                                            dula = 0;
                                                            z++;                                                        //进入3
                                                            break;
                                             
                                              case 3:                                                          //第四个数码管亮
    
                                                  P0 =0xFF;
                                                            dula = 1;
                                                            P0 = LedBuf[LedNumNS % 10];              //个位
                                                            P20 = 0;                                          //第三个关闭
                                                            P16 = 0;
                                                            P17 = 0;
                                                            P21 = 1;                                          //使能第四个数码管
                                                            dula = 0;
                                                            z = 0;                                                          //进入0
                                                            break;
    
                                              default:break;                                                                                                   
                  }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题