前言
相信你在看完《扯會兒單片機開發(fā):開始》后,對單片機開發(fā)的基礎知識有了一定的了解。這一次我們來實戰(zhàn)一番,在Proteus中模擬一個單片機界的"HelloWorld" --- 點亮一個LED。
電路
在我們開始編碼之前,要先把電路畫好。我們要通過程序去控制一個LED的明滅,所以需要一個單片機和一個LED,當然,還有它們之間說不清道不明的關(guān)系。
Proteus
Proteus軟件是英國Lab Center Electronics公司出版的EDA工具軟件。它可以仿真單片機邏輯和元件之間的電路,我們這次寫好的單片機程序就是交給它來模擬運行。
我所用的是Proteus 8.4 SP0
如果你用的是早期版本,可能啟動圖標不一樣。我之前用的7.8版的Proteus會有兩個子程序,如果你的也是的話,點那個ISIS(阿拉胡阿克巴?。┚褪橇恕?p>
建項
現(xiàn)在要做的就是在Proteus中畫個可以控制LED的電路出來。
-
打開Proteus
主界面 -
建個項目
點擊主界面中的新建工程
新建第一步:輸入名稱和設置路徑
在名稱
那里輸入項目名稱,在路徑
處設置項目工程文件存儲的路徑,下一步。
新建第二步:選擇原理圖
這里我們選擇默認DEFAULT
,選下一步。
新建第三步:選擇模板
選擇不創(chuàng)建PCB布板設計
,下一步。
新建第三步:選擇固件
選擇沒有固件項目
,下一步。
新建第四步:總結(jié)
點擊完成
后建項成功。
其實我也是第一次用Proteus 8,之前的版本建項步驟沒這么繁瑣,我這么說是因為我也不咋知道那些中間的設置項都能干嘛,還沒試過(我好水,這樣子自己揭露自己真的好嘛)。
開始畫電路
創(chuàng)建好項目后如下圖所示
- 列個需要的元件清單
- 單片機
- LED
- 電源
點擊左側(cè)的P
添加元件
在元器件選擇界面中,用
關(guān)鍵字
搜索我們需要的器件。我們需要一個51單片機,這個項目就選擇at89c52吧,輸入"c52"搜索。
中間那里會列出匹配的結(jié)果,你可以一個一個選擇,然后觀察右側(cè)的預覽圖來確定是不是你要的菜。你還可以在右下角那里選擇其封裝。在本項目中,我們需要
AT89C52
這道菜的DIL40
的封裝。點擊
確定
后,你的鼠標會變成一根兒筆,再點擊一下左鍵,剛才的器件就會出現(xiàn),然后就可以擺放它的位置了。然后重復剛才的操作,去找LED。
可以看到,與LED相關(guān)的元件是比較多的。這里我們選擇圖示中的那款黃色發(fā)光二極管
LED-YELLOW
(模擬的時候,效果會比較明顯)。電源的話,就要去另一個地方找了,點一下左邊欄的
終端模式
。選擇列表中的
POWER
,然后和前面一樣,把它畫出來。途中的小雨傘就是電源。
然后連接它們,畫線路。
用筆一樣的鼠標點擊那些觸角就可以將他們連接起來。連好后如下圖:
注意電源跟LED的哪個引腳連?
二極管是固定電流方向的,要按照圖中的方式連接,具體為什么就要你自己查資料了。
到這里我們的第一大步就走完了。
代碼
Keil
Keil是我們寫單片機代碼要用到的IDE,它支持匯編、C和C++的編譯,還是很不錯的。不過,沒有代碼補全。
選擇下載時,要根據(jù)你所開發(fā)的單片機選擇具體的IDE,它分為ARM、C51、C166、C251四種。你也可以裝多個,然后它們會在同一個IDE下顯示并使用。
根據(jù)我們剛才在電路板上畫的是at89c52單片機,所以我們就選用C51版本的。
建項
點擊菜單欄的Project - New μVersion Project
這里選擇你的項目工程要存儲的路徑,他不會像Visual Studio或Xcode那樣幫你為項目或解決方案自動生成文件夾,這個你要注意,你最好自己建一個項目文件夾,然后選擇它去存儲。
項目建立好后,左邊欄會顯示當前項目的文件結(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ā)的一個完整過程了。嗯,看完這篇文章后你也一定也按捺不住要干個痛了吧!那就趕緊去爽♂爽的實踐一番吧。