51單片機(jī)實(shí)戰(zhàn):Proteus剿涮、Keil入門及點(diǎn)亮一個(gè)虛擬LED

前言

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


電路

在我們開始編碼之前怀吻,要先把電路畫好瞬浓。我們要通過程序去控制一個(gè)LED的明滅,所以需要一個(gè)單片機(jī)和一個(gè)LED蓬坡,當(dāng)然瑟蜈,還有它們之間說不清道不明的關(guān)系。

Proteus

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

Proteus 8啟動(dòng)畫面

我所用的是Proteus 8.4 SP0
Proteus 8.4 SP0 啟動(dòng)圖標(biāo)

如果你用的是早期版本乔宿,可能啟動(dòng)圖標(biāo)不一樣。我之前用的7.8版的Proteus會有兩個(gè)子程序访雪,如果你的也是的話详瑞,點(diǎn)那個(gè)ISIS(阿拉胡阿克巴!)就是了臣缀。

建項(xiàng)

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

  1. 打開Proteus
    主界面
  2. 建個(gè)項(xiàng)目
    點(diǎn)擊主界面中的新建工程
    新建第一步:輸入名稱和設(shè)置路徑

    名稱那里輸入項(xiàng)目名稱,在路徑處設(shè)置項(xiàng)目工程文件存儲的路徑精置,下一步计寇。
    新建第二步:選擇原理圖

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

    選擇不創(chuàng)建PCB布板設(shè)計(jì)番宁,下一步元莫。
    新建第三步:選擇固件

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

    點(diǎn)擊完成后建項(xiàng)成功踱蠢。
    其實(shí)我也是第一次用Proteus 8,之前的版本建項(xiàng)步驟沒這么繁瑣棋电,我這么說是因?yàn)槲乙膊徽χ滥切┲虚g的設(shè)置項(xiàng)都能干嘛茎截,還沒試過(我好水,這樣子自己揭露自己真的好嘛)赶盔。

開始畫電路

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


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

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

左側(cè)的`P`

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

我們需要一個(gè)51單片機(jī)招刨,這個(gè)項(xiàng)目就選擇at89c52吧霎俩,輸入"c52"搜索。
"c52"的搜索結(jié)果

中間那里會列出匹配的結(jié)果沉眶,你可以一個(gè)一個(gè)選擇打却,然后觀察右側(cè)的預(yù)覽圖來確定是不是你要的菜。你還可以在右下角那里選擇其封裝谎倔。在本項(xiàng)目中柳击,我們需要AT89C52這道菜的DIL40的封裝。
點(diǎn)擊確定后片习,你的鼠標(biāo)會變成一根兒筆捌肴,再點(diǎn)擊一下左鍵,剛才的器件就會出現(xiàn)藕咏,然后就可以擺放它的位置了状知。
準(zhǔn)備擺放

部署后

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

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

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

途中的小雨傘就是電源蓖救。

然后連接它們,畫線路丐一。
用筆一樣的鼠標(biāo)點(diǎn)擊那些觸角就可以將他們連接起來藻糖。連好后如下圖:

需要的電路

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

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


代碼

Keil

Keil是我們寫單片機(jī)代碼要用到的IDE洋满,它支持匯編、C和C++的編譯珍坊,還是很不錯(cuò)的牺勾。不過,沒有代碼補(bǔ)全阵漏。

Keil μ5 的啟動(dòng)畫面

選擇下載時(shí)驻民,要根據(jù)你所開發(fā)的單片機(jī)選擇具體的IDE,它分為ARM履怯、C51回还、C166、C251四種叹洲。你也可以裝多個(gè)柠硕,然后它們會在同一個(gè)IDE下顯示并使用。

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

主界面

建項(xiàng)

點(diǎn)擊菜單欄的Project - New μVersion Project

選擇工程存儲路徑

這里選擇你的項(xiàng)目工程要存儲的路徑,他不會像Visual StudioXcode那樣幫你為項(xiàng)目或解決方案自動(dòng)生成文件夾民泵,這個(gè)你要注意癣丧,你最好自己建一個(gè)項(xiàng)目文件夾,然后選擇它去存儲栈妆。

項(xiàng)目建立好后胁编,左邊欄會顯示當(dāng)前項(xiàng)目的文件結(jié)構(gòu)。然后我們新建源文件签钩,右擊Source Group,選擇Add New Item to Group 'Source Group 1'坏快。添加源文件的前提必須是在一個(gè)Group下铅檩,這里選擇用它默認(rèn)的Source Group莽鸿,你也可以自己新建一個(gè)Group拾给。

選擇C File (.c)兔沃,輸入文件名蒋得,然后點(diǎn)擊Add
新建窗口

這樣我們就添加了一個(gè)源代碼文件乒疏。
添加了源文件

C代碼

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

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

一步一步來怕吴,首先窍侧,第一行所包含的reg52.h文件中定義了52單片機(jī)基礎(chǔ)的特殊功能寄存器和特殊功能位转绷。其內(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

可以看到咧织,里面聲明了所有基礎(chǔ)的功能寄存器扯旷、I/O寄存器和各種功能位。
還有一點(diǎn)毯炮,建議大家在定義自己的頭文件的時(shí)候也寫上#ifndef - #define - #endif這樣的結(jié)構(gòu)來保持自己的頭文件在全局中保持唯一而不被重復(fù)引入耸黑。

回頭看源碼的第二行。

sbit led = P0^1;

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

最后绪钥。

void main()
{
    led = 0;
}

在主函數(shù)中執(zhí)行,使led所指向的特殊功能位置低電平匣吊。因?yàn)槲覀冎暗碾娐分蠰ED一端連著電源寸潦,也就是高電平,另一端連著單片機(jī)的P0.1引腳命雀,所以需要將P0.1置低電平斩箫,從而使電路連通乘客。

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


演示

生成HEX文件

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

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


選擇Output選項(xiàng)卡 - 勾上Create Hex File - OK
目標(biāo)設(shè)置頁

編譯

設(shè)置好目標(biāo)生成選項(xiàng)后奴饮,點(diǎn)擊左上方的Build(如圖按鈕)。


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

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

導(dǎo)入Proteus中的單片機(jī)

生成好的Hex文件在Keil項(xiàng)目目錄下的Objects文件夾中完疫。
回到Proteus中债蓝,右擊at89c52(或雙擊)喚出設(shè)置頁。


元件編輯頁

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

看看效果

點(diǎn)擊Proteus左下角的‘播放’按鈕

播放按鈕

效果

可以看到,小黃燈被我們點(diǎn)亮了烟号。
MISSION COMPLETE!


結(jié)語

我們從一開始的Proteus建項(xiàng)汪拥、畫電路,到Keil的建項(xiàng)趟大、編碼铣焊,再到最后的Keil編譯、Proteus模擬叽讳。
這就是模擬電路的單片機(jī)開發(fā)的一個(gè)完整過程了坟募。嗯懈糯,看完這篇文章后你也一定也按捺不住要干個(gè)痛了吧!那就趕緊去爽♂爽的實(shí)踐一番吧她紫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屿储,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子民褂,更是在濱河造成了極大的恐慌,老刑警劉巖面殖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畜普,死亡現(xiàn)場離奇詭異群叶,居然都是意外死亡钝荡,警方通過查閱死者的電腦和手機(jī)埠通,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梁剔,“玉大人舞蔽,你說我怎么就攤上這事渗柿。” “怎么了颊亮?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵陨溅,是天一觀的道長门扇。 經(jīng)常有香客問我,道長臼寄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任铅祸,我火速辦了婚禮,結(jié)果婚禮上涡扼,老公的妹妹穿的比我還像新娘盟庞。我一直安慰自己,他們只是感情好票彪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布降铸。 她就那樣靜靜地躺著摇零,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谅畅。 梳的紋絲不亂的頭發(fā)上噪服,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天粘优,我揣著相機(jī)與錄音,去河邊找鬼邪铲。 笑死无拗,一個(gè)胖子當(dāng)著我的面吹牛英染,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搪搏,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闪金,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了囱嫩?” 一聲冷哼從身側(cè)響起墨闲,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盾鳞,沒想到半個(gè)月后瞻离,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缸兔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昂拂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抛猖。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡财著,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情售滤,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布鹿霸,位于F島的核電站秆乳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏葛闷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扣泊。 院中可真熱鬧,春花似錦评矩、人聲如沸阱飘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缰儿。三九已至散址,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞪浸,已是汗流浹背吏祸。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工犁罩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人含滴。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓谈况,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碑韵。 傳聞我的和親對象是個(gè)殘疾皇子祝闻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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