1.2.1从最基础的点LED灯开始
单片机通过寻址找到 IO口
怎么(编程)找到IO口呢:ANSI C sfr“指令”: 用来直接描述硬件地址,先理解成“一组IO口”的起始地址中数据 sfr P0 = 0x80; P0 = 0;
找到IO口的具体一个引脚呢: sbit“指令”:对应可位寻址空间的一个位,小白先理解成“一个IO口/针脚”的地址中数据 sbit led2 = P3^6 c语言的一个字节,char型就是8位
stc89c52有5组这样的输入输出口,分别为P0,P1,P2,P3每组对应8个针脚,P4是RC系列才有,7个 针脚
![](https://img-blog.csdnimg.cn/img_convert/158e11cd637d0b27e8144f3825006eec.png)
是对单片机来讲的,IO口的 输入(把外面东西拿回来)/输出(给东西给外面)89C52比较简单粗暴,关于引脚输入还是输出的功能不需要配置 ,比如:
sbit IFfire = P1^0;
int main()
{
int io_data;
//什么情况叫做输入
io_data = IFfire; // 给变量赋值,就是输入 —— 或者理解为,这个针脚有数据啦,拿个变量来
保存
if(io_data == 0){
}
//什么情况叫做输出
IFfire = 1; // 被给予一个数值,引起IO口电压变化(一般1输出高电平,0输出低电平),此时为输
出,来影响外接的电路
return 0;
}
1.1灯为什么会亮
单片机电路图,非常简单,初中知识
(原理图中标号一样代表是同一根“电线” )
简单的串联电路,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一个低电平,就能点亮灯
![](https://img-blog.csdnimg.cn/img_convert/f6541e18dcf4a100c6dff55166018b95.png)
![](https://img-blog.csdnimg.cn/img_convert/cbc685223511b93ab63942e7c95bf8ad.png)
1.2怎么样使LED灯闪烁,这个简单就是一下亮一下不亮
这里我们使用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.3按键控制LED
轮询法按键控制灯
怎么知道sw1按键被按下 KEY1位置和GND接通,表现为低电平,值为0 怎么知道sw1按键没有被按下 KEY1位置通过上拉电阻到5V,表现为高电平,值为1
![](https://img-blog.csdnimg.cn/img_convert/808525784489d6eba70c89e4bcbae776.png)
![](https://img-blog.csdnimg.cn/img_convert/5c3bd6ac0abca92dc19c76c5e73d61d5.png)
我们只要不断检测P2.1口的值(0-按下,1-松开)就知道按键是 否被按下
#include "reg52.h"
sbit key1 = P2^1;
sbit ledOne = P3^7;
按键控制灯,SW1开,SW2关,案例中只在SW1添加软件消抖
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;//灭
}
按键按下一次,灯状态改变
状态位来控制LED
}
}
按键按下一次,灯状态改变
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;
}
}
}