娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

51單片機編程環境的搭建及代碼編寫的方法

發布者:CelestialGarden最新更新時間:2024-03-20 來源: elecfans關鍵字:51單片機  編程環境  代碼編寫 手機看文章 掃描二維碼
隨時隨地手機看文章

1. 51單片機概述

51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。目前教科書基本都是以早期的MCS-51為原型,講解微機的原理及其接口技術的。早期的51單片機功能都較弱,需擴展rom,ram等才能組成一個較復雜的系統。而現今流行的8位51單片機都比早期芯片作了較多的功能擴展,性能強勁。生產51單片機的廠家有很多,像atmel的at80c51系列,華邦w78c051系列,宏晶stc80c51系列等,其中***宏晶stc系列51單片機在國內尤為流行。因此,筆者采用宏晶性價比較高的一款51單片機stc12c5a60s2來作開發講解。該款51單片機已經是宏昌第N代產品了,其主要特征如下:


1.1. 增強型8051 CPU,1T,單時鐘/機器周期,指令代碼完全兼容傳統8051;

1.2. 工作頻率范圍:0 - 35MHz,相當于普通8051的 0~420MHz;

1.3. 用戶應用程序空間60K字節,片上集成1280字節RAM;

1.4. 通用I/O口36個(以封裝PDIP40為例),可設置成準雙向口/弱上拉,推挽/強上拉,僅為輸入/高阻,開漏,每個I/O口驅動能力均可達到20mA,但整個芯片最大不要超過55Ma;

1.5. ISP(在系統可編程)/IAP(在應用可編程),無需專用編程器,無需專用仿真器 可通過串口(P3.0/P3.1)直接下載用戶程序。

1.6. 內部集成MAX810專用復位電路,2路PWM,8路高速10位A/D轉換(250K/S),EEPROM,看門狗,內部RC振蕩器,4個定時器,7路外部I/O口中斷等。

尤其需注意的是stc新一代的單片機都是1T單時鐘/機器周期,與課本介紹的早期51單片機是12T單周期是不一樣的,軟件實現延時時需作注意,其余擴充的特殊功能寄存器等請參考stc12c5a60s2的數據手冊。

2. 51單片機編程環境概述2.1. 代碼編譯工具

51單片機開發軟件基本無疑選用Keil C51集成開發環境。Keil C51是德國Keil Software公司(ARM公司收購了)出品的51系列兼容單片機C語言軟件開發系統,提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等,目前最新版本已經到了uVision5。這里需要說明的是,Keil C51并不完全與ANSI C一樣,Keil C51由于面向的是51單片機,為了更好地詳述51的架構,Keil C51擴展了一些獨特的關鍵字,語法描述等。如用code說明為常量放在代碼區,data說明直接尋址區的變化,sfr聲明特殊功能寄存器等。

51單片機編程環境的搭建及代碼編寫的方法

圖2.1-1

2.2. 代碼調試工具2.2.1. Keil自帶仿真調試器

Keil集成開發環境除了編譯鏈接工具外,還自帶了一個功能強大的仿真調試器。當然軟仿真是能夠看到Keil編譯后的匯編代碼,單步調試可以跟蹤各個寄存器的狀態變化,但是軟仿真是無法得到真實的外部輸入狀態的,如仿真真實開發板的按鍵輸入等。代碼調試時往往需要知道編譯器是否按照要求進行代碼的編譯處理,因此,可以讓編譯器輸出它是如何編譯,鏈接文件的,我們可以查看這些了解編譯器編譯c生成的匯編代碼,鏈接的符號,內存分配之類的信息。Keil在Target屬性中Listing列可進行設置,如C Compiler Listing選項中是c編譯器輸出選項,點上Assembly Code即輸出c編譯對應的匯編代碼,在文件.lst中。C Preprocessor Listing為c編譯器預處理輸出的信息,AssemblerListing為匯編器輸出的處理信息,LinkerListing為鏈接器輸出的處理信息(在.m51后綴文件中),這包括編譯器對內存的分配,各個函數符號等。通常編譯后的匯編代碼以及代碼的鏈接信息是可以跟蹤查看,以判斷代碼的問題所在。

2.2.2. Proteus仿真軟件

Proteus軟件是英國Lab Center Electronics公司出版的EDA工具軟件,它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。Proteus具有電路仿真功能,能仿真一些最基本電子元器件,如led,數碼管,鍵盤等,并且是能仿真51單片機代碼運行的。在這里需要說明的是,請務必不能以仿真電路的效果圖與真實的硬件開發混攪,電路仿真軟件往往都是邏輯上的電路連接,完全不能夠用來說明真實硬件開發過程。此外,Proteus仿真51單片機也會有一些邏輯的問題,例如,在硬件上真實可運行的代碼在Proteus上無法仿真達到效果,修改一下代碼順序即可。總之,對于小代碼,Proteus都是可以勝任的,如果代碼太復雜,仿真任務會達到100%,無法再進行仿真了。因此,筆者推薦對于初學者,可先用Proteus進行仿真,進行一些最基本的練習,熟悉匯編語言,51單片機狀態變化,c語言等,驗證自己在51單片機架構學習中的一些理解,代碼實現的理解。學習到一定的程度還是需要一塊51開發板進行開發練習的,畢竟仿真軟件只能仿真很少部分的外圍,也不能仿真復雜的硬件及代碼。

51單片機編程環境的搭建及代碼編寫的方法

圖2.2.2-1

2.3. 代碼燒錄工具

Keil C51編譯生成的hex文件通過STC_ISP工具,連接串口線(一般采用usb轉串口線)進行下載。代碼燒寫傳輸是通過51單片機的uart串口信號線Tx,Rx完成的,stc單片機實現isp下載是因為芯片內部有廠商的固化代碼,上電復位后是先執行固化代碼,檢測串口有無接收到特定的命令,如果有則進入下載模式,與上位機的isp下載軟件進行通信,從而把代碼下載進單片機rom區。如果沒有有效的串口下載命令,則跳轉執行真正的用戶代碼,即從0000H處開始執行代碼。

51單片機編程環境的搭建及代碼編寫的方法

圖2.3-1

3. 匯編流水燈入門代碼

筆者認為學習51單片機并不是能通過別人的例子用c語言模仿寫出類似的功能即可,必須要對自己的編碼意圖比較清晰,這樣脫離任何例程都是可以自己掌控編寫代碼。因此學習51單片機其實更準確來說是學習微機的原理以及接口技術。而微機的原理以及接口技術對于51,arm或其它架構的mcu都是通用的,通過51來學習微機原理會涉及到匯編語言,因為只有匯編語言才能直接描述51內部的工作狀態。筆者以過來人的身份推薦初學者從51微機原理,匯編學起。C語言只是簡化封裝了匯編語言的一些處理過程,學完匯編,c語言也自然會達到相應的水平。此外,對于軟件出錯調試,只能跟蹤匯編代碼,查看寄存器的狀態判斷,而想學習arm,從事更深入的嵌入式開發,匯編是必不可少的。

3.1. 硬件原理圖

8個LED連接到P0口,當短接CON2后,只要P0口對應位為0(低電平),相應的LED則被點亮。此外說明一下為什么不用P0對應位為1時點亮而用0,因為傳統51單片機I/O口是弱上拉的,高電平是輸不出大電流的(相對低電平),高電平拉電流估計是ua級,但低電平灌電流幾個ma是不成問題的。對于stc系列51單片機,I/O口是可以配置成推挽輸出的,這樣高低電平都是可以達到20ma(手冊數據)的輸出/吸收電流。

51單片機編程環境的搭建及代碼編寫的方法

圖3.1-1

3.2. 工程搭建

打開Keil C51,Project-》NewuVersion Project,保存項目后,選擇cpu為Atmel的AT89C52的51單片機,這里需要說明的是,Keil沒有stc系列的51單片機選擇,只要是51內核,在Keil下可選擇任一廠家,任一款51單片機進行代碼編寫,因為代碼都是兼容的。而不同廠商芯片之間的差異只是rom大小,ram大小,片內外設以及一些廠家特有的特殊功能寄存器的定義。這些都可以在工程中,代碼中重新定義,編譯器會老老實實按照要求編譯代碼。選擇了cpu后,會提示是否加入51的啟動代碼到工程中,由于我們編寫的是匯編語言,此處不需要,加入后啟動代碼會與我們自己的匯編代碼定義沖突。這里需要說明的是,啟動代碼是初始化c環境需要的文件,啟動代碼會設置c代碼運行時的堆棧,清零全局變量,靜態變量區等。這就是為什么我們在c文件中定義一個全局變量,默認這個變量的初始值為0(C標準)。

3.3. 代碼編寫

創建一個新文件,命名為LEDs.ASM,ASM為51匯編文件后綴,保存并加入工程。匯編的一些基本用法在代碼注釋中有說明,更多的匯編用法請google,百度。這里需要說明的是,51單片機第一條指令位置是在0H,后面相鄰的地址是分配給相應的中斷進入的,因此第一條指令往往會跳轉避開中斷向量地址區。以下代碼實現8個LED燈輪流點亮,點亮延時1s,這個匯編代碼是模仿c語言函數結構化編程的,里面可以類似認識到c編譯器大概是如何處理c函數并生成匯編的,當然編譯器匯編質量基本是無法達到人工匯編質量的。

ORG 0H ; 表示后面緊跟的那條指令的地址是 0000H

JMP Begin; 無條件跳轉到Begin處,以避免中斷向量地址

ORG 0BH ;000BH處為定時器T0的中斷處理入口

JMP T0_INT ; 未使用T0定時器中斷,只供代碼說明

T0_INT:

; 中斷發生時會自動把當前程序運行地址PC壓入棧sp

; 中斷處理完后用RETI中斷返回,從棧sp中出棧到PC返回打斷程序處

RETI

LED1 EQUP0.0 ; LED1由P0口第0位控制,以下類似

LED2 EQU P0.1

LED3 EQU P0.2

LED4 EQU P0.3

LED5 EQU P0.4

LED6 EQU P0.5

LED7 EQU P0.6

LED8 EQU P0.7

ORG 100H

Begin:

MOV P0, #0xff ;P0口輸出全1,所有LED滅

LOOP:

; R6,R7為調用函數的參數傳入,參數為16位,需2字節

; _Delay_ms對應c函數原型為void Delay_ms(intnCount)

; 共延時nCount * 1ms(12M普通8051),對于stc指令周期1T的

; 延時nCount * (1/6)ms (12M)

CLR LED1 ;直接位清0指令,清除P0口第0位,LED1亮

MOV R7, #(1000& 0xff) ; 參數為1000,普通8051延時1s

MOV R6, #((1000》》8) & 0xff) ; 16位變量


關鍵字:51單片機  編程環境  代碼編寫 引用地址:51單片機編程環境的搭建及代碼編寫的方法

上一篇:51單片機作用、功能、廠商單品詳解
下一篇:基于51單片機的多功能電子鐘萬年歷仿真設計

推薦閱讀最新更新時間:2025-06-07 23:28

8051單片機和STM32單片機的編程環境對比
單片機編程是一門實戰性的技術,程序要在單片機平臺上跑起來才能看到效果、才能積累編程經驗。在學校學習單片機課程時,可能會感覺到一直有一種脫節的感覺,因為一直沒有用武之地。其實學習單片機很簡單,第一步就是搞清楚編程環境。 入門單片機時,我們常用51型8051單片機和STM32單片機。這兩種單片機比較典型,因為學校里單片機課程是基于51單片機的,而STM32的單片機則具有較多的學習資料。下面就這兩種單片機介紹一下編程環境。 1、單片機常用的編程環境 比較流行的單片機環境有keil和IAR,這兩種環境可以覆蓋市面上90%的單片機型號,而且都提供了函數庫。根據單片機位數不同,這兩個編程環境也有不同的版本。 1.1 Keil的常用版本
[單片機]
80<font color='red'>51單片機</font>和STM32單片機的<font color='red'>編程</font><font color='red'>環境</font>對比
80C51單片機介紹
80C51單片機屬于MCS-51系列單片機,由Intel公司開發,其結構是8048的延伸,改進了8048的缺點。 增加了如乘(MUL)、除(DIV)、減(SUBB)、比較(CMP)、16位數據指針、布爾代數運算等指令,以及串行通信能力和5個中斷源。 采用40引腳雙列直插式DIP(Dual In Line Package),內有128Byte的RAM單元及4K的ROM。 80C51有兩個16位定時計數器,兩個外中斷,兩個定時計數中斷,及一個串行中斷,并有4個8位并行輸入口。 80C51內部有 時鐘電路 ,但需要石英晶體和微調電容外接,本系統中采用12MHz的晶振頻率。 由于80C51的系統性能滿足系統 數據采集 及時間精度的要求
[單片機]
51單片機】DAC0832制作信號發生器(方波,三角波,鋸齒波)
1 A/D與D/A 將模擬量轉換為數字量稱為模數轉換(A/D轉換),模擬量是連續的,比如電壓、電流等,可以連續變化的量;數字量是離散的,對應于計算機中的位,每一個位只能是0或1,是不存在中間狀態的。通過模數轉換原件將模擬量轉化為數字量輸入計算機,以便計算機進行計算、存儲等(這里說的計算機指具有cpu芯片的計算系統)。 模數轉換中運用到了微分思想。如下圖所示: 將連續的信號轉換成一系列接近的離散的值,分割的越窄,就能表現得越精確。 數模轉換(D/A轉換)與模數轉換的效果相反,是輸入控制的數字量,經過D/A轉換器輸出模擬量。 2 電路與元器件 80C51芯片是intel公司開發的MCS-51系列單片機中的經典的一種。 DAC0
[單片機]
【<font color='red'>51單片機</font>】DAC0832制作信號發生器(方波,三角波,鋸齒波)
80C51單片機中斷的編程使用方法介紹
1、單片機中斷: 找了一張 80C51 單片機的圖如下: 其中,在 P3.2、P3.3 的位置,即 12 ,13 引腳處,標有 INT0 和 INT1,那兩個引腳就是外部中斷的輸入。上面一個橫杠代表低電平有效,給 P3.2、P3.3 賦值 0,就可以運行已經寫好的中斷服務程序。具體怎么用,還要熟悉一些中斷寄存器的使用。 2、中斷寄存器: (1)、IE (Interrupt Enable):中斷允許控制寄存器 EA (IE.7):EA=0 時,所有中斷禁止(即不允許中斷) EA=1 時,各中斷的產生由個別的允許位決定 ET2 (IE.5):定時器 2 溢出中斷允許(8052 用,博主用的 STC89C54RD+ 也有) ES
[單片機]
80C<font color='red'>51單片機</font>中斷的<font color='red'>編程</font>使用方法介紹
51單片機定時器和計數器
8051單片機內部有兩個定時/計數器T0及T1,具有定時和計數兩種功能。T0及T1在計數過程中不需要CPU參與,也不影響CPU的其他工作。當計數溢出后,定時/計數器給出中斷信號,申請CPU停止當前的工作,去處理預先設定的中斷事件。 一、T1內部結構 定時器工作模式:對內部時鐘信號計數。由于時鐘頻率是定值,所以可根據計數值計算出定時時間。 計數器工作模式:是對加在T1(P3.5)引腳上的外部脈沖進行計數。 二、計數功能 計數器用于統計從TO(P3.4)和Tl(P3.5)兩個引腳輸入脈沖的負跳變數量。負跳變是指前一個機器周期采樣為高電平,后一個機器周期為低電平。每輸入一個脈沖負跳變,計數器加1。 輸入脈沖的高電平與低電平至少應保持
[單片機]
<font color='red'>51單片機</font>定時器和計數器
51單片機實現控制網卡芯片進行數據傳輸的設計
在網絡技術應用日益廣泛的今天,網絡傳輸是最經濟有效的數據傳輸方式。如何利用廉價的51單片機來控制網卡芯片進行數據傳輸,加載TCP/IP協議連接到互聯網,實現網絡通信成了眾多設計者的目標。但由于指令及資源的限制,實施過程會有許多困難。我們在設計方案中舍棄了耗費資源的高級協議,采用發送小數據包的方式以避免分段,來簡化TCP協議和UDP協議,實現互聯接入。 硬件設計與實現 系統的硬件結構框圖如圖1所示。本系統的微控制器是Winbond公司的78E58,網絡接口芯片是與NE2000系列兼容的ReaLTEk公司的RTL8019AS。RTL8019AS內置了10BASE-T收發器,外接一個隔離LPF濾波器,經RJ-45接口輸出。外部RAM
[單片機]
<font color='red'>51單片機</font>實現控制網卡芯片進行數據傳輸的設計
基于51單片機的呼出異味氣體檢測儀設計方案
本設計由STC89C52單片機電路+LCD1602液晶顯示電路+MQ-2甲烷傳感器模塊電路+MQ-3酒精傳感器模塊電路+MQ-9 CO傳感器電路+A/D采樣PCF8591電路+蜂鳴器報警電路+LED指示燈電路+按鍵電路+藍牙模塊電路+電源電路組成。 1、LCD1602液晶實時顯示當前的甲烷濃度、酒精濃度和CO濃度。 2、如果甲烷濃度或酒精濃度或CO濃度超過設定的閾值,則蜂鳴器報警,否則蜂鳴器不報警。 3、如果甲烷濃度超過設定的閾值,則紅燈亮,否則紅燈滅。 4、如果酒精濃度超過設定的閾值,則綠燈亮,否則綠燈滅。 5、如果甲CO濃度超過設定的閾值,則黃燈亮,否則黃燈滅。 6、可以通過按鍵設置煤氣濃度、酒精濃度和CO濃度的閾值。
[單片機]
基于<font color='red'>51單片機</font>的呼出異味氣體檢測儀設計方案
零基礎:學51單片機定時器
  我們學單片機是首先學的就是 led 閃爍,那是用延時程序做的,現在回想起來,這樣做不很恰當,為什么呢?我們的主程序做了燈的閃爍,就不能再干其它的事了,難道單片機只能這樣工作嗎?當然不是,我們能用定時器來實現燈的閃爍的功能。   例 1:查詢方式   ORG 0000H   AJMP START   ORG 30H   START:   MOV P1,#0FFH ;關所 燈   MOV TMOD,#00000001B ;定時/計數器 0 工作于方式 1   MOV TH0,#15H   MOV TL0,#0A0H ;即數 5536   SETB TR0 ;定時/計數器 0 開始運行   LOOP:JBC TF0,NEXT ;
[單片機]
零基礎:學<font color='red'>51單片機</font>定時器
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 扎兰屯市| 宜黄县| 澎湖县| 沁水县| 冕宁县| 马鞍山市| 洱源县| 和田市| 依兰县| 镇坪县| 河东区| 尚志市| 漳州市| 永靖县| 丰台区| 宁国市| 全南县| 抚州市| 即墨市| 安阳市| 桐梓县| 观塘区| 靖州| 丽江市| 大方县| 富顺县| 田林县| 东兴市| 黄石市| 阳春市| 唐河县| 常熟市| 蛟河市| 大宁县| 格尔木市| 若羌县| 荣昌县| 临沂市| 梅河口市| 德江县| 兴和县|