51单片机实战:Proteus、Keil入门及点亮一个虚拟LED

您所在的位置:网站首页 keil4怎么导入proteus 51单片机实战:Proteus、Keil入门及点亮一个虚拟LED

51单片机实战:Proteus、Keil入门及点亮一个虚拟LED

2023-12-03 04:03| 来源: 网络整理| 查看: 265

前言

相信你在看完《扯会儿单片机开发:开始》后,对单片机开发的基础知识有了一定的了解。这一次我们来实战一番,在Proteus中模拟一个单片机界的"HelloWorld" --- 点亮一个LED。

电路

在我们开始编码之前,要先把电路画好。我们要通过程序去控制一个LED的明灭,所以需要一个单片机和一个LED,当然,还有它们之间说不清道不明的关系。

Proteus

Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件。它可以仿真单片机逻辑和元件之间的电路,我们这次写好的单片机程序就是交给它来模拟运行。

Proteus 8启动画面 我所用的是Proteus 8.4 SP0 Proteus 8.4 SP0 启动图标 如果你用的是早期版本,可能启动图标不一样。我之前用的7.8版的Proteus会有两个子程序,如果你的也是的话,点那个ISIS(阿拉胡阿克巴!)就是了。

建项

现在要做的就是在Proteus中画个可以控制LED的电路出来。

打开Proteus 主界面 建个项目 点击主界面中的新建工程 新建第一步:输入名称和设置路径 在名称那里输入项目名称,在路径处设置项目工程文件存储的路径,下一步。 新建第二步:选择原理图 这里我们选择默认DEFAULT,选下一步。 新建第三步:选择模板 选择不创建PCB布板设计,下一步。 新建第三步:选择固件 选择没有固件项目,下一步。 新建第四步:总结 点击完成后建项成功。 其实我也是第一次用Proteus 8,之前的版本建项步骤没这么繁琐,我这么说是因为我也不咋知道那些中间的设置项都能干嘛,还没试过(我好水,这样子自己揭露自己真的好嘛)。 开始画电路

创建好项目后如下图所示

主编辑界面 列个需要的元件清单 单片机 LED 电源

点击左侧的P添加元件

左侧的`P` 在元器件选择界面中,用关键字搜索我们需要的器件。 元器件选择界面 我们需要一个51单片机,这个项目就选择at89c52吧,输入"c52"搜索。 "c52"的搜索结果 中间那里会列出匹配的结果,你可以一个一个选择,然后观察右侧的预览图来确定是不是你要的菜。你还可以在右下角那里选择其封装。在本项目中,我们需要AT89C52这道菜的DIL40的封装。 点击确定后,你的鼠标会变成一根儿笔,再点击一下左键,刚才的器件就会出现,然后就可以摆放它的位置了。 准备摆放 部署后 然后重复刚才的操作,去找LED。 “LED”的搜索结果 可以看到,与LED相关的元件是比较多的。这里我们选择图示中的那款黄色发光二极管LED-YELLOW(模拟的时候,效果会比较明显)。 电源的话,就要去另一个地方找了,点一下左边栏的终端模式。 image.png 选择列表中的POWER,然后和前面一样,把它画出来。 画上LED和电源 途中的小雨伞就是电源。

然后连接它们,画线路。 用笔一样的鼠标点击那些触角就可以将他们连接起来。连好后如下图:

需要的电路 注意电源跟LED的哪个引脚连? 二极管是固定电流方向的,要按照图中的方式连接,具体为什么就要你自己查资料了。

到这里我们的第一大步就走完了。

代码 Keil

Keil是我们写单片机代码要用到的IDE,它支持汇编、C和C++的编译,还是很不错的。不过,没有代码补全。

Keil μ5 的启动画面 选择下载时,要根据你所开发的单片机选择具体的IDE,它分为ARM、C51、C166、C251四种。你也可以装多个,然后它们会在同一个IDE下显示并使用。

根据我们刚才在电路板上画的是at89c52单片机,所以我们就选用C51版本的。

主界面

建项

点击菜单栏的Project - New μVersion Project

选择工程存储路径 这里选择你的项目工程要存储的路径,他不会像Visual Studio或Xcode那样帮你为项目或解决方案自动生成文件夹,这个你要注意,你最好自己建一个项目文件夹,然后选择它去存储。 项目建立好后,左边栏会显示当前项目的文件结构。然后我们新建源文件,右击Source Group,选择Add New Item to Group 'Source Group 1'。添加源文件的前提必须是在一个Group下,这里选择用它默认的Source Group,你也可以自己新建一个Group。 选择C File (.c),输入文件名,然后点击Add 新建窗口 这样我们就添加了一个源代码文件。 添加了源文件

C代码

我们要实现功能的代码如下所示。

#include sbit led = P0^1; void main() { led = 0; }

一步一步来,首先,第一行所包含的reg52.h文件中定义了52单片机基础的特殊功能寄存器和特殊功能位。其内部的介绍是:

Header file for generic 80C52 and 80C32 microcontroller.

可以通过右键reg52.h - Open ducment 打开其文件。

打开后,可以看到其源码:

/*-------------------------------------------------------------------------- REG52.H Header file for generic 80C52 and 80C32 microcontroller. Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. --------------------------------------------------------------------------*/ #ifndef __REG52_H__ #define __REG52_H__ /* BYTE Registers */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8; sfr IP = 0xB8; sfr SCON = 0x98; sfr SBUF = 0x99; /* 8052 Extensions */ sfr T2CON = 0xC8; sfr RCAP2L = 0xCA; sfr RCAP2H = 0xCB; sfr TL2 = 0xCC; sfr TH2 = 0xCD; /* BIT Registers */ /* PSW */ sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0; //8052 only /* TCON */ sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0; /* IE */ sbit EA = IE^7; sbit ET2 = IE^5; //8052 only sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0; /* IP */ sbit PT2 = IP^5; sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0; /* P3 */ sbit RD = P3^7; sbit WR = P3^6; sbit T1 = P3^5; sbit T0 = P3^4; sbit INT1 = P3^3; sbit INT0 = P3^2; sbit TXD = P3^1; sbit RXD = P3^0; /* SCON */ sbit SM0 = SCON^7; sbit SM1 = SCON^6; sbit SM2 = SCON^5; sbit REN = SCON^4; sbit TB8 = SCON^3; sbit RB8 = SCON^2; sbit TI = SCON^1; sbit RI = SCON^0; /* P1 */ sbit T2EX = P1^1; // 8052 only sbit T2 = P1^0; // 8052 only /* T2CON */ sbit TF2 = T2CON^7; sbit EXF2 = T2CON^6; sbit RCLK = T2CON^5; sbit TCLK = T2CON^4; sbit EXEN2 = T2CON^3; sbit TR2 = T2CON^2; sbit C_T2 = T2CON^1; sbit CP_RL2 = T2CON^0; #endif

可以看到,里面声明了所有基础的功能寄存器、I/O寄存器和各种功能位。 还有一点,建议大家在定义自己的头文件的时候也写上#ifndef - #define - #endif这样的结构来保持自己的头文件在全局中保持唯一而不被重复引入。

回头看源码的第二行。

sbit led = P0^1;

意思是声明一个位寻址变量,寻址到P0.1引脚。在上面P0的声明中,可以看到它的地址是0x80,这个地址是P0八个引脚起始(也就是P0.0)的地址,这个地址的高四位代表这组I/O引脚的片选地址,低四位表示其内部的位选地址。这里的led的位选地址根据亦或运算符^算出,也就是P0.1的引脚地址。 注意,位寻址变量必须在外部定义,不能在内部,sfr也一样。

最后。

void main() { led = 0; }

在主函数中执行,使led所指向的特殊功能位置低电平。因为我们之前的电路中LED一端连着电源,也就是高电平,另一端连着单片机的P0.1引脚,所以需要将P0.1置低电平,从而使电路连通。

以上,我们就完成了代码编写工作。

演示 生成HEX文件

单片机看不懂C,它只读二进制的机器码,所以我们需要Keil生成一个十六进制的HEX文件(十六进制可以说是服务于二进制的,它与二进制可以非常方便地相互转换,其主要用于存储大量的二进制。一位十六进制可以表示4位二进制)。

还是在Keil中,右击Target 1 - 选择Options for Target 1

选择Output选项卡 - 勾上Create Hex File - OK 目标设置页

编译

设置好目标生成选项后,点击左上方的Build(如图按钮)。

下方会输出编译信息 编译输出信息 我们可以从中看到:内部数据data、外部数据xdata、代码量code、编译错误和警告0 Error(s), 0Warning(s)还有编译时间Build Time Elapsed: 00:00:01的信息。 总的来说,只要0 Error(s),就说明编译通过了。

导入Proteus中的单片机

生成好的Hex文件在Keil项目目录下的Objects文件夹中。 回到Proteus中,右击at89c52(或双击)唤出设置页。

元件编辑页

点击Program File右侧的浏览按钮,选择刚才编译出来的Hex文件,然后点击确定。

看看效果

点击Proteus左下角的‘播放’按钮

播放按钮 效果 可以看到,小黄灯被我们点亮了。 MISSION COMPLETE!

结语

我们从一开始的Proteus建项、画电路,到Keil的建项、编码,再到最后的Keil编译、Proteus模拟。 这就是模拟电路的单片机开发的一个完整过程了。嗯,看完这篇文章后你也一定也按捺不住要干个痛了吧!那就赶紧去爽♂爽的实践一番吧。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3