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模擬。
這就是模擬電路的單片機開發的一個完整過程了。嗯,看完這篇文章后你也一定也按捺不住要干個痛了吧!那就趕緊去爽♂爽的實踐一番吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容