51單片機實戰(zhàn):Proteus、Keil入門及點亮一個虛擬LED

前言

相信你在看完《扯會兒單片機開發(fā):開始》后,對單片機開發(fā)的基礎知識有了一定的了解。這一次我們來實戰(zhàn)一番,在Proteus中模擬一個單片機界的"HelloWorld" --- 點亮一個LED。


電路

在我們開始編碼之前,要先把電路畫好。我們要通過程序去控制一個LED的明滅,所以需要一個單片機和一個LED,當然,還有它們之間說不清道不明的關(guān)系。

Proteus

Proteus軟件是英國Lab Center Electronics公司出版的EDA工具軟件。它可以仿真單片機邏輯和元件之間的電路,我們這次寫好的單片機程序就是交給它來模擬運行。

Proteus 8啟動畫面

我所用的是Proteus 8.4 SP0
Proteus 8.4 SP0 啟動圖標

如果你用的是早期版本,可能啟動圖標不一樣。我之前用的7.8版的Proteus會有兩個子程序,如果你的也是的話,點那個ISIS(阿拉胡阿克巴?。┚褪橇恕?p>

建項

現(xiàn)在要做的就是在Proteus中畫個可以控制LED的電路出來。

  1. 打開Proteus
    主界面
  2. 建個項目
    點擊主界面中的新建工程
    新建第一步:輸入名稱和設置路徑

    名稱那里輸入項目名稱,在路徑處設置項目工程文件存儲的路徑,下一步。
    新建第二步:選擇原理圖

    這里我們選擇默認DEFAULT,選下一步。
    新建第三步:選擇模板

    選擇不創(chuàng)建PCB布板設計,下一步。
    新建第三步:選擇固件

    選擇沒有固件項目,下一步。
    新建第四步:總結(jié)

    點擊完成后建項成功。
    其實我也是第一次用Proteus 8,之前的版本建項步驟沒這么繁瑣,我這么說是因為我也不咋知道那些中間的設置項都能干嘛,還沒試過(我好水,這樣子自己揭露自己真的好嘛)。

開始畫電路

創(chuàng)建好項目后如下圖所示


主編輯界面
  • 列個需要的元件清單
  1. 單片機
  2. LED
  3. 電源

點擊左側(cè)的P添加元件

左側(cè)的`P`

在元器件選擇界面中,用關(guān)鍵字搜索我們需要的器件。
元器件選擇界面

我們需要一個51單片機,這個項目就選擇at89c52吧,輸入"c52"搜索。
"c52"的搜索結(jié)果

中間那里會列出匹配的結(jié)果,你可以一個一個選擇,然后觀察右側(cè)的預覽圖來確定是不是你要的菜。你還可以在右下角那里選擇其封裝。在本項目中,我們需要AT89C52這道菜的DIL40的封裝。
點擊確定后,你的鼠標會變成一根兒筆,再點擊一下左鍵,剛才的器件就會出現(xiàn),然后就可以擺放它的位置了。
準備擺放

部署后

然后重復剛才的操作,去找LED。
“LED”的搜索結(jié)果

可以看到,與LED相關(guān)的元件是比較多的。這里我們選擇圖示中的那款黃色發(fā)光二極管LED-YELLOW(模擬的時候,效果會比較明顯)。
電源的話,就要去另一個地方找了,點一下左邊欄的終端模式。
image.png

選擇列表中的POWER,然后和前面一樣,把它畫出來。
畫上LED和電源

途中的小雨傘就是電源。

然后連接它們,畫線路。
用筆一樣的鼠標點擊那些觸角就可以將他們連接起來。連好后如下圖:

需要的電路

注意電源跟LED的哪個引腳連?
二極管是固定電流方向的,要按照圖中的方式連接,具體為什么就要你自己查資料了。

到這里我們的第一大步就走完了。


代碼

Keil

Keil是我們寫單片機代碼要用到的IDE,它支持匯編、C和C++的編譯,還是很不錯的。不過,沒有代碼補全。

Keil μ5 的啟動畫面

選擇下載時,要根據(jù)你所開發(fā)的單片機選擇具體的IDE,它分為ARM、C51、C166、C251四種。你也可以裝多個,然后它們會在同一個IDE下顯示并使用。

根據(jù)我們剛才在電路板上畫的是at89c52單片機,所以我們就選用C51版本的。

主界面

建項

點擊菜單欄的Project - New μVersion Project

選擇工程存儲路徑

這里選擇你的項目工程要存儲的路徑,他不會像Visual StudioXcode那樣幫你為項目或解決方案自動生成文件夾,這個你要注意,你最好自己建一個項目文件夾,然后選擇它去存儲。

項目建立好后,左邊欄會顯示當前項目的文件結(jié)構(gòu)。然后我們新建源文件,右擊Source Group,選擇Add New Item to Group 'Source Group 1'。添加源文件的前提必須是在一個Group下,這里選擇用它默認的Source Group,你也可以自己新建一個Group

選擇C File (.c),輸入文件名,然后點擊Add
新建窗口

這樣我們就添加了一個源代碼文件。
添加了源文件

C代碼

我們要實現(xiàn)功能的代碼如下所示。

#include <reg52.h>
sbit led = P0^1;
void main()
{
    led = 0;
}

一步一步來,首先,第一行所包含的reg52.h文件中定義了52單片機基礎的特殊功能寄存器和特殊功能位。其內(nèi)部的介紹是:

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這樣的結(jié)構(gòu)來保持自己的頭文件在全局中保持唯一而不被重復引入。

回頭看源碼的第二行。

sbit led = P0^1;

意思是聲明一個位尋址變量,尋址到P0.1引腳。在上面P0的聲明中,可以看到它的地址是0x80,這個地址是P0八個引腳起始(也就是P0.0)的地址,這個地址的高四位代表這組I/O引腳的片選地址,低四位表示其內(nèi)部的位選地址。這里的led的位選地址根據(jù)亦或運算符^算出,也就是P0.1的引腳地址。
注意,位尋址變量必須在外部定義,不能在內(nèi)部,sfr也一樣。

最后。

void main()
{
    led = 0;
}

在主函數(shù)中執(zhí)行,使led所指向的特殊功能位置低電平。因為我們之前的電路中LED一端連著電源,也就是高電平,另一端連著單片機的P0.1引腳,所以需要將P0.1置低電平,從而使電路連通。

以上,我們就完成了代碼編寫工作。


演示

生成HEX文件

單片機看不懂C,它只讀二進制的機器碼,所以我們需要Keil生成一個十六進制的HEX文件(十六進制可以說是服務于二進制的,它與二進制可以非常方便地相互轉(zhuǎn)換,其主要用于存儲大量的二進制。一位十六進制可以表示4位二進制)。

還是在Keil中,右擊Target 1 - 選擇Options for Target 1


選擇Output選項卡 - 勾上Create Hex File - OK
目標設置頁

編譯

設置好目標生成選項后,點擊左上方的Build(如圖按鈕)。


下方會輸出編譯信息
編譯輸出信息

我們可以從中看到:內(nèi)部數(shù)據(jù)data、外部數(shù)據(jù)xdata、代碼量code、編譯錯誤和警告0 Error(s), 0Warning(s)還有編譯時間Build Time Elapsed: 00:00:01的信息。
總的來說,只要0 Error(s),就說明編譯通過了。

導入Proteus中的單片機

生成好的Hex文件在Keil項目目錄下的Objects文件夾中。
回到Proteus中,右擊at89c52(或雙擊)喚出設置頁。


元件編輯頁

點擊Program File右側(cè)的瀏覽按鈕,選擇剛才編譯出來的Hex文件,然后點擊確定

看看效果

點擊Proteus左下角的‘播放’按鈕

播放按鈕

效果

可以看到,小黃燈被我們點亮了。
MISSION COMPLETE!


結(jié)語

我們從一開始的Proteus建項、畫電路,到Keil的建項、編碼,再到最后的Keil編譯、Proteus模擬。
這就是模擬電路的單片機開發(fā)的一個完整過程了。嗯,看完這篇文章后你也一定也按捺不住要干個痛了吧!那就趕緊去爽♂爽的實踐一番吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內(nèi)容