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

📄 交通灯.c

📁 基于51的简单交通灯模拟,对那些刚刚入门的朋友可能有所帮助
💻 C
字号:
/*程序功能:89S52单片机交通灯模拟程序*************/
/*设计者:吴海林**********************/
/*硬件说明:P0口作为数码管段控,P1口作为数码管位近代
           P2口作为交通灯信号模拟P2.0为绿,P2.1为黄
		   P2.3为红,P2.4为绿,P2.5为黄,P2.6为红*****************/
#include "reg51.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 contr(void);
void time(void);
void deal0(void);
void deal1(void);
void deal2(void);
void deal3(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[3];
uchar flag,state,second,n=0;
 void main(void)
{ TMOD=0x01;
  TH0=0x3c;
  TL0=0xb0;
  EA=1;
  ET0=1;
  TR0=1;
  contr();
 }
void contr(void)
 {loop:state=0;
  second=10;
  while(1)
  {switch(state)
    {case 0: if(second==0){state=1;second=5;}
	           else deal0();break;
	 case 1: if(second==0){state=2;second=5;}
	           else deal1();break;
	 case 2: if(second==0){state=3;second=5;}
	           else deal2();break;
	 case 3: if(second==0){state=0;second=10;}
	 	       else deal3();break;
	 default: goto loop;
	 }
   }
 }
 void deal0(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 deal1(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 deal2(void)
 { green1=0;red1=1;yellow1=0;
   green2=1;red2=0;yellow2=0;
   b[0]=second%10;b[1]=second/10;
   b[2]=(second-5)%10;b[3]=(second-5)/10;
   display(b);
  }
 void deal3(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;
  uchar 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<=25;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 + -