keil中89C51与PROTEUS中的交通灯

proteus效果

交通灯

proteus电路搭建图

数码管使用移位寄存器进行控制,led使用74hc245进行控制是为了防倒灌。

keil代码

#include"reg51.h"

sbit clock1=P2^1;//时钟位
sbit H1=P2^0;
sbit clock2=P2^3;//时钟位
sbit H2=P2^2;

sbit key1=P3^2;
sbit key2=P3^3;
unsigned char code_seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管0~1
int sum1=0;
int sum2=0;

void Key1()  interrupt 0{ //按键一中断
	
  if(key1==0){ 
  unsigned long i;
  for(i=0;i<700;i++){ //消抖
  ;
  }
		if(key1==0){
		sum1++;}
	}
	
}

void Key2()  interrupt 2{ //按键二中断
  if(key2==0){ 
  unsigned long i;
  for(i=0;i<700;i++){ //消抖
  ;
  }
		if(key2==0){ 
		sum2++;}
	}
	
}

void control(unsigned char continues){ //按键控制
  if(sum1==1){ 
		while(1){
			P1=0x21;//全为红灯
			if(sum1==2){sum1=0;P1=continues;sum2=0;break;} //再次按下跳出循环
			}
	}
	if(sum2==1){ 
		while(1){
			P1=0x42;//全为黄灯
			if(sum2==2){sum2=0;P1=continues;sum1=0;break;}//再次按下跳出循环
			}
	}
}

void seg71s_S_N(unsigned int date_seg71_s_n){ //南北数码管显示
  unsigned int datas=date_seg71_s_n/10;//十位
  unsigned int data_1=date_seg71_s_n%10;//个位
  unsigned char bits[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  
    unsigned int i;
	  //unsigned int a;
    for(i=0;i<8;i++){ 
    
    clock1=0; //拉低时钟
    if(code_seg[datas]&bits[i]){ //循环八次显示十位
      H1=1;
    }
    else{
      H1=0;
    }
    clock1=1;  //拉高时钟
    }
  
    for(i=0;i<8;i++){ 
    clock1=0; 
    if(code_seg[data_1]&bits[i]){ //循环八次显示个位
      H1=1;
    }
    else{
      H1=0; 
    }
    clock1=1; 
    }
    
}

void seg71s_E_W(unsigned int date_seg71_e_w){ //东西数码管显示
  unsigned int datas=date_seg71_e_w/10; 
  unsigned int data_1=date_seg71_e_w%10; 
  unsigned char bits[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  
	 unsigned int i;
//unsigned int a;
  for(i=0;i<8;i++){ 
    clock2=0; 
    if(code_seg[datas]&bits[i]){ 
      H2=1; 
    }
    else{
      H2=0; 
    }
    clock2=1; 
    }
  
    
    for(i=0;i<8;i++){ 

    clock2=0; 
    if(code_seg[data_1]&bits[i]){ 
      H2=1; 
    }
    else{
      H2=0;
    }
    clock2=1; 
    }
  
}

void Delay(void);

void main(void){ //主函数
	unsigned char light[4]={0x81,0x41,0x24,0x22};//LED灯
  unsigned int b=0;
  unsigned int c=0;
	unsigned int i=0;
	unsigned int a=0;
	IT0=1;
	EX0=1;
	IT1=1;
	EX1=1;
	EA=1;
	key1=1;
	key2=1;
  while(1){ 
    for(i=0;i<4;i++){ 
      P1=light[i];
      if(i%2){
        for(a=3;a>0;a--){
          control(light[i]);					
          seg71s_S_N(a);
          seg71s_E_W(a);
          Delay();
        }
      }
      else{ 
        for(a=27;a>0;a--){ 
          if(i<2){ 
          b=a;
          c=a+3;
        }
          else{ 
            b=a+3;
            c=a;
          }
	control(light[i]);
          seg71s_S_N(c);
          seg71s_E_W(b);
          Delay();
        }
      }
    }

  }
}

void Delay(void){ 
  unsigned long i;
  for(i=0;i<15700;i++){ 
  ;
  }
}

为完成课程设计因此没有使用时钟做延迟(欢迎大家修改)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值