找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1979|回复: 3
收起左侧

交通灯的设计,程序有些许问题,还望大神帮忙

[复制链接]
ID:405670 发表于 2018-10-9 11:16 来自手机 | 显示全部楼层 |阅读模式
问题都有:控制东西方向通行时间加一的按键按下(或者控制南北方向的按键按下)再次启动后东西方向的数码管会胡乱显示数字,比如 35 25 29这样,然而南北方向的数码管就不会,可是这两个按键采用的是一样的编程思想呀,求大神指教,另外想加一个夜间模式,所有黄灯闪烁,还请多多指教。
仿真图如下
程序如下
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code a[10]={                          //数码管段选表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar code b[4]={0xfe,0xfd,0xfb,0xf7};         //数码管位码组合
uchar code c[4]={0xf3,0xf5,0xde,0xfe,};         //绿红,黄绿,红绿,红黄,黄黄
uchar H=5,NB=25,DX=30,NBG=15,DXG=15;
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;               //使用定时器方式1
TH0=0x3c;                //(65536-5000)/256
TL0=0xb0;                                 //(65536-5000)%256
IT0=1;
ET0=1;
TR0=1;
EA=1;
EX0=1;
EX1=1;
P1=c[k];              //开启交通灯
}
void delay(uchar t)
{                               //延时函数
uchar i;
for(;t>0;t--)
for(i=0;i<20;i++);
}
void int0(void) interrupt 0  //通行时间设置
{
EA=0;
P1=0xf6;               //红灯全亮
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^6=0返回
{
delay(40);
if(K4==0)
{
while(!K4)
{
}
k=0;P1=c[k];
NB=NBG;DX=DXG+H;
display();
EA=1;
break;
}
}
}
}

void time1(void) interrupt 1    //交通灯控制程序
{
TH0=0x3c;             //定时50ms
TL0=0xb0;
cnt++;
if(cnt>=20)         //每20*50ms=1s自减1
{
NB--;
DX--;
cnt=0;
if(NB==0||DX==0)
  {
k++;
if(k>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  key()                                //按键程序
{
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 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 display()
{                    //显示程序
P2=b[0],P0=a[NB%10];
delay(20);
P2=b[1],P0=a[DX/10];
delay(20);
P2=b[2],P0=a[DX%10];
delay(20);
P2=b[3],P0=a[DX/10];
delay(20);
}
void main(void)                                  //主程序
{
init();
for(;;)
{
display();
key();
//黄灯闪烁程序
while(j==1)
//主干道黄灯闪烁
{
P1=0xfd;
for(i=83;i>0;i--){display();}
P1=c[k];
for(i=83;i>0;i--){display();}
}
while(j==2)
//支干道黄灯闪烁
{  
P1=0xef;
for(i=83;i>0;i--){display();}
P1=c[k];
for(i=83;i>0;i--){display();}
}
}
}                                                                                                


2018-10-09_11.14.16.jpg
回复

使用道具 举报

ID:140489 发表于 2018-10-9 14:55 | 显示全部楼层
把你的仿真文件发上来,我给你调调
回复

使用道具 举报

ID:382454 发表于 2018-10-9 16:56 | 显示全部楼层
那么多,那么乱,我只能说看到眼花。
回复

使用道具 举报

ID:405670 发表于 2018-10-10 13:00 来自手机 | 显示全部楼层
lids 发表于 2018-10-9 14:55
把你的仿真文件发上来,我给你调调

方便加下QQ或者微信么,这学期刚开始学单片机,也是第一次做项目,有的地方不太明白,还希望能多多指教
(QQ:1011520053
微信:18438608208)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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