前言
相信你在看完《扯會兒單片機(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.4 SP0
如果你用的是早期版本乔宿,可能啟動(dòng)圖標(biāo)不一樣。我之前用的7.8版的Proteus會有兩個(gè)子程序访雪,如果你的也是的話详瑞,點(diǎn)那個(gè)ISIS(阿拉胡阿克巴!)就是了臣缀。
建項(xiàng)
現(xiàn)在要做的就是在Proteus中畫個(gè)可以控制LED的電路出來坝橡。
-
打開Proteus
主界面 -
建個(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è)需要的元件清單
- 單片機(jī)
- LED
- 電源
點(diǎn)擊左側(cè)的P
添加元件
在元器件選擇界面中企锌,用
關(guān)鍵字
搜索我們需要的器件。我們需要一個(gè)51單片機(jī)招刨,這個(gè)項(xiàng)目就選擇at89c52吧霎俩,輸入"c52"搜索。
中間那里會列出匹配的結(jié)果沉眶,你可以一個(gè)一個(gè)選擇打却,然后觀察右側(cè)的預(yù)覽圖來確定是不是你要的菜。你還可以在右下角那里選擇其封裝谎倔。在本項(xiàng)目中柳击,我們需要
AT89C52
這道菜的DIL40
的封裝。點(diǎn)擊
確定
后片习,你的鼠標(biāo)會變成一根兒筆捌肴,再點(diǎn)擊一下左鍵,剛才的器件就會出現(xiàn)藕咏,然后就可以擺放它的位置了状知。然后重復(fù)剛才的操作,去找LED孽查。
可以看到饥悴,與LED相關(guān)的元件是比較多的。這里我們選擇圖示中的那款黃色發(fā)光二極管
LED-YELLOW
(模擬的時(shí)候盲再,效果會比較明顯)西设。電源的話,就要去另一個(gè)地方找了答朋,點(diǎn)一下左邊欄的
終端模式
贷揽。選擇列表中的
POWER
,然后和前面一樣梦碗,把它畫出來禽绪。途中的小雨傘就是電源蓖救。
然后連接它們,畫線路丐一。
用筆一樣的鼠標(biāo)點(diǎn)擊那些觸角就可以將他們連接起來藻糖。連好后如下圖:
注意電源跟LED的哪個(gè)引腳連?
二極管是固定電流方向的库车,要按照圖中的方式連接巨柒,具體為什么就要你自己查資料了。
到這里我們的第一大步就走完了柠衍。
代碼
Keil
Keil是我們寫單片機(jī)代碼要用到的IDE洋满,它支持匯編、C和C++的編譯珍坊,還是很不錯(cuò)的牺勾。不過,沒有代碼補(bǔ)全阵漏。
選擇下載時(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 Studio或Xcode那樣幫你為項(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
編譯
設(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í)踐一番吧她紫。