课程特点
- 无需开发板
- 0基础教学
- 软件硬件双修
- 辅助入门
本课程面对纯小白,因此会对各个新出现的知识点在实例基础上进行详细讲解,有相关知识的可以直接跳过。课程涉及protues基本操作、原理图设计、数电模电、kell使用、C语言基本内容,所有涉及知识都将建立在实例的基础上放心食用。
食用教程
- 详细目录,随时跳过已知部分;
- 全小白按步骤全程跟学;
- 有开发板的交叉理解开发板的原理图与我们设计的原理图
本次实验内容
设计一个AT89C51控制的LED灯,实现用程序点亮或者熄灭LED灯。熟悉使用protues和keil软件的基本操作,包括工程建立,原理图设计,程序编写等。
目录
课程特点
本次实验内容
软件准备
protues基本操作
新建工程
绘制AT89C51最小系统的原理图
电源电路
晶振电路
晶振的基本概念
无源晶振电路的设计
晶振电路的绘制
复位电路
复位电路的作用
按键复位电路设计
上电复位电路设计
绘制复位电路
外设电路
IO口介绍
LED灯设计思路
绘制外设电路
keli
新建工程
工程设置
新建c语言文件
新建头文件
编程
原理图逻辑分析
程序编写
编译
protues验证
软件准备
- protues
- keil C51
版本说明:
电脑版本:作者使用的是WIN10,但这并不代表WIN11不能用,具体软件版本可能会不一样,但关系不大,自己电脑能用就行,核心内容大差不差。
protues的版本作者用的是v8.15,推荐使用近10年以内即可,功能大差不差。注意不要太老也不要太新,太老的可能系统不契合,特别是win11,太新的不稳定,bug多。
keil的版本:keil可以直接从keil官网下载,需要注意的是一定一定选择C51这个版本。
因为电脑的差异性和系统的差异性,这里不提供安装教程,同学们可以在CSDN上搜索适合自己的安装教程即可,这两个软件安装还是比较简单的。
安装教程推荐:
keil C51https://blog.csdn.net/weixin_41995541/article/details/107447912
protues8.15安装教程https://blog.csdn.net/m0_67742803/article/details/129488383
protues基本操作
小白可读,其他人可跳过;
新建工程
- 双击打开软件:
- 新建工程
- 更改工程名,及其路径(路径选择一个自己能找到的就行,但是建议新建文件夹统一管理)
- 一直进行下一步即可,最后会进入到原理图界面
- 点击左侧第二个黄色图标(选择元件模式),然后点击P,进入库中选择元器件
- 搜索元器件,双击选中,选完点击确定
常用的元器件名:元器件 原理图库名 AT89C51 AT89C51 电容 CAP 电阻 RES 晶振 CRYSTAL 开关 SWITCH 蓝色LED LED-BULU
绘制AT89C51最小系统的原理图
最小系统原理图包括以下几个部分:
- 电源电路
- 晶振电路
- 复位电路
电源电路
电源电路用于电路板所有模块的供电,其设计需要依据所有元器件的具体情况设计,其涉及多个内容,在protues中拥有自带的电源供电网络系统,不需要进行设计。
如果读者需要相关设计过程,可以在评论区留言或者私信。
每当电路板进行增减外设时都需要修改电源电路,因此在这里我就不单独设计了,如果有需要作者会单独出一期电源电路设计思路。
电网配置
protues自带三个电源,分别是VCC/VDD的+5V电源、GND的0V电源和VEE的-5V电源。
1.菜单栏找到设计->配置供电网
2. 在这里可以看到自带的3个电源,我们现在不需要任何操作,只要记得电网配置在这里
晶振电路
晶振的基本概念
晶振的作用
晶振是单片机工作的心脏,和我们的心脏一样,晶振电路会提供源源不断的周期信号,一般为正弦波。
晶振的作用是为系统提供基本的时钟信号,通常一个系统共用一个晶振,便于各部分保持同步。简单来说就像音乐节拍一样,晶振提供这个节拍,系统的所有指令都根据节拍的律动去执行,使得系统协调统一。
晶振工作原理
晶振一般是石英晶体谐振器,它是利用石英晶体的压电效应制成的一种谐振器件。当在晶片两极外加电压后,晶体会产生变形;反之,如外力使晶片变形,则两极上金属片又会产生电压。这种机械振动的振幅通常比较小,但其振动频率则很稳定。当外加交变电压的频率与晶片的固有频率(由晶片的尺寸决定)相等时,机械振动的幅度将急剧增加,这种现象称为压电谐振。
晶振的分类
晶振可分为有源晶振和无源晶振。非常好理解,区别就是加不加电压源。
有源晶振有四个引脚,两个引脚加直流电,一个引脚输出时钟,一个引脚悬空;有源晶振内部集成震荡电路,加入电源之后可以自身震动;
无源晶振只有两个引脚,分别为频率输入和输出引脚,没有正反之分,无源晶振不能自己起振,需要依靠时钟电路才能产生震荡信号。
无源晶振电路的设计
所有硬件设计都需要依靠相应的设计手册为基本,在此基础上进行设计。我们查看AT89C51的数据手册可以看到无源晶振的电路形式为:
因此该电路的核心为:
- 选择合适的晶振频率
- 选择合适的外部负载电容
AT89C51的常见频率选择可以是:6MHZ 11.0582MHZ 12MHZ 24MHZ,其中晶振频率越高抗干扰性越低,但运行速度越快,在这里我们选择11.0582MHZ的晶振,这个频率特别适用于需要精确波特率的串行通信应用,因为它能够准确地划分成常见的波特率值,同时其速度和抗干扰性也居中,综合考虑其更合适
外部负载电容一般来说22pF,需要通过外部匹配电容来调整,但在要求不高的情况下可以直接使用手册推荐值:
我们常用石英晶体晶振,因此这里我们可以直接选用30pF的电容。
晶振电路的绘制
我们开始在protues中进行操作,首先学会调用元器件:点击左侧元件模式->点击需要调用的元器件->在右侧原理图空白处单击:
1.我们依次调出两个电容和一个晶振和一个AT89C51芯片
2.在左侧的终端模式选择地,点击空白处调出地
3.修改元件值 ,双击元器件,进入属性修改界面
将电容改为30pF
将晶振改为11.0582MHZ
连线,连连看会吧。
【注意】如果要删除连线,需要选中该线然后点击DEL按键,切记不是backspace建,一定是DEL。要选中线,可以框选,或者在选择模式下点击线,在元件模式下直接点很容易认为你想连线
复位电路
复位电路的作用
复位电路目的就是为了让芯片恢复到初始状态,从初始态开始工作。简单理解是全部程序从头开始走一遍(不完全是,新手简单理解)。
复位电路兼顾上电复位和人工按键复位两种功能。我们可以查看一下手册的描述如下:
因此我们要在上电时和按下按键时给RST引脚两个机械周期以上的高电平。不知道两个机械周期是什么意思,没关系这个时间很短,所以只需要给一点时间就行。
按键复位电路设计
而且在其他情况下要保持RST引脚为低电平,因此RST在正常情况下应该接地,同时按下按键就为高电平。
正常新手可能就这样设计了:
显然这是有问题的,因为按下按键电源接地了,相当于电源短路,既不能拉高RST引脚电平,而且会让这条电源电路直接废了。但是思路是没问题的,只不过这里不能让其短路,所以我们可以加个电阻去防止其短路,这里有两条分路,我们电阻加哪里呢?思考一下!
如果我们只是在1加上电阻,则RST引脚直接接地,电压一直为0无法被拉高;
如果只是在2加上电阻,那么相当于电源直接接到RST,引脚虽然被拉高,但电流可能会很大,而芯片的所有引脚都有输入输出电压和电流的要求.
因此我们应该选用分压限流的方法去做这个
分压接法既能限流,又能在按下时拉高RST引脚电压
但我们还需要解决一个问题,就是上电复位,如何实现上电复位呢?
上电复位电路设计
上电的时候这条路有用,平时这条路相当于断路。也就是是电路出现突变是有用,这不难可以联想到储能元件,电容或者电感;但我们电感在稳定时是通路,所以不合适,电容在稳定时相当于断路。因此我们可以并一个电容上去。
上电复位原理
上电时电源通过,C3与R2回路给电容C3充电加给RST一个短暂的高电平信号。这个时间取决于电容C的充电时间,充电时间越长,复位时间越长。
电容的选择
-
典型值:对于AT89C51单片机,常用的电容值为10uF。这个值能够确保在上电时,RST引脚能够保持足够的高电平时间,以满足单片机复位的要求。
-
计算依据:电容的充电时间与RC时间常数有关。根据公式t=RC×ln[(V1−V0)/(V1−Vt)]t=RC×ln[(V1−V0)/(V1−Vt)],其中V0为电容上的初始电压值,V1为电容最终可充到或放到的电压值,Vt为t时刻电容上的电压值。为了确保复位信号有效,通常要求RST引脚的高电平持续时间大于两个机器周期(约24个振荡周期)。
-
实际应用:在实际应用中,由于电容两端电压不能突变,因此在系统上电时,电容会开始充电,导致RST引脚出现一个持续的高电平。这个高电平的持续时间由RC电路决定,因此选择合适的电容值至关重要。
电阻的选择
-
典型值:对于AT89C51单片机,R1常用的电阻值为220Ω,R2常用的电阻值为1kΩ。这个值与22uF的电容配合使用,可以形成典型的RC复位电路。
-
计算依据:电阻R2的值需要与电容的值相匹配,以确保RC时间常数满足复位要求。根据上述公式,电阻的值会影响电容的充电速度,从而影响RST引脚高电平的持续时间。电阻R1的值需要与R2组成的分压电路,以及RST引脚输入电路限制相匹配。
-
实际应用:在实际应用中,电阻不仅起到限流作用,还与电容一起决定了复位电路的稳定性和可靠性。如果电阻值过小,可能会导致电容充电过快,无法满足复位时间要求;如果电阻值过大,则可能导致充电时间过长,影响系统的启动速度。
综上所述,对于AT89C51单片机的复位电路,建议选择10uF的电容和220Ω和1kΩ的电阻作为典型值。当然,在实际应用中,可以根据具体的系统要求和工作环境进行适当的调整。
绘制复位电路
1.调用一个地 一个电源 两个电阻 一个电容,电容电阻在元件模式
2.地和电源在终端模式,地(GROUND),电源(POWER)
外设电路
IO口介绍
外设电路一般用IO口进行控制,我们先了解一下51单片机的IO口,查看手册可以获得以下消息
P0口
P1口
P2口
P3口
51单片机的P0~P3口分别代表8位IO口;通过手册的信息我们可以知道,P0是漏极开路型双向IO口;而P1~P3是内部上拉电阻双向IO口。双向IO口说明该IO口可以用于输入或者输出两种用途。接下来简单讲一下漏极开路和内部上拉电阻。
如果详细将漏极开路和内部上拉的话需要耗费大量的时间,这里只针对该IO口简单讲一下在这里的实际作用。
漏极开路:漏极开路指的是场效应管的漏极与外部电路断开,即漏极不连接任何电路元件或电源。不知道什么是场效应管和不知道什么是漏极没关系,在这里的意思就是,该IO口为1时为开路高阻态模式;IO口为0时,IO口电压拉低接地。
内部上拉:内部上拉是指在电路内部集成了一个上拉电阻,该电阻连接到电源电压,用于将输出节点保持在高电平状态。在这里的意思就是,IO口为1时为高电平;IO口为0时为低电平。
漏极开路一般用于更大驱动电流的场合;P3口有第二功能;因此P1和P2口可供我们选择,P2在访问外部拓展内存时有用,因此我们优先使用P1口。
LED灯设计思路
灯我们再熟悉不过了,初高中物理就有相关内容,对于一个直流的灯,只需要两端街上合适的电源就行,这个合适往往是电压和电流合适,尽量在额定电压和额定电流的左右。
我们先将LED调出来,双击查看其属性,可以看到额定电压和额定电流
我们可以看到我们的额定电压是2.2V,额定电流是10mA,因此我们尽可能保持其工作在额定的环境中。
我们知道的是电网在电源有+5V,同时51单片机的引脚高电平也是+5V;另一方面LED是一个发光二极管,属于单向导通。
P1口为内部上拉双向IO口,可作输入也可作为输出。因此我们的LED灯设计就有两个方向,外部电源供电,IO口作为开关控制;或者由IO口供电,控制LED灯的亮灭。
设计时,是否由外部电源供电主要是取决于外设所需功率,就像LED灯这种低功率电器,可以直接用单片机供电,但对于大功率电器而言IO口功率明显不足,只能依靠外部供电。
在这里我们直接用IO口供电,既直接将LED正极接到IO口。此时IO口电压为5V,明显高于额定电压,因此需要串联一个电阻去分压,同时因为LED额定电流是10mA,所以电阻的阻值为:
绘制外设电路
1.调出LED 地和电阻(右击元器件可以旋转哦)
2.双击电阻设置阻值为280
3.连连看,将LED正极接到P1.0
keli
注意,因为工作需要作者使用的软件是集合了keil C51 C251 arm三种,因此会与你们的有一点差距,但可以忽略不影响。
新建工程
1.双击打开keil
2.菜单栏点击project->new uvision project
3.选择工程路径(建议建立单独文件夹储存工程,并且该文件夹你要能找到,这点非常关键)输入工程名称
4.选择芯片,搜索AT89C51,选择并确定
5.如果还有弹窗,点击ok即可
工程设置
1.点击魔法棒
2.点击output,勾选creade HEX_File,这个非常重要,hex文件是储存单片机固件16进制文本文件。
新建c语言文件
1.点击新建并点击保存
2.命名,注意后缀为.c
新建头文件
1.点击新建并点击保存
命名,注意名字与上一个C语言文件名一样,后缀为h
2.将C语言文件添加到文件夹,双击分组选择刚刚建的C语言文件
3.看一下左边添加到就行,不要一直点,左边添加到了就行
编程
原理图逻辑分析
所有的程序都是以硬件为基础,因此我们在编写程序之前,需要通过原理图就行逻辑分析,确认编程思路。
同学们买了板子的就知道,它们功能丰富的同时原理图也相对复杂,对初学者很不友好。初学者需要一个容易接受的过程。这也是作者做这个课程的初衷。
我们上面已经完成了原理图的简单绘制,现在我们来分析一下:
上述原理图中,一共三个电路,其中晶振电路和复位电路是51单片机最小系统的必备电路,与编程无关。因此我们只需要分析外设LED电路这部分,这一部分也很简单,只需要P1.0输出高电平就行。
在正式编程之前,你们可以点击一下protues左下角的仿真开始按钮:
这个时候你会发现LED是亮的,因为P1.0默认是高电平
开启仿真之后,LED已经亮了,同时有很多不同颜色的小方块,用于表示电路各个结点的逻辑电平,红色为高电平,蓝色为低电平,灰色为不确定,引脚悬空。
程序编写
现在我们通过程序控制LED灯灭,给P1.0逻辑低电平。
1.先看一下源码:
#include "reg51.h"
sbit LED=P1^0;
void main(){
while(1){
LED=0;
}
}
这就是关闭LED灯的全部代码,是不是很简单。简单解析一下代码:
2.头文件的引用
#include "reg51.h"//51单片机的头文件引用
这一行是引用51单片机的头文件,每个51单片机芯片编程都需要这个头文件(这里说的是51,其他芯片不一样);
头文件(Header File)是C语言和C++编程语言中的一种文件类型,通常以
.h
作为文件扩展名。头文件的主要作用是声明函数、宏、结构体、类、变量等,以便这些元素可以在多个源文件中共享和使用
头文件这个概念简单理解就是里面集成了很多你需要用的东西,作者喜欢比喻成武功秘籍,头文件有很多,功能都不一样,就像藏经阁里面的功法一样,要使用对应的功能时就用相应就要拿到对应的功法秘籍。例如你要计算cos等初等函数,就需要引用数学的功法:
#include "math.h"//数学计算头文件
51头文件的部分内容:
上面声明了我们要用的P0~P3口及其它寄存器
3.引脚定义
sbit LED=P1^0;
各个符合解析:
sbit //表示一个二进制数据类型,是keil C51专属的关键字 常用于IO口的定义
LED //是变量名,自己取的名字,因为P1.0是控制LED的所以作者就取了这个名字
= //赋值,将左边的值给右边
P1^0 //表示P1.0,C语言是不知道你的P1.0是什么,它是在第一行的reg51.h这个头文件中定义的
这句话的意思是定义了一个二进制的变量叫LED,同时这个LED代表的是51单片机的P1.0引脚(注意程序中写的是P1^0,P要大写,不能写成P1.0.)
4. 主函数结构
void main(){
程序执行区
}
程序都是从主函数中运行的,主函数之外的程序不会运行。
5.循环语句:
while(1){
}
while语句的格式是这样的
while(条件){
程序
}
判断语句为真时,就会一直循环执行{ }里面的程序,例如我们代码中的1会使其一直循环执行{ }里面的
6.控制语句
LED=0;
表示给LED代表的P1.0赋值0,即为低电平让LED熄灭。
编译
1.程序写完点击编译并生成文件,主要是为了生成hex文件
2.0ERROR(0错误)表示生成成功
3.出现Target not created表示生成失败
protues验证
1.双击芯片
2.选择hex文件,上面让你在建工程的时候记住,工程路径,hex文件就在工程路径下的Objects中
3.点击仿真
你看这灯是不是灭了,同学们可以自己多画几个LED,也可以更改LED的额定电压和电流,自己设计合适的电路,多动手哦!
新人作者,欢迎同学们在积极留言或者私信!