急求KEIL C51 红绿灯程序!(用C语言!)

急求KEIL C51 红绿灯程序!(用C语言!),第1张

//12M晶振

//共阴数码管

#include <reg51.h>

sbit red=P1^0

sbit green=P1^1

sbit yellow=P1^2

bit flag=1

unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}

unsigned char code wei[ ]={0xfd,0xfe}

unsigned char time=35

void main()

{

  void show_time()

  void show_light()

  EA=1

  ET0=1

  TMOD=0x01

  TH0=(65536-50000)/256

  TL0=(65536-50000)%256

  TR0=1

  red=0

  while(1)

  {

      show_time()

      show_light()

  }

}

void show_time()

{

  void delay()

  unsigned char num=time,i

  for(i=0i<2++i)

  {

      P2=wei[i]

      P0=duan[num%10]

      delay()

      P0=0x00

      num/=10

  }

}

void delay()

{

  int i

  for(i=1000ii--)

}

void show_light()

{

  if(flag)

  {

      if(!time)

      {

          flag=0

          red=1

          green=0

          time=35

      }

  }

  else

  {

      if(time>0&&time<4)

      {

          green=1

          yellow=0

     液数轮 }       

 毕并     if(!time)

      {

          yellow=1

          red=0

          flag=1

          time=35

      }

  }

}

void dec_sec() interrupt 1

{

  static count=0

  TH0=(65536-50000)/256

  TL0=(65536-50000)%256

  if(++count==20)

  {

     闹信 count=0

      time--

  }

}

#include<AT89X52.H>

#define LED_D  P2

#define LED_S  P1

unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}

sfr P1M0=0xB2

unsigned int m,i,post1,post2

unsigned int k=0,nums=1,n=1

void timer1() interrupt 1 using 1

{   

 i++

 TH0=0XB1    //初始化

 TL0=0XE0   //初始化         

 post1=9-(i/50%10)

 post2=2-i/500 

 m=i/25

 if(m==60)

  i=0

}

void initialize()

{

 P0=0XFF

 TMOD=0X01

 TR0=1

 TH0=0XB1

 TL0=0XE0 

}

void show()

{    switch(n)

    { case 1:

         LED_D=table[post1]

         LED_S=0x01

      break

      case 3:

         LED_D=table[post2]

         LED_S=0x02

      break

    }

 if(n++==4)

    n=1

   switch(nums)

   {

    case 1:    

    if(m<52)

      P0=0XDE

    if(m>=52&&m<59) 

   行宏册 {P0_0=1

     if(k++>=50000)

       {

        P0_1=!P0_1

       档宏 k=0

       }

  }

  if(m==59)

     nums=2

  break

      case 2:

    if(m<52)

       P0=0XF3

    if(m>=52&&m<59) 

    {

     P0_3=1

     if(k++>=50000)

     {

    绝猛  P0_4=!P0_4

        k=0

   }

   }

  if(m==59)

     nums=1

    break

  default: break

 } 

}

void main()

{

   initialize()

   EA=1

   P1M0=0XF0

   ET0=1  

   TR0=1 

   while(1)

   { 

     show() 

   }

}

这是带数码管显示的红绿灯,主要用了四位8段的数码管显示时间。如果需要详细的继续追问。

代码修改如下,经keil编译,proteus仿真结果为 P1.0亮10秒,然后P1.1亮2秒,然后P1.2亮10秒,最后P1.0亮10秒,,,

#include <reg51.h>

sbit R=P1^0//HONG

sbit W=P1^1//HUANG

sbit L=P1^2//LV

unsigned int a,b=0

//unsigned char code c[]={0xfe,0xfc,0xfb}//1110,1100,1011

unsigned char code c[]={0xfe,0xfD,0xfb,0xfd}//1110,1101,1011,1101//红 黄 绿 黄//修正黄灯的值,增加一个状态

void timer10s () interrupt 1

{

 if (a<2000)

    {

        TH0=0xec//5ms

        TL0=0x78

        a++

  //      b=0//这里不能对b赋值

        TR0=1

        TR1=0//【增加】

    }

    if (a>=2000)

    {

        TH0=0xec

        TL0=0x78

        a=0

        b++//b=1

        if(b==4) b=0//【增加】

        TR1=1

        TR0=0//【增加】

    }

}

void timer2s ()interrupt 3

{

   

   if (a<400)

    {

        TH1=0xec

        TL1=0x78

        a++

        TR1=1

        TR0=0

    }

    if (a>=400)

    {

        TH1=0xec

        TL1=0x78

        a=0

        b++//b=2

        //

        if(b==4) b=0//【增加】

        TR0=1

        TR1=0//【增加】

    }

}

void main ()

{

    EA=1

    ET0=1

    ET1=1

    TMOD=0X11

    TH0=0xec//5MS

    TL0=0x78

    TH1=0xec

    TL1=0x78

    TR0=1

    TR1=0

    P1=c[0]

    b=0////【增加】

    while (1)

    {

        switch (b)

        {

            case 0x00:P1=c[0]break

            case 0x01:P1=c[1]break

            case 0x02:P1=c[2]break

            case 0x03:P1=c[3]break//增加一个状态

        }

    }

}

以上代码可以优化,如下:

#include <reg51.h>

sbit R=P1^0//HONG

sbit W=P1^1//HUANG

sbit L=P1^2//LV

unsigned int a,b=0

unsigned char code c[]={0xfe,0xfD,0xfb,0xfd}

void timer10s () interrupt 1

{

    TH0=0xec//5ms

    TL0=0x78

    a++

    if(TR1==1) TR1=0

    if (a>=2000)

    {

        a=0

        b++

        if(b==4) b=0

        TR1=1

        TR0=0

    }

}

void timer2s ()interrupt 3

{

    TH1=0xec

    TL1=0x78

    a++ 

    if(TR0==1) TR0=0

    if (a>=400)

    {

        a=0

        b++

        if(b==4) b=0

        TR0=1

        TR1=0

    }

}

void main ()

{

    EA=1

    ET0=1

    ET1=1

    TMOD=0X11

    TH0=0xec//5MS

    TL0=0x78

    TH1=0xec

    TL1=0x78

    TR0=1

    TR1=0

    a=0//

    b=0//

    while (1)

    {

        switch (b)

        {

            case 0x00:P1=c[0]break

            case 0x01:P1=c[1]break

            case 0x02:P1=c[2]break

            case 0x03:P1=c[3]break

        }

    }

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12482541.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存