⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traffic.c

📁 基于51的简单交通灯模拟,对那些刚刚入门的朋友可能有所帮助
💻 C
字号:
/*程序功能:89S52单片机交通灯模拟程序*************/
/*设计者:吴海林**********************/
/*硬件说明:P0口作为数码管段控,P1口作为数码管位近代
           P2口作为交通灯信号模拟P2.0为绿,P2.1为黄
		   P2.3为红,P2.4为绿,P2.5为黄,P2.6为红*****************/
#include "reg52.h"
#include "absacc.h"
typedef unsigned char uchar;
sbit green1=P2^0;
sbit red1=P2^1;
sbit yellow1=P2^2;
sbit green2=P2^3;
sbit red2=P2^4;
sbit yellow2=P2^5;
void Init_Timer0(void);
void contr(void);
void time(void);
void State0(void);
void State1(void);
void State2(void);
void State3(void);
void display(uchar data *p); //显示子程序
void deltime(uchar s);
uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //在ROM中定义数字转换码;
uchar data b[4];
uchar data flag,state,second,n=0;
void main(void)
{ Init_Timer0();
  TR0=1;
  EA=1;
  ET0=1;
  contr();

 }
/*定时器0初始化*/
void Init_Timer0(void)
{
  TMOD=0x01;          
  TH0=0x3c;
  TL0=0xb0;
}
 /*交通灯控制程序*/
void contr(void)
 {loop:state=0;
  second=40;
  while(1)
  {switch(state)
    {case 0: if(second==0){state=1;second=5;display(b);}
	           else State0();break;
	 case 1: if(second==0){state=2;second=20;display(b);}
	           else State1();break;
	 case 2: if(second==0){state=3;second=5;display(b);}
	           else State2();break;
	 case 3: if(second==0){state=0;second=40;display(b);}
	 	       else State3();break;
	 default: goto loop;
	 }
   }
 }
 /*不同状态时,调用相应的处理程序*/
 void State0(void)
 { green1=1;red1=0;yellow1=0;
   green2=0;red2=1;yellow2=0;
   b[0]=second%10;b[1]=second/10;
   b[2]=(second+5)%10;b[3]=(second+5)/10;
   display(b);
  }
 void State1(void)
 { green1=0;red1=0;yellow1=1;
   green2=0;red2=1;yellow2=0;
 b[0]=second%10;b[1]=second/10;
  b[2]=second%10;b[3]=second/10;
  display(b);
  }
 void State2(void)
 { green1=0;red1=1;yellow1=0;
   green2=1;red2=0;yellow2=0;
 b[0]=(second+5)%10;b[1]=(second+5)/10;
 b[2]=second%10;b[3]=second/10;
  display(b);
  }
 void State3(void)
 { green1=0;red1=1;yellow1=0;
   green2=0;red2=0;yellow2=1;
  b[0]=second%10;b[1]=second/10;
   b[2]=second%10;b[3]=second/10;
   display(b);
  }
 /*显示程序*/
void display( uchar data *p)
{ uchar data i,sel;
  sel=0x01;
  for(i=0;i<=3;i++)
  {P0=tab[*p];
   P1=~sel;
   deltime(1);
   P1=0xff;
   p++;
   sel=sel<<1;
   }
 }
  /*延时程序,使数码管每次点亮的时间足够长*/    
  void deltime(uchar s)
  {  uchar data j;
	while(s--)
	{for(j=0;j<=125;j++);}
  }
/*中断程序*/
 void time(void) interrupt 1 using 1
 {TR0=0;
  TH0=0x3c;
  TL0=0xb0;
  n++;
  if(n==20) 
  {n=0;second--;}
  TR0=1;
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -