51单片机学习笔记

文章详细介绍了如何使用单片机控制LED的各种操作,包括点亮、闪烁、流水灯效果,以及独立按键控制LED的亮灭、状态、显示二进制和移位。此外,还讲解了138译码器在数码管显示中的应用,以及数码管的位选和段选原理。
摘要由CSDN通过智能技术生成

目录

一.LED模块

         1.点亮一个LED

2.LED闪烁

3.LED流水灯

4.独立按键控制LED亮灭

5.独立按键控制LED状态

6.独立按键控制LED显示二进制

7.独立按键控制LED移位 

一.LED模块

单片机需要通过CPU控制寄存器的值,进而通过驱动器加大控制力度,由控制电路输出高低电平(对应寄存器1/0)。因此,程序需要在对应的寄存器上写1或0,即可控制LED的亮灭。

1.点亮一个LED

//一个端口低电平

#include <REGX52.H>
void main()
{
	P2=0xFE;//1111 1110
	while(1)
	{
		
	}
}

   2.LED闪烁

  调用延时函数

#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	P2=0xFE;//1111 1110
	Delay500ms();
	P2=0xFF;//1111 1111
	Delay500ms();
	while(1)
	{
		
	}
}

    3.LED流水灯

#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		
	}
	P2=0xFE;//1111 1110
	Delay500ms();
	P2=0xFD;//1111 1101
	Delay500ms();
	P2=0xFB;//1111 1011
	Delay500ms();
	P2=0xF7;//1111 0111
	Delay500ms();
	P2=0xEF;//1110 1111
	Delay500ms();
	P2=0xDF;//1101 1111
	Delay500ms();
	P2=0xBF;//1011 1111
	Delay500ms();
	P2=0x7F;//0111 1111
	Delay500ms();
}

使延迟秒数自定

#include <REGX52.H>

void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms!=0)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	while(1)
	{
		P2=0xFE;
		Delay1ms(100);
		P2=0xFD;
		Delay1ms(100);
		P2=0xFB;
		Delay1ms(100);
		P2=0xF7;
		Delay1ms(100);
		P2=0xEF;
		Delay1ms(100);
		P2=0xDF;
		Delay1ms(100);
		P2=0xBF;
		Delay1ms(100);
		P2=0x7F;
		Delay1ms(100);
	}
}

4.独立按键控制LED亮灭

 同时控制8位

 单独控制某一位

 

#include <STC89C5xRC.H>
void main()
{	
	while(1)
	{
		if(P30==0)//按下
		{
			P20=0;//灯亮
		}
		else      //松开
		{
			P20=1;//灯灭
		}
	}
}

5.独立按键控制LED状态

按键消抖,检测松手,才改变LED灯的状态,使其松开按键后长亮或长灭。

#include <STC89C5xRC.H>
 
void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while(xms)
	{
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}
}
 
 
void main()
{
	while(1)
	{
		if(P31==0)
		{
			Delay(20);  // 按键抖动
			while(P31==0);//松手跳出循环
			Delay(20);  // 松手检测
			P20=~P20;   //亮暗交替
		}
	}
}

6.独立按键控制LED显示二进制

通过不停的按下按键,使得灯以二进制的方式,不断往上加一,达到用灯来表示按键次数

#include <STC89C5xRC.H>
 
void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while(xms)
	{
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}
}
 
void main()
{
	unsigned char LEDNum=0;  
	while(1)
	{
	if(P31==0)
	{
		Delay(20);
		while(P31==0);
		Delay(20);
		LEDNum++;
		P2=~LEDNum;
	}
	}
}

7.独立按键控制LED移位 

按下P31,往左边移一位;按下P30,往右边移一位,以LED灯来展示。

#include <REGX52.H>
void Delay(unsigned int xms);
unsigned char LEDNum;

void main()
{
	P2=~0x01;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			LEDNum++;
			if(LEDNum>=8)//防止溢出
			{
				LEDNum=0;
			}
			P2=~(0x01<<LEDNum);
		}
		 if(P3_0==0)
		 {
			Delay(20);
			while(P3_0==0);
			Delay(20);
			LEDNum--;
			if(LEDNum==0)//防止溢出
				LEDNum=7;
			else
				LEDNum--;
			P2=~(0x01<<LEDNum);
		}			
	}
}
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms!=0)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

基础知识

 

 二.数码管模块

 1.138译码器原理

  A B C中C为高位,138译码器可以将可将地址端(A、B、C)的二进制编码在Y0至Y7对应的输出端以低电平译出。Y表示三位二进制对应的十进制数,当Y=0时表示Y0有效,既Y0为0,其余位为1,其他位的输出也是如此。

2.数码管显示原理 

  数码管分为位选和段选,138译码器控制数码管的位选,通过138译码器选择LED1~8哪个显示数字,74HC245控制数码管段选,显示数字的每个部分实质上是LCD灯,通过点亮不同部分的而实现数字的显示,例如要使第一个数码管显示数字1,在段选的时候就要点亮f段和e段,对应的八位二进制数为1111 0011转化为十六进制为E3,每个数码管可以显示的数字均为0~9,可以通过数组存储每个数字显示的所对应的十六进制断码,进而访问数组的各个元素,实现数码管数字的显示。

   3.静态数码管显示

#include <reg52.h>
#include <intrins.h> 
#define uint unsigned int
#define uchar unsigned char
  
unsigned char m,n;
sbit dula=P2^6;					//段选锁存器-使能控制
sbit wela=P2^7;					//位选锁存器-使能控制
  
void Delay_ms(uint xms)
{
	uint i,j;	
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
} 
void main()
{
	wela=1;						//位选锁存器使能
	//P0=0xFE;					//1111 1110 :启用第一个数码管-左边第一个
	P0=0xFD;					//1111 1101 :启用第二个数码管-左边第二个
	wela=0;
 
	dula=1;						//段选锁存器使能
	P0=0X7F;					//0111 1111	:显示数字8				
	dula=0;
  	while(1)
  	{
	
   	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值