第一篇:單片機實驗報告一
南昌大學實驗報告
學生姓名:曾華兆
學號:
6110116078 專業班級:
電子163班
實驗類型:?驗證 ?綜合 ?設計?創新 實驗日期:
2018.4.17
實驗成績:
實驗一 單片機軟件實驗
(一)實驗目的
掌握51單片機keil軟件集成開發環境,能夠使用匯編語言編寫應用程序。
(二)設計要求
熟悉51單片機的keil軟件集成開發環境,使用匯編語言編寫“1+2+3+?+100”的程序。
(三)實驗原理
KeilC51軟件使用
在KeilC51集成開發環境下,建立一個工程并編輯源程序,熟悉Keil C51集成開發環境下各種菜單、命令的使用。
(四)實驗設備
電腦(軟件:Keil uVision5)
(五)實驗結果
(六)結果討論與心得體會
第一次使用Keil C51軟件,初步了解了軟件:Keil uVision5的使用方法,初步了解了Keil軟件中程序的編輯,新工程的建立運行,初步對單片機實驗進行了了解,加強了實驗動手操作能力。
(七)附錄:實驗源代碼 ORG 0000H
LJMP MAIN ORG 0050H
MAIN:MOV R3,#00H
MOV R4,#00H
MOV R5,#01H MOV R7,#64H MOV A,#00H CLR C
LOOP:MOV A,R3
ADD A,R5
MOV R3,A MOV A,R4 ADDC A,#00H MOV R4,A INC R5 DJNZ R7,LOOP MOV 50H,R3 MOV 51H,R4 SJMP $
END
第二篇:杭電單片機實驗報告一
單片機原理與應用技術實驗報告
實驗題目:
Keil軟件使用及匯編語言編程
姓名:
*
*
*
學號:
********
實驗日期:
2017
指導教師:
1.Keil軟件的簡介和使用
1.1
Keil
uVision4的簡介
最新的Keil
uVision4
IDE,旨在提高開發人員的生產力,實現更快,更有效的程序開發。
uVision4引入了靈活的窗口管理系統,能夠拖放到視圖內的任何地方,包括支持多顯示器窗口。
uVision4在μVision3
IDE的基礎上,增加了更多大眾化的功能:
·
多顯示器和靈活的窗口管理系統
·
系統瀏覽器窗口的顯示設備外設寄存器信息
·
調試還原視圖創建并保存多個調試窗口布局
·
多項目工作區簡化與眾多的項目
1.2
Keil
uVision4的使用
①,打開Keil
4應用軟件,其初始界面如下:
②、點擊菜單項“Project”下的“New
uVisionProject”,如下圖所示。
③、選擇文件夾,并輸入工程名。
④、輸入工程名并保存后會彈出選擇芯片界面
⑤、這里我們選擇Atmel公司的AT89S51單片機,選擇后,點擊“OK”,即創建完工程。
⑥、單擊點擊下圖所示圓圈圈起的部分建立一個文件。也可以點擊菜單“File”下面的“NEW”來新建一個文件。
⑦、之后輸入程序的代碼后,單擊File—Save
as,根據代碼語言的格類型,可保存為后綴為.asm(匯編語言)和.c(C語言)的文件。
⑧、單擊“Target1”前面的“+”號,并用鼠標右鍵點擊“SourceGroup1”,界面如圖10所示。在用鼠標左鍵點擊“Add
Files
to
Group
Source
Group1...”即可把剛剛的代碼文件添加到工程。最后點擊左上角的編譯按鈕即可完成編譯。之后即可進行程序的調試了。
2.實驗內容
使用匯編語言完成課本P95的(2)、(5)、(8)三道題以及一個跑馬燈程序。
2.1
P95-(2)
設內部RAM
5AH單元中有一個變量X,請編寫計算下述函數式的程序,結果存入5BH。
設計思路:顯然本題要使用分支語句,不妨使用JZ,JNB等,并通過X-10,X-15綜合判斷X處于哪個區間。
代碼如下:
ORG
0000H
JMP
START
ORG
1000H
START:
MOV
A,5AH
;直接尋址,將5AH地址上的數據X存入寄存器A
MOV
B,5AH
;直接尋址,將5AH地址上的數據X再一次存入寄存器B
SUBB
A,#0FH
;將A中數據X先減去15,初步判斷X所屬區間
JNB
ACC.7,DO3
;若A的第7位不為1(X>=15)則程序跳到DO3,否則順序執行
MOV
A,5AH
;若X比15小,再次將X存入累加器A中
CLR
C
;清零進位C
SUBB
A,#0AH
;將X減去10
JNB
ACC.7,DO1
;若A的第7位不為1,(X>=10),跳到DO1
JMP
DO2
;剩下的情況就是:X<10,跳到DO2
DO1:MOV
A,5AH
;10<=X<=15
MUL
AB
;相當于X*X,結果的低八位存入A
ADD
A,#08H
;即X*X+8→A
MOV
5BH,A
;即X*X+8→B
JMP
DONE
;跳到程序結束段
DO2:MOV
A,5AH
;X<10
MUL
AB
;X*X→A
CLR
C
;進位C清零
SUBB
A,#01H
;
X*X-1→A
MOV
5BH,A
;
X*X-1→B
JMP
DONE
;跳到程序結束段
DO3:MOV
A,#29H
;41→A
MOV
5BH,A
;41→B
JMP
DONE
;跳到程序結束段
DONE:SJMP
$
END
程序截圖:
程序結果:
①、當X=12時,Y=12*12+8=152
②、當X=8時,Y=8*8-1=63
③、當X=18時,Y=41
2.2
P95-(5)
設有兩個長度均為15的數組,分別存放在以2000H和2100H為首的存儲區中,試編程求其對應項之和,結果存放到以2200H為首的存儲區中。
設計思路:本題需要用到LOOP進行15次的求和及存放。并且由于地址過高,應采用DPTR進行訪問。
代碼如下:
ORG
0000H
JMP
START
ORG
1000H
START:
MOV
R1,#00H
;求和寄存器,初始清零
MOV
R2,#0FH
;循環次數為15次
MOV
DPL,#00H
;類似段內偏移地址地址
LOOP:
MOV
DPH,#20H
;DPTR的高八位,可理解為段地址,這里先指向第一個數組的首
;地址2000H
MOVX
A,@DPTR
;A←((DPTR))
MOV
R1,A
;R1←(A)
INC
DPH
;DPH改成指向高8位是21H的存儲區
MOVX
A,@DPTR
;A←((DPTR))
ADD
A,R1
;兩數組對應項求和
INC
DPH
;DPH改成指向高8位是22H的存儲區
MOVX
@DPTR,A
;求和結果送入上述地址區
INC
DPL
;低8位地址自增
DJNZ
R2,LOOP
;若循環次數-1后不為0,則跳轉到LOOP處進行循環
END
程序截圖:
程序結果:
首先分別在2000H和2100H存入15數,這里我都存入了1,2,3,…,14,15。
結果得到:
2.3
P95-(8)
將片外數據存儲器地址為1000H~1030H的數據塊,全部搬遷到片內RAM
30H~60H中,并將原數據塊區域全部清零。
設計思路:顯然還是得用LOOP進行搬遷,且每搬完一個就得清零原地址數據,并用DPTR訪問片外存儲器。
代碼如下:
ORG
0000H
JMP
START
ORG
1000H
START:
MOV
R1,#30
;用R1保存循環次數
30次
MOV
R0,#30H
;將地址30H存入R0中
MOV
DPTR,#1000H
;將1000H這個地址存入DPTR中
LOOP:
MOVX
A,@DPTR
;寄存器間接尋址。A←((DPTR))
MOV
@R0,A
;(R0)←A
CLR
A
;A←0
MOVX
@DPTR,A
;原地址數據清零
INC
R0
;數據的寫入地址
自增
INC
DPTR
;數據的讀取地址
自增
DJNZ
R1,LOOP
;若循環次數-1不為0,則跳轉到LOOP處進行循環
END
程序截圖:
程序結果:
先在片外存儲器1000H開始存入數據
接下來開始將數據搬遷到片內30H開始的區域中
且原地址數據依次被清零
2.4
P95-(8)
題目:設計一個6+50=56ms跑馬燈,并在P1端口顯示。
設計思路:首先我得設計一個56ms的延遲。這里已知當單片機系統的振蕩頻率為fosc=12MHz時,一個機器周期為1T=1us;執行一條DJNZ指令需要2個機器周期,執行一條NOP需要一個機器周期,執行一條MOV也是一個機器周期。
接著,再通過循環左移指令RL
A實現跑馬等效果。
代碼如下:
ORG
0000H
JMP
START
ORG
0800H
START:MOV
A,#01H
;即將0000
0001存入A,后面會將最右邊1循環左移。
SJMP
DELAY
;進入延時段起點
LOOP:
RL
A
;從此處開始跑馬燈模塊。先將A循環左移
MOV
P1,A
;將A的值賦給端口P1的8位
SJMP
DELAY
;從56ms的延遲程序段再跑一遍
DELAY:
MOV
R7,#224
;設置外循環次數224次
DLY1:
MOV
R6,#123
;設置內循環次數123次
DLY2:
DJNZ
R6,DLY2
NOP
DJNZ
R7,DLY1
;延時程序段結束,總用時(123*2+2+1+1)T*224T+2T+1T=56ms
SJMP
LOOP
SJMP
END
程序截圖:
程序結果:
初始狀態
執行一次56ms延遲后左移
再一次56ms延遲后左移
Proteus仿真截圖:
3.實驗心得
通過以上4個實驗,我學會了KEIL軟件的使用,即創建工程,創建并添加項目,編譯與調試等等。更重要的是學習了很多單片機編程方面的只是。比如用匯編語言實現數據的傳送、運算、移位等,同時還有一些簡單的程序設計,如分支程序、循環程序等等。
這些實驗使我更好的從底層了解單片機系統的運行機制,尤其的匯編語言的使用更是提高了我對各類端口、存儲器的運用水平。另一方面我也感受到匯編語言雖然十分直接,但面對大型的程序項目就顯得力不從心,所以這就體現了后期實驗使用C語言編寫的簡便性。
我想,通過更多的運用各類指令及對更多端口、元件的綜合使用,我會對變得越來越熟練,且能不斷地提升自己的邏輯思維。
第三篇:單片機實驗報告[范文模版]
實 實 驗 驗 報 報 告
實驗課程:
單片機原理及應用
班
級:
自動化 2 班
學
號:
姓
名:
教
師:
張
玲
成績:
實 驗 日 期 :
****年**月**日
實驗名稱:
實驗 1-—計數顯示器
一、實驗目得: 學習Proteus 軟件得使用,掌握單片機原理圖得繪圖方法。
二、實驗內容:
?1、繪制“計數顯示器”電路原理圖;2、利用提供得hex 文件驗證此電路得運行效果。
三、實驗要求:
提交得實驗報告中應包括:1、繪圖方法簡述,要求說明元件與電源得選取、擺放及屬性編輯,總線與標簽得畫法等內容;2、電路原理圖;3、仿真運行效果展示,要求就仿真文件加載方法及 3~4幅運行截圖進行簡要說明;4、實驗小結,說明遇到得主要問題或實驗 1 體會等.參考電路原理圖如下:
元件類別 電路符號 元件名稱 Microprocessor ICs “U1“ 80C51 Miscellaneous “X1”/12MHz CRYSTAL Capacitors “C1”~“C2”/1nF CAP Capacitors “C3”/22μF CAP—ELEC Resistors Packs “RP1“/7—100Ω RESPACK—7 Resistors “R1"/100Ω RES Optoelectronics “LED1”~“LED2” 7SEG--CAT-GRN Switches & Relays “BUT” BUTTON 1、、及 編程思路及 C51 源程序:
2、電路原理圖:
:
3、仿真運行效果展示:
4、實驗小結 :
熟悉Proteus 軟件,了解軟件得結構組成與功能;學習ISIS 模塊得使用方法,學會設置圖紙、選元件、線畫總線、修改屬性等基本操作;學會可執行文件 加載及程序仿法;理解Proteus在單片機開發中得作用,完成單片機電路原 理圖得繪制. 實驗名稱:
實驗 2——LED 指示燈循環控制
一、實驗目得 熟悉μVision3 編譯軟件、掌握 C51編程與調試方法。
二、
實驗內容 1、按照教材 P243 得圖 A、34,繪制實驗二電路原理圖; 2、編寫 C51 程序,實現 8 個 LED 燈依次點亮得功能: P0、0→P0、1→ P0、2→P0、3→ ┅ →P0、7→P0、6→P0、5→ ┅ →P0、0 得順序,無限循環,間隔約50ms; 3、觀察仿真結果,完成實驗報告。
三、
實驗要求 1、采用兩種加載并運行可執行文件得方法,即proteus獨立運行與prote
us + Keil 聯合運行,體會其中得差異與意義;2、練習采用單步、斷點以及監視窗等手段進行程序調試得方法;3、觀察仿真結果,完成實驗報告:繪制得電路原理圖、編程思路分析及 C51源程序、調試過程簡述,仿真運行效果以及實驗小結。、電路原理圖:
:
及 2、編程思路及 C51 源程序:、仿真運行效果:、實驗小結 :
通過本次實驗我熟悉 uVision3 編譯軟件了解軟件得結構組成與功能學習C51 語言得程序設計方法)學會在 uVision3中進行 C51 程序錄入、編譯、與 調試理解 Proteus 與 Keil 聯合得仿真原理實現 LED 指示燈循環控制功能。
更好得將 C 語言與 C51 語言聯系在了一起)學到得知識能準確得利用了出來。
實驗名稱:
實驗3——指示燈與數碼管得中斷控制
一、實 驗目得 掌握外部中斷得工作原理,學會中斷程序設計.二、實驗內容 1、按照教材帕圖 A、53,繪制實驗四電路原理圖;2、要求采用外部中斷原理完成本次實驗,其中按鍵 K1、K2 均設置為下降沿觸發方式,自然優先級; 3、編寫 C51 程序實現如下功能:開機后 D1滅燈,LED1黑屏,隨后單擊 K1→D1狀態反轉,單擊 K2 →LED1 從 0 開始循環顯示0~F 字符。
4、觀察仿真結果,完成實驗報告。
三、
實驗要求 提交得實驗報告中應包括:電路原理圖,外部中斷工作原理闡述(以 K1 為例說明中斷響應過程),C51 源程序(含流程圖與注釋語句),運行效果(含運行截圖
與說明),實驗小結. 1、電路原理圖 :
2、外部中斷工作原理闡述:
持續按下 K1 則 D1 將“亮→滅→亮→滅→?→亮→滅如此循環,表明實現了 K1 對應于 D1 狀態反轉這個功能;持續按下持續按 K2 則數碼顯示管依次顯 示 1-F,實現了 K2 對應于 0~F 間得數碼管加一計數顯示.
3、、及 編程思路及 C51 源 源 程序:、仿真運行效果:
5、實驗小結:
通過實驗對 Protues 有了更多得了解,同時了解到中斷系統在實際中得更好 應用。經過編程操作起來更加熟練能很快得完成繪圖,編程時也得心應手,能熟練得運用軟件找出自己所編程中得語法問題及其她問題,并以改正。
實驗名稱:
實驗4—-電子秒表顯示器
一、實 實 驗目得 掌握定時/計數器得中斷法工作原理,熟悉 C51 編程與調試方法
二、實驗要求:
1、實驗電路原理圖如教材 P260 A、65 圖所示.程序開始時顯示“00”;當1s 產生時,秒計數加1;秒計數到 59 后,自動從“00”開始。
2、采用12MHz晶振頻率,T0 定時方式 1、50ms 定時中斷法編程(1s 需要經過 20 軟循環)(流程圖與參考程序模版如下所示).//定時中斷方式實現得電子秒表
15()件文頭?(定義無符號字符型變量 t—-中斷次數計數器,并賦初值0(定義無符號字符型變量 second—-秒計數器,并賦初值 0(定義位于 ROM 區得無符號字符型數組table-—顯示字模)timer0()
(中斷函數關鍵詞){ ?()0T 閉關?(初值重裝載 0x3cb0)
()1增器數計數次斷中? {)02==t(fi??
?
// 秒1于當相,次 02斷中若?
;0=t???????? //中斷次數計數器清零 ?
;++dnoces?? ? // 零清器數計秒?
}()零清,06 到達值器數計秒若??()值示顯得 dnoces 量變出輸別分口 2P與0P?()0T動啟??} main(){
?
;]01/dnoces[elbat=0P?? // 值示顯出輸別分口 2P 與 0P?
;]01%dnoces[elbat=2P?(定義T0 定時方式 1—-TMOD)05()0LT與0HT——載加0bc3x0值初出溢 sm?()AE,0TE——化始初斷中?(啟動 T0)
(死循環)3、編程思路及C1 51 源程序: :
4、仿真運行效果:
5、實驗小結 :
本次實驗進行得比較順利,根據指導材料中提供得流程圖完成了源程序得編 寫,成功生成了、hex文件,經過仿真運行達到了預期得實驗結果.通過本次得 實驗,我更加深入得了解到單片機定時/計數功能實現得機理,通過與單片機中 斷功能得結合,可以完成更多得預期功能。但就是進過討論我也發現,程序還就是存 在很大得缺陷,想要實現更加準確實現計時功能還需綜合利用各種知識完善程 序。
第四篇:單片機實驗報告
《單片機原理及應用》
實 驗 報 告
2017—2018學年第一學期
班級: 152 專業: 電子科學與技術 姓名: 子路 學號: 教師:
實驗一:Keil C51
一、實驗目的
1、熟悉Keil C51單片機應用開發系統
2、熟悉Keil C51的調試技巧
二、實驗內容
1、安裝好了Keil軟件以后,我們打開它。打開以后界面如下:
2、我們先新建一個工程文件,點擊“Project->New Project?”菜單,如下圖:
3、選擇工程文件要存放的路徑 ,輸入工程文件名 LED, 最后單擊保存.4、在彈出的對話框中選擇 CPU 廠商及型號
5、選擇好 Atmel 公司的 AT89S52 后 , 單擊確定
6、在接著出現的對話框中選擇“是”。
7、新建一個 C51 文件 , 單擊左上角的 New File 如下圖所示:
8、保存新建的文件,單擊SAVE如下圖:
9、在出現的對話框中輸入保存文件名MAIN.C(注意后綴名必須為.C),再單擊“保存”,如下圖:
10、保存好后把此文件加入到工程中方法如下 : 用鼠標在 Source Group1 上單擊右鍵 , 然后再單擊 Add Files to Group ‘Source Group 1' 如下圖:
11、選擇要加入的文件 , 找到 MAIN.C 后 , 單擊 Add, 然后單擊 Close
12、在編輯框里輸入如下代碼:
13、到此我們完成了工程項目的建立以及文件加入工程 , 現在我們開始編譯工程如下圖所示 : 我們先單擊編譯, 如果在錯誤與警告處看到 0 Error(s)表示編譯通過:
14、生成.hex 燒寫文件,先單擊Options for Target,如圖:
15、在下圖中,我們單擊 Output, 選中 Create HEX F。再單擊“確定”
16、打開文件夾‘實驗1’,查看是否生成了HEX文件。如果沒有生成,在執行
一遍步驟10到步驟12,直到生成。
三、實驗工具(軟件、硬件等)
1、Keil
2、計算機
實驗二:Proteus軟件學習
一、實驗目的
1、了解Proteus的基本功能
2、熟悉Proteus的設計環境Preoteus ISIS及第三方編譯工具Keil
3、掌握Proteus中實現單片機系統設計與仿真的步驟與方法
二、實驗內容
設計與仿真的開發過程
Proteus強大的單方機系統設計與仿真功能,使之成為單片機系統應用開發和改進手段之一。
開發的整個過程都是在計算機上完成的,其過程一般分為三步: 1)Proteus 電路設計:在ISIS平臺上進行單片機系統電路設計、選擇元器件、接插件、連接電路和電氣現則檢查等。
2)Proteus 源程序設計和生成目標代碼文件:在ISIS平臺上或借助第三方編譯工具進行單片機系統程序設計、編輯、匯編編譯、代碼級調試,最后生成目標代碼文件(*hex)。
3)Proteus仿真:在ISIS平臺上將目標代碼文件加載到單片機系統中,由此實現系統實時交互與協同傷真。
三、實驗工具(軟件、硬件等)
1、載有Proteus的計算機一臺
實驗三:LED流水燈
一、實驗目的
1、用Keil軟件編寫程序并利用開發板仿真
2、學習LED燈工作原理
二、實驗內容
延時實現LED流水燈效果P2口八個燈作跑馬燈。采用了寄存器存中間數。
三、實驗工具(軟件、硬件等)1.載有Keil軟件的計算機一臺 2.開發板一套
四、實驗結果及分析
實驗四:靜態數碼管
一、實驗目的
1、用Keil軟件編寫程序并利用開發板仿真
2、學習靜態顯示管工作原理
二、實驗內容
靜態數碼管流動顯示0~9
二、實驗工具(軟件、硬件等)1.載有Keil軟件的計算機一臺 2.開發板一套
四、實驗結果及分析
實驗五:按鍵移位動態顯示
一、實驗目的
1、用Keil軟件編寫程序并利用開發板仿真
2、學習靜態顯示管工作原理
二、實驗內容
靜態顯示管,按鍵不同顯示不同
三、實驗工具(軟件、硬件等)1.載有Keil軟件的計算機一臺 2.開發板一套
四、實驗結果及分析
實驗六:中斷INT0+INT1
一、實驗目的
1、用Keil軟件編寫程序并利用開發板仿真
2、學習中斷INT0和INT1的工作原理
二、實驗內容
試驗數碼管上顯示外部中斷計數,用單片機腳直接控制數碼管和外部中斷使用
三、實驗工具(軟件、硬件等)1.載有Keil軟件的計算機一臺 2.開發板一套
四、實驗結果及分析
第五篇:單片機實驗報告
目錄
第一章單片機簡介....................................................2 第二章
實驗要求..................................................3 第三章實驗設備......................................................3 第四章實驗安排......................................................4 第五章實驗內容......................................................4
LED燈實驗.......................................................4 步進馬達試驗....................................................5 獨立按鍵控制LED實驗............................................7 矩陣鍵盤實驗....................................................9 靜態數碼管實驗.................................................12 動態數碼管實驗.................................................14 NE555脈沖發生器實驗(定時/計數器).............................16 RS232串口通信實驗(接收與發送)..................................21 第六章收獲體會.....................................................25
單片機實驗報告
第一章單片機簡介
單片機也被稱為微控制器(Microcontroller),是因為它最早被用在工業控制領域。單片機由芯片內僅有CPU的專用處理器發展而來。最早的設計理念是通過將大量外圍設備和CPU集成在一個芯片中,使計算機系統更小,更容易集成進復雜的而對體積要求嚴格的控制設備當中。INTEL的Z80是最早按照這種思想設計出的處理器,從此以后,單片機和專用處理器的發展便分道揚鑣。單片機是靠程序運行的,并且可以修改。通過不同的程序實現不同的功能,尤其是特殊的獨特的一些功能,這是別的器件需要費很大力氣才能做到的,有些則是花大力氣也很難做到的。一個不是很復雜的功能要是用美國50年代開發的74系列,或者60年代的CD4000系列這些純硬件來搞定的話,電路一定是一塊大PCB板!但是如果要是用美國70年代成功投放市場的系列單片機,結果就會有天壤之別!只因為單片機的通過你編寫的程序可以實現高智能,高效率,以及高可靠性!
單片機誕生于20世紀70年代末,經歷了SCM、MCU、SoC三大階段。
1.SCM即單片微型計算機(Single Chip Microcomputer)階段,主要是尋求最佳的單片形態嵌入式系統的最佳體系結構?!皠撔履J健鲍@得成功,奠定了SCM與通用計算機完全不同的發展道路。在開創嵌入式系統獨立發展道路上,Intel公司功不可沒。
2.MCU即微控制器(Micro Controller Unit)階段,主要的技術發展方向是:不斷擴展滿足嵌入式應用時,對象系統要求的各種外圍電路與接口電路,突顯其對象的智能化控制能力。它所涉及的領域都與對象系統相關,因此,發展MCU的重任不可避免地落在電氣、電子技術廠家。從這一角度來看,Intel逐漸淡出MCU的發展也有其客觀因素。在發展MCU方面,最著名的廠家當數Philips公司。
Philips公司以其在嵌入式應用方面的巨大優勢,將MCS-51從單片微型計算機迅速發展到微控制器。因此,當我們回顧嵌入式系統發展道路時,不要忘記Intel和Philips的歷史功績。
3.單片機是嵌入式系統的獨立發展之路,向MCU階段發展的重要因素,就是尋求
單片機實驗報告
應用系統在芯片上的最大化解決;因此,專用單片機的發展自然形成了SoC化趨勢。隨著微電子技術、IC設計、EDA工具的發展,基于SoC的單片機應用系統設計會有較大的發展。因此,對單片機的理解可以從單片微型計算機、單片微控制器延伸到單片應用系統。
MCS51系列微控制器應用廣泛,在家電、汽車甚至航空等領域都有其活躍的身影。然而,普通51系列微控制器內部資源有限,像我用Proteus構建微控制器虛擬實驗室選用的AT89C52只有三個定時器、一個全雙工的串行口和中斷控制,并且其數據處理能力有限,不適合對大量數據進行復雜分析和運算。
因此,在不重新選型(可選用SoC)的前提下,為實現我們所需要的功能,就需要進行外圍擴展。針對微控制器的特點,我們首先考慮串行擴展,因為微控制器的I/O引腳有限,并行擴展一則外圍芯片面積比較大,二則對抑制EMI不利。
第二章 實驗要求
1.學習Keil C51集成開發工具的操作及調試程序的方法,包括:仿真調試與脫機運行間的切換方法
2.熟悉TD-51單片機系統板及實驗系統的結構及使用
3.進行MCS51單片機指令系統軟件編程設計與硬件接口功能設
4. 學習并掌握Keil C51軟件聯機進行單片機接口電路的設計與編程調試
5.完成指定MCS51單片機綜合設計題
第三章實驗設備
1.HC600S-51單片機開發板 2.Keil C51 3.普中自動下載軟件
第四章 實驗安排
1.LED燈實驗
單片機實驗報告
2.步進馬達試驗
3.獨立按鍵控制LED實驗 4.矩陣鍵盤實驗 5.靜態數碼管實驗 6.動態數碼管實驗
7.NE555脈沖發生器實驗(定時/計數器)8.RS232串口通信實驗(接收與發送)
第五章 實驗內容
一、LED燈實驗
1.基本要求
利用位移循環指令實現LED燈的閃爍 2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖
4.電路原理圖
單片機實驗報告
5.程序
#include
main(){unsigned int i;while(1)
{for(i=0,P0=1;i<4;i++){d(500);P0=(P0<<2);}}}
二、步進馬達試驗
1.基本要求
編程實現馬達的正反轉,調速等功能 2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖(圖一)
單片機實驗報告
圖一 圖二
4.電路原理圖
上圖圖二 5.程序
#include “reg52.h” #define speed 2 sbit PH1 = P1^0;
//定義管腳 sbit PH2 = P1^1;sbit I01 = P1^2;sbit I11 = P1^3;sbit I02 = P1^4;sbit I12 = P1^5;
void delay(int time);
void Go(){ //A
PH1 = 0;//PH1為0 則A線圈為反向電流
I01 = 0;I11 = 0;
//以最大電流輸出
PH2 = 0;//PH2為0 則B線圈為反向電流
I02 = 1;I12 = 1;
//輸出0 delay(speed);//圈為反向電流
I01 = 1;//輸出0 I11 = 1;
PH2 = 1;//PH2為1 則B線圈為正向電流
I02 = 0;//以最大電流輸出
I12 = 0;
delay(speed);//B PH1 = 1;
//PH1為1 則A線圈為
正向電流
I01 = 0;
//以最大電流輸出
I11 = 0;
PH2 = 1;//PH2為1 則B線圈為正
向電流
I02 = 1;//輸出0 I12 = 1;
delay(speed);
PH1 = 1;
//PH1為1 則A線圈為正向電流
I01 = 1;I11 = 1;
PH2 = 0;
//PH2為0 則B線圈為反向電流
I02 = 0;I12 = 0;delay(speed);}
void delay(int time){
int i,j;
for(j=0;j <= time;j++)
for(i =0;i <= 120;i++);}
void main(){
while(1)
{
Go();//步進電機運行
} }
單片機實驗報告
三、獨立按鍵控制LED實驗
1.基本要求
通過編程控制8個獨立按鍵分別控制8個LED燈的開關 2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖(圖一)
圖一 圖二
4.電路原理圖 上圖圖二 5.程序
#include
P1口
#define uchar unsigned char #define uint unsigned int
void Delayms(unsigned int c);
//延時10ms uchar Key_Scan();void main(void){
unsigned char ledValue, keyNum;
ledValue = 0x01;
while(1)
{
keyNum = Key_Scan();//掃描鍵
盤
switch(keyNum)
{
case(0xFE):
//返回按
鍵K1的數據
ledValue = 0x01;
break;
單片機實驗報告
case(0xFD):
ledValue = 0x02;
break;case(0xFB):
ledValue = 0x04;
break;case(0xF7):
ledValue = 0x08;
break;case(0xEF):
ledValue = 0x10;
break;case(0xDF):
ledValue = 0x20;
break;case(0xBF):
ledValue = 0x40;
break;case(0x7F):
ledValue = 0x80;
//返回按鍵K2的數據
//返回按鍵K3的數據
//返回按鍵K4的數據
//返回按鍵K5的數據
//返回按鍵K6的數據
//返回按鍵K7的數據
//返回按鍵K8的數據
break;default:
break;
}
GPIO_LED = ledValue;//點亮LED燈
}
}
uchar Key_Scan(void)//鍵盤掃描函數 { uchar i,n=0xff;
if(P1==0xff)goto Scan_r;//無鍵按
下,返回
goto Scan_r;Scan_1:
while(P1!=0xff);//等待鍵釋放
Delayms(10);Scan_r:
return n;}
void Delayms(uint x){
uint n;
for(;x>0;x--)
{
for(n=0;n<123;n++)
{;}
} }
四、矩陣鍵盤實驗
1.基本要求
編程由16個矩陣按鍵控制數碼管顯示相應的數值 2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。
3.接線圖
單片機實驗報告
見下圖圖一
圖一 圖二
4.電路原理圖
見上圖圖二 5.程序
#include
uchar ScanKey(void);void Delayms(uint x);main(){ unsigned char ledValue;uchar i;ledValue = 0x01;loop: i = ScanKey();
switch(i)
{ case 0xee:
ledValue = ~0x3F;
break;
case 0xde:
ledValue = ~0x06;
break;
case 0xbe:
ledValue = ~0x5B;
break;
case 0x7e:
ledValue = ~0x4F;
break;
case 0xed:
ledValue = ~0x66;
break;
case 0xdd:
ledValue = ~0x6D;
break;
單片機實驗報告
case 0xbd:
ledValue = ~0x7D;
break;
case 0x7d:
ledValue = ~0x07;
break;
case 0xeb:
ledValue = ~0x7F;
break;
case 0xdb:
ledValue = ~0x6F;
break;
case 0xbb:
ledValue = ~0x77;
break;
case 0x7b:
ledValue = ~0x7C;
break;
case 0xe7:
ledValue = ~0x39;
break;
case 0xd7:
ledValue = ~0x5E;
break;
case 0xb7:
ledValue = ~0x79;
break;
case 0x77:
ledValue = ~0x71;
break;
}
GPIO_LED = ledValue;i=0;goto loop;}
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
uchar ScanKey(void)//鍵盤掃描函數 { uchar i,n=0xff;
P1=0xf0;
if(P1==0xf0)goto Scan_r;//無鍵按下,返回
for(i=0,P1=0xfe;i<4;i++)
{ if((P1&0xf0)!=0xf0)
{ Delayms(10);
if((P1&0xf0)!=0xf0)
{ n=
P1;
goto
Scan_1;}
}
P1=(P1<<1)+1;
//掃描下
一行
} goto Scan_r;Scan_1:
單片機實驗報告
P1=0xf0;while((P1&0xf0)!=0xf0);//等待鍵
釋放
Delayms(10);
Scan_r:
P1=0xff;return n;} }
五、靜態數碼管實驗
1.基本要求
編程使數碼管顯示字符0-F 2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線框圖(圖一)
圖一
單片機實驗報告
圖二
4.電路原理圖
見上圖圖二 5.程序
#include
{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D, ~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};main(){
unsigned int LedNumVal;//定義變量 while(1)
{
// 將字模送到P0口顯示
LedNumVal++;
P0 = LED7Code[LedNumVal%16];
Delayms(1000);
//調用延時程序
}
}
單片機實驗報告
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
六、動態數碼管實驗
1.基本要求
編程實現8個數碼管的動態掃描。通過P22、P23、P24控制3-8譯碼器來對數碼管進行位選,通過P0口經過573的驅動控制數碼管的段選,通過P13控制573的使能端,為低電平時573才會有輸出。2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖(圖一)
圖一 圖二
單片機實驗報告
圖三
4.電路原理圖
見上圖圖
二、圖三 5.程序
#define uint unsigned int void Dsplay();void Delayms(uint x);uchar mDS[6];uchar code cDsCode[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main(){ uchar i;
for(i=0;i<6;i++)mDS[i]=i+1;
loop:
Dsplay();
goto loop;}
void Dsplay()//動態掃描顯示
{uchar i;
for(i=0,P2=0x01;i<6;i++)
{ P1=cDsCode[mDS[i]];//輸出段
Delayms(1000);
P2=P2<<1;
//選通下一位
}
P2=0x00;
//關閉位選通 }
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
七、NE555脈沖發生器實驗(定時/計數器)
1.基本要求
2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖
4.電路原理圖
5.程序
#include
CYMOMETER
”};uchar code EN_CHAR2[16]={“FREQ:
HZ”};
單片機實驗報告
void TIMER_Configuration();//初始化定時器 ulong Freq;
//用來存放要顯示的頻率值 ulong TimeCount;//用于計算1S鐘的
void main(){ uchar i, freqValue[6];
LcdInit();TIMER_Configuration();for(i=0;i<16;i++){
LcdWriteData(EN_CHAR1[i]);}
LcdWriteCom(0xc0);//第二行顯示
for(i=0;i<16;i++){
LcdWriteData(EN_CHAR2[i]);}
while(1){
if(TR0==0)
//當計數器停下的時候,表明計數完畢
{
Freq = Freq + TL1;
//讀取TL的值
Freq = Freq +(TH1 * 256);//讀取TH的值
LcdWriteCom(0xc8);
//--求頻率的個十百千萬十萬位--//
freqValue[0]='0'+Freq%1000000/100000;
freqValue[1]='0'+Freq%100000/10000;
freqValue[2]='0'+Freq%10000/1000;
freqValue[3]='0'+Freq%1000/100;
freqValue[4]='0'+Freq%100/10;
freqValue[5]='0'+Freq%10;
for(i=0;i<5;i++)//從最高位開始查找不為0的數開始顯示(最低位為0顯示0)
{
if(freqValue[i]==0x30)
{
freqValue[i]=0x20;//若為0則賦值空格鍵
}
else
單片機實驗報告
{
break;
}
}
for(i=0;i<6;i++)
{
LcdWriteData(freqValue[i]);
}
Freq=0;//將計算的頻率清零
TH1=0;//將計數器的值清零
TL1=0;
TR0=1;//開啟定時器
TR1=1;//開啟計數器
} } }
void TIMER_Configuration(){ TMOD=0x51;TH0=0x3C;TL0=0xB0;ET0=1;ET1=1;EA=1;TR0=1;TR1=1;} void Timer0()interrupt 1 { TimeCount++;if(TimeCount==20)//計時到1S {
TR0=0;
TR1=0;
TimeCount=0;
}
//--12MHZ設置定時50ms的初值--// TH0=0x3C;TL0=0xB0;} void Timer1()interrupt 3 {
單片機實驗報告
//--進入一次中斷,表明計數到了65536--// Freq=Freq+65536;
}
#include“lcd.h”
void Lcd1602_Delay1ms(uint c)
//誤差 0us {
uchar a,b;for(;c>0;c--){
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
} #ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時 void LcdWriteCom(uchar com)
//寫入命令 { LCD1602_E = 0;
//使能
LCD1602_RS = 0;
//選擇發送命令
LCD1602_RW = 0;
//選擇寫入
LCD1602_DATAPINS = com;
//放入命令
Lcd1602_Delay1ms(1);//等待數據穩定
LCD1602_E = 1;
//寫入時序
Lcd1602_Delay1ms(5);
//保持時間
LCD1602_E = 0;} #else
void LcdWriteCom(uchar com)
//寫入命令 { LCD1602_E = 0;//使能清零
LCD1602_RS = 0;//選擇寫入命令
LCD1602_RW = 0;//選擇寫入
LCD1602_DATAPINS = com;// Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);
單片機實驗報告
LCD1602_DATAPINS = com << 4;//發送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS
void LcdWriteData(uchar dat)
//寫入數據 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;//選擇輸入數據
LCD1602_RW = 0;//選擇寫入
LCD1602_DATAPINS = dat;//寫入數據
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
//寫入時序
Lcd1602_Delay1ms(5);
//保持時間
LCD1602_E = 0;} #else void LcdWriteData(uchar dat)
//寫入數據 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;
//選擇寫入數據
LCD1602_RW = 0;
//選擇寫入
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//寫入低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x38);//開顯示
單片機實驗報告
LcdWriteCom(0x0c);//開顯示不顯示光標
LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//設置數據指針起點 } #else void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x32);//將8位總線轉為4位總線
LcdWriteCom(0x28);//在四位線下的初始化
LcdWriteCom(0x0c);//開顯示不顯示光標
LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//設置數據指針起點 } #endif
八、RS232串口通信實驗(接收與發送)
1.基本要求
a.通過實驗了解串口的基本原理及使用,理解并掌握對串口進行初始化; b.使用串口調試助手(Baud 9600、數據位
8、停止位
1、效驗位無)做為上位機來做收發試驗;
c.利用串口調試助手中字符串輸入進行數據發送,接受窗口顯示收到的數據。2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖
單片機實驗報告
4.電路原理圖
5.程序
#include
LcdWriteData(ChCode[i]);} UsartConfiguration();while(1){
if(RI == 1)
//查看是否接收到數據
{
receiveData = SBUF;//讀取數據
單片機實驗報告
RI = 0;
//清除標志位
LcdWriteCom(0xC0);
LcdWriteData('0' +(receiveData / 100));
// 百位
LcdWriteData('0' +(receiveData % 100 / 10));// 十位
LcdWriteData('0' +(receiveData % 10));
// 個位
} } } void UsartConfiguration(){ SCON=0X50;
//設置為工作方式1 TMOD=0X20;//設置計數器工作方式2 PCON=0X80;
//波特率加倍
TH1=0XF3;
//計數器初始值設置,注意波特率是4800的TL1=0XF3;TR1=1;
//打開計數器 }
#include“lcd.h”
void Lcd1602_Delay1ms(uint c)
//誤差 0us {
uchar a,b;for(;c>0;c--){
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
} #ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時 void LcdWriteCom(uchar com)
//寫入命令 { LCD1602_E = 0;
//使能
LCD1602_RS = 0;
//選擇發送命令
LCD1602_RW = 0;
//選擇寫入
LCD1602_DATAPINS = com;
//放入命令
Lcd1602_Delay1ms(1);//等待數據穩定
LCD1602_E = 1;
//寫入時序
單片機實驗報告
Lcd1602_Delay1ms(5);
//保持時間
LCD1602_E = 0;} #else
void LcdWriteCom(uchar com)
//寫入命令 { LCD1602_E = 0;//使能清零
LCD1602_RS = 0;//選擇寫入命令
LCD1602_RW = 0;//選擇寫入
LCD1602_DATAPINS = com;Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com << 4;//發送低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat)
//寫入數據 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;//選擇輸入數據
LCD1602_RW = 0;//選擇寫入
LCD1602_DATAPINS = dat;//寫入數據
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//寫入時序
Lcd1602_Delay1ms(5);
//保持時間
LCD1602_E = 0;} #else void LcdWriteData(uchar dat)
//寫入數據 { LCD1602_E = 0;
//使能清零
LCD1602_RS = 1;
//選擇寫入數據
LCD1602_RW = 0;//選擇寫入
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//寫入時序
Lcd1602_Delay1ms(5);
單片機實驗報告
LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//寫入低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif
#ifndef LCD1602_4PINS void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x38);//開顯示
LcdWriteCom(0x0c);//開顯示不顯示光標
LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//設置數據指針起點 } #else void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x32);//將8位總線轉為4位總線
LcdWriteCom(0x28);//在四位線下的初始化
LcdWriteCom(0x0c);//開顯示不顯示光標
LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//設置數據指針起點 } #endif
單片機實驗報告
第六章 收獲體會
本次微控制器綜合設計基本上使用了所選微控制器的所有資源,進一步熟悉和加深了對中斷、定時器和串行通信的理解和使用。我覺得軟件實驗就是讓我們初學者熟悉keil的使用,然后復習下匯編的思想和掌握程序的流程,所以軟件實驗可以很快的完成,并且慢慢熟悉調試的強大功能。硬件設計中,仿真讓我很有感觸,感覺蠻好玩的,可以摒棄麻煩的實驗硬件自己在寢室玩而且不受硬件狀態的限制,即便出錯了也不會損壞。當然更重要的是這種好習慣,仿真完后再去在實驗板上驗證會比直接要來的確切而且便捷,至少不要老是去插拔線。在做實驗中在同學指導下我試用C語言來編寫程序,確實發現比匯編語言容易編寫也容易理解,以前的實驗還是有參考資料的習慣,現在什么都開始自己寫感覺還是很有成就感的,當然這是基于程序本身就那么幾行很容易編寫,也不是說參考不好??偠灾?,這學期的單片機實驗還是收獲頗豐的。相信在以后的實驗學習實踐工作中都會有個潛移默化的作用的。