本篇介绍编程实现LED灯闪烁,需要学到一些新的C语言知识。由于单片机执行的速度是非常快的,如果不进行延时的话,人眼是无法识别(停留时间要大于20ms)出LED灯是否在闪烁所以需要学习如何实现软件延时。另外IO口与一个字节位的数据对应关系。
文章目录
- 1. 循环语句
- 2. 变量的定义
- 3. 软件延时
- 3.1 软件延时
- 3.2 LED闪烁实践
- 4. IO口与一个字节位的数据对应关系
1. 循环语句
(1) while(条件表达式) {语句}
只有当while后面圆括号内条件表达式的值为真时,程序才会重复执行花括号内语句,当条件表达式为假时则不执行花括号内语句。
(2)for([初值设定表达式]; [循环条件表达式]; [更新表达式])
{语句}
例:for(i=1;i<=100;i++)
{语句}
花括号内语句会被执行100次后才退出。
2. 变量的定义
变量是在程序执行过程中其值能不断变化的量。在使用一个变量之前必须进行定义,用一个标识符作为变量名,并指出它的数据类型。
注意:C语言中每条语句必须用分号结束。
常用定义格式如下:
数据类型 变量名;
例如:
unsigned char a;
unsigned char b:
a=5;b=2;
b=5+a; (其中5是常量,a与b都是变量,b最终的值等于10)
unsigned char
可以表示的数字是0-255
变量作用域
全局变量: 在函数体外定义的变量通常为全局变量,作用范围:从定义开始的整个程序
局部变量: 在函数体内定义的变量通常为局部变量,作用范围:函数体内
3. 软件延时
3.1 软件延时
当单片机在处理某些事件的时候用户希望它处理完后间隔一段时间再去处理下一个事件,这时就需要用到延时。
常用的延时方法:
- 软件延时:使用简单但是耗费CPU资源(CPU执行无用的加减运算,运算结束再执行下一步来实现延时)
- 定时器延时:只需要给定时器配置值,等到达指定时间之后再去执行下一个动作,期间CPU可以执行别的动作,到时间之后定时器提醒执行别的操作,不浪费CPU资源
因为定时器延时要操作到内部寄存器,刚开始我们先学习较为简单的软件延时。
3.2 LED闪烁实践
直接进行实践,首先关闭上一个project
新建工程,根据原理图可知我们需要将原理图中的8个LED灯同时亮同时灭,实现闪烁的功能
以下是通过while循环增加了软件延时的代码,从而实现P1口8个LED同时亮同时灭的功能
虽然main本身就在循环,但是通常循环是需要加while(1)循环
#include <reg52.h>
unsigned int i; //0~65535
//main函数自身就会循环
void main()
{
//虽然main本身就在循环,但是通常循环是需要加while(1)循环
while(1)
{
//点亮P1口8个LED
//实现P1上所有的LED灯均为0,也就是每一位都为0,对应16进制的ox0
P1=0;
//延时,看清亮的时间
i = 65535;
while(i--)
//熄灭P1口8个LED
P1=0xff; //十进制的255对应 1111 1111,一般是使用16进制去写,对应的16进制值为0xff
//延时,看清灭的时间
i = 65535;
while(i--)
}
}
4. IO口与一个字节位的数据对应关系
如果把一个字节的数据赋值给一组IO口,其中数据的最低位对应此组IO口的最低位,数据的最高位对应此组IO口最高位。
例如把十六进制数0xfe赋值给P1口它们的对应关系如下图所示