1 项目分析
- 基于点亮LED灯、LED灯闪烁,扩展到构成最简单、花样流水灯。
2 技术准备
1 流水灯硬件及原理图
-
流水灯是由多个LED灯组成的
2 C语言知识点
- 数组
-
数组声明:长度不可变
- 数据类型 数组名称[长度n] // 整数型默认为0,小数型默认为0.0,字符默认为 ‘\0’,字符串默认为:NULL
- 数据类型 数组名称[长度n] // 整数型默认为0,小数型默认为0.0,字符默认为 ‘\0’,字符串默认为:NULL
-
声明数组并初始化
- 数据类型 数组名称[长度n] = {元素1,元素2…元素n};
- 数据类型 数组名称[] = {元素1,元素2…元素n};
-
访问:索引值从0开始
- 数组名称[索引];
- 数组名称[索引];
-
数组长度
- sizeof(数组名称) / sizeof(数组名称[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 延时
-
介绍
-
每条指令都占一定的时间(或者机器周期)的,如果让机器什么都不做,即空指令的话,机器就会延时,然后在计算好每次延时到底有多长,外面套一个循环(或者多重循环),根据想要的延时时间即可计算出来循环的次数,延时函数基本上都是这种原理,它的参数就是用来控制循环次数的。
-
实现延时通常有两种方法:
- 硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;
- 软件延时,这种方法主要采用循环体进行。
-
-
分类
- 1)硬件延时: 使用定时器/计数器实现精确延时
- 2)软件延时: 软件延时与时间计算
- 在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。
-
方法
- 短暂延时 nop (intrins.h头文件)
- 在C51中嵌套汇编程序段实现延时
- 使用示波器确定延时时间
- 使用反汇编工具计算延时时间
- 短暂延时 nop (intrins.h头文件)
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