求按题目要求的C语言程序 这个程序的延时有没有问题

2019-07-18 12:29发布

#include "reg51.h"
sbit smg1=P1^6;  //数码管十位的位选端
sbit smg0=P1^7;  //数码管个位的位选端
sbit  EW_R_Lamp=P1^5;
sbit  EW_Y_Lamp=P1^4;
sbit  EW_G_Lamp=P1^3;
sbit SN_R_Lamp=P1^2;
sbit SN_Y_Lamp=P1^1;
sbit SN_G_Lamp=P1^0;
#define uchar unsigned char
#define uint  unsigned int
#define EW_R_Lamp_ON   EW_R_Lamp=1 //东西红灯亮
#define EW_R_Lamp_OFF  EW_R_Lamp=0
#define EW_Y_Lamp_ON   EW_Y_Lamp=1 //东西黄灯亮
#define EW_Y_Lamp_OFF  EW_Y_Lamp=0
#define EW_G_Lamp_ON   EW_G_Lamp=1 //东西绿灯亮
#define EW_G_Lamp_OFF  EW_G_Lamp=0
#define SN_R_Lamp_ON   SN_R_Lamp=1
#define SN_R_Lamp_OFF  SN_R_Lamp=0
#define SN_Y_Lamp_ON   SN_Y_Lamp=1
#define SN_Y_Lamp_OFF  SN_Y_Lamp=0
#define SN_G_Lamp_ON   SN_G_Lamp=1
#define SN_G_Lamp_OFF  SN_G_Lamp=0
uchar smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选
uchar kk,aa;
void smg_display(uchar n)  //数码管显示程序
{
uchar i,j;
i=n/10;   //显示数字的十位
j=n%10;   //显示数字的个位
smg1=1;
P0=smg_duan[i];
smg0=1;
P1=smg_duan[j];
}
void delay_50us(uint t)     //延时50us
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void EW_G_Lamp_SS()     //东西绿灯闪烁
{
EW_G_Lamp_ON;
delay_50us(200);
EW_G_Lamp_OFF;
delay_50us(200);
}
void SN_G_Lamp_SS()
{
SN_G_Lamp_ON;
delay_50us(200);
SN_G_Lamp_OFF;
delay_50us(200);
}
void init()    //初始化
{
EA=1; //开总中断开关
EX0=1;  //打开外部中断0中断允许开关
IT0=0; //设置外部中断0的触发方式为低电平触发
TMOD=0x01;     //设置定时器0为工作方式1
TH0=(65536-50000)/256;  
TL0=(65536-50000)%256;  //赋初值
ET0=1;      //打开定时器中断0
TR0=0;      //先不启动定时器
}
void main()
{
init();
EW_R_Lamp_OFF;
EW_Y_Lamp_OFF;
EW_G_Lamp_OFF;
SN_R_Lamp_OFF;
SN_Y_Lamp_OFF;
SN_G_Lamp_OFF;
while(1);  //等待外部中断触发
}
void int0() interrupt 0
{
   /*进入中断,开始计时*/
   TR0=1;
   /*南北红灯维持25S,在南北红灯亮的同时东西绿灯也亮,并维
持20S,到20S时,东西绿灯闪烁,闪烁3S后熄灭。在东西绿灯熄灭
时,东西黄灯亮,并维持2S。2S到后,东西黄灯熄,东西红灯亮。
同时,南北红灯熄灭,南北绿灯亮。*/
    if(aa<25)
{
  smg_display(aa);
  SN_R_Lamp_ON;
  if(aa<20)
  EW_G_Lamp_ON;
  else if(aa<23)
  EW_G_Lamp_SS();
  else
  {
   EW_G_Lamp_OFF;
   EW_Y_Lamp_ON;
  }
}
/*3)东西红灯维持30S,南北绿灯维持25S,然后闪烁3S,熄灭,同时
南北黄灯亮,维持2S后熄灭,这时南北红灯亮,东西绿灯亮。*/
else if(aa<55)
{
  smg_display(aa-25);
  EW_Y_Lamp_OFF;
  EW_R_Lamp_ON;
  SN_R_Lamp_OFF;
  if(aa<50)
  SN_G_Lamp_ON;
  else if(aa<53)
  SN_G_Lamp_SS();
  else
  {
   SN_G_Lamp_OFF;
   SN_Y_Lamp_ON;
  }
}
else
aa=0;//当aa大于或等于55时,清零
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;  
TL0=(65536-50000)%256;  //赋初值
kk++;
if(kk>=20)//kk每50ms加一,则aa每1S加一
{
  kk=0;
  aa++;
}
}
78AYP~F6J31QHCVW5CNGT5X.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。