当前位置: 首页 > news >正文

C51点灯学习

#点灯环节

点亮第一个灯

原理:从VCC正极电极过来,若碰到的组件是 1,那么就会不亮(因为两个都是高电平),若碰到的组件是 0,则会通过高低电平来促使灯发亮

#include <REGX52.H>

void main()
{
	P2 = 0xFE;//由高往低数(从P27 ~ P20)1111 1110
}


让灯交互闪烁

#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;
		Delay500ms();
		P2 = 0xFF;
		Delay500ms();
	}
}
/*
		P2 = 0x49;
		Delay500ms();
		P2 = 0xB6;
		Delay500ms();
*/


流水灯实现

#include <REGX52.H>
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		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);
		}
}


独立按键控制灯

#include <REGX52.H>
void main()
{
	//P3_1 == 0表示按下
	if(P3_1 == 0)//注意这里的独立按键串口,第一个独立按键是P3_1的串口,第二个独立按键是P3_0的串口
	{
		P2_0 = 1;//表示寄存器中8位中的一位
	}else P2_0 = 0;
}


独立按键控制灯状态

注意:单片机上电后所有串口默认是高电平(1)

#include <REGX52.H>
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
	

void main()
{
	while(1)
	{
		//P2_0 = 0;
		if(!P3_1)
		{
			Delay1ms(20);
			while(!P3_1);
			Delay1ms(20);
			P2_0 = ~P2_0;
		}
	}
}
	


实现二进制点灯方式

用需要定义一个字符去表示对应的二进制数,不断累加

#include <REGX52.H>

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

void main()
{
	unsigned char erjinzhi = 0;
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay1ms(20);
			while(P3_1 == 0);
			Delay1ms(20);
			erjinzhi++;
			P2 = ~erjinzhi;
		}
	}
}


实现按键操控灯移向

单键操控

#include <REGX52.H>
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{	
			while (--j);
		} 	while (--i);
		xms--;
	}
}

void main()
{
	unsigned char Num = 0;
	P2 = ~(0x01);//需要初始化P2的第一位,因为不初始化会直接跳过第一位
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay1ms(20);
			while(P3_1 == 0);
			Delay1ms(20);
			Num++;
			if(Num == 8)Num = 0;
			P2 = ~(0x01<<Num);
		}
	}
}

双键操控

#include <REGX52.H>
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{	
			while (--j);
		} 	while (--i);
		xms--;
	}
}

void main()
{
	unsigned char Num = 0;
	P2 = ~(0x01);//ÐèÒª³õʼ»¯P2´®¿ÚµÄÖµ£¬ÒòΪÈç¹û²»³õʼ»¯»áÌø¹ýµÚһλ
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay1ms(20);
			while(P3_1 == 0);
			Delay1ms(20);
			Num++;
			if(Num == 8)Num = 0;
			P2 = ~(0x01<<Num);
		}
		
		if(P3_0 == 0)
		{
			Delay1ms(20);
			while(P3_0 == 0);
			Delay1ms(20);
			if(Num == 0)Num = 7;
			else Num --;
			P2 = ~(0x01 << Num);
			//这里为什么继续用左移
			//因为你的Num在执行K1按键的时候,Num自增了1,然后你在决定按K2的时候,Num又自减了1,相当于在K1的基础上右移了一位
		}
	}
}

相关文章:

  • 一.ffmpeg打开麦克风,录制音频并重采样
  • k8s集群-kubeadm init
  • CSS3学习教程,从入门到精通,CSS3 选择器权重问题语法知识点及案例代码(5)
  • linux系统命令——权限
  • 破碎的誓言
  • 深入xtquant:掌握创建交易对象的关键技巧
  • 初探 Threejs 物理引擎CANNON,解锁 3D 动态魅力
  • C语言实现堆结构及Top - K问题求解
  • C#opencv 遍历图像中所有点 不在圆范围内的点变为黑色,在圆范围内的保持原色
  • Gemini 2.0 Flash:AI 图像生成的革命性突破!
  • c++三级(枚举问题)
  • 练习题:87
  • Go vs Rust vs C++ vs Python vs Java:谁主后端沉浮
  • Mybatis——基础操作、动态SQL
  • 【STM32】USART串口收发HEX数据包收发文本数据包
  • 2024年12月CCF-GESP编程能力等级认证C++编程三级真题解析
  • Vue前端项目部署到宝塔面板的详细过程
  • VSCode通过SSH免密远程登录Windows服务器
  • 搭建Spring Boot Admin监控系统
  • 【SpringBoot】最佳实践——JWT结合Redis实现双Token无感刷新
  • 浦江潮涌征帆劲,上海以高质量发展服务全国发展大局
  • 竞彩湃|欧联杯决赛前,曼联、热刺继续划水?
  • 中方是否计划解除或调整稀土出口管制?外交部回应
  • 350种咖啡主题图书集结上海,20家参展书店买书送咖啡
  • 商务部:今年前3月自贸试验区进出口总额达2万亿元
  • 国防部:中方愿与俄方不断增强两军关系良好发展势头