课程特点
- 无需开发板
- 0基础教学
- 软件硬件双修
- 辅助入门
本课程面对纯小白,因此会对各个新出现的知识点在实例基础上进行详细讲解,有相关知识的可以直接跳过。课程涉及protues基本操作、原理图设计、数电模电、kell使用、C语言基本内容,所有涉及知识都将建立在实例的基础上放心食用。
食用教程
- 详细目录,随时跳过已知部分;
- 全小白按步骤全程跟学;
- 有开发板的交叉理解开发板的原理图与我们设计的原理图
本次实验内容
设计一个AT89C51控制的LED灯,实现用程序点亮或者熄灭LED灯。熟悉使用protues和keil软件的基本操作,包括工程建立,原理图设计,程序编写等。
目录
软件准备
- 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的额定电压和电流,自己设计合适的电路,多动手哦!
新人作者,欢迎同学们在积极留言或者私信!
标签:LED,引脚,51,晶振,单片机,电路,protues,IO,电容 From: https://blog.csdn.net/weixin_58498967/article/details/144171509