我还是学生,第一次凭自己的思路写程序,请大神指教,急

2020-01-30 13:43发布

这次写的是基于单片机控制的交通灯,由于第一次写,外部中断服务程序还没写,只写了数码管倒计时 红黄绿状态变化的代码,我就编译了 把hex文件装入proteus里模拟了一下,行不通,不知道是电路画错了还是程序错了,我实在是检查不出哪里有问题。。求各位大神指教一下,小生感激不尽,好人好报。在这里把代码和模拟电路的文件贴出来。

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define time 50000
sbit red_a=P1^3;
sbit green_a=P1^4;
sbit yellow_a=P1^5;

sbit red_b=P1^0;
sbit green_b=P1^1;
sbit yellow_b=P1^2;
sbit int0_key=P3^2;
sbit kai=P3^7;

uint n1,n2,n3,n4,g1,g2,g3,g4;
uchar mm=0;           //全局变量
uchar flag0=0;  //a绿 b红 定义标志位
uchar flag1=0;        //a黄 b红
uchar flag2=0;  //a红 b绿
uchar flag3=0;  //a红 b黄
uchar t=0;                        //35秒倒计时完 跳变到25倒计时
uchar b=35,a=25,ac=30,bc=20;  //分别为b车道和a车道红灯时间 a车道和b车道绿灯时间
uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

void inittime01()                 //初始化定时器0 外部中断0
{
TMOD=0X11; //定时器0和1都工作在方式1
  TH0=(65536-50000)/256;  //50ms计时
  TL0=(65536-50000)%256;
  TH1=(65536-50000)/256;  //50ms计时
  TL1=(65536-50000)%256;
  TR0=1;                                  //启动定时器0        开始计时
  ET0=1;                  //允许定时器0中断
  EA=1;                    //开总中断
  IE0=1;                    //启动外部中断0
  EX0=1;                                        //开中断0
  IT0=1;                     //外部中断0为跳变沿触发
  PX0=1;                     //外部中断0优先级设为最高
            
  }
void delay(uint num)
{
   while(num--);

}
void timer0() interrupt 1   //定时器0中断服务程序
{
  mm++;
  TH0=(65536-50000)/256;  //50ms计时
  TL0=(65536-50000)%256;
   if(mm==20)                //每到一秒都会执行这个语句
   {
     mm=0;
         if(b<=35&&b>0)
           {
             b--;                          //b车道红灯值35
                 ac--;                          //a车道绿灯和黄灯的倒计时值30和5
                 
                 }
         if(t==1)                        //切换状态 倒计时25秒
          {
           a--;                                  //a车道红灯值25
           bc--;                          //b车道绿灯和黄灯倒计时值20和5
             }
         

   }  



}

void disp_daojishi1()          //a车道通车b车道红灯停车 数码管倒计时显示
{
  n1=ac/10;                                  //a车道十位
  n2=ac%10;                                  //a车道个位
  n3=b/10;                 //b车道十位
  n4=b/10;                //b车道个位

  P2=0xf7;                                    //b车道个位
  P0=led[n4];                                 
  delay(200);
                                               
  P2=0xfb;                                   //b车道十位
  P0=led[n3];
  delay(200);

  P2=0xfd;                                  //a车道个位
  P0=led[n2];
  delay(200);

  P2=0xfe;                                //a车道十位
  P0=led[n1];
  delay(200);
  P0=0xff;
}
void disp_daojishi2()          //a车道红灯b车道通车 数码管倒计时显示
{
  g1=a/10;                                  //a车道十位
  g2=a%10;                                  //a车道个位
  g3=bc/10;                 //b车道十位
  g4=bc/10;                //b车道个位

  P2=0xf7;                                    //b车道个位
  P0=led[g4];                                 
  delay(200);
                                               
  P2=0xfb;                                   //b车道十位
  P0=led[g3];
  delay(200);

  P2=0xfd;                                  //a车道个位
  P0=led[g2];
  delay(200);

  P2=0xfe;                                //a车道十位
  P0=led[g1];
  delay(200);
  P0=0xff;
}
void qiehuan()          
{
     if(b)              //b红灯倒计时35s
          {
            a=25;        //又给a赋值25秒
                bc=20;      
                if(b<=35&&b>5)
                   flag0=1;                 //a绿 b红
            if(b<=5)                //a黄 b红
             {
                   ac=5;                // a黄灯置初值5秒
                   flag0=0;           //关闭状态0
               flag1=1;
                   if(b==0)
                     t=1;
                  }
                 else
                   {
                     flag0=1;
                      }
               }
           if(t==1)
                 {       
                   flag1=0;                     //关闭状态1
                      if(a)
                   {
                     if(a<=25&&a>=5)
                      {
                            flag2=1;         //a红 b绿
                      }
                          if(a<=5)
                           {
                             bc=5;        //置b车道黄灯初值5秒
                             flag2=0;         //关闭状态2
                             flag3=1;          //a红 b黄
                                  if(b==0)
                                   {
                                    b=35;                         //又返回第0状态 置初值
                                        ac=30;
                                        flag3=0;           //关闭状态3
                                        t=0;        //关闭切换状态b——倒计时25秒
                                         }
                   }
                        }
                        }
}
void main()
{
kai=1;    //74hc573通断开关
P0=0xff;
P2=0xff; //开始时使a b车道都不亮
inittime01();
while(1)
{
  qiehuan();
  if(b<=35&&b>0)
   disp_daojishi1();
   if(t==1)
   disp_daojishi2();       
  if(flag0)                 //状态0 a绿 b红
   {
    green_a=0;
    red_b=0;
     }
   if(flag1)         //启动状态1 a黄b红
   {
     green_a=1;           //关闭状态0
     red_b=1;
            yellow_a=0;
         red_b=0;
       }
        if(flag2)                 //启动状态2 a红b绿
        {
           yellow_a=1;
           red_b=1;
           red_a=0;
           green_b=0;
          }
        if(flag3)           //启动状态3 a红b黄
         {
           red_a=1;
           green_b=1;
           red_a=0;
           yellow_a=0;
              }
    }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
51条回答
elecfun
2020-02-01 18:29
USACH 发表于 2013-4-6 15:21
proteus里面不加上拉也会亮的吧?

很多年前这个问题把我难倒啦,为什么  proteus里面可以,实际不行。 ...

不加上拉的话,P0口的高电平状态指示显示的是灰 {MOD},加了上拉后才红 {MOD}。
我一直困惑的是仿真三极管驱动数码管时三极管不导通,所以一直用的反向器仿真。

一周热门 更多>