求助89c52单片机交通灯程序!

笔记 专栏收录该内容
1 篇文章 0 订阅

当红灯时按下s2程序报警,但是本来显示十几秒的数码管,十位数突然消失,然后个位数卡住不动,当报警器响完后,十位数又会出现,然后程序就直接卡住不动。

`
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
sbit kaiguan=P3^0;

unsigned int pp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar j,k,l=255;
uchar a1,a0;
uchar shijian,deng=2,dengL=2;
void delay(unsigned int i)
{
for(j=i;j>0;j–)
for(k=125;k>0;k–);
}

void delaytwo() //大概0.5ms左右的延时
{
uchar a;
for(a=450;a>0;a–)
{
nop();
}
}

void display(unsigned char sh_c,unsigned char g_c)
{
dula=0;
P0=table[sh_c];
dula=1;
dula=0;

wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);

P0=table[g_c];
dula=1;
dula=0;

P0=0xfd;
wela=1;
wela=0;
delay(5);
}

void main()
{
TMOD=0x01;
TR0=1;
TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为5000011.0592/12
ET0=1;
EA=1;
while(1)
{
while(dengL==1 && !kaiguan)
{
uint m;
uint i;
for(i=5;i>0;i–)
{
for(m=800;m>0;m–) //持续时间0.5ms
800
{
beep=~beep;
delaytwo(); //2000HZ的信号。
}
for(m=500;m>0;m–) //持续时间0.5ms2500
{
beep=~beep;
delaytwo();
delaytwo(); //1000HZ的信号。
}
}dengL=2;
}
if(shijian0)
{
switch(deng)
{
case 0: shijian=20; //红灯
deng=1;
dengL=1;
break;
case 1: shijian=5; //黄灯
deng=2;
dengL=2;
break;
case 2: shijian=8; //绿灯
deng=3;
dengL=2;
break;
case 3: shijian=5; //黄灯
deng=0;
dengL=2;
break;
}
}
if(pp
20)
{ pp=0;
shijian–;
}
a0=shijian%10;
a1=shijian/10;
display(a1,a0);
switch(deng)
{
case 1: P1=0XEE; //红灯
break;
case 2: //黄灯
if(shijian%20)
P1=0xDD;
if(shijian%2
1)
P1=0xFF;
break;
case 3: //绿灯
if(shijian%20)
P1=0xBB;
if(shijian%2
1)
P1=0xFF;
break;
case 0: if(shijian%20) //黄灯
P1=0xDD;
if(shijian%2
1)
P1=0xFF;
break;
}
}

}

void time0() interrupt 1
{ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}`

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

qq_46105263

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值