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

前言

相信你在看完《扯会儿单片机开发:开始》后,对单片机开发的基础知识有了一定的了解。这一次我们来实战一番,在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的电路出来。

  1. 打开Proteus
    主界面
  2. 建个项目
    点击主界面中的新建工程
    新建第一步:输入名称和设置路径

    名称那里输入项目名称,在路径处设置项目工程文件存储的路径,下一步。
    新建第二步:选择原理图

    这里我们选择默认DEFAULT,选下一步。
    新建第三步:选择模板

    选择不创建PCB布板设计,下一步。
    新建第三步:选择固件

    选择没有固件项目,下一步。
    新建第四步:总结

    点击完成后建项成功。
    其实我也是第一次用Proteus 8,之前的版本建项步骤没这么繁琐,我这么说是因为我也不咋知道那些中间的设置项都能干嘛,还没试过(我好水,这样子自己揭露自己真的好嘛)。

开始画电路

创建好项目后如下图所示


主编辑界面
  • 列个需要的元件清单
  1. 单片机
  2. LED
  3. 电源

点击左侧的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 StudioXcode那样帮你为项目或解决方案自动生成文件夹,这个你要注意,你最好自己建一个项目文件夹,然后选择它去存储。

项目建立好后,左边栏会显示当前项目的文件结构。然后我们新建源文件,右击Source Group,选择Add New Item to Group 'Source Group 1'。添加源文件的前提必须是在一个Group下,这里选择用它默认的Source Group,你也可以自己新建一个Group

选择C File (.c),输入文件名,然后点击Add
新建窗口

这样我们就添加了一个源代码文件。
添加了源文件

C代码

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

#include <reg52.h>
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>打开其文件。


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

/*--------------------------------------------------------------------------
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模拟。
这就是模拟电路的单片机开发的一个完整过程了。嗯,看完这篇文章后你也一定也按捺不住要干个痛了吧!那就赶紧去爽♂爽的实践一番吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容