51单片机教程(六)- LED流水灯

1 项目分析

  • 基于点亮LED灯、LED灯闪烁,扩展到构成最简单、花样流水灯。

2 技术准备

1 流水灯硬件及原理图

  • 流水灯是由多个LED灯组成的

    在这里插入图片描述
    在这里插入图片描述

2 C语言知识点

  • 数组
    • 数组声明:长度不可变

      • 数据类型 数组名称[长度n] // 整数型默认为0,小数型默认为0.0,字符默认为 ‘\0’,字符串默认为:NULL

    • 声明数组并初始化

      • 数据类型 数组名称[长度n] = {元素1,元素2…元素n};
      • 数据类型 数组名称[] = {元素1,元素2…元素n};

    • 访问:索引值从0开始

      • 数组名称[索引];

    • 数组长度

      • sizeof(数组名称) / sizeof(数组名称[0])

    • 修改数组中对应索引值位置的数据

      • 数组名称[0] = 元素1;
      • 数组名称[1] = 元素2;
      • 数组名称[n-1] = 元素n;

    • 遍历数组中的每个数据

      for (int i = 0; i <sizeof(array) / sizeof(arr[0]); i++)
      {
             
             
      		arrray[i]   // 相关操作
      }
      
      // 数组的基本使用
      
      #include <stdio.h>
      
      int main()
      {
             
             
      	// 数组的定义
      	int score[5];
      
      	// 数组的初始化(重点)
      	int scores[5] = {
             
             34, 55, 67, 88, 19};
      	int score1[] = {
             
             34, 55, 67, 88, 19};
      	
      	// 数组的索引:从0开始(重点)
      	printf("%d ", scores[3]);
      	
      	// 数组的索引赋值
      	scores[4] = 99;
      	printf("%d ", scores[4]);
      	
      	// 数组的长度
      	printf("\n长度:%d", sizeof(scores));
      	printf("\n长度:%d", sizeof(scores) / sizeof(scores[0]));
      	
      	// 数组的遍历(重点)
      	int x = 0;
      	for(; x < 5; x++)
      	{
             
             
      		printf(" %d ", scores[x]);
      	}
      	 
      	return 0;
      } 
      

3 延时

  • 介绍

    • 每条指令都占一定的时间(或者机器周期)的,如果让机器什么都不做,即空指令的话,机器就会延时,然后在计算好每次延时到底有多长,外面套一个循环(或者多重循环),根据想要的延时时间即可计算出来循环的次数,延时函数基本上都是这种原理,它的参数就是用来控制循环次数的。

    • 实现延时通常有两种方法:

      1. 硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;
      2. 软件延时,这种方法主要采用循环体进行。
  • 分类

    • 1)硬件延时: 使用定时器/计数器实现精确延时
    • 2)软件延时: 软件延时与时间计算
      • 在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。
  • 方法

    • 短暂延时 nop (intrins.h头文件)
      • 在C51中嵌套汇编程序段实现延时
    • 使用示波器确定延时时间
      • 使用反汇编工具计算延时时间

3 项目实现

方式1:常规方法

  • 实验

    • 结合多个LED灯实现流水灯效果,每个灯亮灭间隔大约2s
  • 代码

      /*
      	代码实现思路:
      		0 搭建代码框架
      		1 定义8个LED灯的端口
      		2 在while循环中,控制每个LED灯亮灭
      		3 需要设置每个LED灯亮灭的间隔(延迟函数)
      */
      
      #include <reg52.h>
      
      // 宏定义
      #define uint unsigned int
      
      // 1 定义8个LED灯的端口
      sbit led1 = P1^0;
      sbit led2 = P1^1;
      sbit led3 = P1^2;
      sbit led4 = P1^3;
      sbit led5 = P1^4;
      sbit led6 = P1^5;
      sbit led7 = P1^6;
      sbit led8 = P1^7;
      
      // 函数声明
      void delay(uint s);
      
      void main()
      {
         
         
      	while(1)
      	{
         
         
      		// 2 在while循环中,控制每个LED灯亮灭
      		led1 = 0;  // led1 亮
      		delay
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值