目录
单片机爱好者之家3群 企鹅群:630442960
1.2 基本IO口控制
1.2.1 关于灯LED的那些事儿
思维发散:
- 单片机编程是什么:人类要求单片机干具体的活,有点像提前写个小纸条贴冰箱上,告诉你女朋友 煮鸡蛋不加水
- 单片机执行程序怎么理解: 女朋友看到纸条后,照做!
- 单片机能做什么事情: IO口供电,串口数据传输等
- 肉眼可见的引脚是什么:方便人类对单片机IO口,串口接东西
- 单片机CPU怎么找到IO口:通过寻址,说白了有一些地址数据,头文件帮你做很多了
- 怎么写纸条(编程)找到IO口呢:ANSI C
- sfr“指令”: 用来直接描述硬件地址,小白先理解成“一组IO口”的起始地址中数据 sfr P0 = 0x80; P0 = 0;
- 怎么找到IO口的具体一个引脚呢: sbit“指令”:对应可位寻址空间的一个位,小白先理解成“一个IO口/针脚”的地址中数据 sbit led2 = P3^6 c语言的一个字节,char型就是8位
我手上的89C52有5组这样的输入输出口,分别为P0,P1,P2, P3每组对应8个针脚,P4是RC系列才有,7个 针脚
89C52
比较简单粗暴,关于引脚输入还是输出的功能不需要配置
比如
sbit IFfire = P1^0;
int main()
{
int io_data;
//什么情况叫做输入
io_data = IFfire; // 给变量赋值,就是输入 —— 或者理解为,这个针脚有数据啦,拿个变量来保存
if(io_data == 0)
{
}
//什么情况叫做输出
IFfire = 1; // 被给予一个数值,引起IO口电压变化(一般1输出高电平,0输出低电平),此时为输出,来影响外接的电路
return 0;
}
为什么灯会亮
得看电路图,但是不要怕,初中电路知识而已!也叫单片机原理图,是硬件设计者设计的
记住:原理图中标号一样代表是同一根 “ 电线 ”
简单的串联电路,
D4,D5,D6
板子上有标记,
D5
一端通过电阻接
5v
,另外一端接着
"LED1
标志的线
"
,我们发现在89C52RC
的电路图中也有
LED1
的标志,是在
P3
的
IO
口组中,在
P3.7
引脚,所以编程让
P3.7
出 低电平(0)就让
D5
灯完成一个串联电路,所以亮
#include "reg52.h"
sbit ledOne = P3^7;
void main()
{
//灯亮,给一个P3.7低电平
ledOne = 0;
}
也就是说,给LED1对应标号的P3^7一个低电平,就能点亮
怎么做才会闪烁
- 使用STC-ISP自带延时函数
#include "reg52.h"
sbit ledOne = P3^7;
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
//灯灭,给一个高电平
//重复执行
while(1){
//灯亮,给一个P3.7低电平
ledOne = 0;
//数数,数的期间,维持低电平,灯亮,延迟
Delay500ms();
//灯灭,给一个高电平
ledOne = 1;
//数数,数的期间,维持高电平,灯灭,延迟
Delay500ms();
}
}
1.2.2 按键控制灯
原理:按键和灯不是我们传统理解的思维,传统按键和灯是在同一个电路中的。而我们单片机编程按键和灯是分开的两个电路,通过单片机作为媒介来处理数据,通过逻辑来实现按键控制灯
查询法按键控制灯
- 怎么知道sw1按键被按下
KEY1位置和
GND
接通,表现为低电平,值为
0
- 怎么知道sw1按键没有被按下
KEY1位置通过上拉电阻到
5V
,表现为高电平,值为
1
通过图
a2
得知
同理
LED
的分析,
KEY1
接到
STC89C52RC
的
P2.1
口,我们只要不断检测
P2.1
口的值(
0-
按下,
1-
松开)就知道按键是 否被按下
按键控制灯
#include "reg52.h"
sbit key1 = P2^1;
sbit ledOne = P3^7;
void main()
{
while(1)
{
//注意:用“==”两个等于号表示判断,新手容易犯错
if(key1 == 0)
{
//KEY1位置和GND接通,表现为低电平,值为0
//灯亮,给一个P3.7低电平
ledOne = 0;
}
}
}
按键控制灯,
SW1
开,
SW2
关,案例中只在
SW1
添加软件消抖
#include "reg52.h"
#include <intrins.h>
sbit key1 = P2^1;
sbit key2 = P2^0;
sbit ledOne = 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低电平
ledOne = 0;
}
}
if(key2 == 0)
{
//KEY2位置和GND接通,表现为低电平,值为0
ledOne = 1;//灭
}
}
}
按键按下一次,灯状态改变
void main()
{
led1 = 0;
led2 = 0;
while(1)
{
if(sw1 == 0)
{
led1 = !led1;
}
}
}
状态位来控制
LED
void 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接通,表现为低电平,值为0
ledMark = OFF_STATUS;
}
if(ledMark == OFF_STATUS)
{
ledOne = 1;
}
else
{
ledOne = 0;
}
}
}
后期学习分享将在下一篇博文中详细讲解哦,敬请期待吧