1.开发环境介绍
使用C语言,环境为keil
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用.
什么是单片机
单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用.
2.了解IO口
怎么找到IO口
sfr“指令”: 用来直接描述硬件地址;“一组IO口“的起始地址中数据 sfr P0 = 0x80;P0= 0;
怎么找到IO口具体的某个引脚
sbit“指令”:对应可位寻址空间的一个位;“一个IO口/针脚“的地址中数据 sbit led2 =P3^6;
IO口介绍
stc89c51有4组IO口,分别为P0,P1,P2,P3;stc89c52有5组IO口,分别为P0,P1,P2,P3,P4每组对应8个针脚,P4是RC系列才有,7个针脚.
![](https://i-blog.csdnimg.cn/blog_migrate/4c6850383c406f37611bfd0da3c81529.png)
3.基本IO控制
对单片机来讲,IO口的 输入(把外面东西拿回来)/输出(把里面的东西给外面)
sbit beep = P1^0;
sbit IFfire = P1^1;
int main()
{
int IO_data;
//什么情况叫做输入
IO_data = IFfire; // 给变量赋值,就是输入 —— 或者理解为,这个针脚有数据,拿个变量来保存
if(IO_data == 0){
beep =0;
}
//什么情况叫做输出
IFfire = 1; // 被给予一个数值,引起IO口电压变化(一般1输出高电平,0输出低电平),此时为输
出,来影响外接的电路
return 0;
}
4. 按键控制灯
4.1 电路图介绍
![](https://i-blog.csdnimg.cn/blog_migrate/9e9c653b0946c7039d17c4f54d6882c2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e71967ce7c4b2d5570ae6303980d2dda.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f72e791dde4fa16acfe9c520407e22d0.png)
4.2 简单亮灯
电路图中LED1(D5)的标志,是在P3的IO口组中,在P3.7引脚,编程让P3.7出低电平(0)就让D5灯完成一个串联电路,亮灯
#include "reg52.h"
sbit led1 = P3^7;
void main()
{
//灯亮,给一个P3.7低电平
led1 = 0;
}
4.3 使灯闪烁
使用延时函数,让灯每隔0.5秒亮(灭)
#include "reg52.h"
sbit led1 = 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低电平
led1 = 0;
//数数,数的期间,维持低电平,灯亮,延迟
Delay500ms();
//灯灭,给一个高电平
ledOne = 1;
//数数,数的期间,维持高电平,灯灭,延迟
Delay500ms();
}
}
4.4 通过按键控制灯
查询法按键控制灯
sw1按键被按下,KEY1位置和GND接通,表现为低电平,值为0;
sw1按键没有被按下,KEY1位置通过上拉电阻到5V,表现为高电平,值为1;
代码介绍
通过按键控制灯,SW1开,SW2关,案例中只在SW1添加软件消抖,按键按下一次,灯状态改变,通过状态位来控制LED;
具体案例如下:
#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()
{
int ledMark = OFF_STATUS;
led1 = 1;
//查询法检测,是否被按下
while(1){
if(key1 == 0)/
{
//感觉被按下,不知道是抖动还是人为,延迟50ms再判断一次
//软件消除抖动
Delay50ms();
if(key1 == 0){ //key1被按下
ledMark = ON_STATUS;
}
}
if(key2 == 0)
{
Delay50ms();
if(key2 == 0){ //key2被按下,与GND连通,为低电平,0
ledMark = OFF_STATUS;
}
}
if(ledMark == OFF_STATUS){
led1 = 1; //灭
}else{
led1 = 0; //亮
}
}
}