基于STC89C52RC
1、STC89C51RC/RD+系列单片机命名规则
2、封装推荐LQFP44。
3、 sfr指令
用来直接描述硬件地址,sfr P0 = 0x80;P0 = 0;(一组IO口的起始地址数据)
4、sbit指令
对应可寻址空间的一个位(一个IO口/针脚的地址数据)
5、输入输出
sbit IfFire = P1^0;
int main()
{
int io_data;
//输入
io_data = IfFire;//给变量赋值,输入(这个针脚有数据,拿个变量来保存)
//输出
IfFire = 1;//被给予一个数值,引起IO口的电压变化(1输出高电平,0输出低电平),输出,来影响外接电路
return 0;
}
6、点亮LED
在原理图中找到LED所连IO口,给IO口低电平即可点亮LED;
根据这两个图可知,LED1与P3^7相连, LED2与P3^7相连,赋值低电平即可点亮,代码如下:
#include "reg52.h"
sbit LED1 = P3^7;
sbit LED2 = P3^6;
void main()
{
//灯亮,给一个低电平即可
LED1 = 0;
LED2 = 0;
}
7、LED闪烁
一直执行while(1)循环,加入延时,代码如下:
#include "reg52.h"
sbit LED1 = P3^7;
sbit LED2 = P3^6;
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)
{
//灯亮,给低电平
LED1 = 0;
LED2 = 0;
//数数,维持低电平,灯亮,延迟
Delay500ms();
//灯灭,给高电平
LED1 = 1;
LED2 = 1;
//数数,维持高电平,灯灭,延迟
Delay500ms();
}
}
8、按键控制灯
查询法按键控制灯
·sw1被按下:KEY1位置和GND接通,变现为低电平,值为0;
·sw1没被按下:KEY1位置通过上拉电阻到5V,表现为高电平,值为1;
KEY1接到了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
{
LED1 = 0;//给低电平灯亮
}
}
}
9、两个按键控制灯
KEY1按下(KEY1位置和GND接通,变现为低电平,值为0),灯亮;
KEY2按下(KEY2位置和GND接通,变现为低电平,值为0),灯灭;
代码如下:
#include "reg52.h"
sbit KEY1 = P2^1;
sbit KEY2 = P2^0;
sbit LED1 = P3^7;
void main()
{
while(1)
{
if(KEY1 == 0)//KEY1位置和GND接通,变现为低电平,值为0
{
LED1 = 0;//给低电平灯亮
}
if(KEY2 == 0)
{
LED1 = 1;
}
}
}
10、按键的软件消抖
感觉被按下,不知道是抖动还是人为,延迟50ms再判断一次。代码如下:
#include "reg52.h"
sbit KEY1 = P2^1;
sbit KEY2 = P2^0;
sbit LED1 = P3^7;
void Delay20ms() //@11.0592MHz
{
unsigned char i, j;
i = 36;
j = 217;
do
{
while (--j);
} while (--i);
}
void main()
{
while(1)
{
if(KEY1 == 0)//KEY1位置和GND接通,变现为低电平,值为0
{
//感觉被按下,不知道是抖动还是人为,延迟50ms再判断一次。
Delay20ms();
if(KEY1 == 0)
{
LED1 = 0;//给低电平灯亮
}
}
if(KEY2 == 0)
{
LED1 = 1;
}
}
}
12、IO口翻转
#include "reg52.h"
sbit KEY1 = P2^1;
sbit LED1 = P3^7;
void Delay50ms() //@11.0592MHz
{
unsigned char i, j;
i = 90;
j = 163;
do
{
while (--j);
} while (--i);
}
void main()
{
while(1)
{
if(KEY1 == 0)//KEY1位置和GND接通,变现为低电平,值为0
{
Delay50ms();
if(KEY1 == 0)
{
LED1 = !LED1;//IO翻转
}
}
}
}
13、标志位
#include "reg52.h"
//为0和1重新定义
#define ON 1
#define OFF 0
sbit KEY1 = P2^1;
sbit KEY2 = P2^0;
sbit LED1 = P3^7;
void Delay20ms() //@11.0592MHz
{
unsigned char i, j;
i = 36;
j = 217;
do
{
while (--j);
} while (--i);
}
void main()
{
int ledMark = OFF;
LED1 = 1;
while(1)
{
if(KEY1 == 0)
{
Delay20ms();
if(KEY1 == 0)
{
ledMark = ON;//如果KEY1被按下,标志位赋值ON
}
}
if(KEY2 == 0)
{
ledMark = OFF;//如果KEY2被按下,标志位赋值OFF
}
if(ledMark == OFF)//判断标志位,如果为OFF,则灯灭,如果为ON,则灯亮
{
LED1 = 1;
}
else
{
LED1 = 0;
}
}
}