目录
一、单片机基本认知
二、IO口输入和输出
三、点亮一个LED
1、编程实现LED闪烁
2、按下按键点亮灯
3、按键的消抖
4、记录状态位来控制LED
一、单片机基本认知
单片机和PC电脑相比的话,相当于电脑的主板
单片机是一种集成电路芯片。单片机又称单片微控制器,是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。一块芯片就成了一台计算机。采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
单片机的特点是体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。
2、什么是单片机开发板
基于单片机设计一些外接电路,模块以满足学习,日常调研等工作需求
单片机命名规则:封装、LQFP44、特性、定时器、计数器、串口、看门狗、IO
3、单片机编程是什么
人类要求单片机干具体的活,有点像提前写个小纸条贴冰箱上,告诉你女朋友煮鸡蛋不加水
4、单片机执行程序怎么理解
女朋友看到女朋友,照做
5、单片机能做什么事情
IO口供电、串口数据传输等
6、肉眼可见的引脚是什么
方便人类对单片机IO口,串口接东西
7、单片机CPU怎么找到IO口
通过寻址,说白了有一些地址数据,头文件帮你做很多了
8、怎么写纸条(编程)到IO口呢
sfr"指令":用来直接描述硬件地址,小白先理解成“一组IO口”的起始地址中数据
sfr P0 = 0X80;
9、怎么找到IO具体的一个引脚
sbit"指令":对应可位寻址空间的一个位,小白先理解成"一个IO口针脚"的地址中数据
sbit led2 = P3^6
C语言的一个字节,char型就是8位
二、IO口输入和输出
1、对单片机来讲,IO口的输入(把外面的东西拿回来)输出(给东西到外面)
out:指向外输出数据
in: 指向内输入数据
89C52比较简单粗暴,关于引脚输入还是输出的功能不需要配置
sbit IFfire = P1^0;
int main(){
int io_data;
//什么情况叫输入
io_data = IFfire; //给变量赋值,就是输入-----或者理解为,这个针脚有数据啦,拿个变量来保存
if(io_data == 0){
}
//什么情况叫输出
IFfire = 1; //被给予一个值,引起IO口变化(一般1代表输出高电平、0代表输出低电平)
此时为输出,来影响外接的电路
return 0;
}
三、点亮一个LED
LED:代表二极管
KEY:代表按键
GND:就是0,代表低电平,上电状态
#include "reg52.h"
sbit ledOne = P3^7;
sbit ledTwo = P3^6;
void main()
{
ledOne = 0;
ledTwo = 0;
}
1、编程实现LED闪烁
软件延时器的使用
#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();
}
}
2、按下按键点亮灯
怎么知道sw1按键被按下
KEY1位置和GND接通,表现为低电平,值为0
怎么知道sw1按键没有被按下
KEY1位置通过上拉电阻到5V,表现为高电平,值为1
通过电路图分析得知
KEY1接到STC89C52的P2.1口,我们只要不断的检测P2.1口的值(0按下,1松开)就能知道按键是否被按下
3、按键的消抖
#include "reg52.h"
#include <intrins.h>
sbit key1 = P2^1;
sbit key2 = P2^0;
sbit ledOne = P3^7;
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1){
if(key1 == 0){ //KEY1位置和GND接通,表现为低电平,值为0
Delay500ms(); //给一个延时处理
if(key1 == 0){
ledOne = 0; //灯亮,给P3.7一个低电平
}
}
if(key2 == 0){ //KEY2位置和GND接通,表现为低电平,值为0
ledOne = 1; //灯灭,给P3.7一个高电平
}
}
}
4、记录状态位来控制LED
#include "reg52.h"
#include <intrins.h>
#define ON_STATUS 1
#define OFF_STATUS 0
sbit key1 = P2^1;
sbit key2 = P2^0;
sbit ledOne = P3^7;
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
int ledMark = OFF_STATUS;
ledOne = 1;
while(1){
if(key1 == 0){
Delay500ms();
if(key1 == 0){
ledMark = ON_STATUS; //记住,key1被按下,记住,在其他地方点灯
}
}
if(key2 == 0){
ledMark = OFF_STATUS;
}
if(ledMark == OFF_STATUS){
ledOne = 1;
}else{
ledOne = 0;
}
}
}