找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机交通灯的程序不能正常倒计时,且显示一样的数字 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:243612 发表于 2019-1-3 22:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
哪位大神看下这个交通灯的程序,它不能正常倒计时,且显示一样的数字,帮帮忙。
#include<reg51.h>      // 对单片机的口进行了定义
#define uint unsigned int
#define uchar unsigned char
uchar code a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码组合,共阳极
uchar code b[4]={0x0E,0x0D,0x0B,0x07}; //位码组合  
uchar code c[4]={0xcc,0xd4,0x78,0xb8};/*P1 红绿、红黄、绿红、黄红*/     
//12MHz     
//*************************************************************************************
uchar NB=25,DX=30,NBG=25,DXG=15,H=5;    /*数码管显示值设置*/
uchar  i,k=0,cnt=0,j=0;
sbit K0=P3^4;      /*支干道通行*/
sbit K1=P3^5;      /*主干道通行*/
sbit K4=P3^6;      /*返回*/
sbit K3=P3^2;   /*设置时间*/
sbit K2=P3^3;   /*紧急刹车*/
void delay(uchar t);  /*定义延时程序*/
void key();    /*定义键盘程序*/
void display();   /*定义显示程序*/
void settime();  /*定义时间设置显示程序*/
//*************************程序初始*********************************************
void init(void)
{
TMOD=0x01;     /*使用定时器0模式一*/
TH0=0x3c;     /*(65536-5000)/256*/
TL0=0xb0;     /*(65536-5000)%256*/
IT0=1;      //开中断
ET0=1;
TR0=1;
IT1=1;
EA=1;
EX0=1;
EX1=1;
P1=c[k];      //开启交通灯
}
//*************************中断0处理程序***************************************
void int0(void) interrupt 0   // 通行时间设置
{  
EA=0;
  P1=0xd8;    /*红灯全亮*/
  
for(;;)
{
    settime();
     if(K1==0)       /*P3^6=0设置主干道通行时间*/
    {  
          delay(40);
          if(K1==0)
    {
             while(!K1)
             {settime();}
     DXG++;    /*主干道通行时间加1*/
             if(DXG==100)
             DXG=0;   
          }
    }
   
     if(K0==0)        /*P3^5=0设置支干道通行时间*/
    {  
             delay(40);
             if(K0==0)
       {
               while(!K0)
               {settime();}
      NBG++;      /*支干道通行时间加1*/
               if(NBG==100)
               NBG=0;  
             }
    }
   
    if(K4==0)          /*P3^7=0返回*/
       {  
         delay(40);
      if(K4==0)
      {
         while(!K4)
      {
      }
             k=0;P1=c[k];
      NB=NBG,DX=NBG+H;
         display();
    EA=1;
              
   
            break;
      }               
       }
    }
}

//***********************************中断1处理程序********************
void int1(void) interrupt 2      //紧急情况
{              
        /*东西南北红灯亮*/
EA=0;         
TR0=!TR0;           /*停止计数*/
for(;;)           /*主支干道显示全为0*/
{  
  P1=0xd8,
  P0=a[0];
  P2=b[0];
    delay(20);
    P2=b[1];
    delay(20);
    P2=b[2];
    delay(20);
    P2=b[3];
    delay(20);
   
    if(K4==0)         /*返回*/
{
   delay(20);
EA=1;
     
  P1=c[k];       /*返回紧急前状态开始计数*/
  TR0=!TR0;      /*重启计数*/
  break;         
  }
}
}
void time0(void) interrupt 1      /*外部中断0交通灯控制程序*/
{
TH0=0x3c;          /*定时50ms*/
TL0=0xb0;            
cnt++;
  
  if(cnt>=100)            /*每100*50ms=1s自减一*/
{
  NB--;
  DX--;
  cnt=0;
  if(NB==0||DX==0)
  {
   k++;
   if(k>3)         /*k取0,1,2,3*/
   {k=0;}
   switch(k)
   {
    case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break;   /*主干道通行显示绿红*/
       case 1:NB=H;j=1;P1=c[k];break;        /*主干道黄灯闪烁*/
    case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break;   /*支干道通行显示红绿*/
    case 3:DX=H;j=2;P1=c[k];break;        /*支干道黄灯闪烁*/
   }
  }   
}
}
void delay(uchar t)
{
      uint x,y;
   for(x=t;x>0;x--)
       for(y=110;y>0;y--);
}
void delay(uchar t)    //延时程序延时0.1*nms   
{
  uchar i;
  do
   {
     for(i=0;i<20;i++)
     ;;;
   } while(t--);
}
void settime()
{
    P2=b[0];P0=a[(NBG+H)%10]; /*显示主干道通行时间  */
       delay(20);
   
    P2=b[1];P0=a[(NBG+H)/10];
    delay(20);
   
   P2=b[2];P0=a[(DXG+H)%10];  /*显示支干道通行时间*/
    delay(20);
           
    P2=b[3];P0=a[(DXG+H)/10];
    delay(20);
}
void  key()    //键盘程序用KO K1模拟一道有车一道无车
{
     if(K1==0)        /*主干道有车支干道无车*/
    {  
       delay(40);
       if(K1==0)   
       {
          while(!K1)
          {  
            display();
          }
      k=0,P1=c[k];cnt=0;
          NB=NBG, DX=NBG+H;
         display();
       }
    }
    if(K0==0)         /*支干道有车主干道无车*/
    {  
       delay(40);
       if(K0==0)
       {
          while(!K0)
          {
           display();
          }
         k=2,P1=c[k];cnt=0;
          NB=DXG+H,DX=DXG;
            display();
    }
}
}
void display()       //显示程序
{
  P2=b[0],P0=a[NB%10];      /*由k的不同值进入确定显示数值*/
  delay(100);

  P2=b[1],P0=a[NB/10];
  delay(100);

  P2=b[2],P0=a[DX%10];
  delay(100);
         
  P2=b[3],P0=a[DX/10];
  delay(100);
}
void main(void)
{  //主程序
        init();
for(;;;)
{
   display();
  key();
   
   //黄灯闪烁程序
   while(j==1)           /*主干道黄灯闪烁*/
       {              
       P1=0xdc;         /*给黄灯一高电平黄灯灭*/   
    for(i=83;i>0;i--){display();}      /*执行for循环延时*/   
    P1=c[k];         /*再给黄灯一低电平黄灯亮*/
    for(i=83;i>0;i--){display();}
  }
while(j==2)
         {              /*支干道黄灯闪烁*/
      
    P1=0xf8;
    for(i=83;i>0;i--){display();}
    P1=c[k];
    for(i=83;i>0;i--){display();}
   }           
   }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2019-1-4 08:01 | 只看该作者
本帖最后由 yzwzfyz 于 2019-1-4 09:05 编辑

先画程序框图,看看能不能行得通,越细越好。
如果你认为框图说得通,再看看程序有没有照框图意思编写、执行。
以上,对任何程序适用。也是程序员必备的方法。
回复

使用道具 举报

板凳
ID:94031 发表于 2019-1-4 09:12 | 只看该作者
程序问题太多,你还是先看懂别人程序自己再编吧,目前编程基础还欠缺,先可以在别人程序基础上改改功能,再过渡到自己写。
回复

使用道具 举报

地板
ID:461809 发表于 2019-1-4 15:10 | 只看该作者
你需要先理一理自己的思路,先看自己的思路有没有问题。然后把程序分成一个个功能模块去调试。
你这样上来直接贴一大段代码,是得不到你想要的答案的。 2楼说的很对。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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