单片机———LED灯(Proteus和KeilC51)

LED灯的简单介绍

在这里插入图片描述

LED灯   01

注意注意注意
注意led灯的方向 他是有方向的(哪一个口接电源,哪一个口接at89c51的引脚)可以记作三角边朝电源,三角尖朝单片机

led灯如何在KeilC51中使用

  • 第一种:直接定义

    (适用于led灯少的时候)
    直接定义led灯所在的引脚、然后再主函数中直接使用

    	sbit led1 = P1^0; 
    	sbit led2 = P1^1;
    
  • 第二种:使用十六进制的方法

    (适用于四个、八个、十六个led灯等)
    以下图举例
    在这里插入图片描述
    在这里插入图片描述

  1. 数组法

    由上图可知,从0口灯亮到7口亮的数组为

    tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
    
  2. 循环法

    由图可知,从低位到高位为左循环,由高位到低位为右循环

    #include<intrins.h>//头文件
    
    _crol_(P1,1);//向左循环一位
    _cror_(P1,2);//向右循环两位
    
    

练习

led灯两灯闪烁

  1. 演示图
    在这里插入图片描述

  2. protues8.9 的图

    在这里插入图片描述

    所用的器件
    1. 最小系统	
    	at89c51
    	cap        30PF
    	cap-elec   22uF
    	res        
    	crystal
    2. led部分
    	led-yellow(别的颜色也可以)
    	res     分压(一定要设置成220,不然分压太大,led灯会没有显示)
    
    
  3. KeilC51代码

    #include<reg51.h>
    #define uint unsigned int
    #define uchar unsigned char
    	
    sbit led1 = P1^0;     //定义引脚
    sbit led2 = P1^1;
    
    void delay(uint xms){    //延时功能;当xms=1时,相当于1ms
    	uint i,j;
    	for(i=xms;i>0;i--)
    		for(j=110;j>0;j--);
    }
    
    void main(){
    	while(1){      //一直循环,在后面会一直写到,大家可以记住
    		led2=led1;
    		led1=~led1;
    		delay(200);  //每200ms led1和led2互换一次
    	}
    }
    

    部分代码讲解
    ~(波浪符号)是取反的意思

    led2=led1;
    led1=~led1;
    

    这段代码是让两个led灯的状态不同,当led2=0时,led1=1;led2=1时,led1=0;

    也可以用:

    while(1){      //一直循环,在后面会一直写到,大家可以记住
    	led2=0;
    	led1=1;
    	delay(200);  //每200ms led1和led2互换一次
    	led2=1;
    	led1=0;
    	delay(200); 
    }
    

8盏花样流水灯

protues8.9 的图
在这里插入图片描述

1357,2468轮流点亮

  1. 演示图
    在这里插入图片描述

  2. 代码
    方法一:循环法

    #include<reg51.h>
    #include<intrins.h>//循环的头文件记得写
    
    #define uint unsigned int
    #define uchar unsigned char
    
    void delay(uint xms){
    	uint i,j;
    	for(i=xms;i>0;i--){
    		for(j=110;j>0;j--);
    	}
    }
    void main(){
    	uint k,m;
    	while(1){	
    		P1=0xfe;
    		for(k=0;k<3;k++){
    			delay(500);
    			P1=_crol_(P1,2);    //循环的方法关键
    		}
    		delay(500);
    		
    		P1=0xfd;
    		for(k=0;k<3;k++){
    			delay(500);
    			P1=_crol_(P1,2);
    		}
    		delay(500);
    	}
    }	
    

    代码讲解

    第一部分:1 3 5 7 亮

    P1=0xfe;
    for(k=0;k<3;k++){
    	delay(500);
    	P1=_crol_(P1,2);    //循环的方法关键
    }
    delay(500);
    

    如图如代码,可知,当我们设置了初值=0xfe,然后就可以进行for循环了
    第二部分:2 4 6 8 亮

    P1=0xfd;
    for(k=0;k<3;k++){
    		delay(500);
    		P1=_crol_(P1,2);
    	}
    	delay(500);
    

    如上一个例子

    方法二:数组法

    #include<reg51.h>
    #include<intrins.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    void delay(uint xms){
    	uint i,j;
    	for(i=xms;i>0;i--){
    		for(j=110;j>0;j--);
    	}
    }
    
    uchar code table1[]={0xfe,0xfb,0xef,0xbf};//数组方法的关键
    uchar code table2[]={0xfd,0xf7,0xdf,0x7f};
    
    void main(){
    	uint k;
    	while(1){
    		for(k=0;k<4;k++){
    			
    			P1=table1[k];
    			delay(500);
    		}
    		for(k=0;k<4;k++){
    			P1=table2[k];
    			delay(500);
    		}
    	}
    }
    

从下到上两遍,从下到上两遍,中间到两头两遍

由于本人比较喜欢用循环的方法,所以以下就全都用循环的方法了

  1. 演示图
    在这里插入图片描述

  2. 代码讲解
    从下到上两遍,从下到上两遍就不进行详细讲解了
    中间到两头两遍

    uchar code ted[]={0xe7,0xdb,0xbd,0x7e};//看下图
    for(m=2;m>0;m--){
    	for(i=0;i<4;i++){
    		P1=ted[i];
    		delay(200);
    	}
    }
    

    在这里插入图片描述

  3. 完整代码

    #include<reg51.h>
    #include<intrins.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    void delay(uint xms){
    	uint i,j;
    	for(i=xms;i>0;i--){
    		for(j=110;j>0;j--);
    	}
    }
    uchar code ted[]={0xe7,0xdb,0xbd,0x7e};
    void main(){
    	uint m,k,i;
    	while(1){
    		P1=0xfe;
    		for(m=2;m>0;m--){
    			for(k=0;k<8;k++){
    				delay(200);
    				P1=_crol_(P1,1);
    			}
    		}
    		P1=0x7f;
    		for(m=2;m>0;m--){
    			for(k=0;k<8;k++){
    				delay(200);
    				P1=_cror_(P1,1);
    			}
    		}
    		for(m=2;m>0;m--){
    			for(i=0;i<4;i++){
    				P1=ted[i];
    				delay(200);
    			}
    		}
    	}
    }
    

两边到中间,中间到两边

  1. 演示图
    在这里插入图片描述

  2. 代码

    #include<reg51.h>
    #include<intrins.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    void delay(uint xms){
    	uint i,j;
    	for(i=xms;i>0;i--){
    		for(j=110;j>0;j--);
    	}
    }
    uchar code ted1[]={0xbd,0xdb,0xe7};
    uchar code ted2[]={0xdb,0xbd,0x7e};
    
    void main(){
    	
    
    	
    	//两边到中间,中间到两边
    	uint i;
    	while(1){
    		P1=0x7e;
    		for(i=0;i<3;i++){	
    			delay(500);
    			P1=ted1[i];
    		}
    		for(i=0;i<3;i++){
    			delay(500);
    			P1=ted2[i];
    		}
    	}	
    }
    
  • 18
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值