zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【51单片机Task】:led十六进制控制led灯详解、按键控制流水灯、跑马灯等任务

控制单片机 详解 任务 Task 51 按键 LED
2023-09-11 14:21:43 时间

 

学习目标:

        学习普中51单片机的按键控制led灯。

电路图:

                    


学习内容:

        LED灯的十六进制怎么算???

        在这给大家算一下:首先先看一下LED模块的电路图!

        

        实物图:

                

可以把    

        D1        D2         D3        D4        D5        D6        D7        D8

看成

        1           1           1           1           1           1           1           1

如:

D1D2D3D4D5D6D7D8
11111111

十六进制1位   对   二进制   四位

则        

 

0123456789ABC
0000000100100011010001010110011110001001101010111100

       下图接上图后:

DEF
110111101111

根据上图可以知道  十六进制  和  二进制  的一一对应。

        根据电路图又知   当   低电平   的时候   led灯点亮   即低电平有效

        在数字电路中     1  代表  高电平    0  代表    低电平

还有一个就是需要知道实物的编码方式:

D1 ——>  D8

所有led灯熄灭    则    111111111     十六进制就是    0xFF

如果我想要   右边第一个led灯亮     111111110 

注:这里要明白   左边 1111   右边1111 

                左边的1111控制的是右边的四个灯

                右边的1111控制的是左边的四个灯

所有想要右边第一个灯亮      则    就是    0x7F

比如      我想要   右边第二个灯亮     1111 1101     就是0xBF  (可以理解为就是反着来)

说明:1101   是从左到右  的    1+2+8  = 11 = B

(本文这样计算  只针对普中51单片机)

由于   上文可知

右边第三个灯亮          1111 1011       0xDF

右边第四个灯亮          1111 0111       0xEF

左边第一个灯亮          0111 1111       0xFE   

说明: 0111  是从左到右  的   2+4+8 = 14 = E

左边第二个灯亮          1011 1111       0xFD

左边第三个灯亮          1101 1111       0xFB

左边第四个灯亮          1110 1111       0xF7

由此    即讲完了   十六进制   控制   P2   亮指定灯     后续又代码   大家也可参考!


 

学习内容:

题目:

        用汇编或C语言实现霓虹灯效果:
        1)开始D1、D2、D3、D4、D5、D6、D7、D8,全灭,
        2)等待按键KEY1按下松开后D4->D3->D2->D1和D5->D6->D7->D8同时间隔约0.2秒逐次点亮后,从D8->D7->D6->D5->D4->D3->D2->D1逐次间隔0.3秒灭掉,循环执行D4->D3->D2->D1和D5->D6->D7->D8同时间隔约0.2秒逐次点亮后,从D8->D7->D6->D5->D4->D3->D2->D1逐次间隔0.3秒灭掉;重复以上现象。
        3)按键再一次按下后:D1->D2->D3->D4和D8->D7->D6->D5同时间隔0.2秒逐次点亮后,从D8->D7->D6->D5->D4->D3->D2->D1逐次间隔0.3秒灭掉;重复以上现象。
4)等按键按下后,分别重复1)2) .... ...

代码如下:

#include <reg51.h>

sbit key1 = P3^1;

#define uint unsigned int
#define uchar unsigned char

void delay(uint z) {
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}


void main()
{
	int i,j,key=1;
	
	while(1)
	{
		if(key1 == 0)
		{
			delay(20);
			if(key1 == 0)
			{
				key +=1;
			}
			if(key == 2)
			{
				for(j=0;j<4;j++)
				{
					P2 = 0xE7;
					delay(200);
					P2 = 0xC3;
					delay(200);
					P2 = 0x81;
					delay(200);
					P2 = 0x00;
					delay(200);
					
				   for(i=0;i<8;i++)
				   {
						P2=~(0x7f>>i);
						delay(300);
				   }			
				}
			}
			if(key == 3)
			{
				for(j=0;j<4;j++)
				{

					P2 = 0x7E;
					delay(200);
					P2 = 0x3C;
					delay(200);
					P2 = 0x18;
					delay(200);
					P2 = 0x00;
					delay(200);				
				   for(i=0;i<8;i++)
				   {
						P2=~(0x7f>>i);
						delay(300);
				   }			
				}		
			}
			
		}	
	}


}


/*
		P2=0XF7;
		delay(200);
		P2=0XF3;
		delay(200);
		P2=0XF1;
		delay(200);
		P2=0XF0;
		delay(200);
	
		P2=0xEF;
		delay(200);
		P2=0xCF;
		delay(200);
		P2=0x8F;
		delay(200);
		P2=0x0F;
		delay(200);

*/

学习内容:

题目 

       用汇编或者c语言实现

        1)初始状态所有灯火。
        2)等按键K3第一次按下松开后D1->D2->D3->D4->D5->u0->L? v0 b0NO 『T
秒亮后,等全亮后,冉从D8->Dr-5.山U流水虹效里掉,重复上面的全亮到全灭重复执行;出现流水灯效果。
        3)按键K3第二次按下松开后出现跑马灯效果
        4)按键再一次按下后,重复2)3)现象。

代码如下:

#include <reg51.h>
#include "intrins.h"

sbit key1 = P3^2;
#define led P2

#define uint unsigned int
#define uchar unsigned char

void delay(uint z) {
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void main()
{
	int i,j,key=1,a = 1;

   P2 = 0xFF;
   delay(500);
	while(1)
	{
		if(key1 == 0)
		{
			delay(20);
			if(key1 == 0)
			{
				key +=1;
			}	
			if(key == 2 && a == 1)
			{
			   for(i=0;i<8;i++)
			   {
					P2=0XFE<<i;
					delay(500);
			   }
			   for(i=0;i<8;i++)
			   {
					P2=~(0x7f>>i);
					delay(500);
			   }	
			   a = 2;
			}
			if(key == 3 && a == 2)
			{
				led=~0x01;
				delay(500);	
				for(i=0;i<7;i++)	 
				{									  
					P2=_crol_(P2,1);
					delay(500); 	
				}
				for(i=0;i<7;i++)	
				{
					P2=_cror_(P2,1);
					delay(500);	
				}
				a = 3;
			}
			if(key == 4 && a == 3)
			{
			   for(i=0;i<8;i++)
			   {
					P2=0XFE<<i;
					delay(500);
			   }
			   for(i=0;i<8;i++)
			   {
					P2=~(0x7f>>i);
					delay(500);
			   }	
				led=~0x01;
				delay(500);	
				for(i=0;i<7;i++)	 
				{									  
					P2=_crol_(P2,1);
					delay(500); 	
				}
				for(i=0;i<7;i++)	
				{
					P2=_cror_(P2,1);
					delay(500);	
				}

			   key = 1;a = 1;
			}
			P2 = 0xFF;
			delay(500);
			
		}	
	}
}

天行健,君子以自强不息。人生是一场努力,就算结局是一个烧糊的花卷子,也不要懊悔自己曾经的一番烈火锻炼。人生风景在路过,不在结局。