单片机学习总结#1:点亮第一盏LED

单片机新人的一点学习总结#1
因为要做毕业设计的原因,我买了一块51开发板回来,结果发现自己完全不会用…
看配套教程捣鼓了半天终于点亮了第一盏LED,顺便写了个流水灯程序,所以:
单片机是什么?有什么用?
最小系统是什么?P0~P3是什么东西?
跟着书写的程序为什么点不亮LED?
本文将带你走进单片机的世界

很久以前就一直听人们在讨论单片机,但那时我对单片机并有没什么概念,而且因为先入为主的原因总以为单片机就是那些机器人啊,自动化啊那些高大上的东西,结果大学里学了微机原理,汇编,单片机之后慢慢才了解到,单片机,其实也就是一块集成电路板而已。

1.什么是单片机

首先我们来聊聊什么是计算机?

来自百度:

计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。
计算机是由硬件系统(hardware system)和软件系统(software system)两部分组成的。
传统电脑系统的硬体单元一般可分为输入单元、输出单元、算术逻辑单元、控制单元及记忆单元,其中算术逻辑单元和控制单元合称中央处理单元(Center Processing Unit,CPU)。

单片机的组成?

我们平时用的电脑中,有中央处理单元CPU,记忆单元内存和硬盘,输入单元有鼠标键盘,输出单元有显示器。
把输入输出单元去掉,只保留接口,将CPU、存储器、集成到一块芯片上,这个芯片我们就称为单片机。

能给张实物图来看看不?

所以单片机到底有什么用?

做毕业设计用。

听说学单片机要学C语言?

C语言是编写单片机程序的核心语言,高效简洁,是开发单片机的首选。当然学一点汇编可以加深了解单片机的工作原理,这也是有必要的。除此之外你还需要懂得一些电路知识,在你添加各种模块的时候就需要用到了。

2.单片机最小系统

我去弄了块单片机芯片,然后呢?

单片机运行需要电源,所以我们需要做一个电源电路;为了让我们写入单片机里的程序能够稳定地运行,我们还需要做一个晶振电路;最后为了防止我们单片机发生意外出现死机之类的情况,我们还需要做一个复位电路,把这几个电路接到单片机上,就组成了我们的单片机最小系统。
当然,每种单片机都不一样,具体如何操作请参考单片机的说明书

这好麻烦,而且我要在单片机里编程那我还要做编程电路对吧?我想要简单上手。

去弄个单片机开发板吧。一般开发板都已经帮你集成好各种电路和模块,你只需要连接各个模块就能用了。

3.点亮第一盏LED

开发板我也弄回来了,然后呢?

我个人十分推崇从实践中学习的做法,所以我们先来点亮一盏LED吧。

一般开发板都会附带单片机说明书,能看到各个引脚对应的功能。

因为不同的开发板电路不同,所以你还得会看电路图,51单片机中8个I/O口P00~P07组成了P0端口,很明显下图中JP10对应的就是P0端口

因为不同的开发板电路不同,所以你还得会看电路图,例如下面的LED电路,很明显,下图中当J12中任意端子有高电平输入时,对应的LED就会亮。

因为不同的开发板电路不同,所以你还得会看电路图,很重要所以说3次,这直接决定了你如何对单片机编写程序。
如上图中的电路,我把JP10(对应P0端口)和J12连接起来,当P00~P07口输出高电平时,就能点亮对应的LED。

等等,这太快了,我表示一脸懵逼。

没事,以后会弄懂的,所以现在先看懂电路,把LED接到单片机上,我们开始写程序吧。

1
2
3
4
5
6
7
8
9
#include<reg51.h>   // 引入51单片机头文件
sbit LED = P0^0; // 给P0.0口取别名为LED

// 主函数
void main() {
while(1) {
LED = 1; // 输出高电平
}
}

等等,我还不会C语言。

左转C语言教程

reg51.h是什么?

我之前学C语言的时候见过stdio.h,有什么不同吗?
stdio标准输入输出(standard input & output)的意思,一般来说,在电脑上,标准输入就是键盘,标准输出就是屏幕,然而单片机上是没有这两样东西的,也就是说单片机没有所谓的标准输入输出,这里用的是51单片机,reg51.h则定义了51单片机的各个I/O口,例如这句sbit LED = P0^0;中,P0端口就是在reg51.h中定义的。

为什么主函数里面是个死循环?

为了不让程序继续向下执行。虽然我们写C语言的时候,程序在最后一行完结,但是在单片机中,程序会继续向下执行,没有这个死循环,程序就会运行到我们编写的代码之外,这样就会产生很多问题。

这段代码是要做什么?

从刚刚的电路图中我们可以看到,J12有8个引脚,对应8个LED,JP10也是8个引脚,对应I/O口P0.0到P0.7,我们用导线将P00与JR1相连,那么当P0.0口输出高电平,也就是执行LED = 1;时,就能点亮对应的D11。
有些电模块是输入低电平点亮LED,这个必须根据实际电路编写程序。

我可以同时操控8个LED吗?

是的,可以,但此时就不应该再用sbit LED = P0^0;,应该改成P0。reg51.h头文件中已经声明了P0,而P0^0是通过按位异或得出的一个值,因此P0可以直接使用,但P0^0需要用sbit声明。所以程序可以写成:

1
2
3
4
5
6
7
8
#include<reg51.h>

// 主函数
void main() {
while(1) {
P0 = 0xff; // 输出16进制信号ff,即2进制信号11111111,同时输出8个高电平
}
}

也可以用宏定义为P0口取别名

1
2
3
4
5
6
7
8
9
#include<reg51.h>
#define LED P0; // 给P0口取别名为LED

// 主函数
void main() {
while(1) {
LED = 0x01;
}
}

那现在我电路接了,程序也写了,要怎么把程序写入单片机里呢?

首先你需要一个叫keil的软件,他能将我们编写的C语言编译成单片机使用的十六进制文件


如何使用Keil软件编译文件

然后我们还需要一个下载软件把十六进制文件烧录到单片机里,不同的单片机需要不同的软件,51单片机常用的下载软件是STC_ISP,在这里就不做详细介绍了。