一、为什么灯会亮
简单的串联电路,
D4,D5,D6
板子上有标记,
D5
一端通过电阻接
5v
,另外一端接着
"LED1
标志的线
"
,我们发现在89C52RC
的电路图中也有
LED1
的标志,是在
P3
的
IO
口组中,在
P3.7
引脚,所以编程让
P3.7
出 低电平(0
)就让
D5
灯完成一个串联电路,所以亮。
也就是说,给LED1对应标号的P3^7一个低电平,就能点亮灯
sbit Led1 = P3^7;Led1 = 0;sbit“ 指令 ” :对应可位寻址空间的一个位,小白先理解成 “ 一个 IO 口 / 针脚 ” 的地址中数据
二、如何控制灯闪烁
在点亮一个LED灯后,加一个STC-ISP自带延时函数delay();
#include "reg52.h"sbit Led1 = P3^7 ;void Delay100ms() //@11.0592MHz
{
unsigned char i, j;i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}void main (){//灯灭,给一个高电平//重复执行while ( 1 ){//灯亮,给一个P3.7 低电平Led1 = 0 ;//数数,数的期间,维持低电平,灯亮,延迟Delay500ms ();//灯灭,给一个高电平Led1 = 1 ;//数数,数的期间,维持高电平,灯灭,延迟Delay100ms ();}}
三、用按键控制灯(查询法)
原理:按键和灯不是我们传统理解的思维,传统按键和灯是在同一个电路中的。而我们单片机编程按键 和灯是分开的两个电路,通过单片机作为媒介来处理数据,通过逻辑来实现按键控制灯。
1、查询法按键控制灯
怎么知道SW
1
按键被按下:KEY1位置和
GND
接通,表现为低电平,值为
0;
怎么知道
sw1
按键没有被按下:KEY1位置通过上拉电阻到
5V
,表现为高电平,值为
1。
通过查询原理图得知
KEY1
接到
STC89C52RC
的
P2.1
口,我们只要不断检测
P2.1
口的值(
0-
按下,
1-
松开)就知道按键是否被按下
#include "reg52.h"sbit Key1 = P2^1 ;sbit Led1 = P3^7 ;void main (){while ( 1 ){//注意:用 “==” 两个等于号表示判断,新手容易犯错if ( Key1 == 0 ){ //KEY1 位置和 GND 接通,表现为低电平,值为 0//灯亮,给一个P3.7低电平Led1 = 0 ;}}}
2、软件消抖
在STC-ISP自带延时函数含有_nop_();需要加入头文件#include <intrins.h>
SW1开,SW2关,案例中只在SW1添加软件消抖
#include "reg52.h"#include <intrins.h>sbit Key1 = P2^1 ;sbit Key2 = P2^0 ;sbit Led1 = P3^7 ;void Delay50ms () //@11.0592MHz{unsigned char i , j , k ;_nop_ ();_nop_ ();i = 3 ;j = 26 ;k = 223 ;do{do{while ( -- k );} while ( -- j );} while ( -- i );}void main (){//查询法检测,是否被按下while ( 1 ){if ( key1 == 0 ) //KEY1 位置和 GND 接通,表现为低电平,值为 0{//感觉被按下,不知道是抖动还是人为,延迟50ms 再判断一次//软件消除抖动Delay50ms ();if ( Key1 == 0 ){//灯亮,给一个P3.7低电平Led1 = 0 ;}if ( Key2 == 0 ){ //KEY2 位置和 GND 接通,表现为低电平,值为 0Led1 = 1 ; // 灭}}}
3、状态位控制LED
定义一个状态位ledMark;使用ledMark的状态改变来控制LED的亮灭
使用 #define 定义一个标识符来表示一个常量,让标志位的状态改变的意义更加明显
#include "reg52.h"
#define ON_STATUS 1
#define OFF_STATUS 0void main (){int ledMark = OFF_STATUS ;ledOne = 1 ;//查询法检测,是否被按下while ( 1 ){if ( key1 == 0 ) //KEY1 位置和 GND 接通,表现为低电平,值为 0{//感觉被按下,不知道是抖动还是人为,延迟50ms再判断一次//软件消除抖动Delay50ms ();if ( key1 == 0 ){//记住,key1被按下,记住,在其他地方点灯ledMark = ON_STATUS ;}}if ( key2 == 0 ){ //KEY2 位置和 GND 接通,表现为低电平,值为 0ledMark = OFF_STATUS ;}if ( ledMark == OFF_STATUS ){ledOne = 1 ;} else {ledOne = 0 ;}}}