点亮一个LED以及左移实现流水灯

虽然c51单片机已经算是过时了,但是确是初学者最好的选择,因为很容易上手,其他开发板的操作也是大同小异,学会了stc89c52之后,再学习其他板子就会相对简单很多。其实学习stc89c52开发板感觉是挺简单的,至于开发板的组成、电子元件、电路布线等问题还需要大家自己去其他地方研究,今天就记录点亮一个LED灯以及用左移实现流水灯。

目录

1、点亮一个LED

2、左移实现流水灯

         3、总结:


1、点亮一个LED

我们先看一下stc89c52rc的LED模块的原理图

 我们看到在左端提供了一个电源,所以左边为高电平,要想点亮哪个LED,则只需要给相应LED的右端给低电平即可。如果我们要点亮D1,那么就只将P20端口赋低电平即可。

第一种方式:

#include<reg52.h>            //包含头文件

//因为我们使用的单片机可用内存都不是很大,所以在使用相应类型时还是需要有一定的考虑
typedef unsigned char u8;   //重定义char类型(可表示范围0~2^7-1)
typedef unsigned int u16;   //重定义int类型(可表示范围0~2^15-1)

sbit LED0 = P2^0;           //重定义一下端口,便于使用
                            //我们可以从"reg52.h"这个头文件中查到定义端口的固定形式

void main()
 {
	  while(1)             //死循环,一般在单片机中的动作都需要不断重复,所以写入死循环中
 {		 
 	 LED0 = 0;             //给P2.0端口赋低电平
 }
 }
 
 

第二种方式:

#include<reg52.h>

typedef unsigned char u8;
typedef unsigned int u16;


void main()
 {
	  while(1)
     {		 
 	     P2 = 0xfe;        //直接对P2端口整体赋值,P2.7-P2.0刚好8个端口
                           //从高位P2.7开始 1111 1110即16进制0xfe
     }
 }
 
 

2、左移实现流水灯

位运算操作位移:分为逻辑位移和算术位移, 逻辑移位是不考虑符号位的移位,算术移位是考虑符号位的移位。但是在我们的单片机的学习中,基本上都是逻辑位移。这里就简单给大家介绍一下逻辑左移和逻辑右移。

左移:<<

整体左移,舍去高位,低位补零。通俗讲就是     原数 *2^n(n为位移数)

右移:>>

整体右移,舍去低位,高位补零。通俗讲就是      原数 /2^n(n为位移数)

#include<reg52.h>
#include<intrins.h>//包含左移的库函数,但是他的左移有一点区别

typedef unsigned char u8;
typedef unsigned int u16;

#define LED_PORT	P2//宏定义P2端口

void delay_ten_us(u16 ten_us)//延时函数,后面传参是以10us为单位,如delay_ten_us(1000)
                            //就是延时10000us = 10ms,但是实际上延时的时间可能介于5-10ms之间
{
	while(ten_us--);
}

void main()
{
while(1)
{
	  u8 i = 0;
	  LED_PORT = 0xfe;//让第一个灯亮
	  delay_ten_us(50000);
	  for(i=0;i<7;i++)
	  {
	  LED_PORT = _crol_(LED_PORT, 1); //库函数实现左移,从D1亮到D8
	  delay_ten_us(50000);

	  /* P2 = ~(0x01<<i);  //直接实现左移
	  delay_ten_us(50000); */

	  }
	   for(i=0;i<7;i++)
	  {
	 LED_PORT = _cror_(LED_PORT, 1);//库函数实现左移,从D8亮到D1
	 delay_ten_us(50000);
	  }
}
}

 _crol_(LED_PORT, 1) 

 _cror_(LED_PORT, 1)也一样,只是函数名不同,大家可以自己理解推理 一下,有助于大家掌握知识。

3、总结:

这里主要就是学习对端口的操作,对硬件的理解,位移操作,以及看懂电路图。这实验虽然很简单,但是对于学习单片机以及各种开发板来说,都是理解的开始,以后的学习中其实内容可能大部分都是很相似,赋予某个端口高电平或者低电平即可,逐渐的了解各种实验,知识点才能得到扩展,今后会不断更新stc89c52的实验,从易到难,希望能帮到你。

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是一个使用 8051 单片机点亮 LED 流水灯的程序: ``` #include <8051.h> void delay(unsigned int t) { while (t--); } void main() { unsigned char i; while (1) { for (i = 0; i < 8; i++) { P1 = 1 << i; delay(50000); } for (i = 7; i > 0; i--) { P1 = 1 << i; delay(50000); } } } ``` 这段代码实现一个简单的 LED 流水灯效果,其中 `P1` 变量代表 8051 单片机的端口 1,用来控制 LED 的亮灭。 希望对您有所帮助。 ### 回答2: 当然可以帮你写一个8051单片机点亮LED流水灯的程序。以下是一个基本示例程序: ``` #include <reg51.h> // 包含8051单片机头文件 sbit LED1 = P1^0; // 定义LED1为P1.0引脚 sbit LED2 = P1^1; // 定义LED2为P1.1引脚 sbit LED3 = P1^2; // 定义LED3为P1.2引脚 sbit LED4 = P1^3; // 定义LED4为P1.3引脚 void Delay(unsigned int time) // 延时函数 { unsigned int i, j; for(i = 0; i < time; i++) for(j = 0; j < 1275; j++); } void main() // 主函数 { while(1) // 无限循环 { LED1 = 1; // 点亮LED1 Delay(1000); // 延时1秒 LED1 = 0; // 关闭LED1 LED2 = 1; // 点亮LED2 Delay(1000); // 延时1秒 LED2 = 0; // 关闭LED2 LED3 = 1; // 点亮LED3 Delay(1000); // 延时1秒 LED3 = 0; // 关闭LED3 LED4 = 1; // 点亮LED4 Delay(1000); // 延时1秒 LED4 = 0; // 关闭LED4 } } ``` 在上述程序中,我们使用了P1口的四个引脚(P1.0-P1.3)来连接四个LED灯。程序中的`Delay`函数用于延时,实现流水灯效果。 希望这个程序对你有帮助!如果有任何疑问,请随时提问。 ### 回答3: 当然可以帮你写一个8051单片机点亮LED流水灯的程序。以下是一个简单的程序示例: ```c #include <8051.h> #define LED P1 // 用P1口控制LED灯 void delay(unsigned int time) { // 延时函数 unsigned int i,j; for(i=0; i<time; i++) for(j=0; j<1275; j++); } void main() { unsigned char pattern; // 存储灯带模式 pattern = 0x01; // 初始化灯带模式,从最低位开始点亮 while(1) { LED = pattern; // 将灯带模式输出到LED delay(200); // 延时一段时间,可根据需要调整 pattern = pattern << 1; // 灯带模式左移一位 if(pattern == 0x00) // 如果模式变为0,则重新从最低位开始 pattern = 0x01; } } ``` 这是一个基本的程序,通过调用延时函数来控制LED灯的亮灭,实现流水灯效果。程序中使用P1口来控制LED灯,定义了一个延时函数用来控制灯的亮灭间隔,然后在主函数中循环处理LED灯的点亮模式。首先将灯带模式输出到LED,然后延时一段时间,再将灯带模式左移一位,如果模式变为0,则重新从最低位开始。这样循环执行,就能实现流水灯效果。 需要注意的是,具体的程序可能会有一些细微的差别,根据不同的开发环境和硬件平台,一些相关的配置和引脚设置可能会有所不同。因此,为了确保程序正常运行,你可能需要根据自己的实际情况进行适当的修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值