LED闪烁

循环语句

循环语句
(1)while(条件表达式){语句}
只有当 while 后面圆括号内条件表达式的值为真时,程序才会重复执行花括号内语句,当条件表达式为假时则不执行花括号内语句。

(2)for([初值设定表达式];[循环条件表达式];[更新表达式])
{语句}

 例:for(i = 1; i <= 100; i++)  
{语句}

花括号内语句会被执行100次后才退出。

变量的定义

变量
变量是在程序执行过程中其值能不断变化的量。在使用一个变量之前必须进行定义,用一个标识符作为变量名,并指出它的数据类型。
注意:C语言中每条语句必须用分号结束。
常用定义格式如下:
数据类型 变量名;
例如:

unsigned char a;  // 作用范围(0~255, 无符号字符型) 
unsigned char b;
a = 5; b = 2;
b = 5 + a; (其中5是常量,a b 都是变量,b最终的值等于10)

变量作用域
全局变量:在函数体外定义的变量通常为全局变量,作用范围: 从定义开始的整个程序
局部变量:在函数体内定义的变量通常为局部变量,作用范围:函数体内

软件延时

当单片机在处理某些事件的时候用户希望它处理完后间隔一段时间再去处理下一个事件,这时就需要用到延时。

常用的延时方法:

  • 软件延时:优点使用简单;缺点浪费CPU资源
  • 定时器延时:需要操作内部寄存器,节省CPU资源

IO口与一个字节位的数据对应关系

如果把一个字节的数据赋值给一组10口,其中数据的最低位对应此组10口的最低位,数据的最高位对应此组10口最高位。

例如
把十六进制数0xfe赋值给P1口他们的对应关系如下图所示
STC89C52单片机 LED灯闪烁_数据

总结:
每个LED灯对应着 2进制位置 1111 1111
每次写入程序需要通过十六进制数对变量进行赋值

例如:
点亮 LED2 LED3 LED5 的LED灯
需要 P1 = 0xe9;
对 0xe9 解析
在程序员计算器中

十进制为 233  
二进制为 1110 1001

当转为二进制后,单片机加载该程序,会根据二进制组对相应的LED灯进行点亮,1110 1001 从高到低排列,

  • 1110 第一个 1 代表P1^7 1为高电平 所以不亮
  • 1110 第二个 1 代表P1^6 1为高电平 所以不亮
  • 1110 第三个 1 代表P1^5 1为高电平 所以不亮
  • 1110 第四个 0 代表P1^4 0为低电平 所以灯亮
  • 1001 第一个 1 代表P1^3 1为高电平 所以不亮
  • 1001 第二个 0 代表P1^2 0为低电平 所以灯亮
  • 1001 第三个 0 代表P1^1 0为低电平 所以灯亮
  • 1001 第四个 1 代表P1^0 1为高电平 所以不亮

点亮 LED6 灯
需要打开程序员计算器 对 二进制位置 1101 1111 进行换算
对应的16进制为 DF
所以 P1 = 0xdf;
即可只点亮 LED6 灯

程序部分

1.使 LED6 灯闪烁

#include <reg52.h>

unsigned int i; // 0~65535 全局变量

void main(){ // main 函数自身会循环

while(1){ // 一般在执行程序的时候需要 写出一个while的循环体来执行代码
// P1 = 0; // 点亮P1口8个LED
// P1 = 0xe9; // 点亮 LED2 LED3 LED5灯
P1 = 0xdf; // 点亮 LED6 灯
i = 65535;
while(i--); // 自定义的软件延时
P1 = 0xff; // 1111 1111 熄灭P1口 8个LED 不能直接使用 P1 = 1; 来熄灭8个LED灯
i= 65535;
while(i--);
}

}


// while(1){
// P1 = 0;
// P1 = 0xff; // 1111 1111 熄灭P1口 8个LED 不能直接使用 P1 = 1; 来熄灭8个LED灯
// }
// 当去掉软件延时器的时候,软件在执行的过程中会不断的循环,LED会反复的开启和关闭,所以通过人眼是无法辨别出来的
// 但是与常开启的LED相比亮度会相对较暗

2.使 LED1 灯闪烁

#include <reg52.h>

/*====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc11.0592M毫秒级延时
====================================*/


void delay(unsigned int z){ // 毫秒级延时函数定义
unsigned int x, y;
for (x = z; x > 0; x--){
for (y = 114; y > 0; y--){

}
}
}

void main(){ // main函数自身会循环
delay(100);

while(1){
P1 = 0XFE; // 点亮 LED1 灯
delay(100); // 延时 100毫秒 通过增加延时的时间或减少延时的时间,来控制灯的闪烁间隔
P1 = 0xff; // 关闭所有的LED 灯
delay(100); // 延时 100毫秒 通过增加延时的时间或减少延时的时间,来控制灯的闪烁间隔
}
}

3.使 LED1、3、5、7 灯亮,使 LED2、4、6、8 灯闪烁;

#include <reg52.h>

void delay(unsigned int z){ // 毫秒级延时函数定义
unsigned int x, y;
for (x = z; x > 0; x--){
for (y = 114; y > 0; y--){

}
}
}

void main(){ // main函数自身会循环
delay(100);

while(1){

P1 = 0; // 0000 0000 // 使 LED1、2、3、4、5、6、7、8 灯亮
delay(500); // 延时 500毫秒 通过增加延时的时间或减少延时的时间,来控制流水灯的速度
P1 = 0XAA; // 1010 1010 // 关闭 2、4、6、8 灯
delay(500); // 延时 500毫秒 通过增加延时的时间或减少延时的时间,来控制流水灯的速度
}
}