51单片机点灯


前言

点灯包括:单个LED闪烁,所有 LED闪烁,LED左流,LED右流,LED循环流

一、单片机LED原理图

在这里插入图片描述
VCC为电源,输出高电平。P20-P27为C51芯片引脚。LED灯点亮,电流只能从左流向右。控制芯片引脚默认输出高电平,LED左右均为高电平,即LED默认不亮。要点亮哪个LED灯,只需控制对应引脚输出低电平即可。

二、点灯代码

#include "reg52.h"
#include "intrins.h" //_crol_()和_cror_()函数要用
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LED0 = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;
#define LED P2 //包含8个LED灯

void delay(uint i){
	while(i--){
	}
}					   
void main(){
	while(1){
         /*第一个LED闪烁*/
		/*LED0 = 0;
		delay(50000);
		LED0=1;
	    delay(50000);*/

		/*全部闪烁*/
		/*LED = 0xff;
		delay(50000);
		LED = 0x00;
		delay(50000);*/

		
		uint i;
		/*流水灯,右流*/
		/*LED = 0xfe;
		for(i=0 ; i<7;++i){
			delay(10000);
			LED = _crol_(LED , 1);
			delay(10000);
		}*/
		
		/*流水灯,左流*/
		/*LED = 0x7f;  //循环流保存左右流并注释该行即可
		for(i=0 ; i<7;++i){
			delay(10000);
			LED = _cror_(LED , 1);
			delay(10000);
		}*/
		 

		/*摩斯密码,SB .../_... 
		  不完美,需要用到多线程。前三个和后三个各自闪烁,每个灯各自线程控制,中间俩个灯常亮。
		*/
		/*
		LED = 0xE7;
		delay(50000);
		LED = 0x00;
		delay(50000); */
	} 
}

代码解释

1.为什么LED闪烁要用两个 delay()函数?

因为程序执行速度非常快,只保留第一个delay()函数,LED熄灭后会很快点亮,虽然其在闪烁,但肉眼无法察觉。

2. 为什么LED=0xfe之类的16进制?

因为LED定义为P2的所有引脚,P2的8个引脚分别控制8个LED灯。0xfe转换为二进制为1111 1110。低位0表示P20引脚为低电平,即第一个LED灯点亮,其他熄灭。在左右流水灯中的左右位移函数 _crol_()_cror_() 中移动给定的十六进制数,以此顺序点亮对应LED灯。

3.为什么for循环中阈值为7而不是8?

要控制8个灯依次点亮,而在for循环体外已经控制点亮了第一个灯,即LED=0xfe。所以只要控制其他七个灯即可。

总结

除了数模电忘干净了很多看不懂,其他比较简单。

### 回答1: #include <reg51.h> sbit LED = P1^0; void main() { while(1) { LED=1; delay(1000); LED=0; delay(1000); } } ### 回答2: 51单片机是一种常用的嵌入式系统开发平台,可以通过编写代码实现各种功能。点灯是其中最基本和简单的功能之一。 下面是一个简单的51单片机点灯的C语言代码示例: ```c #include <reg51.h> // 延时函数 void delay() { unsigned int i, j; for (i = 0; i < 10000; i++) { for (j = 0; j < 100; j++) { } } } void main() { P2 = 0x00; // 将P2口的初始值设为0 while(1) { // 无限循环 P2 = 0xFF; // 将P2口的值设为全高电平,即所有灯都亮 delay(); // 延时一段时间,使灯亮持续一段时间 P2 = 0x00; // 将P2口的值设为全低电平,即所有灯都灭 delay(); // 延时一段时间,使灯灭持续一段时间 } } ``` 以上代码会不断地循环将P2口的值设为全高电平和全低电平,从而实现灯的亮灭效果。具体实现过程为,将P2口的初始值设为0,然后进入一个无限循环,在循环中首先将P2口的值设为全高电平,使所有灯都亮起来;然后延时一段时间,使灯亮持续一段时间;接着将P2口的值设为全低电平,使所有灯都灭掉;再次延时一段时间,使灯灭持续一段时间。之后循环重新开始,灯的亮灭过程会一直循环执行。 注意,上述代码仅针对51单片机中的P2口进行点灯操作,如果需要控制其他引脚或其他功能,则需要相应地修改代码。 ### 回答3: 51单片机点灯的C语言代码可以如下所示: #include <reg51.h> // 导入头文件 sbit LED = P0^0; // 定义LED连接的IO口 void delay(unsigned int t) // 延时函数 { unsigned int i, j; for(i = t; i > 0; i--) for(j = 120; j > 0; j--); } void main() { while(1) // 无限循环 { LED = 0; // 点亮LED delay(500); // 延时500ms LED = 1; // 关闭LED delay(500); // 延时500ms } } 以上代码通过定义一个sbit类型的变量LED来表示连接的IO口,然后在主函数中使用while循环实现LED点灯的功能。循环体中先将LED置为低电平以点亮LED,然后调用延时函数延时500ms,随后将LED置为高电平以关闭LED,再次调用延时函数延时500ms。这样循环执行,就可以实现LED的闪烁效果。需要注意的是,在51单片机中,延时函数中的延时时间需要根据实际芯片的指令周期进行调整,以保证延时的准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值