大家好啊! 我是何同学。这一期开始我将从零开始教你学习51单片机,并且我将按照51单片机→32单片机→freerots操作系统→Linux驱动的学习线路,出一个完整的教程,同时有需要学习资料的可以私信我,或者留言邮箱,我将免费提供给大家!
目录
一、什么是单片机
(1)单片机-MCU:
由CPU、RAM、ROM、定时器、中断系统、寄存器等构成。
RAM-随机存储器,数据存储空间,掉电丢失
ROM-只读存储器,程序存储空间,掉电不丢失
SFR-特殊功能寄存器
以普中开发板举例,ROM大小为8K,RAM大小为512字节
(2)单片机内部架构图
①系统内部结构框图
②系统组成图
③引脚封装图
(注意芯片引脚位置,芯片上边有缺口处,正视从左顺时针数第40脚为VCC,切记不要装反!!!)
(3)组成单片机最小系统
- 电源电路:主流单片机电源有3.3V和5V两个标准,也叫VCC或者VDD,图中单片机20引脚和40引脚就是电源电源,中间的C21为电容,主要起保护、稳定电路 的作用,上电的一瞬间电容相当于我们水管龙头,起到缓冲保护电路;电路运行时,电容像水池一样,进入电容的电流可以想象为往水池注水,进入电路的电流相当于从水池排水,这样无论输入的电流怎么变化,经过电容后进入电路的电流都是稳定的。(这里不清楚的话可以百度下电容的作用)
- 晶振电路:晶振电路的作用是为单片机提供基准时钟信号,可以理解为人的心跳,代码能在单片机上能跑起来就是因为它,就好像人的血液也是通过每次次心跳传输到全身一样;旁边有两个电容,这里的电容是起到起振作用和稳定作用。
- 复位电路:RST是单片机复位引脚,复位也分为3种情况:手动复位、上电复位和程序自动复位,复位的意思是让代码从头开始运行。
/***********************
❤️上电复位的意思是,单片机运行时,突然被断电了,RAM区某些数据还没被擦除,但是我们想让程序从第一条执行,这时就要上电复位;
❤️手动复位的意思,可以理解为重启电脑,按下复位键复位,让程序从头开始运行;
❤️程序自动复位,主要是程序跑飞或者死机触发,一般为单片机内部看门狗模块,看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或 低电平 ),一旦单片机由于干扰造成程序跑飞后而陷入某一 程序段 进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个 复位信号 ,使单片机发生复位
**************************/
二、开始愉快的点灯了
1、点灯的准备工作,建立keil工程文件,步骤如下:
(1)建立工程文件夹
(2)点完第一步后,会进入到一个文件夹,此时需要调整保存路径,方便日后开发所有程序可以放在一起,我这里是在F盘提前新建了一个“单片机开发板学习资料的文件夹”,在这个文件夹下,又增加了一个叫“1-1.点亮LED”的文件夹,后面关于这个工程的所有程序都会在里面,不然你建立第二个工程放进来就乱了,大家可以看下我这个层级关系。
(3)给工程起工程名
(4)选对应芯片
(5)建立代码区
(6)代码区加入工程中
进去后,点击这个main文件,点击ADD就可以了
(7)到这里,工程就建立好了,可以编写代码了
2、LED基础知识
- 图号:
LED也叫发光二极管,要区分正负极才可以亮,如上图所示区分即可。
这里我们要根据开发板看原理图,如下:
图1.LED原理图
图2.单片机引脚图局部
LED要正极接正极,负极接负极才能亮,图1中D1到D8代表LED,左边正极都接到VCC,所以是共阳极接法,反之共阴极就是负极接在一起,最右边以P开头的字母代表单片机的端口,这种是云线标法,LED的负极我们要接低电平,才能点亮它,所以对应的单片机端口要输出低电平,输出高电平就不亮了;结合图2,单片机P2.7这个引脚引出的P27接的是图1的D8,如果P2.7输出低电平,D8的LED 就被点亮。
三、代码实战
(1)写法1:
#include <REGX52.H> //包含相关寄存器的头文件
void main() //主函数入口,程序从这里进来运行
{
while(1) //一个循环条件,永远为真
{
P2=0xFE; /*写P2口,注意要大写,0xFE是16进制数据,
这里根据开发板原理图写*/
}
}
因为P2.0到P2.7这8个口对应的是LED的端口,假设要让D1这个LED亮,就要这个端口输出低电压,及P2.0端口为0,其他端口均为1,及1 1 1 1 1 1 1 0,转化为16进制,即为FE,所以第7条语句这样写。
(2)写法2:
#include <REGX52.H>
sbit LED_OUT=P2^1; //把P2.1这个口定义为LED输出口
void main( )
{
while(1)
{
LED_OUT=0; //让定义的LED输出口输出低电压
}
}
这种写法一定要会!!!实际开发多以这种写法,首先这种写法可读性很高,能让别人读懂你的程序,其次也方便后期修改程序,现在是P2.1这个端口输出低电压,如果我想让别的端口输出低电压,可以直接修改这条语句。
最后就是编译生成helix文件,烧录到单片机里观察实验现象即可。
值得一提的是,编译后信息输出窗口如图
其中date-代表所占RAM字节数,code-代表所占ROM字节数
备注:部分图片或者名词解释可能来源于互联网,如有侵权请联系我修改,谢谢!