單片機原理與應用范例6篇

前言:中文期刊網精心挑選了單片機原理與應用范文供你參考和學習,希望我們的參考范文能激發你的文章創作靈感,歡迎閱讀。

單片機原理與應用

單片機原理與應用范文1

一、考核知識點:

1、計算機的數據表示和數據運算

2、計算機的各種編碼

3、計算機的組成及工作過程

二、考核要求:

1、識記計算機的各種編碼

2、領會計算機的組成及工作過程

3、簡明應用計算機的數據表示和數據運算

第二章51單片機的硬件結構和原理

一、考核知識點:

1、單片機的發展史及各方面的應用

2、51單片機的分類和內部結構

3、單片機的引腳和功能

4、單片機工作的時序

二、考核要求:

1、識記單片機的發展史及各方面的應用

2、識記單片機的引腳和功能

3、領會單片機工作的時序

4、簡明應用51單片機的分類和內部結構

第三章51單片機指令系統

一、考核知識點:

1、單片機的尋址方式

2、單片機的指令系統

3、助記符指令和二進制代碼指令的異同

二、考核要求:

1、領會助記符指令和二進制代碼指令的異同

2、綜合應用單片機的尋址方式

3、綜合應用單片機的指令系統

第四章匯編語言程序設計

一、考核知識點:

1、偽指令

2、匯編語言設計技巧

3、匯編語言到機器語言的編譯過程

二、考核要求:

1、領會偽指令

2、簡明應用匯編語言設計技巧

3、綜合應用匯編語言到機器語言的編譯過程

第五章51單片機的中斷系統

一、考核知識點:

1、中斷基本概念

2、中斷系統的程序編制

3、中斷系統的初步應用

二、考核要求:

1、領會中斷基本概念

2、簡明應用中斷系統解決工程問題

3、綜合簡明應用中斷系統的程序編制

第六章51單片機的內部定時器/計數器及串行接口

一、考核知識點:

1、單片機內部定時器/計數器的結構及工作原理

2、定時器/計數器的程序編制

3、定時器/計數器的初步應用

4、串行口的基本概念

5、串行口的程序編制

6、串行口的初步應用

二、考核要求:

1、識記串行口的基本概念

2、領會單片機內部定時器/計數器的結構及工作原理

3、簡明應用定時器/計數器解決工程問題

4、簡明應用串行口的程序編制

5、簡明應用串行口解決工程問題

6、綜合應用定時器/計數器的程序編制

第七章單片機的系統擴展與接口技術

一、考核知識點:

1、單片機外部總線的擴展

2、外部存儲器的擴展

3、I/O接口的擴展

4、管理功能部件的擴展

5、A/D和D/A接口功能的擴展

二、考核要求:

1、識記單片機外部總線的擴展

2、識記管理功能部件的擴展

3、簡明應用A/D和D/A接口功能的擴展

4、綜合應用外部存儲器的擴展

5、綜合應用I/O接口的擴展

第八章單片機應用系統設計

一、考核知識點:

1、單片機應用系統的開發過程

2、單片機開發工具的分類和使用

3、單片機應用系統的軟件和硬件調試過程

二、考核要求:

1、識記單片機應用系統的軟件和硬件調試過程

2、領會單片機應用系統的開發過程

3、領會單片機開發工具的分類和使用

第九章單片機系統的抗干擾技術

一、考核知識點:

1、單片機干擾源與分類

2、干擾對單片機系統的影響

3、硬件抗干擾技術

4、軟件抗干擾技術

5、數字濾波

二、考核要求:

1、識記單片機干擾源與分類

2、識記干擾對單片機系統的影響

3、識記數字濾波

4、簡明應用硬件抗干擾技術

5、簡明應用軟件抗干擾技術

第十章其它單片機簡介

一、考核知識點:

1、AT89C系列單片機的特點與性能

2、其它8位單片機的特點與性能

3、16位、32位單片機的特點與性能

二、考核要求:

1、識記其它8位單片機的特點與性能

2、識記16位、32位單片機的特點與性能

3、領會AT89C系列單片機的特點與性能

《單片機原理及應用技術》考試大綱

《單片機原理及應用技術》課程是一門面向應用的專業技術課。單片機原理與應用介紹了單片機的基本知識和單片機技術的應用,其內容與工程實際緊密聯系,實用性很強,是一門在理論指導下,偏重于實際應用的課程。本課程具有實用性強、理論和實踐結合、軟硬件結合等特點。本課程圍繞使用較為廣泛的MCS-51系列單片機進行學習。本課程已成為理、工科電子類專業的一門基礎課程,這是從電子系統設計角度考慮的,它體現了電子系統設計的方法和硬件結構的變化。通過該課程的學習,要求學生掌握80C51單片機的工作原理、編程技術,掌握單片機應用系統的擴展方法和實際應用。因此,以單片機為內核,分析和設計一個簡單的計算機應用系統是我們學習本課程要達到的目的。

第一部分考試大綱

1單片機概述

本章為單片機的基本概念。

1.掌握有關單片機的基本概念、單片機的特點、單片機的應用。

2.理解單片機的總體組成。

3.了解單片微型計算機的產生、發展歷史、主要品種及系列。

2單片機結構和原理

本章以80C51單片機為例介紹了主要硬件結構和主要功能,著重掌握系統所提供的資源特性及其功能特性。

1.掌握80C51的內部結構。

2.掌握80C51單片機的存儲器組成。

3.掌握單片機并行輸入/輸出端口結構及功能。

4.了解單片機的時序概念和復位工作方式。

5.掌握單片機引腳功能

3指令系統

1.掌握指令與偽指令的正確格式。

2.掌握七種尋址方式的使用及尋址方式的含義。

3.掌握

五類指令的功能和使用,特別是傳送指令。

4.理解書中所列例題與習題。

4匯編語言程序設計舉例

本章為MCS-51的一些常用偽指令,介紹順序結構程序設計、分支結構程序設計、循環結構程序設計和子程序的設計。

1.程序設計的基本步驟、各種基本的結構化程序設計方法;讀懂較復雜的常用程序。

2.掌握數據傳送指令的編寫。

3.理解算術運算程序設計。

4.理解數碼轉換程序設計。

5.理解查表程序設計。

6.理解子程序設計和參數傳遞。

7.理解邏輯運算程序設計

5中斷系統

1.掌握有關中斷、中斷源、中斷優先級等概念。

2.掌握中斷響應過程。

3.掌握中斷優先級排列。

4.掌握中斷允許寄存器IE、中斷優先級寄存器IP各位的含義及設置。

5.掌握外部中斷的兩種觸發方式:電平觸發、邊沿觸發。

6定時/計數器

1.掌握定時器/計數器的四種工作方式及有何不同。

2.掌握TMOD和TCON中各位的含義、作用。

4.掌握不同工作方式計數初值與定時時間的關系,即能根據定時時間算出計數初值,完成定時器的初始化編程和簡單應用編程。

7串行通信

1.理解有關通信、協議的概念。

2.理解串行口的四種工作方式。

3.掌握SBUF的含義及作用。

4.了解串行口的工作原理。

5.了解SCON中每一位的含義及SMOD位的作用。

6.掌握串行通信總線RS-232C標準、RS-232C電平轉換。

7.了解RS-232C與MCS-51的接口。

8系統擴展技術

1.掌握總線、驅動、鎖存和譯碼、地址重疊的概念。

2.掌握程序存儲器的擴展:EPROM程序存儲器及其擴展方法。

3.掌握數據存儲器的擴展:靜態存儲器SRAM及其擴展方法。

4.掌握簡單I/O口的擴展。

5.掌握8255A可編程并行接口:結構、控制字、工作方式、與8255A的接口方法。

9A/D和D/A轉換器接口技術

1.掌握DAC0832與單片機的接口方法與編程。

2.掌握ADC0809與單片機的接口方法與編程。

10鍵盤/顯示接口技術

1.掌握LED顯示器結構、工作原理和顯示方式。

2.掌握鍵盤接口原理。

3.理解LED顯示器與80C51單片機接口。

4.理解鍵輸入程序設計方法。

5.了解行列式鍵盤與80C51單片機接口。

11、功率接口技術

1.掌握簡單開關量接口、光電耦合接口和繼電器接口。

2.晶閘管與故態繼電器的應用接口。

12、單片機系統設計技術

掌握單片機系統的設計、開發、調試的原則、步驟及方法。

13、實用舉例

了解一兩個典型的單片機開發應用系統的設計思想和實現方法。

14、新型單片機介紹

了解MCS-51常見8位單片機。

第二部分考試考核改革方案

一、考試考核要求

《單片機技術及應用》選擇具有代表性的、使用較為廣泛的MCS-51系列單片機進行學習(具體以80C51為例),介紹了80C51單片機的硬件組成、軟件編程及一般應用系統組成。通過本課程的學習,要求掌握80C51單片機的系統結構、指令系統、程序設計方法、系統擴展方法、單片機常用接口等應用技術。本課程的教學過程由面授輔導、自學、實驗及作業四個環節組成,因此本課程考試考核要求為:

1.作業、實驗成績與期末考試成績共同評定為課程總成績。

2.作業、實驗占課程總分的60,期末理論考試占總分的40。

為使學生不把注意力僅僅放在期末考試上,培養學生系統學習的能力,加強學生各方面能力的培養,平時、實驗課、作業、考試都納入本課程的成績評定。平時的成績包括出勤、課堂提問和隨堂測試。期末考試可以選擇筆試、口試和進行實際實驗、設計等多種形式。

二、平時成績考核要求及說明

1.每章作業按要求完成后交教師批改,完成作業80為12分(及格);所有作業均完成,且質量較好者,20分(滿分)。中間情況酌情給分。

2.每次實驗均能按照教師安排進行,實驗態度好,至少完成5個實驗且實驗報告完整,為18分(及格);能基本獨立完成6個或以上實驗,實驗報告完整、無誤,實驗質量高,30分(滿分)。中間情況酌情給分。如果實驗有創新的特點,酌情加分。

3.作業與實驗的平均分為平時成績,滿分50分。

4.課程設計單獨計算成績,考評方法見其大綱。

三、理論考試說明

1.單片機技術及應用理論考試,采用閉卷筆試形式,考試時間120分鐘。

2.期末考試試題根據教學大綱,其范圍和難度按照本方案中制訂的考試考核內容和要求確定??荚嚸}覆蓋考試大綱要求范圍。

3.期末考試試題類型有以下幾種:

①填空題;

②選擇題;

③判斷題;

④簡答題

⑤綜合應用題。

四、考試考核要求層次

按照教學大綱的要求,理論考試要求分為掌握、理解和了解三個層次。

掌握:

對于本課程的重點內容要求學生達到掌握的程度。即能夠全面、深入理解和熟練掌握所學內容,并能夠用其分析、初步設計和解答與應用相關的問題,能夠舉一反三。要求學生掌握的內容也就是考試的主要內容,在考試中所占比例約70。

理解:

對于本課程的一般內容要求學生能夠理解。即要求學生能夠較好地理解所學內容,并且對所涉及的內容能夠進行簡單分析和判斷。要求學生理解的內容也是考試的內容,在考試中所占比例約25。

了解:

對于本課程的次要內容要求學生能夠了解。要求學生了解的內容,一般是指在眼下不必進一步深入和擴展,有些也許需要學生自己今后在工作中進行深入研究。對要求了解的內容,在考試中占較小比例,不超過5。

實驗五:按鍵電路、顯示電路實驗

一、實驗目的:

1.掌握獨立式按鍵電路與矩陣式按鍵電路的設計方法。

2.掌握數碼管顯示電路的工作原理

3.掌握源程序編輯軟件UltraEdit,編譯軟件KeilC51、仿真軟件Proteus的使用方法

4.掌握硬件仿真器ME-52A的使用方法

二、實驗器材:

1.單片機實驗板

2.單片機硬件仿真器ME-51A

3.計算機

4.電源

三、實驗要求:

1.電路如圖5所示,用單片機的P3口所接的四個獨立式按鍵控制p1口流水燈花樣的方法;具體表現為:p3.0、P3.1、P3.2、P3.3四個小按鍵分別實現了四個控制:

(1)跑燈:即P1.0---1.7亮點流動:

(2)流水燈:即P1.0-1.7依次點

亮(3)交叉閃爍:即P0.0,P0.2,P0.4,P0.6和P0.1,P0.3,P0.5,P0.7輪流點亮

(4)停止;在任何狀態下按此鍵程序停止運行.

2.電路如圖6所示,用P2口所接的4×4矩陣式鍵盤作為輸入,在P1口所接的數碼管上顯示出每個按鍵的0~F序號,鍵盤的布局如下表所示:

F

E

D

C

B

A

9

8

7

6

5

4

3

2

1

四、實驗原理:

1.獨立式按鍵電路顯示如圖5所示,從圖中可看出,判斷有無鍵按下,只要檢測P3.0~P3.3相應端口的高低電平即可,若檢測有某一端口為低電平,表明該端口有按鍵按下,經延時消抖后轉去執行相應的功能子程序。若為高電平,表明無鍵按1.獨立式按鍵電路如圖5所示,下,繼續檢測。

示例程序如下:

ORG000H

LJMPSTAR1

ORG0030H

STAR1:MOVP3,#0FFH;置P3口為輸入態

JNBP3.0,FUN0;判別P3.0是否有鍵按下,是,則轉FUN0

JNBP3.1,FUN1;判別P3.1是否有鍵按下,是,則轉FUN1

JNBP3.2,FUN2;判別P3.2是否有鍵按下,是,則轉FUN2

JNBP3.3,FUN3;判別P3.3是否有鍵按下,是,則轉FUN3

JNBF0,STAR1;曾經有鍵按下F0置1

RET

圖5

FUN0:LCALLDL10MS;消岸抖動

JBP3.0,STAR1

WAITL0:JNBP3.0,WAITL0;等待鍵釋放

SETBF0

FUN01:LCALLFUN00

LCALLSTAR1

LJMPFUN01

FUN1:LCALLDL10MS;消岸抖動

JBP3.1,STAR1

WAITL1:JNBP3.1,WAITL1;等待鍵釋放

SETBF0

FUN10:LCALLFUN11

LCALLSTAR1

LJMPFUN10

FUN2:LCALLDL10MS;消岸抖動

JBP3.2,STAR1

WAITL2:JNBP3.2,WAITL2;等待鍵釋放

SETBF0

FUN20:LCALLFUN22

LCALLSTAR1

LJMPFUN20

FUN3:LCALLDL10MS;消岸抖動

JBP3.3,STAR1

WAITL3:JNBP3.3,WAITL3;等待鍵釋放

CLRF0

MOVP1,#0FFH;關顯示

LJMPSTAR1

FUN00:MOVA,#0FEH;跑燈子程序

FUN000:MOVP1,A

LCALLDL05S

JNBACC.7,OUT

RLA

AJMPFUN000

OUT:RET

FUN11:MOVA,#0FEH;流水燈子程序

FUN111:MOVP1,A

LCALLDL05S

JZOUT

RLA

ANLA,P1

AJMPFUN111

FUN22:MOVA,#0AAH;交叉點亮子程序

MOVP1,A

LCALLDL30S

CPLA

MOVP1,A

LCALLDL30S

RET

;____________;

;延時程序;

;____________;

DL512:MOVR2,#0FFH

LOOP1:DJNZR2,LOOP1

RET

DL10MS:MOVR3,#14H

LOOP2:LCALLDL512

DJNZR3,LOOP2

RET

DL05S:MOVR4,#0AH

LOOP3:LCALLDL10MS

DJNZR4,LOOP3

RET

DL30S:MOVR5,#03H

LOOP4:LCALLDL05S

DJNZR5,LOOP4

RET

END

2.矩陣式按鍵電路顯示如圖6所示。采用掃描方式進行按鍵的識別檢測,并將對應按鍵的鍵號用查表指令將對應的代碼顯示在數碼管上。

圖6

參考程序如下:

ORG0000H

LJMPSTART

ORG0030H

START:MOVSP,#60H;設置堆棧指針

SCAN:MOVR3,#0F7H;置行掃描初值

MOVR1,#00H;到TABLE表中取碼的指針

SCAN1:MOVA,R3

MOVP2,A;掃描輸出

MOVA,P2;重讀P2口狀態

MOVR4,A;暫存于R4呂中

SETBC;C=1

MOVR5,#03H;掃描4列初值

L1:RLCA;A中內容循環左移

JNCKEYIN;C=0,有鍵按下,轉消抖

INCR1;取碼指針加1

DJNZR5,L1;無鍵按下,繼續檢測

MOVA,R3;掃描下一行

SETBC

RRCA

MOVR3,A

JCSCAN1;4行是否掃描完,未完,繼續

LJMPSCAN

KEYIN:MOVR7,#10;削除抖動

D2:MOVR6,#248

DJNZR6,$

DJNZR7,D2

D3:MOVA,P2;按鍵放開否?

XRLA,R4

JZD3

MOVA,R1

MOVDPTR,#TABLE;到TABLE中取碼

MOVCA,@A DPTR

MOVP1,A

LJMPSCAN

TABLE:DB0C0H,0F9H,0A4H,0B0H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH

END

DB80H,90H,88H,83H

DB0C6H,0A1H,86H,8EH

END

五、實驗步驟:

1.運行UltraEdit-32源程序編輯軟件,輸入、編輯匯編語言源程序。

2.運行KeiluVision2源程序編譯軟件,對源程序進行編譯,得到目標代碼文件。

3.運行Proteus模擬仿真軟件,打開已繪制好的仿真電路原理圖,進行模擬仿真。

4.把硬件仿真器ME-52A與單片實驗板連接好,再用硬件仿真器進行仿真驗證。

六、實驗分析與總結

1.用仿真系統調試簡單程序結構、分支程序結構、循環程序結構、子程序結構和中斷結構的關鍵在于,如何將對程序的分析理解和開發系統提供的基本功能有機地結合起來,其前提條件是必須對源程序的作用、結構特點、運行過程與結果有較全面的認識,并能根據程序運行過程中出現的現象和結果分析并判斷產生各種故障現象的原因,再運用排除法逐一檢驗各種判斷是否準確。

2.掌握程序結構特點的基礎上,合理選擇觀測點,通過觀察在觀測點處參數及路徑的變化檢驗程序運行的結果。

3.高調試程序的效率,應對單片機開發系統所提供的幾種程序運行調試方式有

足夠的了解并能熟練地運用。例如,在調試過程中,若要觀察最終結果,則可選擇全速運行調試;若要觀察相關指令的運行結果或運行路徑的變化過程,則可選擇單步運行;若要檢查子程序的運行過程,則可選擇跟蹤運行調試;若要檢查循環程序或中斷服務程序,則可選擇斷點運行調試;若要定點檢查程序運行到某處的結果時,則可選擇快速運行到光標處調試。但實際中究竟選用哪種方法更適宜或哪幾種方法結合使用更快捷,將隨著分析能力與操作的熟練程度逐步提高。4.程序運行結果是否正確時,應運用單片機開發系統所提供的交互界面,將程序運行過程中程序計數器PC(地址)的變化、各單元(內部RAM和外部RAM)內容的變化、特殊功能寄存器內容的變化、堆棧指針SP內容的變化與程序的理論分析結果相對照。

5.程序和調試程序時,需要多次反復的過程,并非一次就能排除全部故障,特別是單片機應用系統的硬件電路和匯編程序相結合的綜合調試就更加復雜,因此,必須通過反復調試,不斷修改硬件和軟件,直到最終符合設計要求為止。如果在調試中能夠根據實驗現象預先對產生故障的原因加以判斷和分析,并制定出相應的調試方法和步驟,可縮小排除故障的范圍,提高調試效率。

七、思考與練習

填空題

1、設X=5AH,Y=36H,則X與Y“或”運算為__7EH_______,X與Y的“異或”運算為___6CH_____。

2、若機器的字長為8位,X=17,Y=35,則X+Y=__110100_____,X-Y=_11101110______(要求結果寫出二進制形式)。

3、單片機的復位操作是____高電平______(高電平/低電平),單片機復位后,堆棧指針SP的值是___07h_____。

4、單片機中,常用作地址鎖存器的芯片是__74HC373____________,常用作地址譯碼器芯片是_____74HC138____________。

5、若選擇內部程序存儲器,應該設置為_____高_______(高電平/低電平),那么,PSEN信號的處理方式為___不用__________________。

6、單片機程序的入口地址是____0000H__________,外部中斷1的入口地址是______0013H_________。

7、若采用6MHz的晶體振蕩器,則MCS-51單片機的振蕩周期為__0.5us_______,機器周期為_____2us__________。

8、擴展芯片的選擇方法有兩種,它們分別是___線選法_______________和_____譯碼法__________。

9、單片機的內部RAM區中,可以位尋址的地址范圍是____20H~2FH______________,特殊功能寄存器中,可位尋址的地址是___是能被8整除的地址_________________。

10、子程序返回指令是___ret______,中斷子程序返回指令是__reti。

11、8051單片機的存儲器的最大特點是內部RAM與外部RAM分開編址。

12、8051最多可以有32個并行輸入輸出口,最少也可以有8個并行口。

13、函數是C語言的基本單位。

14、串行口方式2接收到的第9位數據送SCON寄存器的RB8位中保存。

15、MCS-51內部提供3個可編程的16位定時/計數器,定時器有4種工作方式。

16、一個函數由兩部分組成,即說明部分和語句部分。

17、串行口方式3發送的第9位數據要事先寫入SCON寄存器的TB8位。

18、利用8155H可以擴展3個并行口,256個RAM單元。

19、C語言中輸入和輸出操作是由庫函數scanf和printf等函數來完成。

二、選擇題

1、C語言中最簡單的數據類型包括(B)。

A、整型、實型、邏輯型B、整型、實型、字符型

C、整型、字符型、邏輯型D、整型、實型、邏輯型、字符型

2、當MCS-51單片機接有外部存儲器,P2口可作為(C)。

A、數據輸入口B、數據的輸出口

C、準雙向輸入/輸出口D、輸出高8位地址

3、下列描述中正確的是(D)。

A、程序就是軟件B、軟件開發不受計算機系統的限制

C、軟件既是邏輯實體,又是物理實體D、軟件是程序、數據與相關文檔的集合

4、下列計算機語言中,CPU能直接識別的是(D)。

A、自然語言B、高級語言C、匯編語言D、機器語言

5、MCS-5l單片機的堆棧區是設置在(C)中。

A、片內ROM區B、片外ROM區C、片內RAM區D、片外RAM區

6、以下敘述中正確的是(C)。

A、用C語言實現的算法必須要有輸入和輸出操作

B、用C語言實現的算法可以沒有輸出但必須要有輸入

C、用C程序實現的算法可以沒有輸入但必須要有輸出

D、用C程序實現的算法可以既沒有輸入也沒有輸出

7、定時器/計數器工作方式1是(D)。

A、8位計數器結構B、2個8位計數器結構

C、13位計數結構D、16位計數結構

8、C語言提供的合法的數據類型關鍵字是(B)。

A、DoubleB、shortC、integerD、Char

9、片內RAM的20H~2FH為位尋址區,所包含的位地址是(B)。

A、00H~20HB、00H~7FHC、20H~2FHD、00H~FFH

10、以下能正確定義一維數組的選項是(B)。

A、inta[5]={0,1,2,3,4,5};B、chara[]={0,1,2,3,4,5};

C、chara={’A’,’B’,’C’};D、inta[5]="0123";

11、數據的存儲結構是指(D)。

A、存儲在外存中的數據B、數據所占的存儲空間量

C、數據在計算機中的順序存儲方式D、數據的邏輯結構在計算機中的表示

12、下列關于棧的描述中錯誤的是(C)。

A、棧是先進后出的先性表B、棧只能順序存儲

C、棧具有記憶作用D、對棧的插入和刪除操作中,不需要改變棧底指針

13、在寄存器間接尋址方式中,間址寄存器中存放的數據是(B)。

A、參與操作的數據B、操作數的地址值

C、程序的轉換地址D、指令的操作碼

14、MCS-51單片機的復位信號是(A)有效。

A、高電平B、低電平C、脈沖D、下降沿

15、為了使模塊盡可能獨立,要求(B)。

A、模塊的內聚程度要盡量高,且各模塊間的耦合程度要盡量強

B、模塊的內聚程度要盡量高,且各模塊間的耦合程度要盡量弱

C、模塊的內聚程度要盡量低,且各模塊間的耦合程度要盡量弱

D、模塊的內聚程度要盡量低,且各模塊間的耦合程度要盡量強

16、若MCS-51單片機使用晶振頻率為6MHz時,其復位持續時間應該超過(B)。

A、2μsB、4μsC、8μsD、1ms

17、以下選項中可作為C語言合法常量的是(A)

A、-80B、-080C、-8e1.0D、-80.0e

18、能夠用紫外光擦除ROM中程序的只讀存儲器稱為(C)。

A、掩膜ROMB、PROMC、EPROMD、EEPROM

19、以下不能定義為用戶標識符是(D)。

A、MainB、_0C、_intD、sizeof

20、下選項中,不能作為合法常量的是(B)。//冪不能為小數

A、1.234e04B、1.234e0.4C、1.234e 4D、1.234e0

21、以下敘述中錯誤的是(C)

A、對于double類型數組,不可以直接用數組名對數組進行整體輸入或輸出

B、數組名代表的是數組所占存儲區的首地址,其值不可改變

C、當程序執行中,數組元素的下標超出所定義的下標范圍時,系統將給出“下標越界”的出錯信息

D、可以通過賦初值的方式確定數組元素的個數

22、以下與函數fseek(fp,0L,SEEK_SET)有相同作用的是(D)

A、feof(f

p)B、ftell(fp)C、fgetc(fp)D、rewind(fp)

23、存儲16×16點陣的一個漢字信息,需要的字節數為(A)

A、32B、64C、128D、256

24、已知1只共陰極LED顯示器,其中a筆段為字形代碼的最低位,若需顯示數字1,則它的字形代碼應為(B)。

A、06HB、F9HC、30HD、CFH

25、在C語言中,合法的長整型常數是(A)

A、OLB、4962710C、324562&D、216D

26、以下選項中合法的字符常量是(B)

A、"B"B、’\010’C、68D、D

27、若PSW.4=0,PSW.3=1,要想把寄存器R0的內容入棧,應使用(D)指令。

A、PUSHR0B、PUSH@R0C、PUSH00HD、PUSH08H

28、在片外擴展一片2764程序存儲器芯片要(B)地址線。

A、8根B、13根C、16根D、20根

29、設MCS-51單片機晶振頻率為12MHz,定時器作計數器使用時,其最高的輸入計數頻率應為(C)

A、2MHzB、1MHzC、500kHzD、250kHz

30、下列數據字定義的數表中,(A)是錯誤的。

A、DW“AA”B、DW“A”C、DW“OABC”D、DWOABCH

三、判斷題

(√)1、在對某一函數進行多次調用時,系統會對相應的自動變量重新分配存儲單元。

(×)2、在C語言的復合語句中,只能包含可執行語句。

(√)3、自動變量屬于局部變量。

(×)4、Continue和break都可用來實現循環體的中止。

(√)5、字符常量的長度肯定為1。

(×)6、在MCS-51系統中,一個機器周期等于1.5μs。

(√)7、C語言允許在復合語句內定義自動變量。

(√)8、若一個函數的返回類型為void,則表示其沒有返回值。

(×)9、所有定義在主函數之前的函數無需進行聲明。

(×)10、定時器與計數器的工作原理均是對輸入脈沖進行計數。

(×)11、END表示指令執行到此結束。

(√)12、ADC0809是8位逐次逼近式模/數轉換接口。

(√)13、MCS-51的相對轉移指令最大負跳距是127B。

(×)14、MCS-51的程序存儲器只是用來存放程序的。

(√)15、TMOD中的GATE=1時,表示由兩個信號控制定時器的的啟停。

(×)16、MCS-51的特殊功能寄存器分布在60H~80H地址范圍內。

(×)17、MCS-51系統可以沒有復位電路。

(×)18、片內RAM與外部設備統一編址時,需要專門的輸入/輸出指令。

(√)19、鎖存器、三態緩沖寄存器等簡單芯片中沒有命令寄存和狀態寄存等功能。

(√)20、使用8751且=1時,仍可外擴64KB的程序存儲器。

四、簡答題

1、在使用8051的定時器/計數器前,應對它進行初始化,其步驟是什么?

答:(1)確定T/C的工作方式——編程TMOD寄存器;

(2)計算T/C中的計數初值,并裝載到TH和TL;

(3)T/C在中斷方式工作時,須開CPU中斷和源中斷——編程IE寄存器;

(4)啟動定時器/計數器——編程TCON中TR1或TR0位。

2、什么是重入函數?重入函數一般什么情況下使用,使用時有哪些需要注意的地方?答:多個函數可以同時使用的函數,稱為重入函數。

通常情況下,C51函數不能被遞歸調用,也不能應用導致遞歸調用的結構。有此限制是由于函數參數和局部變量是存儲在固定的地址單元中。重入函數特性允許你聲明一個重入函數。即可以被遞歸調用的函數。

重入函數可以被遞歸調用,也可以同時被兩個或更多的進程調用。重入函數在實時應用中及中斷服務程序代碼和非中斷程序代碼必須共用一個函數的場合中經常用到。

3、8051引腳有多少I/O線?他們和單片機對外的地址總線和數據總線有什么關系?地址總線和數據總線各是幾位?

答:8051引腳共有40個引腳,8051的地址總線由P2和P0口提供,P2口是地址總線的高8位,P0口是地址總線的低8位;數據總線由P0口提供;P0口的地址總線和數據總線是分時進行的,P0口的地址總線需要外接地址鎖存器完成地址鎖存。

地址總線共16位,數據總線是8位。

4、在有串行通信時,定時器/計數器1的作用是什么,怎樣確定串行口的波特率?

答:在有串行通信時,定時器/計數器1的作用是串行口發生器。

串行口的波特率根據串行口的工作方式具有不同的計算方式:

方式0的波特率固定為晶體振蕩器的十二分之一;

方式1的波特率=2SMOD.(定時器1的溢出率)/32;

方式2波特率=2SMOD.(fosc/64);

方式3波特率同方式1(定時器l作波特率發生器)。

5、如何消除鍵盤的抖動?怎樣設置鍵盤中的復合鍵?

答:由于按鍵是機械開關結構,所以當用手按下其中一個鍵時,往往會出現所按鍵在閉合位置和斷開位置之間發生跳幾下后才會穩定到閉合狀態的情況。在釋放一個鍵時,也會出現類似的情況,這就是鍵的抖動,抖動的持續時間不一,但通常不會大于10ms。

若抖動問題不解決,就會引起對閉合鍵的多次讀入。對于鍵抖動最方便的解決方法就是當發現有鍵按下后,不是立即進行掃描,而是延時大約10ms后再進行。由于一個鍵按下的時間一般會持續上百毫秒,所以延遲10ms后再掃描處理并不遲。

復合鍵可以仿照計算機復合鍵的處理方法,通??梢约僭O一個鍵具有復合功能,再與其它減的鍵值組合成復合鍵。

1、矩陣式鍵盤的結構與工作原理

在鍵盤中按鍵數量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。

矩陣式結構的鍵盤顯然比直接法要復雜一些,識別也要復雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。具體的識別及編程方法如下所述。

2、矩陣式鍵盤的按鍵識別方法

確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。

行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。

1、判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。

2、判斷閉合鍵所在的位置在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

下面給出一個具體的例子:

圖仍如上所示。8031單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源 5V,并把列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。

1、檢測當前是否有鍵被按下。檢測的方法是P1.4-P

1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。

2、去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。

3、若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:

P1.71110

P1.61101

P1.51011

P1.40111

在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值

4、為了保證鍵每閉合一次CPU僅作一次處理,必須卻除鍵釋放時的抖動。

鍵盤掃描程序:

從以上分析得到鍵盤掃描程序的流程圖如圖2所示。程序如下

SCAN:MOVP1,#0FH

MOVA,P1

ANLA,#0FH

CJNEA,#0FH,NEXT1

SJMPNEXT3

NEXT1:ACALLD20MS

MOVA,#0EFH

NEXT2:MOVR1,A

MOVP1,A

MOVA,P1

ANLA,#0FH

CJNEA,#0FH,KCODE;

MOVA,R1

SETBC

RLCA

JCNEXT2

NEXT3:MOVR0,#00H

RET

KCODE:MOVB,#0FBH

NEXT4:RRCA

INCB

JCNEXT4

MOVA,R1

SWAPA

NEXT5:RRCA

INCB

INCB

INCB

INCB

JCNEXT5

NEXT6:MOVA,P1

ANLA,#0FH

CJNEA,#0FH,NEXT6

MOVR0,#0FFH

RET

鍵盤處理程序就作這么一個簡單的介紹,實際上,鍵盤、顯示處理是很復雜的,它往往占到一個應用程序的大部份代碼,可見其重要性,但說到,這種復雜并不來自于單片機的本身,而是來自于操作者的習慣等等問題,因此,在編寫鍵盤處理程序之前,最好先把它從邏輯上理清,然后用適當的算法表示出來,最后再去寫代碼,這樣,才能快速有效地寫好代碼。

到本課為止,本站教程暫告一個段落!感謝大家的關心和支持!

矩陣按鍵部分由16個輕觸按鍵按照4行4列排列,連接到JP50端口。將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。確定矩陣式鍵盤上何鍵被按下,介紹一種“行掃描法”。行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法.判斷鍵盤中有無鍵按下:將全部行線置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。判斷閉合鍵所在的位置:在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

下面給出一個具體的例子:

電路圖路徑:G:\圖片\電路圖片\xl100097.jpg

8031單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。

1.檢測當前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。

2.去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。

3.若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:

P1.71110

P1.61101

P1.51011

P1.40111

在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值。

4.為了保證鍵每閉合一次CPU僅作一次處理,必須去除鍵釋放時的抖動。

實驗目的:通過XL1000的16位矩陣按鍵,在數碼管上分別顯示0---9,A,B,C,D,E,F。

接線方法:1用一條8PIN數據排線,把矩陣按鍵部份的JP50,接到CPU部份的P1口JP44.

2接8位數碼管的數據線。將數碼管部份的數據口JP5接到CPU部份的P0口JP51.

3接8位數碼管的顯示位線。將數碼管部份的顯示位口JP8接到CPU部份的P2口JP52.

參考程序:

;本程序實現掃描按鍵顯示功能.

;分別按16個鍵盤顯示分別顯示數字123A456B789C*0#D

;鍵盤口P1,數碼管顯示第二位p21,數碼管段位p0口

org0000h

ajmpmain

org0030h

main:

movdptr,#tab;將表頭放入DPTR

lcallkey;調用鍵盤掃描程序

movca,@a dptr;查表后將鍵值送入ACC

movp0,a;將Acc值送入P0口

CLRP2.1;開顯示

ljmpmain;返回反復循環顯示

KEY:

LCALLKS;調用檢測按鍵子程序

JNZK1;有鍵按下繼續

LCALLDELAY2;無鍵按調用延時去抖

AJMPKEY;返回繼續檢測按鍵

K1:LCALLDELAY2

LCALLDELAY2;有鍵按下延時去抖動

LCALLKS;再調用檢測按鍵程序

JNZK2;確認有按下進行下一步

AJMPKEY;無鍵按下返回繼續檢測

K2:MOVR2,#0EFH;將掃描值送入R2暫存

MOVR4,#00H;將第一列值送入R4暫存

K3:MOVP1,R2;將R2的值送入P1口

L6:JBP1.0,L1;P1.0等于1跳轉到L1

MOVA,#00H;將第一行值送入ACC

AJMPLK;跳轉到鍵值處理程序

L1:JBP1.1,L2;P1.1等于1跳轉到L2

MOVA,#04H;將第二行的行值送入ACC

AJMPLK;跳轉到鍵值理程序進行鍵值處理

L2:JBP1.2,L3;P1.2等于1跳轉到L3

MOVA,#08H;將第三行的行值送入ACC

AJMPLK;跳轉到鍵值處理程序

L3:JBP1.3,NEXT;P1.3等于1跳轉到NEXT處

MOVA,#0cH;將第四行的行值送入ACC

LK:ADDA,R4;行值與列值相加后的鍵值送入A

PUSHACC;將A中的值送入堆棧暫存

K4:LCALLDELAY2;調用延時去抖動程序

LCALLKS;調用按鍵檢測程序

JNZK4;按鍵沒有松

開繼續返回檢測POPACC;將堆棧的值送入ACC

RET

NEXT:

INCR4;將列值加一

MOVA,R2;將R2的值送入A

JNBACC.7,KEY;掃描完至KEY處進行下一掃描

RLA;掃描未完將A中的值右移一位進行下一列的掃描

MOVR2,A;將ACC的值送入R2暫存

AJMPK3;跳轉到K3繼續

KS:MOVP1,#0FH;將P1口高四位置0低四位值1

MOVA,P1;讀P1口

XRLA,#0FH;將A中的值與A中的值相異或

RET;子程序返回

DELAY2:;40ms延時去抖動子程序

MOVR5,#08H

L7:MOVR6,#0FAH

L8:DJNZR6,L8

DJNZR5,L7

RET

tab:

db28h,34h,28h,34h,0a9h,60h,20h,7ah,

20h,21h,61h,74h,30h,62h,0a2h,7eh

;0h0hc9878654a321輪流顯示鍵盤因為無法表達*#就用H表示,B用8表示

end

這是我做成功的4X4鍵盤掃描源程序,P1.0-P1.3做四根列線,P1.4-P1.7做四根行線。

數碼管的字型表是按照標準接法做的,按對應的按鍵數碼管顯示對應的數字。

以下是源程序:

KEYBUFEQU30H

ORG00H

START:MOVKEYBUF,#2

MOVP2,#00001111B

WAIT:

MOVP1,#0FFH

CLRP1.4

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK1

MOVKEYBUF,#0

LJMPDK1

NK1:CJNEA,#0DH,NK2

MOVKEYBUF,#1

LJMPDK1

NK2:CJNEA,#0BH,NK3

MOVKEYBUF,#2

LJMPDK1

NK3:CJNEA,#07H,NK4

MOVKEYBUF,#3

LJMPDK1

NK4:NOP

DK1:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK1A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK1A

NOKEY1:

MOVP1,#0FFH

CLRP1.5

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY2

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY2

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK5

MOVKEYBUF,#4

LJMPDK2

NK5:CJNEA,#0DH,NK6

MOVKEYBUF,#5

LJMPDK2

NK6:CJNEA,#0BH,NK7

MOVKEYBUF,#6

LJMPDK2

NK7:CJNEA,#07H,NK8

MOVKEYBUF,#7

LJMPDK2

NK8:NOP

DK2:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK2A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK2A

NOKEY2:

MOVP1,#0FFH

CLRP1.6

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY3

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY3

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK9

MOVKEYBUF,#8

LJMPDK3

NK9:CJNEA,#0DH,NK10

MOVKEYBUF,#9

LJMPDK3

NK10:CJNEA,#0BH,NK11

MOVKEYBUF,#10

LJMPDK3

NK11:CJNEA,#07H,NK12

MOVKEYBUF,#11

LJMPDK3

NK12:NOP

DK3:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK3A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK3A

NOKEY3:

MOVP1,#0FFH

CLRP1.7

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY4

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY4

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK13

MOVKEYBUF,#12

LJMPDK4

NK13:CJNEA,#0DH,NK14

MOVKEYBUF,#13

LJMPDK4

NK14:CJNEA,#0BH,NK15

MOVKEYBUF,#14

LJMPDK4

NK15:CJNEA,#07H,NK16

MOVKEYBUF,#15

LJMPDK4

NK16:NOP

DK4:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK4A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK4A

NOKEY4:

LJMPWAIT

DELY10MS:

MOVR6,#10

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

TABLE:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H;0-9

DB088H,083H,0C6H,0A1H,086H,08EH,089H,0CFH,0C7H,0C8H;A,B,C,D,E,F,H,I,L,N,

END

;P3.1數據采集控制

;P2.6P2.7個位十位顯示轉換控制

;P1口接8個開關模擬數據

;P1.0-P1.3為個位開關量輸入

;P1.4-P1.7為十位開關量輸入

;此程序僅供參考

;功能P1口接8個開關輸入量4個一組,分別為個位,十位輸入

;P0口接一個數碼管,依次顯示輸入量。P3.1控制是否讀入

;開關量。P2.6P2.7控制是否顯示個位

或十位

ORG100h

LJMPSTAR

STAR:MOVP1,#0FFH

SETBP3.1數據讀入標志

MOVR0,#100,循環工作次數

LOOP:JBP3.1,$P3.1低電平時,采集P1口數據開關量處理顯示階段不再應答P3.1

MOVA,P1

PUSHACC

ANLA,#0FH取個位數值

MOVR1,A個位數值保存到R1

POPACC

ANLA,#0F0H

SWAPA高4位轉成字節信息

MOVR2,A十位數值保存到R2

MOVDPTR,#TABLED

MOVA,R1

MOVCA,@A DPTR

MOVP0,A

CLRP2.6個位顯示

ACALLDELAY500MS

SETBP2.6

MOVA,R2

MOVCA,@A DPTR

MOVP0,A

CLRP2.7十位顯示

ACALLDELAY500MS

SETBP2.7

DJNZR0,LOOP

DELAY500MS:延時500毫秒子程略

RET

TABLED:DB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB80H,90H,88h,83h,0c6h,0a1h,86h,8eh

END

#include

typedefunsignedcharBYTE;

BYTEcodeTABLED[16]={0Xc0,0Xf9,0Xa4,0Xb0,0X99,0X92,0X82,0X0f8,0X80,0X90,0X88,0X83,0Xc6,0Xa1,0X86,0X8e};

BYTEDATled;

sbitP26=P2^6;

sbitP27=P2^7;

sbitP31=P3^1;

intTIME;

voidtimedelay(DTIME)

intDTIME;

{

intI;

for(I=0;I4;

P0=TABLED[TEMP];

P27=0;

timedelay(TIME);

P27=1;

}

}

}

1.實驗任務

在8X8 LED點陣上顯示柱形,讓其先從左到右平滑移動三次,其次從右到左平滑移動三次,再次從上到下平滑移動三次,最后從下到上平滑移動三次,如此循環下去。

2.電路原理圖

圖4.24.1

3.硬件電路連線

(1).把“單片機系統”區域中的P1端口用8芯排芯連接到“點陣模塊”區域中的“DR1-DR8”端口上;

(2).把“單片機系統”區域中的P3端口用8芯排芯連接到“點陣模塊”區域中的“DC1-DC8”端口上;

4.程序設計內容

(1).8X8 點陣LED工作原理說明

8X8點陣LED結構如下圖所示

圖4.24.2

從圖4.24.2中可以看出,8X8點陣共需要64個發光二極管組成,且每個發光二極管是放置在行線和列線的交叉點上,當對應的某一列置1電平,某一行置0電平,則相應的二極管就亮;因此要實現一根柱形的亮法,如圖49所示,對應的一列為一根豎柱,或者對應的一行為一根橫柱,因此實現柱的亮的方法如下所述:

一根豎柱:對應的列置1,而行則采用掃描的方法來實現。

一根橫柱:對應的行置0,而列則采用掃描的方法來實現。

5.匯編源程序

ORG00H

START:NOP

MOVR3,#3

LOP2:MOVR4,#8

MOVR2,#0

LOP1:MOVP1,#0FFH

MOVDPTR,#TABA

MOVA,R2

MOVCA,@A DPTR

MOVP3,A

INCR2

LCALLDELAY

DJNZR4,LOP1

DJNZR3,LOP2

MOVR3,#3

LOP4:MOVR4,#8

MOVR2,#7

LOP3:MOVP1,#0FFH

MOVDPTR,#TABA

MOVA,R2

MOVCA,@A DPTR

MOVP3,A

DECR2

LCALLDELAY

DJNZR4,LOP3

DJNZR3,LOP4

MOVR3,#3

LOP6:MOVR4,#8

MOVR2,#0

LOP5:MOVP3,#00H

MOVDPTR,#TABB

MOVA,R2

MOVCA,@A DPTR

MOVP1,A

INCR2

LCALLDELAY

DJNZR4,LOP5

DJNZR3,LOP6

MOVR3,#3

LOP8:MOVR4,#8

MOVR2,#7

LOP7:MOVP3,#00H

MOVDPTR,#TABB

MOVA,R2

MOVCA,@A DPTR

MOVP1,A

DECR2

LCALLDELAY

DJNZR4,LOP7

DJNZR3,LOP8

LJMPSTART

DELAY:MOVR5,#10

D2:MOVR6,#20

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

DJNZR5,D2

RET

TABA:DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH

TABB:DB01H,02H,04H,08H,10H,20H,40H,80H

END

6.C語言源程序

#include0;j--);

}

voidmain(void)

{

unsignedchari,j;

while(1)

{

for(j=0;j<3;j )

//fromlefttoright3time

{

for(i=0;i<8;i )

{

P3=taba[i];

P1=0xff;

delay1();

}

}

for(j=0;j<3;j )

//fromrighttoleft3time

{

for(i=0;i<8;i )

{

P3=taba[7-i];

P1=0xff;

delay1();

}

}

for(j=0;j<3;j )

//fromtoptobottom3time

{

for(i=0;i<8;i )

{

P3=0x00;

P1=tabb[7-i];

delay1();

}

}

for(j=0;j<3;j )

//frombottomtotop3time

{

for(i=0;i<8;i )

{

P3=0x00;

P1=tabb[i];

delay1();

}

}}

}

LED點陣顯示實驗

一.實驗要求

編程實現中英文字符的顯示。

二.實驗目的

1.了解LED點陣顯示的基本原理和實現方法。

2.掌握點陣漢字庫的編碼和從標準字庫中提取漢字編碼的方法。

三.實驗電路及連線

點陣顯示模塊WTD3088的(紅色)列輸入線接至內部LED的陰極端,行輸入線接至內部LED的陽極端(若陽極端輸入為高電平,陰極端輸入低電平,則該LED點亮)。發光點的分布如圖22-0所示。

Fig22-0WTD3088LED分布

如圖22-1示,本實驗模塊使用74LS374來控制列輸入線的電平值。將74LS374的某輸出置0,則對應的LED陰極端被置低。如圖22-2示,本實驗模塊使用74LS273來控制行輸入線,并通過9013提供電流驅動。將74LS273的某輸出置1,則對應的LED陽極端被置高。每次系統重新開啟或總清后,74LS273輸出為全0,LED顯示被關閉。

通過編程控制各顯示點對應LED陽極和陰極端的電平,就可以有效的控制各顯示點的亮滅。

Fig22-1LED模塊及列掃描電路

Fig22-2行掃描電路

Fig22-3地址譯碼電路

本實驗模塊使用4塊WTD3088組成16×16點陣,以滿足漢字顯示的要求。為了方便的控制四個單元,使用了一片74LS139譯碼,產生四個地址片選信號:CLKR1=CSLED,CLKR2=CSLED 1,用于行控制的兩片74LS273;CLKC1=CSLED 2,CLKC2=CSLED 3,用于列控制的兩片74LS374。

實驗接線:按示例程序,模塊的CSLED接51/96地址的8000H。

四.實驗說明

使用高亮度LED發光管構成點陣,通過編程控制可以顯示中英文字符、圖形及視頻動態圖形。LED顯示以其組構方式靈活、亮度高、技術成熟、成本低廉等特點在證券、運動場館及各種室內/外顯示場合得到廣泛的應用。

所顯示字符的點陣數據可以自行編寫(即直接點陣畫圖),也可從標準字庫(如ASC16、HZ16)中提取。后者需要正確掌握字庫的編碼方法和字符定位的計算。

實驗盤片中“字符轉換”子目錄下提供的Basc16.exe,BHz16.exe可方便的將單個字符的碼表從標準字庫Asc16,Hzk16中提取出來。具體使用方法是運行上述可執行程序,根據提示輸入所需字符(如是漢字還需要先啟動dos下的漢字環境,如ucdos,pdos95等)。程序將該字符的碼表提取出來,存放在該字符ASC或區位碼為文件名稱的.dat文件中。用戶只需將該文件中內容拷貝、粘貼到自己的程序中即可。但需要注意字節排列順序、字節中每一位與具體顯示點的一一對應關系,必要時還要對碼表稍作修改。同一目錄下還提供了上述可執行程序的源文件,使用BC3.1編寫,供用戶參考。

五.實驗程序框圖

用戶應留心其中行掃描的實現及碼表的處理。

六.實驗程序:

(一)提供LEDA51演示Asc16字符的簡單點陣顯示。

;________*LED點陣顯示示例程序______________________*

;__該程序顯示Asc16字符__

;__為了簡單起見,程序只顯示一個字符__

;__該程序針對T598實驗機的模塊14__

;____________________________________________________

CSLEDEQU8000H

CSR1EQUCSLED;行1273

CSR2EQUCSLED 1H;行2273

CSC1EQUCSLED 2H;列1374

CSC2EQUCSLED 3H;列2374

ORG0000H

MOVSP,#60H

INIT:MOVA,#0H;關閉行

MOVDPTR,#CSR1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVX@DPTR,A

MOVA,#0FFH;關閉列

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSC2

MOVX@DPTR,A

D:MOVR5,#00H

MOVR4,#01H;每次為單行掃描

DISP:

MOVA,R5

MOVDPTR,#ASCE;此處設定所要顯示的字符

MOVCA,@A DPTR

CPLACC;代碼取反,決定顯示的陰陽

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVDPTR,#CSR1

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#8H,DISP

MOVA,#0H

MOVX@DPTR,A

MOVR5,#08H

MOVR4,#01H

DISP2:

MOVA,R5

MOVDPTR,#ASCE

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#10H,DISP2

MOVA,#0H

MOVX@DPTR,A

SJMPD

;________延時子程序,協調字符顯示速度____________*

DELAY:MOVR7,#1H

DL1:MOVR6,#00H

DL2:DJNZR6,DL2

DJNZR7,DL1

RET

;________字符點陣字庫______________*

;ASC16字符編碼排列

;0

;1

;|

;|

;14

;15

;高位D7--D0

;請注意編碼的排列次序和實際顯示點陣分布的關系

ASCA:DB00H,00H,10H,38H,6CH,0C6H,0C6H,0FEH

DB0C6H,0C6H,0C6H,0C6H,00H,00H,00H,00H

ASCE:DB00H,00H,0FEH,66H,62H,68H,78H,68H

DB60H,62H,66H,0FEH,00H,00H,00H,00H

ASCD:DB00H,00H,0F8H,6CH,66H,66H,66H,66H

DB66H,66H,6CH,0F8H,00H,00H,00H,00H

ASCK:DB00H,00H,0E6H,66H,66H,6CH,78H,78H

DB6CH,66H,66H,0E6H,00H,00H,00H,00H

;____________________________________________________

END

(二)LEDHZ51兩個示例程序。和Hz16字符的簡單點陣顯示。

;________*LED點陣顯示示例程序______________________*

;__該程序顯示hz16字符__

;__為了簡單起見,程序只顯示一個字符__

;__該程序針對T598實驗機的模塊14__

;____________________________________________________

CSLEDEQU8000H

CSR1EQUCSLED;行1273

CSR2EQUCSLED 1H;行2273

CSC1EQUCSLED 2H;列1374

CSC2EQUCSLED 3H;列2374ORG0000H

MOVSP,#60H

INIT:MOVA,#0H;關閉LED顯示

MOVDPTR,#CSR1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVX@DPTR,A

MOVA,#0FFH;關閉LED顯示

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSC2

MOVX@DPTR,A

D:MOVR5,#00H

MOVR4,#01H

DISP:

MOVA,R5

RLACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVA,R5

RLACC

INCACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSR1

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#8H,DISP

MOVA,#0H

MOVX@DPTR,A

MOVR5,#08H

MOVR4,#01H

DISP2:

MOVA,R5

RLACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVA,R5

RLACC

INCACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#10H,DISP2

MOVA,#0H

MOVX@DPTR,A

SJMPD

;________延時子程序,協調字符顯示速度____________*

DELAY:MOVR7,#1H

DL1:MOVR6,#00H

DL2:DJNZR6,DL2

DJNZR7,DL1

RET

;________字符點陣字庫______________*

;HZ16字符編碼排列

;01

;23

;|

;|

;2829

;3031

;高位D7--D0

HZAI:DB00H,78H,3FH,80H,11H,10H,09H,20H

DB7FH,0FEH,42H,02H,82H,04H,7FH,0F8H

DB04H,00H,07H,0F0H,0AH,20H,09H,40H

DB10H,80H,11H,60H,22H,1CH,0CH,08H

HZDI:DB00H,80H,40H,80H,20H,88H,2FH,0FCH

DB08H,88H,08H,88H,0E8H,88H,2FH,0F8H

DB28H,88H,28H,88H,28H,88H,2FH,0F8H

DB28H,08H,50H,06H,8FH,0FCH,00H,00H

HZKE:DB01H,00H,01H,04H,0FFH,0FEH,01H,00H

DB01H,10H,1FH,0F8H,10H,10H,10H,10H

DB10H,10H,1FH,0F0H,14H,50H,04H,40H

DB04H,40H,08H,42H,10H,42H,60H,3EH

;____________________________________________________

END

基于89C51的計算機可鎖定加密鍵盤設計

摘要:介紹PC鍵盤和鍵盤接口的PS/2通信協議,以及用89C51實現可鎖定鍵盤的軟件和硬件設計方法。具有安全可靠、容錯能力強、可以直接采用標準鍵盤進行改裝、便于實現等優點,并保留標準鍵盤的全部功能。

關鍵詞:PS/289C51C51鍵盤

引言

在智能儀器、自動控制等領域,已大量使用嵌入式PC,如Advantech公司的PC/104、AMD公司的DIMM-PC等。為適應開放式、模塊化的要求,嵌入式PC具有標準的PC接口,如VGA顯示器控制接口、以太網接口、RS232接口、PC/AT鍵盤接口等。所以,可以用標準的PC鍵盤對嵌入式PC進行操作與控制。鍵盤在輸入指令之后,可能很長一段時間不用。為計算機安全和防止誤觸發,需要將鍵盤鎖定,還要對某些鍵采取屏蔽措施,但是PC標準鍵盤不能滿足這些要求。本文介紹一種用89C51設計實現的可鎖定加密PC/AT鍵盤。

1鍵盤功能及工作原理

PC鍵盤功能主要有按鍵識別、去抖、重鍵處理、發送掃描碼、自動重發、接收鍵盤命令、處理命令等。鍵盤有編碼鍵盤和非編碼鍵盤。編碼鍵盤程序設計簡單,但硬件電路復雜,價格較高;非編碼鍵盤用軟件來實現識別鍵、編碼轉換、去抖等功能,硬件電路簡單,價格便宜?,F代微機系統中廣泛采用非編碼鍵盤。PC鍵盤多采用18行×8列的二維矩陣行列結構。采用行掃描法識別按下的按鍵。

2PS/2協議

PS/2協議是外設與主機之間通信的一種同步雙向串行協議。在該協議中主機擁有較高的優先級,在一定條件下可以終止外設正在進行的發送過程。PS/2協議采用的傳送數據幀的格式為:1位起始位(0)、8位數據位、1位奇偶校驗位、1位停止位(1)。數據發送時低位在前,高位在后。外設每收到主機發來的1幀數據,都要緊隨該幀的停止位發送一個握手位ACK(0)應答主機。然后,外設還要發1幀應答數據(0xF0),表示外設已經完整地接收到了主機的命令;而主機則不需發送握手位,也不需要發送應答幀。

2.1鍵盤到PC鍵盤接口的通信

當時鐘線和數據線均為高電平時,允許鍵盤發送數據,系統將接收數據;當時鐘線被拉為低電平時,表明系統禁止數據傳輸。圖1給出了發送時序,包含1個低電平觸發的起始位、8位數據位、1個奇校驗位和1個高電平的結束位。

2.2PC系統到鍵盤的通信協議

若時鐘線出現高電平,數據線出現低電平,表明系統請求發送,鍵盤準備產生同步時鐘脈沖串,并接收數據。包含了1個低電平觸發的起始位、8位數據位、1個奇校驗位、1個應答位、1個高電平的結束位。圖2為時序圖。

(1)鍵盤命令及執行過程

①FFH:復位鍵盤。系統通過此軟件復位命令使鍵盤進入程序復位和內部自測試,稱為基本保證測試(BAT)。復位鍵盤的過程如下:

a.鍵盤收到FFH后立即回送ACK(FAH)作答;

b.鍵盤接口收到ACK后,將鍵盤時鐘和數據線置為高電平;

c.鍵盤檢測到此狀態后開始BAT操作;

d.如果BAT正確完成,鍵盤發送AAH以表示結束,

否則以FDH(或其它任何值)表示診斷有誤。

②FEH:重新發送。當系統檢測

到從鍵盤送來的任何傳輸錯誤時,它便向鍵盤發送FEH命令。鍵盤接收到此命令后,將重新送出原來的內容。③FDH~F7H:空操作(保留未用)。

④F6H:設置缺省值。此命令使鍵盤所有條件復位到電源接通時的缺省狀態,鍵盤繼續掃描。

⑤F5H:設置缺省值和停止鍵盤。此命令使鍵盤所有條件復位到電源接通時的缺省狀態,并停止鍵盤掃描,等待下一個鍵盤命令。

⑥F4H:啟動鍵盤。鍵盤接收到此命令后,用ACK(FAH)作答,清除輸出緩沖器,并啟動鍵盤開始掃描。

⑦F3H:設置拍發速率和延時參數。每當按下任一鍵時,鍵盤以拍發速率連續送出鍵的接通碼,直到鍵被釋放為止。延時參數是指按下一鍵后,鍵盤輸出的響應時間。

系統缺省設置:拍發速率=10個/s±20,延時=500ms±20。

當要改變設置時可以使用F3H命令,并后跟一個字節的參數。參數定義如表1所列。

表1

D7

D6D5

D4D3

D2D1D0

C

B

A

計算拍發速率和響應延時的公式如下:

拍發速率=1/[(8 A)×2B×0.00417](1/s)

響應延時=(1 C)×250(ms)

注:缺省的延時參數值為2CH。

此命令的執行過程如下:

a.鍵盤收到F3H命令后,用FAH予以響應,并停止

掃描和等待隨后的參數;

b.鍵盤若收到隨后的設置參數,用另一個ACK響

應,并按其參數設置新的拍發速率和響應延時,

之后重新開始掃描(若鍵盤原來是開放的);

c.鍵盤若收到FAH命令,但無隨后的設置參數,則

鍵盤結束命令設置,并保持原來的拍發速率和響

應延時,停止掃描。

⑧F2H,F1,EFH:保留未用。

⑨F0H:設置鍵盤掃描碼命令。此命令用于設置鍵盤的掃描碼,后跟參數指定三種掃描碼的哪一種。鍵盤復位時,默認掃描碼是第二種。

⑩EEH:回送命令。此命令用于輔助診斷,要求鍵盤接收到EEH時也要回送EEH予以響應。若鍵盤原來是開放的,則繼續掃描。

EDH:置位/復位LED指示器。鍵盤右上角有三個LED指示器,分別反映Caps、Num和Scroll三個鍵的鎖定情況。參數字節如表2所列。

表2

D7D3

D2

D1

D0

保留

1=激勵CapsLED

1=激勵NumLED

1=激勵ScrollLED

此命令執行過程與F3H相似。若命令后跟參數,則按參數設定LED狀態并繼續掃描。若僅有命令無參數,則不改變LED原狀態,并停止掃描。

(2)鍵盤響應

鍵盤在下列四種情況下都會向鍵盤接口發送數據。

①按下任一鍵,鍵盤以拍發速率向接口發送鍵盤接通掃描碼。

②釋放所按下的鍵,鍵盤發送斷開掃描碼。

③系統向鍵盤發送鍵盤命令后,鍵盤回送應答。

④當用戶按鍵速度超出鍵盤所能容納的最大鍵個數時,鍵盤做出響應。

后三種情況稱為鍵盤響應。響應字節有7個,定義如下。

①FEH:重新發送響應。當鍵盤收到一個無效的鍵盤命令,或者檢測到奇偶錯的鍵盤命令時,鍵盤回送響應字節為FEH,要求系統重發鍵盤命令。

②FAH:正常應答。對任何一個有效的鍵盤命令,鍵盤回送FAH予以響應。

③00H:超限應答。當用戶按鍵速度超出鍵盤所能容納的最大鍵符個數時(16個字節的緩沖器),鍵盤發送00H。

④FDH:診斷故障應答。鍵盤接受軟件復位命令,執行自測試過程中。若檢測到故障,則以FDH應答。此時,鍵盤停止掃描并等待下一個鍵盤命令。

⑤AAH:診斷正常應答。鍵盤在軟件復位過程中,正常完成BAT測試,以AAH應答。

⑥FEH:回響命令的應答,對鍵盤FEH命令的應答。

⑦F0H:斷開掃描碼前綴,鍵盤對鍵符按下后釋放的應答,第一個字節為F0H,第二個字節為接通掃描碼(有幾個鍵例外)。

3硬件設計

PC系列鍵盤采用18行×8列的矩陣行列結構。89C51單片機有4個8位I/O端口,因此可以采用P0、P2口再加上P3口的2個(P3.6和P3.7)作為行掃描線。P1口作為列輸入線(如果用P0口作列輸入線,必須加上拉電阻)。采用P3.0、P3.1作為數據線和時鐘線與PC系統進行通信,用P3.2、P3.4、P3.5控制鍵盤上的3個指示燈。硬件原理如圖3所示。

鍵盤與計算機通過一個五芯(PS/2接口為六芯)插座相接,4個有效引腳的定義分別是電源(VCC)、地(GND)、串行時鐘線(SCK)、串行數據線(SIO)。

4軟件設計

①消抖及重鍵處理:通過軟件上延時程序來消除抖動;采用后按鍵優先處理,即多鍵同時按下時,只重復發送最后按下鍵的掃描碼。

②程序包括鍵盤掃描子程序、發送鍵碼子程序、發送數據子程序、接收命令子程序、定時器1中斷服務程序、主程序等。鍵盤掃描子程序用于掃描鍵狀態,將被按鍵的位置號存入緩沖器中;發送鍵碼子程序用于將緩沖區鍵的接通碼或斷開碼發送給計算機鍵盤接口或者存在鍵盤密碼緩沖區中;發送數據子程序用于將數據發給計算機鍵盤接口;接收命令子程序用于接收計算機鍵盤接口發來的鍵盤命令;定時器1中斷服務子程序用于給程序中的延時提供標準時鐘,并具有軟件看門狗功能,防止軟件出現死機現象;主程序用于系統初始化,子程序調度,鎖定狀態的顯示等。

圖6發送緩沖區鍵碼子程序流程圖

圖4~6是主要軟件模塊的流程圖。單片機源程序見本刊網絡補充版(.com)。

5結論

本文介紹的PC/AT鍵盤具有結構簡單、設計靈活、安全可靠的特點,可用于標準PC和嵌入式PC。本鍵盤可以在標準的鍵盤基礎上進行改造,只需換掉原來的控制芯片即可,可節省設計成本。

單片機C51編程幾個有用的模塊(1)

KeilC51常用功能模塊使用說明

說明

本文檔包括單片機系統中常用到的時鐘中斷、通訊及鍵盤掃描等模塊(見所附源程序)的說明。這些模塊使用前后臺系統模型。為達到最大的靈活性,需要在用戶工程中定義config.h文件,在其中定義各模塊可選參數的設置,而不是直接更改源代碼。

這些可選內容大部分為宏定義,如果不定義宏相應的功能在編譯時被屏蔽,不會增加代碼長度。具體可選內容見各模塊中的說明。

在Config.h文件中還要包含一個單片機硬件的資源頭文件。

各模塊使用了定義在Common.h中的一些數據類型。如:BIT(bit)BYTE(unsignedchar)等,具體請參見源程序。

時鐘模塊

在單片機軟件設計中,時鐘是重要資源,為了充分利用時鐘資源,故設計本時鐘模塊。本模塊使用定時器0,在完成用戶指定功能的同時,還能夠自動處理一些其它模塊中與時鐘相關的信息。

時鐘模塊由聲明文件Timer.h以及實現文件Timer.c組成。

用戶應該在Config.h中定義宏TIMER_RELOAD來設定定時器0的重裝載初值。推薦的定時器0的中斷時間大于1毫秒。

在程序的初始化階段調用時鐘模塊的初始化函數InitTimerModule()之后,就可以使用時鐘模塊所以支持的各種功能。具體描述如下:

延時:當用戶需要進行一定時間的延時時,可以通過調用Delay()來進行,參數為時鐘中斷的次數。如時鐘中斷周期為1ms,想進行100ms的延時,則可以調用Delay(100)。

注意:

如果延時的絕對時間小于時鐘中斷的周期,則不能夠用本方法做到延時。

定時:當程序中需要使用定時功能時,如等待某外部事件,如果在一定時間內發生則繼續執行,如果在這段時間內發生,則認為出現錯誤,轉向錯誤處理機制。

在此推薦一種編程模式,但用戶可以用自己認為更合理的方式處理此類問題。

這里簡單說明一下關于阻塞式函數及非阻塞式函數。簡單說,阻塞式函數就是當檢測完成條件,如

果不能夠完成則等待,如:

voidCheckSomething()

{

//gbitSuccessFlagisaglobalvariable

while(gbitSuccessFlag==FALSE)

{

//donothingbutwaiting

}

}

可以看到,當bitSuccessFlag沒有被設置為TRUE時,函數保持等待狀態不返回,這樣就是阻塞式的函數。

另外一種情況:

BITCheckSomething()

{

if(gbitSuccessFlag==TRUE)

{

//…

returnTRUE;

}

returnFALSE;

}

在這里,如果所檢測的事件有沒有完成,函數進行檢測之后,立刻返回,通過返回值報告完成情況,如果沒有完成,則等待調用者分配再次執行的機會。這樣的函數就是非阻塞函數。

在應用定時功能時,首先要將檢測函數定義成非阻塞函數。如上面的第二個版本的CheckSomething。

然后下面模式:

BITbitDone=FALSE;

ResetClock();//cleartimerinterrupttimescounter

while(GetClock()

{

if(CheckSomething()==TRUE)

{

bitDone=TRUE;

break;

}

}

if(bitDone==FALSE)

{

//processtimeout

}或者簡單寫成:

BITbitDone=FALSE;

ResetClock();

while(GetClock()=(z))

當然,用戶也可以將IsPackageHeader和IsPackageTailer定義成為函數,通過BIT類型的返回值來向調用者提供與相應宏相同的信息。

另一種辦法需要在Config.h文件中定義宏SCOMM_ComplexPackageFormat。(需要注意的是,不能夠同時定義SCOMM_SimplePackageFormat和SCOMM_ComplexPackageFormat宏,否則會造成嚴重的不可預見性錯誤。

這時需要提供回調函數QueryPackageFormat,原形如下:

BYTEQueryPackageFormat(BYTEbyData,BYTEbyCount,BYTEbyParam);

函數中三個參數的含義與使用簡單數據包格式時判斷數據包尾的宏的參數相同。

函數通過返回值來通知作為調用者的接收函數對接收到的數據如何處理,但目前這種方法僅為需要處理復雜數據包格式時的一種可選方法,但不推薦。用戶如果想使用這種方法可以自己更改接收函數中相應的

#ifdefSCOM_ComplexPackageFormat

#endif//SCOMM_ComplexPackageFormat

預編譯指令之間的內容。

例如指定QueryPackageFormat的返回值的含義:

0:繼續找數據包頭或繼續找數據包尾。

1:找到數據包頭。

2:找到數據包尾。

3:數據包出錯,需要拋棄。

然后更改源代碼來實現上面的協議。

注意:當用戶需要使用字符串的時候,可以利用簡單的包裝函數將字符串轉換為字節數組。所以沒有必要提供專用的字符串處理函數。

鍵盤掃描模塊

鍵盤掃描模塊有兩種工作方式,一種為自動的由時鐘模塊調用,另一種是由程序員自行調用。

1)由時鐘模塊自動調用的方式

將時鐘模塊實現文件(Timer.h)及鍵盤掃描模塊的實現文件(KBScan。c)包含進工程,在Config.h文件中添加TIMER_KBSCANDELAY宏。時鐘模塊自動對時鐘中斷進行計數,當達到TIMER_KBSCANDELAY宏所定義的值后,自動調用鍵盤掃描模塊中的函數KBScanProcess()進行鍵盤掃描,也就是說,這個宏的值可以決定按鍵消抖動的時間。

用戶應該提供兩個回調函數OnKBScan()及OnKeysPressed()。在函數OnKBScan中進行鍵盤掃描,并返回掃描碼。掃描碼的類型缺省為BYTE,當鍵盤規模較大時,BYTE不能夠完全包含鍵盤信息時,可在Config.h文件中重定義宏KBvalue,如下:

#defineKBvalueWORD

這樣,就可以使用16位的鍵盤掃描碼,如果此時還達不到要求,可以將鍵盤掃描碼定義成一個結構,但這樣做將會增加代碼量及消耗更多的RAM資源,故不推薦。

掃描模塊調用OnKBScan取得掃描碼,并調用用戶可以重定義的宏IsNoKeyPressed來判斷是否有鍵按下,缺省的IsNoKeyPressed實現如下:

#defineIsNoKeyPressed(x)((x)==0x00)

即認為OnKBScan返回0掃描碼時為沒有鍵按下,如果掃描函數返回其它非零掃描碼做為無鍵按下的掃描碼時,可以在Config.h文件中重定義IsNoKeyPressed宏的實現。

8位鍵盤掃描碼(缺省值)時,相應的掃描函數為:

BYTEOnKBScan()

當掃描模塊經過軟件消抖動之后,發現有鍵按下,就會調用另一個回調函數OnKeysPressed。函數的聲明應該如下:

voidOnKeyPressed(BYTEbyKBvalue,BYTEbyState)

其中中的參數byKBvalue的類型為BYTE,此為缺省值,如果使用其它類型的掃描碼,就將此參數變為相應類型。這個值由OnKBScan返回。另一個參數byState在通常情況下為零。但當用戶在Config.h中定義宏KBSCAN_BRUSTCOUNT,同時鍵盤上的某鍵被按住不放時,掃描模塊對它自己的調用(注意這里和TIMER_KBSCANDELAY宏不同,TIMER_KBSCANDELAY是時鐘中斷足夠的次數后調用掃描模塊,而KBSCAN_BRUSHCOUNT為掃描模塊自身的被調用次數)進行計數,當達到KBSCAN_BRUSTCOUNT時,掃描模塊調用OnKeysPressed,此時第一個參數的含義不變,而byState變成1,同時計數器復位,又經過一段時間后,用值為3的byState調用OnKeysPressed。這樣就可以很方便的實現多功能鍵或者檢測某鍵的長時間被按下。

2)由用戶自行調用

由用戶自行在程序中調用掃描模塊,而不是由時鐘中斷自行調用。其它與方式1相同。

注意:

1)函數KBScanProcess為非阻塞函數,它將在很快的時間內返回,等待再次分配給它執行的機會。

2)函數KBScanProcess是在時鐘中斷外部運行的,它的過程可以被任何中斷打斷,但不影響系統運行。

3)byState的最大值為250,之后被復位為零。

應用舉例

現在來舉例說明上述幾個模塊的使用方法。

硬件環境描述:

為了控制一盞燈,需要單片機提供一個做控制功能的開關量,這里不描述外部接口電路,只說明當單片機的P10腳為高電平時,燈滅,當P10腳為低電平時,燈亮。

可以通過計算機由串口發送命令來控制,或通過一個按鍵(pus

hbutton不是自鎖式的按鍵)來手動控制(按鍵接在P11腳上,當鍵沒有按下時,P11電平為高,鍵按下時,引腳電平被接低),當使用按鍵手動控制的時候,需要給計算機發送通知。

設定串口通訊指令如下:

數據包由0xff做包頭,4個字節長,第二個字節為命令代碼,第三個字節為數據,最后一個字節為校驗位。

命令和數據代碼有如下組合:

(計算機發給單片機)

0x100x01:計算機控制燈亮。(數據位是非零值即可)

0x100x00:計算機控制燈滅。

(單片機發給計算機)

0x110x01:單片機正常執行控制指令,返回。(數據位是非零值即可)

0x110x00:單片機不能夠正常執行控制指令,或控制指令錯(不明含義的數據包或校驗錯等)。

0x120x01:手動控制燈亮。(數據位是非零值即可)

0x120x00:手動控制燈滅。建立工程:

在硬盤上建立文件夾Projects,在Projects下建立Common文件夾及Example文件夾。將各模塊的頭文件及實現文件拷貝到Common文件夾下(推薦使用這樣的文件組織結構,其它工程也可以建立在Projects下,各工程共享Common文件夾中的代碼)。

啟動KeilC的IDE,在Example下建立新工程,將各模塊的實現文件包含進工程。

在Example文件夾下建立Output文件夾,更改工程設置,將Output作為輸出文件和List文件的輸出文件夾(推薦使用這樣的結構,當保存工程文件時,可以簡單的刪除Output文件夾中的內容而不會誤刪有用的工程文件)。

建立工程配置頭文件Config.h及工程主文件Example.c,并將Exmaple.c文件加入工程。

輸入代碼:

代碼的具體編寫過程略。下面是最后的Config.h文件及Example.c文件。

//

//file:onfig.h

//

#ifndef_CONFIG_H_

#define_CONFIG_H_

#include//使用AT89C52做控制

#include“../Common/Common.h”//使用自定義的數據類型

#defineTIMER_RELOAD922//11.0592MHz晶振,1ms中斷周期

#defineTIMER_KBSCANDELAY40//40ms重檢測按鍵狀態,即40ms消抖

#defineSCOMM_AsyncInterface//使用異步通訊服務

#defineIsPackageHeader(x)((x)==0xff)//判斷包頭是不是0xff

#defineIsPackageTailer(x,y,z)((y)<=(z))//判斷包的長度是不是足夠

#endif//_CONFIG_H_

//

//file:xample.c

//

#include

#include“../Common/Common.h”

#include“../Common/Timer.h”

#include“../Common/Scomm.h”

#include“../Common/KBScan.h”

BITgbitLampState=1;//燈的狀態,缺省為off

staticvoidInitialize()

{

InitTimerModule();//初始化時鐘模塊

InitSCommModule(0xfd,TRUE);//初始化通訊模塊,11.0592MHz晶振,

//波特率為19200

EA=1;//開中斷

}

voidmain()

{

Initialize();//初始化

while(TRUE)//主循環

{

ImpTimerService();//實現時鐘中斷服務,如鍵盤掃描

AsyncRecePackage(4);//接收4個字節長的數據包

}

}

//在中斷外部響應時鐘中斷事件

voidOnTimerEvent()

{

//donothing

}

//控制外部燈

staticvoidTriggerLamp(BITbEnable)

{

P10=~bEnable;//需要反相控制

}

//鍵掃描回調函數

BYTEKBScan()

{

BITb;

P11=1;//讀之前拉高引腳電平

b=P11;//讀入引腳狀態

return~b;//數據反相做掃描碼

}

//計算校驗和

staticBYTECalcCheckSum(BYTE*pbyBuf,BYTEbyLen)

{

BYTEby,bySum=0;

for(by=0;by

return0–bySum;

}

//接收到鍵盤消息回調函數

voidOnKeyPressed(BYTEbyvalue,BYTEbyState)

{

BYTEby[4];

if(byState==0)

{

switch(byvalue)

{

case0x01:

gbitLampState=~gbitLampState;//燈狀態取反

TriggerLamp(gbitLampState);//執行控制

by[0]=0xff;//構造數據包

by[1]=0x12;

by[2]=(BYTE)gbitLampState;

by[3]=CalcCheckSum(by,3);//求校驗和

SendPackage(by,4);//發送數據包

break;

//處理其它掃描碼

default:

break;

}

}

//接收到數據包回調函數

voidOnRecePackage(BYTE*pbyBuf,BYTEbyBufLen)

{

BYTEby[4];

by[0]=0xff;

by[1]=0x11;

if(byBufLen!=4||pbyBuf[3]!=CalcCheckSum(pbyBuf,3))

{

by[2]=0;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//處理長度或校驗和不正確

}

switch(pbyBuf[1])

{

case0x10:

gbitLampState=(BIT)pbyBuf[2];

TriggerLamp(gbitLampState);

by[2]=1;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//發送成功執行通知

break;

default://不知道的命令

by[2]=0;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//發送沒有成功執行通知

break;

}

}

4.課程設計單獨計算成績,考評方法見其大綱。

三、理論考試說明

1.單片機技術及應用理論考試,采用閉卷筆試形式,考試時間120分鐘。

2.期末考試試題根據教學大綱,其范圍和難度按照本方案中制訂的考試考核內容和要求確定??荚嚸}覆蓋考試大綱要求范圍。

3.期末考試試題類型有以下幾種:

①填空題;

②選擇題;

③判斷題;

④簡答題⑤綜合應用題。

四、考試考核要求層次

按照教學大綱的要求,理論考試要求分為掌握、理解和了解三個層次。

掌握:

對于本課程的重點內容要求學生達到掌握的程度。即能夠全面、深入理解和熟練掌握所學內容,并能夠用其分析、初步設計和解答與應用相關的問題,能夠舉一反三。要求學生掌握的內容也就是考試的主要內容,在考試中所占比例約70。

理解:

對于本課程的一般內容要求學生能夠理解。即要求學生能夠較好地理解所學內容,并且對所涉及的內容能夠進行簡單分析和判斷。要求學生理解的內容也是考試的內容,在考試中所占比例約25。

了解:

對于本課程的次要內容要求學生能夠了解。要求學生了解的內容,一般是指在眼下不必進一步深入和擴展,有些也許需要學生自己今后在工作中進行深入研究。對要求了解的內容,在考試中占較小比例,不超過5。實驗五:按鍵電路、顯示電路實驗一、實驗目的:1.掌握獨立式按鍵電路與矩陣式按鍵電路的設計方法。2.掌握數碼管顯示電路的工作原理3.掌握源程序編輯軟件UltraEdit,編譯軟件KeilC51、仿真軟件Proteus的使用方法4.掌握硬件仿真器ME-52A的使用方法二、實驗器材:1.單片機實驗板2.單片機硬件仿真器ME-51A3.計算機4.電源三、實驗要求:1.電路如圖5所示,用單片機的P3口所接的四個獨立式按鍵控制p1口流水燈花樣的方法;具體表現為:p3.0、P3.1、P3.2、P3.3四個小按鍵分別實現了四個控制:(1)跑燈:即P1.0---1.7亮點流動:(2)流水燈:即P1.0-1.7依次點亮(3)交叉閃爍:即P0.0,P0.2,P0.4,P0.6和P0.1,P0.3,P0.5,P0.7輪流點亮(4)停止;在任何狀態下按此鍵程序停止運行.2.電路如圖6所示,用P2口所接的4×4矩陣式鍵盤作為輸入,在P1口所接的數碼管上顯示出每個按鍵的0~F序號,鍵盤的布局如下表所示:FEDCBA9876543210四、實驗原理:1.獨立式按鍵電路顯示如圖5所示,從圖中可看出,判斷有無鍵按下,只要檢測P3.0~P3.3相應端口的高低電平即可,若檢測有某一端口為低電平,表明該端口有按鍵按下,經延時消抖后轉去執行相應的功能子程序。若為高電平,表明無鍵按1.獨立式按鍵電路如圖5所示,下,繼續檢測。示例程序如下:ORG000HLJMPSTAR1ORG0030HSTAR1:MOVP3,#0FFH;置P3口為輸入態JNBP3.0,FUN0;判別P3.0是否有鍵按下,是,則轉FUN0JNBP3.1,FUN1;判別P3.1是否有鍵按下,是,則轉FUN1JNBP3.2,FUN2;判別P3.2是否有鍵按下,是,則轉FUN2JNBP3.3,FUN3;判別P3.3是否有鍵按下,是,則轉FUN3JNBF0,STAR1;曾經有鍵按下F0置1RET圖5FUN0:LCALLDL10MS;消岸抖動JBP3.0,STAR1WAITL0:JNBP3.0,WAITL0;等待鍵釋放SETBF0FUN01:LCALLFUN00LCALLSTAR1LJMPFUN01FUN1:LCALLDL10MS;消岸抖動JBP3.1,STAR1WAITL1:JNBP3.1,WAITL1;等待鍵釋放SETBF0FUN10:LCALLFUN11LCALLSTAR1LJMPFUN10FUN2:LCALLDL10MS;消岸抖動JBP3.2,STAR1WAITL2:JNBP3.2,WAITL2;等待鍵釋放SETBF0FUN20:LCALLFUN22LCALLSTAR1LJMPFUN20FUN3:LCALLDL10MS;消岸抖動JBP3.3,STAR1WAITL3:JNBP3.3,WAITL3;等待鍵釋放CLRF0MOVP1,#0FFH;關顯示LJMPSTAR1FUN00:MOVA,#0FEH;跑燈子程序FUN000:MOVP1,ALCALLDL05SJNBACC.7,OUTRLAAJMPFUN000OUT:RETFUN11:MOVA,#0FEH;流水燈子程序FUN111:MOVP1,ALCALLDL05SJZOUTRLAANLA,P1AJMPFUN111FUN22:MOVA,#0AAH;交叉點亮子程序MOVP1,ALCALLDL30SCPLAMOVP1,ALCALLDL30SRET;____________;;延時程序;;____________;DL512:MOVR2,#0FFHLOOP1:DJNZR2,LOOP1RETDL10MS:MOVR3,#14HLOOP2:LCALLDL512DJNZR3,LOOP2RETDL05S:MOVR4,#0AHLOOP3:LCALLDL10MSDJNZR4,LOOP3RETDL30S:MOVR5,#03HLOOP4:LCALLDL05SDJNZR5,LOOP4RETEND2.矩陣式按鍵電路顯示如圖6所示。采用掃描方式進行按鍵的識別檢測,并將對應按鍵的鍵號用查表指令將對應的代碼顯示在數碼管上。圖6參考程序如下:ORG0000HLJMPSTARTORG0030HSTART:MOVSP,#60H;設置堆棧指針SCAN:MOVR3,#0F7H;置行掃描初值MOVR1,#00H;到TABLE表中取碼的指針SCAN1:MOVA,R3MOVP2,A;掃描輸出MOVA,P2;重讀P2口狀態MOVR4,A;暫存于R4呂中SETBC;C=1MOVR5,#03H;掃描4列初值L1:RLCA;A中內容循環左移JNCKEYIN;C=0,有鍵按下,轉消抖INCR1;取碼指針加1DJNZR5,L1;無鍵按下,繼續檢測MOVA,R3;掃描下一行SETBCRRCAMOVR3,AJCSCAN1;4行是否掃描完,未完,繼續LJMPSCANKEYIN:MOVR7,#10;削除抖動D2:MOVR6,#248DJNZR6,$DJNZR7,D2D3:MOVA,P2;按鍵放開否?XRLA,R4JZD3MOVA,R1MOVDPTR,#TABLE;到TABLE中取碼MOVCA,@A DPTRMOVP1,ALJMPSCANTABLE:DB0C0H,0F9H,0A4H,0B0H,80H,90H,88H,83H,0C6H,0A1H,86H,8EHENDDB80H,90H,88H,83HDB0C6H,0A1H,86H,8EHEND五、實驗步驟:1.運行UltraEdit-32源程序編輯軟件,輸入、編輯匯編語言源程序。2.運行KeiluVision2源程序編譯軟件,對源程序進行編譯,得到目標代碼文件。3.運行Proteus模擬仿真軟件,打開已繪制好的仿真電路原理圖,進行模擬 仿真。4.把硬件仿真器ME-52A與單片實驗板連接好,再用硬件仿真器進行仿真驗證。六、實驗分析與總結1.用仿真系統調試簡單程序結構、分支程序結構、循環程序結構、子程序結構和中斷結構的關鍵在于,如何將對程序的分析理解和開發系統提供的基本功能有機地結合起來,其前提條件是必須對源程序的作用、結構特點、運行過程與結果有較全面的認識,并能根據程序運行過程中出現的現象和結果分析并判斷產生各種故障現象的原因,再運用排除法逐一檢驗各種判斷是否準確。2.掌握程序結構特點的基礎上,合理選擇觀測點,通過觀察在觀測點處參數及路徑的變化檢驗程序運行的結果。3.高調試程序的效率,應對單片機開發系統所提供的幾種程序運行調試方式有足夠的了解并能熟練地運用。例如,在調試過程中,若要觀察最終結果,則可選擇全速運行調試;若要觀察相關指令的運行結果或運行路徑的變化過程,則可選擇單步運行;若要檢查子程序的運行過程,則可選擇跟蹤運行調試;若要檢查循環程序或中斷服務程序,則可選擇斷點運行調試;若要定點檢查程序運行到某處的結果時,則可選擇快速運行到光標處調試。但實際中究竟選用哪種方法更適宜或哪幾種方法結合使用更快捷,將隨著分析能力與操作的熟練程度逐步提高。4.程序運行結果是否正確時,應運用單片機開發系統所提供的交互界面,將程序運行過程中程序計數器PC(地址)的變化、各單元(內部RAM和外部RAM)內容的變化、特殊功能寄存器內容的變化、堆棧指針SP內容的變化與程序的理論分析結果相對照。5.程序和調試程序時,需要多次反復的過程,并非一次就能排除全部故障,特別是單片機應用系統的硬件電路和匯編程序相結合的綜合調試就更加復雜,因此,必須通過反復調試,不斷修改硬件和軟件,直到最終符合設計要求為止。如果在調試中能夠根據實驗現象預先對產生故障的原因加以判斷和分析,并制定出相應的調試方法和步驟,可縮小排除故障的范圍,提高調試效率。七、思考與練習填空題

1、設X=5AH,Y=36H,則X與Y“或”運算為__7EH_______,X與Y的“異或”運算為___6CH_____。

2、若機器的字長為8位,X=17,Y=35,則X+Y=__110100_____,X-Y=_11101110______(要求結果寫出二進制形式)。

3、單片機的復位操作是____高電平______(高電平/低電平),單片機復位后,堆棧指針SP的值是___07h_____。

4、單片機中,常用作地址鎖存器的芯片是__74HC373____________,常用作地址譯碼器芯片是_____74HC138____________。

5、若選擇內部程序存儲器,應該設置為_____高_______(高電平/低電平),那么,PSEN信號的處理方式為___不用__________________。

6、單片機程序的入口地址是____0000H__________,外部中斷1的入口地址是______0013H_________。

7、若采用6MHz的晶體振蕩器,則MCS-51單片機的振蕩周期為__0.5us_______,機器周期為_____2us__________。

8、擴展芯片的選擇方法有兩種,它們分別是___線選法_______________和_____譯碼法__________。

9、單片機的內部RAM區中,可以位尋址的地址范圍是____20H~2FH______________,特殊功能寄存器中,可位尋址的地址是___是能被8整除的地址_________________。

10、子程序返回指令是___ret______,中斷子程序返回指令是__reti。

11、8051單片機的存儲器的最大特點是內部RAM與外部RAM分開編址。

12、8051最多可以有32個并行輸入輸出口,最少也可以有8個并行口。

13、函數是C語言的基本單位。

14、串行口方式2接收到的第9位數據送SCON寄存器的RB8位中保存。

15、MCS-51內部提供3個可編程的16位定時/計數器,定時器有4種工作方式。

16、一個函數由兩部分組成,即說明部分和語句部分。

17、串行口方式3發送的第9位數據要事先寫入SCON寄存器的TB8位。

18、利用8155H可以擴展3個并行口,256個RAM單元。

19、C語言中輸入和輸出操作是由庫函數scanf和printf等函數來完成。

二、選擇題

1、C語言中最簡單的數據類型包括(B)。

A、整型、實型、邏輯型B、整型、實型、字符型

C、整型、字符型、邏輯型D、整型、實型、邏輯型、字符型

2、當MCS-51單片機接有外部存儲器,P2口可作為(C)。

A、數據輸入口B、數據的輸出口

C、準雙向輸入/輸出口D、輸出高8位地址

3、下列描述中正確的是(D)。

A、程序就是軟件B、軟件開發不受計算機系統的限制

C、軟件既是邏輯實體,又是物理實體D、軟件是程序、數據與相關文檔的集合

4、下列計算機語言中,CPU能直接識別的是(D)。

A、自然語言B、高級語言C、匯編語言D、機器語言

5、MCS-5l單片機的堆棧區是設置在(C)中。

A、片內ROM區B、片外ROM區C、片內RAM區D、片外RAM區

6、以下敘述中正確的是(C)。

A、用C語言實現的算法必須要有輸入和輸出操作

B、用C語言實現的算法可以沒有輸出但必須要有輸入

C、用C程序實現的算法可以沒有輸入但必須要有輸出

D、用C程序實現的算法可以既沒有輸入也沒有輸出

7、定時器/計數器工作方式1是(D)。

A、8位計數器結構B、2個8位計數器結構

C、13位計數結構D、16位計數結構

8、C語言提供的合法的數據類型關鍵字是(B)。

A、DoubleB、shortC、integerD、Char

9、片內RAM的20H~2FH為位尋址區,所包含的位地址是(B)。

A、00H~20HB、00H~7FHC、20H~2FHD、00H~FFH

10、以下能正確定義一維數組的選項是(B)。

A、inta[5]={0,1,2,3,4,5};B、chara[]={0,1,2,3,4,5};

C、chara={’A’,’B’,’C’};D、inta[5]="0123";

11、數據的存儲結構是指(D)。

A、存儲在外存中的數據B、數據所占的存儲空間量

C、數據在計算機中的順序存儲方式D、數據的邏輯結構在計算機中的表示

12、下列關于棧的描述中錯誤的是(C)。

A、棧是先進后出的先性表B、棧只能順序存儲

C、棧具有記憶作用D、對棧的插入和刪除操作中,不需要改變棧底指針

13、在寄存器間接尋址方式中,間址寄存器中存放的數據是(B)。

A、參與操作的數據B、操作數的地址值

C、程序的轉換地址D、指令的操作碼

14、MCS-51單片機的復位信號是(A)有效。

A、高電平B、低電平C、脈沖D、下降沿

15、為了使模塊盡可能獨立,要求(B)。

A、模塊的內聚程度要盡量高,且各模塊間的耦合程度要盡量強

B、模塊的內聚程度要盡量高,且各模塊間的耦合程度要盡量弱

C、模塊的內聚程度要盡量低,且各模塊間的耦合程度要盡量弱

D、模塊的內聚程度要盡量低,且各模塊間的耦合程度要盡量強

16、若MCS-51單片機使用晶振頻率為6MHz時,其復位持續時間應該超過(B)。

A、2μsB、4μsC、8μsD、1ms

17、以下選項中可作為C語言合法常量的是(A)

A、-80B、-080C、-8e1.0D、-80.0e

18、能夠用紫外光擦除ROM中程序的只讀存儲器稱為(C)。

A、掩膜ROMB、PROMC、EPROMD、EEPROM

19、以下不能定義為用戶標識符是(D)。

A、MainB、_0C、_intD、sizeof

20、下選項中,不能作為合法常量的是(B)。//冪不能為小數

A、1.234e04B、1.234e0.4C、1.234e 4D、1.234e0

21、以下敘述中錯誤的是(C)

A、對于double類型數組,不可以直接用數組名對數組進行整體輸入或輸出

B、數組名代表的是數組所占存儲區的首地址,其值不可改變

C、當程序執行中,數組元素的下標超出所定義的下標范圍時,系統將給出“下標越界”的出錯信息

D、可以通過賦初值的方式確定數組元素的個數

22、以下與函數fseek(fp,0L,SEEK_SET)有相同作用的是(D)

A、feof(fp)B、ftell(fp)C、fgetc(fp)D、rewind(fp)

23、存儲16×16點陣的一個漢字信息,需要的字節數為(A)

A、32B、64C、128D、256

24、已知1只共陰極LED顯示器,其中a筆段為字形代碼的最低位,若需顯示數字1,則它的字形代碼應為(B)。

A、06HB、F9HC、30HD、CFH

25、在C語言中,合法的長整型常數是(A)

A、OLB、4962710C、324562&D、216D

26、以下選項中合法的字符常量是(B)

A、"B"B、’\010’C、68D、D

27、若PSW.4=0,PSW.3=1,要想把寄存器R0的內容入棧,應使用(D)指令。

A、PUSHR0B、PUSH@R0C、PUSH00HD、PUSH08H

28、在片外擴展一片2764程序存儲器芯片要(B)地址線。

A、8根B、13根C、16根D、20根

29、設MCS-51單片機晶振頻率為12MHz,定時器作計數器使用時,其最高的輸入計數頻率應為(C)

A、2MHzB、1MHzC、500kHzD、250kHz

30、下列數據字定義的數表中,(A)是錯誤的。

A、DW“AA”B、DW“A”C、DW“OABC”D、DWOABCH

三、判斷題

(√)1、在對某一函數進行多次調用時,系統會對相應的自動變量重新分配存儲單元。

(×)2、在C語言的復合語句中,只能包含可執行語句。

(√)3、自動變量屬于局部變量。

(×)4、Continue和break都可用來實現循環體的中止。

(√)5、字符常量的長度肯定為1。

(×)6、在MCS-51系統中,一個機器周期等于1.5μs。

(√)7、C語言允許在復合語句內定義自動變量。

(√)8、若一個函數的返回類型為void,則表示其沒有返回值。

(×)9、所有定義在主函數之前的函數無需進行聲明。

(×)10、定時器與計數器的工作原理均是對輸入脈沖進行計數。

(×)11、END表示指令執行到此結束。

(√)12、ADC0809是8位逐次逼近式模/數轉換接口。

(√)13、MCS-51的相對轉移指令最大負跳距是127B。

(×)14、MCS-51的程序存儲器只是用來存放程序的。

(√)15、TMOD中的GATE=1時,表示由兩個信號控制定時器的的啟停。

(×)16、MCS-51的特殊功能寄存器分布在60H~80H地址范圍內。

(×)17、MCS-51系統可以沒有復位電路。

(×)18、片內RAM與外部設備統一編址時,需要專門的輸入/輸出指令。

(√)19、鎖存器、三態緩沖寄存器等簡單芯片中沒有命令寄存和狀態寄存等功能。

(√)20、使用8751且=1時,仍可外擴64KB的程序存儲器。

四、簡答題

1、在使用8051的定時器/計數器前,應對它進行初始化,其步驟是什么?

答:(1)確定T/C的工作方式——編程TMOD寄存器;

(2)計算T/C中的計數初值,并裝載到TH和TL;

(3)T/C在中斷方式工作時,須開CPU中斷和源中斷——編程IE寄存器;

(4)啟動定時器/計數器——編程TCON中TR1或TR0位。

2、什么是重入函數?重入函數一般什么情況下使用,使用時有哪些需要注意的地方?

答:多個函數可以同時使用的函數,稱為重入函數。

通常情況下,C51函數不能被遞歸調用,也不能應用導致遞歸調用的結構。有此限制是由于函數參數和局部變量是存儲在固定的地址單元中。重入函數特性允許你聲明一個重入函數。即可以被遞歸調用的函數。

重入函數可以被遞歸調用,也可以同時被兩個或更多的進程調用。重入函數在實時應用中及中斷服務程序代碼和非中斷程序代碼必須共用一個函數的場合中經常用到。

3、8051引腳有多少I/O線?他們和單片機對外的地址總線和數據總線有什么關系?地址總線和數據總線各是幾位?

答:8051引腳共有40個引腳,8051的地址總線由P2和P0口提供,P2口是地址總線的高8位,P0口是地址總線的低8位;數據總線由P0口提供;P0口的地址總線和數據總線是分時進行的,P0口的地址總線需要外接地址鎖存器完成地址鎖存。

地址總線共16位,數據總線是8位。

4、在有串行通信時,定時器/計數器1的作用是什么,怎樣確定串行口的波特率?

答:在有串行通信時,定時器/計數器1的作用是串行口發生器。

串行口的波特率根據串行口的工作方式具有不同的計算方式:

方式0的波特率固定為晶體振蕩器的十二分之一;

方式1的波特率=2SMOD.(定時器1的溢出率)/32;

方式2波特率=2SMOD.(fosc/64);

方式3波特率同方式1(定時器l作波特率發生器)。

5、如何消除鍵盤的抖動?怎樣設置鍵盤中的復合鍵?

答:由于按鍵是機械開關結構,所以當用手按下其中一個鍵時,往往會出現所按鍵在閉合位置和斷開位置之間發生跳幾下后才會穩定到閉合狀態的情況。在釋放一個鍵時,也會出現類似的情況,這就是鍵的抖動,抖動的持續時間不一,但通常不會大于10ms。

若抖動問題不解決,就會引起對閉合鍵的多次讀入。對于鍵抖動最方便的解決方法就是當發現有鍵按下后,不是立即進行掃描,而是延時大約10ms后再進行。由于一個鍵按下的時間一般會持續上百毫秒,所以延遲10ms后再掃描處理并不遲。

復合鍵可以仿照計算機復合鍵的處理方法,通常可以假設一個鍵具有復合功能,再與其它減的鍵值組合成復合鍵。1、矩陣式鍵盤的結構與工作原理

在鍵盤中按鍵數量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。

矩陣式結構的鍵盤顯然比直接法要復雜一些,識別也要復雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。具體的識別及編程方法如下所述。

2、矩陣式鍵盤的按鍵識別方法

確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。

行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。

1、判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。

2、判斷閉合鍵所在的位置在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為 高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

下面給出一個具體的例子:

圖仍如上所示。8031單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源 5V,并把列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。

1、檢測當前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。

2、去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。

3、若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:

P1.71110

P1.61101

P1.51011

P1.40111

在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值

4、為了保證鍵每閉合一次CPU僅作一次處理,必須卻除鍵釋放時的抖動。

鍵盤掃描程序:

從以上分析得到鍵盤掃描程序的流程圖如圖2所示。程序如下

SCAN:MOVP1,#0FH

MOVA,P1

ANLA,#0FH

CJNEA,#0FH,NEXT1

SJMPNEXT3

NEXT1:ACALLD20MS

MOVA,#0EFH

NEXT2:MOVR1,A

MOVP1,A

MOVA,P1

ANLA,#0FH

CJNEA,#0FH,KCODE;

MOVA,R1

SETBC

RLCA

JCNEXT2

NEXT3:MOVR0,#00H

RET

KCODE:MOVB,#0FBH

NEXT4:RRCA

INCB

JCNEXT4

MOVA,R1

SWAPA

NEXT5:RRCA

INCB

INCB

INCB

INCB

JCNEXT5

NEXT6:MOVA,P1

ANLA,#0FH

CJNEA,#0FH,NEXT6

MOVR0,#0FFH

RET

鍵盤處理程序就作這么一個簡單的介紹,實際上,鍵盤、顯示處理是很復雜的,它往往占到一個應用程序的大部份代碼,可見其重要性,但說到,這種復雜并不來自于單片機的本身,而是來自于操作者的習慣等等問題,因此,在編寫鍵盤處理程序之前,最好先把它從邏輯上理清,然后用適當的算法表示出來,最后再去寫代碼,這樣,才能快速有效地寫好代碼。

到本課為止,本站教程暫告一個段落!感謝大家的關心和支持!矩陣按鍵部分由16個輕觸按鍵按照4行4列排列,連接到JP50端口。將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。確定矩陣式鍵盤上何鍵被按下,介紹一種“行掃描法”。行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法.判斷鍵盤中有無鍵按下:將全部行線置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。判斷閉合鍵所在的位置:在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。下面給出一個具體的例子:電路圖路徑:G:\圖片\電路圖片\xl100097.jpg8031單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。1.檢測當前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。2.去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。3.若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:P1.71110P1.61101P1.51011P1.40111在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值。4.為了保證鍵每閉合一次CPU僅作一次處理,必須去除鍵釋放時的抖動。實驗目的:通過XL1000的16位矩陣按鍵,在數碼管上分別顯示0---9,A,B,C,D,E,F。接線方法:1用一條8PIN數據排線,把矩陣按鍵部份的JP50,接到CPU部份的P1口JP44.2接8位數碼管的數據線。將數碼管部份的數據口JP5接到CPU部份的P0口JP51.3接8位數碼管的顯示位線。將數碼管部份的顯示位口JP8接到CPU部份的P2口JP52.參考程序:;本程序實現掃描按鍵顯示功能.;分別按16個鍵盤顯示分別顯示數字123A456B789C*0#D;鍵盤口P1,數碼管顯示第二位p21,數碼管段位p0口org0000hajmpmainorg0030hmain:movdptr,#tab;將表頭放入DPTRlcallkey;調用鍵盤掃描程序movca,@a dptr;查表后將鍵值送入ACCmovp0,a;將Acc值送入P0口CLRP2.1;開顯示ljmpmain;返回反復循環顯示KEY:LCALLKS;調用檢測按鍵子程序JNZK1;有鍵按下繼續LCALLDELAY2;無鍵按調用延時去抖AJMPKEY;返回繼續檢測按鍵K1:LCALLDELAY2LCALLDELAY2;有鍵按下延時去抖動LCALLKS;再調用檢測按鍵程序JNZK2;確認有按下進行下一步AJMPKEY;無鍵按下返回繼續檢測K2:MOVR2,#0EFH;將掃描值送入R2暫存MOVR4,#00H;將第一列值送入R4暫存K3:MOVP1,R2;將R2的值送入P1口L6:JBP1.0,L1;P1.0等于1跳轉到L1MOVA,#00H;將第一行值送入ACCAJMPLK;跳轉到鍵值處理程序L1:JBP1.1,L2;P1.1等于1跳轉到L2MOVA,#04H;將第二行的行值送入ACCAJMPLK;跳轉到鍵值理程序進行鍵值處理L2:JBP1.2,L3;P1.2等于1跳轉到L3MOVA,#08H;將第三行的行值送入ACCAJMPLK;跳轉到鍵值處理程序L3:JBP1.3,NEXT;P1.3等于1跳轉到NEXT處MOVA,#0cH;將第四行的行值送入ACCLK:ADDA,R4;行值與列值相加后的鍵值送入APUSHACC;將A中的值送入堆棧暫存K4:LCALLDELAY2;調用延時去抖動程序LCALL KS;調用按鍵檢測程序JNZK4;按鍵沒有松開繼續返回檢測POPACC;將堆棧的值送入ACCRETNEXT:INCR4;將列值加一MOVA,R2;將R2的值送入AJNBACC.7,KEY;掃描完至KEY處進行下一掃描RLA;掃描未完將A中的值右移一位進行下一列的掃描MOVR2,A;將ACC的值送入R2暫存AJMPK3;跳轉到K3繼續KS:MOVP1,#0FH;將P1口高四位置0低四位值1MOVA,P1;讀P1口XRLA,#0FH;將A中的值與A中的值相異或RET;子程序返回DELAY2:;40ms延時去抖動子程序MOVR5,#08HL7:MOVR6,#0FAHL8:DJNZR6,L8DJNZR5,L7RETtab:db28h,34h,28h,34h,0a9h,60h,20h,7ah,20h,21h,61h,74h,30h,62h,0a2h,7eh;0h0hc9878654a321輪流顯示鍵盤因為無法表達*#就用H表示,B用8表示end這是我做成功的4X4鍵盤掃描源程序,P1.0-P1.3做四根列線,P1.4-P1.7做四根行線。

數碼管的字型表是按照標準接法做的,按對應的按鍵數碼管顯示對應的數字。

以下是源程序:

KEYBUFEQU30H

ORG00H

START:MOVKEYBUF,#2

MOVP2,#00001111B

WAIT:

MOVP1,#0FFH

CLRP1.4

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK1

MOVKEYBUF,#0

LJMPDK1

NK1:CJNEA,#0DH,NK2

MOVKEYBUF,#1

LJMPDK1

NK2:CJNEA,#0BH,NK3

MOVKEYBUF,#2

LJMPDK1

NK3:CJNEA,#07H,NK4

MOVKEYBUF,#3

LJMPDK1

NK4:NOP

DK1:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK1A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK1A

NOKEY1:

MOVP1,#0FFH

CLRP1.5

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY2

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY2

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK5

MOVKEYBUF,#4

LJMPDK2

NK5:CJNEA,#0DH,NK6

MOVKEYBUF,#5

LJMPDK2

NK6:CJNEA,#0BH,NK7

MOVKEYBUF,#6

LJMPDK2

NK7:CJNEA,#07H,NK8

MOVKEYBUF,#7

LJMPDK2

NK8:NOP

DK2:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK2A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK2A

NOKEY2:

MOVP1,#0FFH

CLRP1.6

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY3

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY3

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK9

MOVKEYBUF,#8

LJMPDK3

NK9:CJNEA,#0DH,NK10

MOVKEYBUF,#9

LJMPDK3

NK10:CJNEA,#0BH,NK11

MOVKEYBUF,#10

LJMPDK3

NK11:CJNEA,#07H,NK12

MOVKEYBUF,#11

LJMPDK3

NK12:NOP

DK3:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK3A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK3A

NOKEY3:

MOVP1,#0FFH

CLRP1.7

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY4

LCALLDELY10MS

MOVA,P1

ANLA,#0FH

XRLA,#0FH

JZNOKEY4

MOVA,P1

ANLA,#0FH

CJNEA,#0EH,NK13

MOVKEYBUF,#12

LJMPDK4

NK13:CJNEA,#0DH,NK14

MOVKEYBUF,#13

LJMPDK4

NK14:CJNEA,#0BH,NK15

MOVKEYBUF,#14

LJMPDK4

NK15:CJNEA,#07H,NK16

MOVKEYBUF,#15

LJMPDK4

NK16:NOP

DK4:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,@A DPTR

MOVP0,A

DK4A:MOVA,P1

ANLA,#0FH

XRLA,#0FH

JNZDK4A

NOKEY4:

LJMPWAIT

DELY10MS:

MOVR6,#10

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

TABLE:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H;0-9

DB088H,083H,0C6H,0A1H,086H,08EH,089H,0CFH,0C7H,0C8H;A,B,C,D,E,F,H,I,L,N,

END;P3.1數據采集控制

;P2.6P2.7個位十位顯示轉換控制

;P1口接8個開關模擬數據

;P1.0-P1.3為個位開關量輸入

;P1.4-P1.7為十位開關量輸入

;此程序僅供參考

;功能P1口接8個開關輸入量4個一組,分別為個位,十位輸入

;P0口接一個數碼管,依次顯示輸入量。P3.1控制是否讀入

;開關量。P2.6P2.7控制是否顯示個位或十位

ORG100h

LJMPSTAR

STAR:MOVP1,#0FFH

SETBP3.1數據讀入標志

MOVR0,#100,循環工作次數

LOOP:JBP3.1,$P3.1低電平時,采集P1口數據開關量處理顯示階段不再應答P3.1

MOVA,P1

PUSHACC

ANLA,#0FH取個位數值

MOVR1,A個位數值保存到R1

POPACC

ANLA,#0F0H

SWAPA高4位轉成字節信息

MOVR2,A十位數值保存到R2

MOVDPTR,#TABLED

MOVA,R1

MOVCA,@A DPTR

MOVP0,A

CLRP2.6個位顯示

ACALLDELAY500MS

SETBP2.6

MOVA,R2

MOVCA,@A DPTR

MOVP0,A

CLRP2.7十位顯示

ACALLDELAY500MS

SETBP2.7

DJNZR0,LOOP

DELAY500MS:延時500毫秒子程略

RET

TABLED:DB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h

DB80H,90H,88h,83h,0c6h,0a1h,86h,8eh

END#include

typedefunsignedcharBYTE;

BYTEcodeTABLED[16]={0Xc0,0Xf9,0Xa4,0Xb0,0X99,0X92,0X82,0X0f8,0X80,0X90,0X88,0X83,0Xc6,0Xa1,0X86,0X8e};

BYTEDATled;

sbitP26=P2^6;

sbitP27=P2^7;

sbitP31=P3^1;

intTIME;

voidtimedelay(DTIME)

intDTIME;

{

intI;

for(I=0;I<=DTIME;I );

}

voidmain()

{

intTEMP;

P26=1;

P27=1;

P31=1;

P1=0xFF;

TIME=1000;

while(1){

while(P31==0){

DATled=P1;

TEMP=DATled&0x0f4;

P0=TABLED[TEMP];

P27=0;

timedelay(TIME);

P27=1;

}

}

}1.實驗任務在8X8 LED點陣上顯示柱形,讓其先從左到右平滑移動三次,其次從右到左平滑移動三次,再次從上到下平滑移動三次,最后從下到上平滑移動三次,如此循環下去。2.電路原理圖圖4.24.13.硬件電路連線(1).把“單片機系統”區域中的P1端口用8芯排芯連接到“點陣模塊”區域中的“DR1-DR8”端口上;(2).把“單片機系統”區域中的P3端口用8芯排芯連接到“點陣模塊”區域中的“DC1-DC8”端口上;4.程序設計內容(1).8X8 點陣LED工作原理說明8X8點陣LED結構如下圖所示圖4.24.2從圖4.24.2中可以看出,8X8點陣共需要64個發光二極管組成,且每個發光二極管是放置在行線和列線的交叉點上,當對應的某一列置1電平,某一行置0電平,則相應的二極管就亮;因此要實現一根柱形的亮法,如圖49所示,對應的一列為一根豎柱,或者對應的一行為一根橫柱,因此實現柱的亮的方法如下所述:一根豎柱:對應的列置1,而行則采用掃描的方法來實現。一根橫柱:對應的行置0,而列則采用掃描的方法來實現。5.匯編源程序

ORG00H

START:NOP

MOVR3,#3

LOP2:MOVR4,#8

MOVR2,#0

LOP1:MOVP1,#0FFH

MOVDPTR,#TABA

MOVA,R2

MOVCA,@A DPTR

MOVP3,A

INCR2

LCALLDELAY

DJNZR4,LOP1

DJNZR3,LOP2

MOVR3,#3

LOP4:MOVR4,#8

MOVR2,#7

LOP3:MOVP1,#0FFH

MOVDPTR,#TABA

MOVA,R2

MOVCA,@A DPTR

MOVP3,A

DECR2

LCALLDELAY

DJNZR4,LOP3

DJNZR3,LOP4

MOVR3,#3

LOP6:MOVR4,#8

MOVR2,#0

LOP5:MOVP3,#00H

MOVDPTR,#TABB

MOVA,R2

MOVCA,@A DPTR

MOVP1,A

INCR2

LCALLDELAY

DJNZR4,LOP5

DJNZR3,LOP6

MOVR3,#3

LOP8:MOVR4,#8

MOVR2,#7

LOP7:MOVP3,#00H

MOVDPTR,#TABB

MOVA,R2

MOVCA,@A DPTR

MOVP1,A

DECR2

LCALLDELAY

DJNZR4,LOP7

DJNZR3,LOP8

LJMPSTART

DELAY:MOVR5,#10

D2:MOVR6,#20

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

DJNZR5,D2

RET

TABA:DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH

TABB:DB01H,02H,04H,08H,10H,20H,40H,80H

END

6.C語言源程序

#include

unsignedcharcodetaba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f0;j--);

}

voidmain(void)

{

unsignedchari,j;

while(1)

{

for(j=0;j<3;j )

//fromlefttoright3time

{

for(i=0;i<8;i )

{

P3=taba[i];

P1=0xff;

delay1();

}

}

for(j=0;j<3;j )

//fromrighttoleft3time

{

for(i=0;i<8;i )

{

P3=taba[7-i];

P1=0xff;

delay1();

}

}

for(j=0;j<3;j )

//fromtoptobottom3time

{

for(i=0;i<8;i )

{

P3=0x00;

P1=tabb[7-i];

delay1();

}

}

for(j=0;j<3;j )

//frombottomtotop3time

{

for(i=0;i<8;i )

{

P3=0x00;

P1=tabb[i];

delay1();

}

}

}

}LED點陣顯示實驗一.實驗要求

編程實現中英文字符的顯示。

二.實驗目的

1.了解LED點陣顯示的基本原理和實現方法。

2.掌握點陣漢字庫的編碼和從標準字庫中提取漢字編碼的方法。

三.實驗電路及連線

點陣顯示模塊WTD3088的(紅色)列輸入線接至內部LED的陰極端,行輸入線接至內部LED的陽極端(若陽極端輸入為高電平,陰極端輸入低電平,則該LED點亮)。發光點的分布如圖22-0所示。

Fig22-0WTD3088LED分布

如圖22-1示,本實驗模塊使用74LS374來控制列輸入線的電平值。將74LS374的某輸出置0,則對應的LED陰極端被置低。如圖22-2示,本實驗模塊使用74LS273來控制行輸入線,并通過9013提供電流驅動。將74LS273的某輸出置1,則對應的LED陽極端被置高。每次系統重新開啟或總清后,74LS273輸出為全0,LED顯示被關閉。

通過編程控制各顯示點對應LED陽極和陰極端的電平,就可以有效的控制各顯示點的亮滅。

Fig22-1LED模塊及列掃描電路Fig22-2行掃描電路

Fig22-3地址譯碼電路

本實驗模塊使用4塊WTD3088組成16×16點陣,以滿足漢字顯示的要求。為了方便的控制四個單元,使用了一片74LS139譯碼,產生四個地址片選信號:CLKR1=CSLED,CLKR2=CSLED 1,用于行控制的兩片74LS273;CLKC1=CSLED 2,CLKC2=CSLED 3,用于列控制的兩片74LS374。

實驗接線:按示例程序,模塊的CSLED接51/96地址的8000H。

四.實驗說明

使用高亮度LED發光管構成點陣,通過編程控制可以顯示中英文字符、圖形及視頻動態圖形。LED顯示以其組構方式靈活、亮度高、技術成熟、成本低廉等特點在證券、運動場館及各種室內/外顯示場合得到廣泛的應用。

所顯示字符的點陣數據可以自行編寫(即直接點陣畫圖),也可從標準字庫(如ASC16、HZ16)中提取。后者需要正確掌握字庫的編碼方法和字符定位的計算。

實驗盤片中“字符轉換”子目錄下提供的Basc16.exe,BHz16.exe可方便的將單個字符的碼表從標準字庫Asc16,Hzk16中提取出來。具體使用方法是運行上述可執行程序,根據提示輸入所需字符(如是漢字還需要先啟動dos下的漢字環境,如ucdos,pdos95等)。程序將該字符的碼表提取出來,存放在該字符ASC或區位碼為文件名稱的.dat文件中。用戶只需將該文件中內容拷貝、粘貼到自己的程序中即可。但需要注意字節排列順序、字節中每一位與具體顯示點的一一對應關系,必要時還要對碼表稍作修改。同一目錄下還提供了上述可執行程序的源文件,使用BC3.1編寫,供用戶參考。

五.實驗程序框圖

用戶應留心其中行掃描的實現及碼表的處理。

六.實驗程序:(一)提供LEDA51演示Asc16字符的簡單點陣顯示。

;________*LED點陣顯示示例程序______________________*

;__該程序顯示Asc16字符__

;__為了簡單起見,程序只顯示一個字符__

;__該程序針對T598實驗機的模塊14__

;____________________________________________________

CSLEDEQU8000H

CSR1EQUCSLED;行1273

CSR2EQUCSLED 1H;行2273

CSC1EQUCSLED 2H;列1374

CSC2EQUCSLED 3H;列2374

ORG0000H

MOVSP,#60H

INIT:MOVA,#0H;關閉行

MOVDPTR,#CSR1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVX@DPTR,A

MOVA,#0FFH;關閉列

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSC2

MOVX@DPTR,A

D:MOVR5,#00H

MOVR4,#01H;每次為單行掃描

DISP:

MOVA,R5

MOVDPTR,#ASCE;此處設定所要顯示的字符

MOVCA,@A DPTR

CPLACC;代碼取反,決定顯示的陰陽

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVDPTR,#CSR1

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#8H,DISP

MOVA,#0H

MOVX@DPTR,A

MOVR5,#08H

MOVR4,#01H

DISP2:

MOVA,R5

MOVDPTR,#ASCE

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#10H,DISP2

MOVA,#0H

MOVX@DPTR,A

SJMPD

;________延時子程序,協調字符顯示速度____________*

DELAY:MOVR7,#1H

DL1:MOVR6,#00H

DL2:DJNZR6,DL2

DJNZR7,DL1

RET

;________字符點陣字庫______________*

;ASC16字符編碼排列

;0

;1

;|

;|

;14

;15

;高位D7--D0

;請注意編碼的排列次序和實際顯示點陣分布的關系

ASCA:DB00H,00H,10H,38H,6CH,0C6H,0C6H,0FEH

DB0C6H,0C6H,0C6H,0C6H,00H,00H,00H,00H

ASCE:DB00H,00H,0FEH,66H,62H,68H,78H,68H

DB60H,62H,66H,0FEH,00H,00H,00H,00H

ASCD:DB00H,00H,0F8H,6CH,66H,66H,66H,66H

DB66H,66H,6CH,0F8H,00H,00H,00H,00H

ASCK:DB00H,00H,0E6H,66H,66H,6CH,78H,78H

DB6CH,66H,66H,0E6H,00H,00H,00H,00H

;____________________________________________________

END

(二)LEDHZ51兩個示例程序。和Hz16字符的簡單點陣顯示。

;________*LED點陣顯示示例程序______________________*

;__該程序顯示hz16字符__

;__為了簡單起見,程序只顯示一個字符__

;__該程序針對T598實驗機的模塊14__

;____________________________________________________

CSLEDEQU8000H

CSR1EQUCSLED;行1273

CSR2EQUCSLED 1H;行2273

CSC1EQU CSLED 2H;列1374

CSC2EQUCSLED 3H;列2374

ORG0000H

MOVSP,#60H

INIT:MOVA,#0H;關閉LED顯示

MOVDPTR,#CSR1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVX@DPTR,A

MOVA,#0FFH;關閉LED顯示

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSC2

MOVX@DPTR,A

D:MOVR5,#00H

MOVR4,#01H

DISP:

MOVA,R5

RLACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVA,R5

RLACC

INCACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSR1

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#8H,DISP

MOVA,#0H

MOVX@DPTR,A

MOVR5,#08H

MOVR4,#01H

DISP2:

MOVA,R5

RLACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC2

MOVX@DPTR,A

MOVA,R5

RLACC

INCACC

MOVDPTR,#HZAI

MOVCA,@A DPTR

CPLACC

MOVDPTR,#CSC1

MOVX@DPTR,A

MOVDPTR,#CSR2

MOVA,R4

MOVX@DPTR,A

RLACC

MOVR4,ACC

INCR5

LCALLDELAY

CJNER5,#10H,DISP2

MOVA,#0H

MOVX@DPTR,A

SJMPD

;________延時子程序,協調字符顯示速度____________*

DELAY:MOVR7,#1H

DL1:MOVR6,#00H

DL2:DJNZR6,DL2

DJNZR7,DL1

RET

;________字符點陣字庫______________*

;HZ16字符編碼排列

;01

;23

;|

;|

;2829

;3031

;高位D7--D0

HZAI:DB00H,78H,3FH,80H,11H,10H,09H,20H

DB7FH,0FEH,42H,02H,82H,04H,7FH,0F8H

DB04H,00H,07H,0F0H,0AH,20H,09H,40H

DB10H,80H,11H,60H,22H,1CH,0CH,08H

HZDI:DB00H,80H,40H,80H,20H,88H,2FH,0FCH

DB08H,88H,08H,88H,0E8H,88H,2FH,0F8H

DB28H,88H,28H,88H,28H,88H,2FH,0F8H

DB28H,08H,50H,06H,8FH,0FCH,00H,00H

HZKE:DB01H,00H,01H,04H,0FFH,0FEH,01H,00H

DB01H,10H,1FH,0F8H,10H,10H,10H,10H

DB10H,10H,1FH,0F0H,14H,50H,04H,40H

DB04H,40H,08H,42H,10H,42H,60H,3EH

;____________________________________________________

END基于89C51的計算機可鎖定加密鍵盤設計摘要:介紹PC鍵盤和鍵盤接口的PS/2通信協議,以及用89C51實現可鎖定鍵盤的軟件和硬件設計方法。具有安全可靠、容錯能力強、可以直接采用標準鍵盤進行改裝、便于實現等優點,并保留標準鍵盤的全部功能。關鍵詞:PS/289C51C51鍵盤引言

在智能儀器、自動控制等領域,已大量使用嵌入式PC,如Advantech公司的PC/104、AMD公司的DIMM-PC等。為適應開放式、模塊化的要求,嵌入式PC具有標準的PC接口,如VGA顯示器控制接口、以太網接口、RS232接口、PC/AT鍵盤接口等。所以,可以用標準的PC鍵盤對嵌入式PC進行操作與控制。鍵盤在輸入指令之后,可能很長一段時間不用。為計算機安全和防止誤觸發,需要將鍵盤鎖定,還要對某些鍵采取屏蔽措施,但是PC標準鍵盤不能滿足這些要求。本文介紹一種用89C51設計實現的可鎖定加密PC/AT鍵盤。

1鍵盤功能及工作原理

PC鍵盤功能主要有按鍵識別、去抖、重鍵處理、發送掃描碼、自動重發、接收鍵盤命令、處理命令等。鍵盤有編碼鍵盤和非編碼鍵盤。編碼鍵盤程序設計簡單,但硬件電路復雜,價格較高;非編碼鍵盤用軟件來實現識別鍵、編碼轉換、去抖等功能,硬件電路簡單,價格便宜。現代微機系統中廣泛采用非編碼鍵盤。PC鍵盤多采用18行×8列的二維矩陣行列結構。采用行掃描法識別按下的按鍵。2PS/2協議

PS/2協議是外設與主機之間通信的一種同步雙向串行協議。在該協議中主機擁有較高的優先級,在一定條件下可以終止外設正在進行的發送過程。PS/2協議采用的傳送數據幀的格式為:1位起始位(0)、8位數據位、1位奇偶校驗位、1位停止位(1)。數據發送時低位在前,高位在后。外設每收到主機發來的1幀數據,都要緊隨該幀的停止位發送一個握手位ACK(0)應答主機。然后,外設還要發1幀應答數據(0xF0),表示外設已經完整地接收到了主機的命令;而主機則不需發送握手位,也不需要發送應答幀。

2.1鍵盤到PC鍵盤接口的通信

當時鐘線和數據線均為高電平時,允許鍵盤發送數據,系統將接收數據;當時鐘線被拉為低電平時,表明系統禁止數據傳輸。圖1給出了發送時序,包含1個低電平觸發的起始位、8位數據位、1個奇校驗位和1個高電平的結束位。2.2PC系統到鍵盤的通信協議

若時鐘線出現高電平,數據線出現低電平,表明系統請求發送,鍵盤準備產生同步時鐘脈沖串,并接收數據。包含了1個低電平觸發的起始位、8位數據位、1個奇校驗位、1個應答位、1個高電平的結束位。圖2為時序圖。(1)鍵盤命令及執行過程①FFH:復位鍵盤。系統通過此軟件復位命令使鍵盤進入程序復位和內部自測試,稱為基本保證測試(BAT)。復位鍵盤的過程如下:a.鍵盤收到FFH后立即回送ACK(FAH)作答;b.鍵盤接口收到ACK后,將鍵盤時鐘和數據線置為高電平;c.鍵盤檢測到此狀態后開始BAT操作;d.如果BAT正確完成,鍵盤發送AAH以表示結束,

否則以FDH(或其它任何值)表示診斷有誤。②FEH:重新發送。當系統檢測到從鍵盤送來的任何傳輸錯誤時,它便向鍵盤發送FEH命令。鍵盤接收到此命令后,將重新送出原來的內容。③FDH~F7H:空操作(保留未用)。④F6H:設置缺省值。此命令使鍵盤所有條件復位到電源接通時的缺省狀態,鍵盤繼續掃描。⑤F5H:設置缺省值和停止鍵盤。此命令使鍵盤所有條件復位到電源接通時的缺省狀態,并停止鍵盤掃描,等待下一個鍵盤命令。⑥F4H:啟動鍵盤。鍵盤接收到此命令后,用ACK(FAH)作答,清除輸出緩沖器,并啟動鍵盤開始掃描。⑦F3H:設置拍發速率和延時參數。每當按下任 一鍵時,鍵盤以拍發速率連續送出鍵的接通碼,直到鍵被釋放為止。延時參數是指按下一鍵后,鍵盤輸出的響應時間。

系統缺省設置:拍發速率=10個/s±20,延時=500ms±20。

當要改變設置時可以使用F3H命令,并后跟一個字節的參數。參數定義如表1所列。

表1D7D6D5D4D3D2D1D00CBA

計算拍發速率和響應延時的公式如下:

拍發速率=1/[(8 A)×2B×0.00417](1/s)

響應延時=(1 C)×250(ms)注:缺省的延時參數值為2CH。此命令的執行過程如下:a.鍵盤收到F3H命令后,用FAH予以響應,并停止掃描和等待隨后的參數;b.鍵盤若收到隨后的設置參數,用另一個ACK響應,并按其參數設置新的拍發速率和響應延時,之后重新開始掃描(若鍵盤原來是開放的);c.鍵盤若收到FAH命令,但無隨后的設置參數,則鍵盤結束命令設置,并保持原來的拍發速率和響應延時,停止掃描。⑧F2H,F1,EFH:保留未用。⑨F0H:設置鍵盤掃描碼命令。此命令用于設置鍵盤的掃描碼,后跟參數指定三種掃描碼的哪一種。鍵盤復位時,默認掃描碼是第二種。⑩EEH:回送命令。此命令用于輔助診斷,要求鍵盤接收到EEH時也要回送EEH予以響應。若鍵盤原來是開放的,則繼續掃描。EDH:置位/復位LED指示器。鍵盤右上角有三個LED指示器,分別反映Caps、Num和Scroll三個鍵的鎖定情況。參數字節如表2所列。

表2D7D3D2D1D0保留1=激勵CapsLED1=激勵NumLED1=激勵ScrollLED

此命令執行過程與F3H相似。若命令后跟參數,則按參數設定LED狀態并繼續掃描。若僅有命令無參數,則不改變LED原狀態,并停止掃描。(2)鍵盤響應鍵盤在下列四種情況下都會向鍵盤接口發送數據。①按下任一鍵,鍵盤以拍發速率向接口發送鍵盤接通掃描碼。②釋放所按下的鍵,鍵盤發送斷開掃描碼。③系統向鍵盤發送鍵盤命令后,鍵盤回送應答。④當用戶按鍵速度超出鍵盤所能容納的最大鍵個數時,鍵盤做出響應。后三種情況稱為鍵盤響應。響應字節有7個,定義如下。

①FEH:重新發送響應。當鍵盤收到一個無效的鍵盤命令,或者檢測到奇偶錯的鍵盤命令時,鍵盤回送響應字節為FEH,要求系統重發鍵盤命令。②FAH:正常應答。對任何一個有效的鍵盤命令,鍵盤回送FAH予以響應。③00H:超限應答。當用戶按鍵速度超出鍵盤所能容納的最大鍵符個數時(16個字節的緩沖器),鍵盤發送00H。④FDH:診斷故障應答。鍵盤接受軟件復位命令,執行自測試過程中。若檢測到故障,則以FDH應答。此時,鍵盤停止掃描并等待下一個鍵盤命令。⑤AAH:診斷正常應答。鍵盤在軟件復位過程中,正常完成BAT測試,以AAH應答。⑥FEH:回響命令的應答,對鍵盤FEH命令的應答。⑦F0H:斷開掃描碼前綴,鍵盤對鍵符按下后釋放的應答,第一個字節為F0H,第二個字節為接通掃描碼(有幾個鍵例外)。3硬件設計

PC系列鍵盤采用18行×8列的矩陣行列結構。89C51單片機有4個8位I/O端口,因此可以采用P0、P2口再加上P3口的2個(P3.6和P3.7)作為行掃描線。P1口作為列輸入線(如果用P0口作列輸入線,必須加上拉電阻)。采用P3.0、P3.1作為數據線和時鐘線與PC系統進行通信,用P3.2、P3.4、P3.5控制鍵盤上的3個指示燈。硬件原理如圖3所示。

鍵盤與計算機通過一個五芯(PS/2接口為六芯)插座相接,4個有效引腳的定義分別是電源(VCC)、地(GND)、串行時鐘線(SCK)、串行數據線(SIO)。

4軟件設計①消抖及重鍵處理:通過軟件上延時程序來消除抖動;采用后按鍵優先處理,即多鍵同時按下時,只重復發送最后按下鍵的掃描碼。②程序包括鍵盤掃描子程序、發送鍵碼子程序、發送數據子程序、接收命令子程序、定時器1中斷服務程序、主程序等。鍵盤掃描子程序用于掃描鍵狀態,將被按鍵的位置號存入緩沖器中;發送鍵碼子程序用于將緩沖區鍵的接通碼或斷開碼發送給計算機鍵盤接口或者存在鍵盤密碼緩沖區中;發送數據子程序用于將數據發給計算機鍵盤接口;接收命令子程序用于接收計算機鍵盤接口發來的鍵盤命令;定時器1中斷服務子程序用于給程序中的延時提供標準時鐘,并具有軟件看門狗功能,防止軟件出現死機現象;主程序用于系統初始化,子程序調度,鎖定狀態的顯示等。

圖6發送緩沖區鍵碼子程序流程圖

圖4~6是主要軟件模塊的流程圖。單片機源程序見本刊網絡補充版(.com)。

5結論

本文介紹的PC/AT鍵盤具有結構簡單、設計靈活、安全可靠的特點,可用于標準PC和嵌入式PC。本鍵盤可以在標準的鍵盤基礎上進行改造,只需換掉原來的控制芯片即可,可節省設計成本。單片機C51編程幾個有用的模塊(1)KeilC51常用功能模塊使用說明

說明

本文檔包括單片機系統中常用到的時鐘中斷、通訊及鍵盤掃描等模塊(見所附源程序)的說明。這些模塊使用前后臺系統模型。為達到最大的靈活性,需要在用戶工程中定義config.h文件,在其中定義各模塊可選參數的設置,而不是直接更改源代碼。

這些可選內容大部分為宏定義,如果不定義宏相應的功能在編譯時被屏蔽,不會增加代碼長度。具體可選內容見各模塊中的說明。

在Config.h文件中還要包含一個單片機硬件的資源頭文件。

各模塊使用了定義在Common.h中的一些數據類型。如:BIT(bit)BYTE(unsignedchar)等,具體請參見源程序。

時鐘模塊

在單片機軟件設計中,時鐘是重要資源,為了充分利用時鐘資源,故設計本時鐘模塊。本模塊使用定時器0,在完成用戶指定功能的同時,還能夠自動處理一些其它模塊中與時鐘相關的信息。

時鐘模塊由聲明文件Timer.h以及實現文件Timer.c組成。

用戶應該在Config.h中定義宏TIMER_RELOAD來設定定時器0的重裝載初值。推薦的定時器0的中斷時間大于1毫秒。

在程序的初始化階段調用時鐘模塊的初始化函數InitTimerModule()之后,就可以使用時鐘模塊所以支持的各種功能。具體描述如下:

延時:當用戶需要進行一定時間的延時時,可以通過調用Delay()來進行,參數為時鐘中斷的次數。如時鐘中斷周期為1ms,想進行100ms的延時,則可以調用Delay(100)。

注意:

如果延時的絕對時間小于時鐘中斷的周期,則不能夠用本方法做到延時。

定時:當程序中需要使用定時功能時,如等待某外部事件,如果在一定時間內發生則繼續執行,如果在這段時間內發生,則認為出現錯誤,轉向錯誤處理機制。

在此推薦一種編程模式,但用戶可以用自己認為更合理的方式處理此類問題。

這里簡單說明一下關于阻塞式函數及非阻塞式函數。簡單說,阻塞式函數就是當檢測完成條件,如果不能夠完成則等待,如:

voidCheckSomething()

{

//gbitSuccessFlagisaglobalvariable

while(gbitSuccessFlag==FALSE)

{

//donothingbutwaiting

}

}

可以看到,當bitSuccessFlag沒有被設置為TRUE時,函數保持等待狀態不返回,這樣就是阻塞式的函數。

另外一種情況:

BITCheckSomething()

{

if(gbitSuccessFlag==TRUE)

{

//…

returnTRUE;

}

returnFALSE;

}

在這里,如果所檢測的事件有沒有完成,函數進行檢測之后,立刻返回, 通過返回值報告完成情況,如果沒有完成,則等待調用者分配再次執行的機會。這樣的函數就是非阻塞函數。

在應用定時功能時,首先要將檢測函數定義成非阻塞函數。如上面的第二個版本的CheckSomething。

然后下面模式:

BITbitDone=FALSE;

ResetClock();//cleartimerinterrupttimescounter

while(GetClock()

{

if(CheckSomething()==TRUE)

{

bitDone=TRUE;

break;

}

}

if(bitDone==FALSE)

{

//processtimeout

}

或者簡單寫成:

BITbitDone=FALSE;

ResetClock();

while(GetClock()=(z))

當然,用戶也可以將IsPackageHeader和IsPackageTailer定義成為函數,通過BIT類型的返回值來向調用者提供與相應宏相同的信息。

另一種辦法需要在Config.h文件中定義宏SCOMM_ComplexPackageFormat。(需要注意的是,不能夠同時定義SCOMM_SimplePackageFormat和SCOMM_ComplexPackageFormat宏,否則會造成嚴重的不可預見性錯誤。

這時需要提供回調函數QueryPackageFormat,原形如下:

BYTEQueryPackageFormat(BYTEbyData,BYTEbyCount,BYTEbyParam);

函數中三個參數的含義與使用簡單數據包格式時判斷數據包尾的宏的參數相同。

函數通過返回值來通知作為調用者的接收函數對接收到的數據如何處理,但目前這種方法僅為需要處理復雜數據包格式時的一種可選方法,但不推薦。用戶如果想使用這種方法可以自己更改接收函數中相應的

#ifdefSCOM_ComplexPackageFormat

#endif//SCOMM_ComplexPackageFormat

預編譯指令之間的內容。

例如指定QueryPackageFormat的返回值的含義:

0:繼續找數據包頭或繼續找數據包尾。

1:找到數據包頭。

2:找到數據包尾。

3:數據包出錯,需要拋棄。

然后更改源代碼來實現上面的協議。

注意:當用戶需要使用字符串的時候,可以利用簡單的包裝函數將字符串轉換為字節數組。所以沒有必要提供專用的字符串處理函數。

鍵盤掃描模塊

鍵盤掃描模塊有兩種工作方式,一種為自動的由時鐘模塊調用,另一種是由程序員自行調用。

1)由時鐘模塊自動調用的方式

將時鐘模塊實現文件(Timer.h)及鍵盤掃描模塊的實現文件(KBScan。c)包含進工程,在Config.h文件中添加TIMER_KBSCANDELAY宏。時鐘模塊自動對時鐘中斷進行計數,當達到TIMER_KBSCANDELAY宏所定義的值后,自動調用鍵盤掃描模塊中的函數KBScanProcess()進行鍵盤掃描,也就是說,這個宏的值可以決定按鍵消抖動的時間。

用戶應該提供兩個回調函數OnKBScan()及OnKeysPressed()。在函數OnKBScan中進行鍵盤掃描,并返回掃描碼。掃描碼的類型缺省為BYTE,當鍵盤規模較大時,BYTE不能夠完全包含鍵盤信息時,可在Config.h文件中重定義宏KBvalue,如下:

#defineKBvalueWORD

這樣,就可以使用16位的鍵盤掃描碼,如果此時還達不到要求,可以將鍵盤掃描碼定義成一個結構,但這樣做將會增加代碼量及消耗更多的RAM資源,故不推薦。

掃描模塊調用OnKBScan取得掃描碼,并調用用戶可以重定義的宏IsNoKeyPressed來判斷是否有鍵按下,缺省的IsNoKeyPressed實現如下:

#defineIsNoKeyPressed(x)((x)==0x00)

即認為OnKBScan返回0掃描碼時為沒有鍵按下,如果掃描函數返回其它非零掃描碼做為無鍵按下的掃描碼時,可以在Config.h文件中重定義IsNoKeyPressed宏的實現。

8位鍵盤掃描碼(缺省值)時,相應的掃描函數為:

BYTEOnKBScan()

當掃描模塊經過軟件消抖動之后,發現有鍵按下,就會調用另一個回調函數OnKeysPressed。函數的聲明應該如下:

voidOnKeyPressed(BYTEbyKBvalue,BYTEbyState)

其中中的參數byKBvalue的類型為BYTE,此為缺省值,如果使用其它類型的掃描碼,就將此參數變為相應類型。這個值由OnKBScan返回。另一個參數byState在通常情況下為零。但當用戶在Config.h中定義宏KBSCAN_BRUSTCOUNT,同時鍵盤上的某鍵被按住不放時,掃描模塊對它自己的調用(注意這里和TIMER_KBSCANDELAY宏不同,TIMER_KBSCANDELAY是時鐘中斷足夠的次數后調用掃描模塊,而KBSCAN_BRUSHCOUNT為掃描模塊自身的被調用次數)進行計數,當達到KBSCAN_BRUSTCOUNT時,掃描模塊調用OnKeysPressed,此時第一個參數的含義不變,而byState變成1,同時計數器復位,又經過一段時間后,用值為3的byState調用OnKeysPressed。這樣就可以很方便的實現多功能鍵或者檢測某鍵的長時間被按下。

2)由用戶自行調用

由用戶自行在程序中調用掃描模塊,而不是由時鐘中斷自行調用。其它與方式1相同。

注意:

1)函數KBScanProcess為非阻塞函數,它將在很快的時間內返回,等待再次分配給它執行的機會。

2)函數KBScanProcess是在時鐘中斷外部運行的,它的過程可以被任何中斷打斷,但不影響系統運行。

3)byState的最大值為250,之后被復位為零。應用舉例

現在來舉例說明上述幾個模塊的使用方法。

硬件環境描述:

為了控制一盞燈,需要單片機提供一個做控制功能的開關量,這里不描述外部接口電路,只說明當單片機的P10腳為高電平時,燈滅,當P10腳為低電平時,燈亮。

可以通過計算機由串口發送命令來控制,或通過一個按鍵(pushbutton不是自鎖式的按鍵)來手動控制(按鍵接在P11腳上,當鍵沒有按下時,P11電平為高,鍵按下時,引腳電平被接低),當使用按鍵手動控制的時候,需要給計算機發送通知。

設定串口通訊指令如下:

數據包由0xff做包頭,4個字節長,第二個字節為命令代碼,第三個字節為數據,最后一個字節為校驗位。

命令和數據代碼有如下組合:

(計算機發給單片機)

0x100x01:計算機控制燈亮。(數據位是非零值即可)

0x100x00:計算機控制燈滅。

(單片機發給計算機)

0x110x01:單片機正常執行控制指令,返回。(數據位是非零值即可)

0x110x00:單片機不能夠正常執行控制指令,或控制指令錯(不明含義的數據包或校驗錯等)。

0x120x01:手動控制燈亮。(數據位是非零值即可)

0x120x00:手動控制燈滅。

建立工程:

在硬盤上建立文件夾Projects,在Projects下建立Common文件夾及Example文件夾。將各模塊的頭文件及實現文件拷貝到Common文件夾下(推薦使用這樣的文件組織結構,其它工程也可以建立在Projects下,各工程共享Common文件夾中的代碼)。

啟動KeilC的IDE,在Example下建立新工程,將各模塊的實現文件包含進工程。

在Example文件夾下建立Output文件夾,更改工程設置,將Output作為輸出文件和List文件的輸出文件夾(推薦使用這樣的結構, 當保存工程文件時,可以簡單的刪除Output文件夾中的內容而不會誤刪有用的工程文件)。

建立工程配置頭文件Config.h及工程主文件Example.c,并將Exmaple.c文件加入工程。

輸入代碼:

代碼的具體編寫過程略。下面是最后的Config.h文件及Example.c文件。

//

//file:onfig.h

//

#ifndef_CONFIG_H_

#define_CONFIG_H_

#include//使用AT89C52做控制

#include“../Common/Common.h”//使用自定義的數據類型

#defineTIMER_RELOAD922//11.0592MHz晶振,1ms中斷周期

#defineTIMER_KBSCANDELAY40//40ms重檢測按鍵狀態,即40ms消抖

#defineSCOMM_AsyncInterface//使用異步通訊服務

#defineIsPackageHeader(x)((x)==0xff)//判斷包頭是不是0xff

#defineIsPackageTailer(x,y,z)((y)<=(z))//判斷包的長度是不是足夠

#endif//_CONFIG_H_

//

//file:xample.c

//

#include

#include“../Common/Common.h”

#include“../Common/Timer.h”

#include“../Common/Scomm.h”

#include“../Common/KBScan.h”

BITgbitLampState=1;//燈的狀態,缺省為off

staticvoidInitialize()

{

InitTimerModule();//初始化時鐘模塊

InitSCommModule(0xfd,TRUE);//初始化通訊模塊,11.0592MHz晶振,

//波特率為19200

EA=1;//開中斷

}

voidmain()

{

Initialize();//初始化

while(TRUE)//主循環

{

ImpTimerService();//實現時鐘中斷服務,如鍵盤掃描

AsyncRecePackage(4);//接收4個字節長的數據包

}

}

//在中斷外部響應時鐘中斷事件

voidOnTimerEvent()

{

//donothing

}

//控制外部燈

staticvoidTriggerLamp(BITbEnable)

{

P10=~bEnable;//需要反相控制

}

//鍵掃描回調函數

BYTEKBScan()

{

BITb;

P11=1;//讀之前拉高引腳電平

b=P11;//讀入引腳狀態

return~b;//數據反相做掃描碼

}

//計算校驗和

staticBYTECalcCheckSum(BYTE*pbyBuf,BYTEbyLen)

{

BYTEby,bySum=0;

for(by=0;by

return0–bySum;

}

//接收到鍵盤消息回調函數

voidOnKeyPressed(BYTEbyvalue,BYTEbyState)

{

BYTEby[4];

if(byState==0)

{

switch(byvalue)

{

case0x01:

gbitLampState=~gbitLampState;//燈狀態取反

TriggerLamp(gbitLampState);//執行控制

by[0]=0xff;//構造數據包

by[1]=0x12;

by[2]=(BYTE)gbitLampState;

by[3]=CalcCheckSum(by,3);//求校驗和

SendPackage(by,4);//發送數據包

break;

//處理其它掃描碼

default:

break;

}

}

//接收到數據包回調函數

voidOnRecePackage(BYTE*pbyBuf,BYTEbyBufLen)

{

BYTEby[4];

by[0]=0xff;

by[1]=0x11;

if(byBufLen!=4||pbyBuf[3]!=CalcCheckSum(pbyBuf,3))

{

by[2]=0;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//處理長度或校驗和不正確

}

switch(pbyBuf[1])

{

case0x10:

gbitLampState=(BIT)pbyBuf[2];

TriggerLamp(gbitLampState);

by[2]=1;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//發送成功執行通知

break;

default://不知道的命令

by[2]=0;

by[3]=CalcCheckSum(by,3);

SendPackage(by,4);//發送沒有成功執行通知

break;

單片機原理與應用范文2

摘要:從單片機行業就業需求特點出發,通過對教學內容和方法的優化組合,對實驗教學、考核方式的改革,以達到改善教學效果,增強學生動手能力,培養學生創新精神的目標,從而使學生適應當今就業要求,最終實現教、學、做、就業的高度統一。關鍵詞:單片機;教學改革;就業需求;創新能力中圖分類號:G424.1

文獻標識碼:A

文章編號:16723198(2009)19021601高校教學改革已成為一種必然趨勢,只有不斷改進教學內容和方法,豐富教學手段,激發學生的學習興趣,加強實踐能力的培養,才能實現教、學、做、就業的高度統一,從某種程度上可緩解大學生的就業問題。1 教學內容和方法的改革根據單片機行業對應聘者的相關要求以及本門課程入門難的特點,教學中打破傳統推車式的教學方式,注重對教學內容和方法進行優化和組合,將本門課程的學習分如下四個階段:第一階段:單片機相關知識及內部結構。首先在講授各部分前,教師應對單片機就業前景、應用現狀等問題給學生做一細致分析。然后以類比的方式(如:人體各部分)講解單片機最小系統,并讓學生明確最小系統是單片機能夠正常工作的基本條件,對單片機有一個整體認識。接下來以最小系統為中心分別對單片機引腳功能、內部結構、晶振、電源、ISP、復位等知識進行簡單講解。此部分應在后面整個學習過程中不斷進行回顧和學習。第二階段:跳過復雜的匯編指令,結合嵌入式C語言講解單片機并行I/O口工作方式。據調研,目前單片機行業主要以嵌入式C語言為主要編程工具,故授課時主要以嵌入式C語言為工具講解,在后面出現編寫程序需要時(如DS18B20等需精確延時的程序時)再穿插講解C、匯編混合編程方法,這樣既和實際工作更加貼近又使學生避過一開始就面對復雜的匯編指令,增強學好的信心。在對單片機并行I/O口講解時,要側重于讓學生明白單片機作為雙向I/O應用時每次讀入前為何需先置1等這類應用型問題。在講解單片機對I/O口的控制方式時,可以采用類比的方式(如:將單片機的各個功能寄存器比喻成我們平時使用的操作系統),以增強學生的理解。經過基礎知識的講解后,教師應拿出大量學時帶領學生從編寫簡單的流水燈程序開始,結合電腦在編譯軟件(如KEIL軟件)下調試,一邊編寫程序一邊講解各部分理論知識(如:程序中頭文件的作用,LED發光二極管的工作原理等),并且逐步由教師帶領學生編寫向教師給任務學生自主設計過渡。在此過程中,需不斷回故前面知識,學習新接口芯片,并同步電腦調試,驗證結果。此部分題目至少涉及如下方面:(1)LED流水燈;(2)獨立式按鍵;(3)LED數碼管;(4)矩陣式按鍵;(5)蜂鳴器。第三階段:中斷、定時器、串行口部分。由于定時器、串行口多使用中斷方式,與外部中斷具有一定的共性,故放在一起進行講解,以達到觸類旁通的目的。首先以學生看得到、摸得著,運用發生在身邊的實際例子(如接電話)進行中斷的相關概念和中斷處理過程的理論講解,然后以外部中斷為代表,結合大量的程序(如每按一次按鍵LED小燈亮滅變化一次等)講解實際中斷的處理過程及編程方法,使學生通過具體的程序充份理解中斷的用途及處理方式。在外部中斷被充分掌握的情況下,利用我們身邊的實例(如:以出租車行駛里程計數等)進行定時器和串行口工作方式的講解,由于前面對中斷的相關概念、外部中斷的工作原理有了很好的理解,故在學習定時器和串行口工作方式時學生就不會感覺太困難。第四階段:綜合設計及系統擴展。結合前面學過的知識,此部分教師拿出部分課時,以任務的方式提出一系列設計任務,學生綜合前面學過的知識進行設計,以達對知識鞏固、整合的目的,對學生創新能力也是一個很好的鍛煉。以上四階段需逐級遞進,每一階段在講授基礎知識后,需通過大量的練習進行消化理解,各部分一定要突出單片機的應用性,使學生體會到單片機的應用就在身邊,以此激發學生的學習興趣。2 改革實驗教學,提高動手能力打破常規按照指導書學生下載程序單純進行驗證的傳統實驗模式,對課內實驗教學進行改革,每次均將實驗分為基礎實驗和設計性實驗兩部分,并逐漸加大設計性實驗的比例?;A實驗主要讓學生按照實驗指導書指導,對相關理論知識進行驗證、對此部分實驗系統結構、使用方法和軟件調試方法進行掌握,為后面設計性實驗打下基礎。設計性實驗由老師提出相應的設計任務(如:利用現有資源設計一款節日彩燈、設計一個秒表等),學生自主進行設計、實驗。設計性實驗以前面基礎實驗為基礎,但設計任務又脫離指導書,沒有參考的內容,故學生只能自已設計硬件電路的連線,編寫程序并調試,從而達到對學生基礎理論知識和獨立自主創新能力雙方面的鍛煉,而這兩項也是用人單位十分看重的。3 開展課程設計,培養創新能力在單片機教學改革中,增設了課程設計部分。課程一開始教師提供多個具有創新要求的課程設計供學生選擇。一般五、六人為一組,此課題伴隨整個單片機教學,讓學生在學習過程中不斷想到自已的課題,遇到問題時先自已解決,不成功時教師再加以適當指導。在教學過程中可以感受到學生學習的主動性明顯增強,所提問題具有更強的針對性,學習效果也更好。課程設計主要對學生以下幾個方面進行了實戰訓練:(1)根據設計任務的具體要求,查閱資料、制定設計方案及預其目標;(2)使用Protel軟件設計電路原理圖和PCB版圖(也可利用萬能板完成但要保證信號的穩定性);(3)購買元器件并進行電路版的焊接;(4)進行軟件編程;(5)進行軟、硬件聯機調試,完善系統功能;(6)撰寫技術文檔資料。通過課程設計,使學生掌握了單片機系統開發設計的全過程,培養了學生團隊精神和創新能力。4 改革考核方式,注重實際能力改變以往一張試卷定成績的方式,更加注重了實際能力的考核。改革后,本課程的考核分為四方面:第一方面是平時考核,側重于課堂上學生出勤、學習態度及參與問題討論的積極性,占總成績的20%;第二方面是實踐能力的考核,側重于學生的實際操作能力的考核,此部分主要針對平時實驗成績,占總成績的30%;第三方面課題設計考核,根據每個人的工作量及最終效果評定此部分成績,側重于綜合動手能力及自主學習能力的考核,占總成績的20%;第四方面理論考核,側重于基本理論的考核,占總成績的30%。由于考核方式的改革,使學生重視實驗教學,提高了學生的實踐能力、互動性增強,改善了教學效果和質量。5 教改實施效果通過對教改方案的實施,教學取得了明顯的成效。學生學習的主動性大為增強。實際動手能力明顯提高,這點從大四學生畢業設計中得到了很好的體現,學生能較容易地獨立完成DS18B20溫度監測系統、數字電子時鐘、十字路通指揮系統等畢業設計題目,且選擇嵌入式相關工作的學生大部分均成功地找到工作。較快地完成角色的轉變,基本達到了社會對單片機應用技術培養人才的需要。參考文獻[1]李廣弟.單片機基礎(修訂版)[M].北京:北京航空航天大學出版社,2001.[2]劉守義.單片機應用技術[M].西安:西安電子科技大學出版社,2002.[3]于復生.任務驅動教學法在機電一體化系統設計教學中的實踐與探索[J].電氣電子教學學報,2004,(1).[4]陳裕成.單片機原理及應用教學改革探索[J].漳州師范學院學報(自然科學版),2007,(2).

單片機原理與應用范文3

關鍵詞: 《單片機原理與應用》 實驗教學改革 創新性實驗

《單片機原理與應用》課程是一門理論和實驗結合非常緊密、突出動手能力的課程。實驗教學是其中一個重要環節,既是聯系理論教學的橋梁,又是培養學生實踐、創新能力的重要手段[1-3]。但是在實驗教學中會出現學生理論與實驗脫節、實驗課效果不理想、學生實驗課積極性不高等問題,因此《單片機原理與應用》課程實驗教學改革就成為許多學校非常重視的一項教改課題。

1.《單片機原理與應用》課程實驗教學現狀分析

1.1課程自身特點

1.1.1跨越性。《單片機原理與應用》課程是一門軟硬件相結合、強調實踐性和應用性的課程。學習這門課程的學生需要經歷從電子技術基礎、電路原理、C語言編程等基礎知識向以微處理器為核心、通過軟件編程來實現系統功能的思想轉變過程,這種思想跨越轉變過程對初次接觸該課程的學生來講具有一定難度。

1.1.2橋梁性?!秵纹瑱C原理與應用》課程是后續嵌入式系統課程、DSP課程、EDA課程及畢業設計等的基礎,具有課程橋梁的重要作用。

1.1.3綜合性及抽象性?!秵纹瑱C原理與應用》課程涉及的內容較廣泛,包括單片機的硬件組成和功能、軟件編程思想、匯編語言的語句及結構等。并且軟件編程涉及的匯編語言需要和硬件的配置情況有關,內容抽象,不易理解。

由于該課程具有自身特性,因此需要教師在實驗教學中進行改革嘗試,幫助學生更好地適應學習這一類課程的方法,增強學生對該課程的理解性,從而提高他們的實際操作及應用能力。

1.2學生對課程的切身感受及認識

通過調研得知,相當一部分學生渴望將這門課程更好地融于自己的專業發展中,牢固掌握課程基本理論和實踐知識。調研結果表明,問題主要集中在兩個方面:(1)在學習該課程之初,學生在沒有大量實驗操作機會的情況下,表現出的是對程序的編寫問題及對整個課程的困惑,大部分學生對該課程主要應用在哪里沒有概念。(2)對于給予大量實驗操作機會的學生,他們表現出對單片機的極大興趣,他們的問題主要集中為:如何設計具有較好功能的源程序,源程序結構的優化,硬件搭建的合理性等。

因此,良好的實驗教學可以幫助學生理解課程內容,掌握核心知識,從而提高學生的學習積極性和學習效率。

1.3實驗教學中出現的待解決問題

1.3.1實驗項目內容設置不夠完善,不利于調動學生的實驗積極性。各個實驗項目獨立性強,幾乎沒有考慮知識的前后貫穿和最后應用系統的設計,這容易使學生學了后面的忘了前面的,自己設計簡單的應用系統更是無從下手,非常不利于培養學生的實驗積極性。

1.3.2教學模式單一,傳統的實驗教學偏重于驗證性與演示性實驗[4-6]。學生在實驗過程中按實驗講義逐步進行,分析思考問題的機會比較少,只是機械化地驗證實驗內容。學生的注意力主要集中在編程及調試上,忽略了實驗電路原理的重要性。不清楚系統設計流程,當需要自行設計系統時,學生就會感覺困難無從下手。實驗教學沒能起到真正推動學生對單片機原理、模擬電路、數字電路等理論知識理解的作用。單一的實驗教學模式制約對學生創新能力及分析解決實際問題能力的培養,降低學生的學習興趣,影響教學效果。

1.3.3學生實驗中實際發揮空間有限。在實踐教學中,教師經常把主要的實驗步驟、程序代碼都提供給學生,造成實驗教學中學生動手機會少、思考不全面、發揮空間有限的缺點。

2.《單片機原理與應用》課程實驗教學改革研究

針對《單片機原理與應用》課程實驗教學現狀,對該課程實驗教學方法進行探討,在實驗項目、實驗教學模式、實驗教學環境及實驗考核方式上進行改革研究,以提高該課程的實驗教學質量,為學生的課程實驗、課程實訓、畢業設計及相關實踐提供優質的基礎。該課程實驗教學改革方法的研究對提高實驗課堂教學質量、促進人才培養和就業都有著深遠的影響。

2.1實驗項目改革研究

《單片機原理與應用》課程比較側重于學生動手能力的培養,所以針對該課程的實驗項目很多,那么如何根據本學校的學生層次及特點進行實驗項目的分類是改革中需要研究和分析的問題。筆者以溫州醫科大學實際授課實例為例進行闡述。溫州醫科大學針對生物醫學工程專業和電子信息工程專業學生開設該課程。針對學生的專業特點及實驗學時的安排,將實驗項目教學內容分成四部分,可以根據各專業學生層次特點選擇合適的實驗項目。具體實施方法為:

第一部分為軟件模擬實驗,主要目的是熟悉Keil軟件、Proteus軟件等的操作及匯編語言指令的熟練應用,讓學生對整個操作軟件的使用及匯編語言的使用有一個全面了解,為以后的實驗打下堅實的基礎。針對軟件模擬實驗,主要開設的實驗項目包括兩類:基礎類實驗及綜合應用類實驗。基礎類實驗主要包括數據傳送實驗、拆字和拼字實驗、數據加法實驗、查表實驗等;綜合應用類實驗主要包括模擬交通燈、投籃計分及病房呼叫模擬實驗等。

第二部分為基本端口實驗,主要目的是讓學生認識紋機系統的基本硬件。實驗項目主要有端口輸出實驗、定時計數器實驗、按鍵中斷實驗、A/D轉換實驗、多位數碼管顯示實驗、串口通信實驗等。

第三部分為綜合設計性實驗,目的是幫助學生全面掌握所學內容,提高學生綜合運用知識的能力。主要有用定時器設計時鐘實驗、鍵盤結合LCD液晶顯示實驗、利用外部中斷設計流水燈實驗、溫度檢測實驗等。

第四部分為創新性實驗,主要針對那些對單片機有興趣的學生,鍛煉學生的創新能力、動手能力和解決實際問題的能力等,該部分實驗在課下進行,可結合教師的科研項目和各類大學生電子設計大賽,如教師科研課題中的控制系統及大學生電子設計競賽、智能車設計大賽、機電產品創新設計大賽等。

2.2實驗教學模式改革研究

《單片機原理與應用》課程實驗教學模式改革中將PBL教學法與TBL教學法相結合,針對該門課程授課學生專業不同,將實驗分成三個層次:基本實驗、綜合實驗和自選實驗。針對不同層次實驗各自特點和難易程度進行教學方法的選擇和綜合應用。

2.2.1基本實驗主要考核學生基礎知識的掌握,內容較為簡單,可以只采用PBL教學法。教師只需要給出實驗設計的問題,由學生獨立完成,不需要進行分組,培養學生的自主動手能力。

2.2.2綜合實驗不再是單一的知識點、單一的學科,考核的知識可能是跨學科多個知識點,教師只需給出實驗的要求和技術指標,學生自主選擇決定學習哪些知識解決問題,體現典型的PBL教學法的應用優勢。具體實驗過程中主要采用分組討論,單人完成或按組匯報兩種方式。

2.2.3自選實驗在三個實驗層次是難度最高的,學生幾乎不可能單獨完成,同時教師要給予一定的指導,給出明確的學習目標及知識點,適合采用TBL教學法分組討論,按組匯報。設計性實驗往往都是給出一個需要解決的實際問題,實施方法不是唯一的,這是PBL教學法應用最適合的情況。因此,對于設計性實驗最好采用兩種方法綜合應用。

2.3實驗教學環境的改革研究

根據學生的實際情況和要求,為學生創造寬松的實驗環境。

2.3.1對學生實驗中用到的硬件實驗仿真平臺可以根據學生的特點及基礎進行針對性選擇及操作。對于大多數學生,可以選用基礎開發板與仿真器的硬件仿真平臺在實驗課堂中完成相應的實驗項目設計,對于能力較強的學生,可以鼓勵學生自己做單片機最小系統板或者選用高級開發板與仿真器結合的硬件仿真平臺,對于積極性較高的學生,可以建議大家在實驗課業余時間選用開發板自己燒寫程序在實驗課堂之外對實驗感興趣的內容進行仿真學習,為學生創造寬松的實驗環境,使學生可以不拘束于課上時間進行實驗。

2.3.2對于軟件仿真平臺,學生可以用匯編語言完成簡單程序的設計,能夠用C51語言完成簡單和復雜程序的設計,學生的前序課程中學過C語言,這樣大大降低學生學習的難度,同時學生從對比中加深對匯編語言和C51語言的理解。

2.4實驗考核方式改革研究

傳統的單片機實驗課程不單獨考核,評價方式主要以實驗報告為依據。這種評價方式使學生對實驗教學環節不重視,很難調動起學生在實驗教學環節中的積極性。本次改革項目將實驗考核方式分為四個部分:把學生每次實驗課堂的態度及積極操作的自我關注程度作為實驗平時成績的考核依據,占實驗成績的20%;平時實驗報告占實驗成績的20%;綜合實驗項目考核占實驗成績的50%;自選實驗項目占實驗成績的10%。

3.結語

為了提高《單片機原理與應用》課程的實驗教學質量,給學生的課程實驗、課程實訓、畢業設計及相關實踐提供優質的基礎,提高學生的實際應用和創新能力,本課題結合學校各專業學生實驗教學的實際情況,對該課程實驗教學方面的教學方法進行探討與改革。經在實際實驗教學中的改革實踐表明,通過對實驗項目的合理設計,可以培養學生的實驗積極性和主觀能動性。通過對實驗教學模式的改革,激發學生的實驗興趣。通過對實驗教學環境的改造及考核方式的改變,可以引導學生重視自身實驗技能的培養。從本校學生畢業設計過程及實習過程中可以看出,學生在實際工程應用項目的開發數量和質量都有較大程度的提高。隨著實驗教學改革的不斷深入和完善,該課程會取得更良好的實驗教學效果,使學生的綜合設計能力及創新能力有明顯的提高。

參考文獻:

[1]李有光,聞新,南英.本科生AVR單片機實驗教學探索與研究[J].實驗室研究與探索,2015,34(9):216-218.

[2]祖一康,徐妙婧.單片機教學改革實踐研究[J].湖北理工學院學報,2015,31(5):67-70.

[3]金國華,滕君華,馬寶山,張大力.單片機課程設計中應用能力的分層培養[J].中國現代教育裝備,2015,11:81-83.

[4]劉喜雙,姚健.單片機課程實踐教學改革探索[J].教育探索,2013,8:31-32.

單片機原理與應用范文4

關鍵詞:項目化教學;單片機;課程改革

DOI:10.16640/ki.37-1222/t.2016.08.245

0 引言

《單片機原理與應用技術》課程是我系數控設備應用與維修專業開設的一門專業技術基礎課程。它是一門綜合運用數字電子技術、模擬電子技術、通信技術、程序設計、電子CAD 等知識,以解決實際工程問題為目標的綜合性課程。學生的學習效果直接影響學生未來解決本專業工程實踐問題的能力,因此它的教學效果就顯得尤其重要。項目化教學是當今職業教育教學改革發展的方向,以項目為導向,通過師生共同完成項目任務組織教學活動,通過學習工作過程而逐步培養提高學生的綜合職業能力。因此,對《單片機原理與應用技術》課程進行項目化教學改革極為必要。

1 項目化教學法簡介

項目化教學是以實施項目為載體,以具體的工作任務為驅動而進行的教學活動,其目的是在課堂教學中把理論與實踐教學有機地結合起來,充分發掘學生的創造潛能,提高學生解決實際問題的綜合能力。項目教學法的關鍵是設計和制定教學項目及每個項目的工作任務。項目教學法主要包括情景設置、操作示范、獨立探索、確定項目、協作學習和學習評價等六步。合理的項目選擇應以該課程的課程目標為導向,項目化教學的課程目標更應突出能力目標的培養。

2 課程目標設計

依據項目化教學核心思想,課程的教學目標應更加突出能力(技能)目標的設定?!秵纹瑱C原理與應用技術》課程以MC-51系列機型作為實踐教學的工具,通過學習單片機硬件、軟件及接口技術,掌握單片機應用系統的設計方法,強化學生的理論知識和實踐動手能力,為后續課程的學習打下良好的基礎。具體目標如下:

(1)能力目標:1)通過本課程的學習能夠獨立的設計和制作簡單單片機應用系統;2)通過本課程的學習能夠維修單片機應用設備和產品;3)通過本課程的學習掌握單片機的學習方法,具備進一步學習擴展知識的能力。

(2)知識目標:1)掌握匯編語言和單片機的編程方法;2)掌握人機接口的硬件結構和軟件編程原理及設計方法;3)掌握單片機系統的擴展技術;4)掌握單片機的A/D、D/A接口技術;5)掌握MCS-51串口通信技術技術;6)掌握MCS-51應用系統的開發技術。

(3)素質目標:1)具有綜合考慮產品指標確定設計方案的素質;2)具有從產品定向到知識的素質;3)具有實事求是的精神、理論聯系實際的工作方法以及嚴謹細致的工作作風;4)具有團隊合作精神;5)提高學生的職業素養和綜合素質。

3 課程項目設計及項目單元設計

基于工作過程的項目化教學以職業活動為導向,以能力為目標,以學生為主體,以素質為基礎,以項目為載體,以行動過程為途徑,以師生互動為方式,以學生的能力培養為教學活動最重要的目標。依據課程相關崗位職業能力的要求,圍繞課程教學目標,根據認知規律,由淺入深循、序漸進設置六個教學項目,如表1所示。整個教學項目實施過程將貫穿基本知識點,采用六步教學法,以學生為主體,將分析問題、解決問題及團隊協作有機融入到教學過程中。

每個項目分成若干任務單元,不同的任務單元對應各自擬實現的能力目標、相關支撐知識、訓練方式手段及步驟、任務實施結果等設計內容。以“項目四:制作電子時鐘”為例,進行項目單元設計如表2。

4 考核方式設計

課程的考核方式分為知識考核和技能考核兩部分。知識考核主要考核學生對單片機電路及其驅動程序的理論知識的掌握情況。技能考核主要針對學生在訓練項目完成過程中職業能力和職業素質提高情況的考核。將傳統的單一“筆試”的考核方式變為“實踐技能”的考核方式,把學生的動手能力列為考核的一項重要內容,這樣有益于學習過程把控,讓學生更加注重學習的過程。其中,教師打分占30%,項目組自評占20%,小組互評占50%。考核過程為全程考核,方式為實物演示+PPT匯報。教學實踐表明遵循以上課程考核方法可以在很大程度上促進學生學習。

經過《單片機原理與應用技術》項目化教學實踐,學生的學習效果有明顯提升。項目實施過程中,學生不僅能夠理解和掌握課程知識,在完成項目的過程中還鍛煉了創新能力及分析問題解決問題的能力,在與小組成員協作的過程中培養了團隊合作能力,為后續課程的學習打下良好的基礎。

參考文獻:

[1]貢雪梅.項目教學法在單片機原理課程設計中的應用[J].實驗技術與管理,2009(07).

[2]劉雪雪.談案例教學法在單片機課程中的應用[J].職業教育研究,2006(04):91-92.

[3]王穎,任務驅動教學法在單片機課程教學中的應用[J].遼寧高職學報,2007(03):50-51.

[4]李鷹,張喜春.高職“項目化”課程改革實操指導[M].吉林:吉林大學出版社,2013.

單片機原理與應用范文5

【關鍵詞】單片機原理與應用;虛擬教學系統;設計

和以往教學模式的差別在于,虛擬教學系統是建立在虛擬現實技術基礎上的新型教學模式。通過采用這種教學技術手段能夠營造出一個仿真的學習環境,通過對人體各種感官的刺激,使人體驗到身臨其境的感覺,刺激學生的學習欲望,提高學習熱情,從而實現快速提高學習能力的目的。通過網絡技術、虛擬現實技術來實現教學,可以對單片機的硬件電路原理進行直觀的演示和講解。采用基于 Flex 的虛擬現實技術開發 的教學系統,不但界面美觀,用戶交互體驗感強,而且提高了學生的動手實踐能力和教學質量。

1.《單片機原理與應用》虛擬教學系統設計

1.1系統框架和功能模塊設計

虛擬教學系統采用三層B/S結構,開發技術采用.NET,MXML+ Action Script,JavaScript技術等,數據庫采用SQL Server2000,其中第一層為客戶端層,該層主要表現為系統界面,在Web瀏覽器上外掛Flay Player播放器,該層用來實現用戶與整個系統的交互,在該層中,部分頁面可以采用Flex技術來建構RIA應用程序,給用戶以豐富的人機交互體驗;第二層為業務層,該層主要負責整個系統的邏輯業務,以此來完成客戶端層與信息資源層之間的數據交互;第三層為信息資源層,提供平臺所需的場景信息與數據信息,這一層實現信息資源的集中統一管理,該層主要包括師生信息庫、模型庫、課件庫、試題庫等。系統功能模塊主要包括管理模塊、教學資源庫模塊、教學模塊以及協作學習模塊。

1.2系統界面設計

界面設計主要包括界面布局、字體、頁面色彩等環節。其設計原則在遵循藝術美的前提下更加注重個性化,強調教學系統所要表達的主題,淡化非主流信息對學習者的干擾。對于虛擬教學系統的界面而言,選用藍色為主體背景色,并通過調整色彩的透明度和飽和度來產生文字和圖標的色彩,對需要交互對象的按鈕等工具采用三維立體的形狀來凸顯出虛擬系統的多感知性。采用Flex技術來優化網站界面有著很大的優勢,它通過提供豐富的組件來增強網站界面的表現力,使得界面更為友好??梢圆捎脠D表控件,創建豐富的圖表,達到數據可視化效果。同時,Flex還提供了大量的用戶交互組件,對于知識體系的呈現,利用【Combo Box】組件對所有知識點以列表的形式展現并與用戶進行交互。

1.3導航策略設計

虛擬教學系統的信息量巨大,內部信息之間的關系復雜,在學習過程中,學習者由于缺乏專業教師的指引,迷航現象時有發生,所以應當提供導航策略設計,引導學生進行有效學習,以提高學習效率。目前比較多的導航方式有檢索導航、導航圖導航、菜單導航、書簽導航、提示導航、演示導航、觸摸區導航等。

1.4交互策略設計

交互性主要包含人機交互以及人與人的交互。所謂的人機交互,是指人與計算機之間使用某種對話手段,以一定的交互方式,為完成確定任務而進行的人機之間信息交流的過程,這種類型的交互是虛擬現實技術的一個重要特征,也是虛擬現實技術應用于虛擬教學系統中的一個主要優勢,系統中的虛擬現實場景能否實現自然流暢的人機交互,將直接關系到系統設計的成敗。從技術特點來看,基于Flex的虛擬現實技術為交互性提供了很多的交互機制,如視點、導航、事件的發送與接收等。主要體現在:視點是用戶在人機交互的過程中通過改變攝像機的位置來改變觀察點,從而在不同的位置場景顯現出不同的形態及具有空間感的三維效果;導航是用戶在虛擬場景中漫游的信息指示,通過導航,用戶可以在虛擬環境中移動或檢查某個對象;基于Flex的虛擬現實技術主要是采用Action Script腳本語言對虛擬環境中的對象產生作用,通過編程控制來發送及接收對象。

2.《單片機原理與應用》虛擬教學系統中應用實現

2.1虛擬實驗室構建

在Flex Builder 3開發環境中,借助Papervision3D開源的3D引擎,建立一個Sphere形體,然后對形體進行貼圖,最后固定Camera的坐標,通過舞臺上鼠標移動的距離來控制Camera旋轉的角度,從而實現360°全方位的展示。

2.2單片機及相關硬件的三維虛擬模型展示

Papervision3D中也自帶一些基本的形體(球體、立方體、平面、圓錐等),但無圖形界面,不能像專業的建模工具那樣通過點擊、拖拽等操作來創建幾何體,要實現一些復雜的模型,就需要借助3DS MAX、MAYA等工具。在3DS MAX中可以通過Polygon多邊形建模、特殊建模、修改建模、Patch面片建模、NURBS建模等方式來建構出虛擬場景及儀器模型,然后通過材質為模型表面加入色彩、光澤和紋理等來達到與真實事物相似的特性。建模的過程中,在不影響模型整體效果的情況下盡量減少多邊形的個數以達到減小輸出文件的體積。

2.3 MXML+Action Script編程控制

MXML是一種描述Flex應用程序界面的XML語言,它通過一組標簽集來定義用戶界面,同時提供一些不可見類庫的調用,在開發虛擬實驗時,可以在Flex工程文件中利用MXML語言來設計界面元素,優化界面美觀,增強人機交互體驗。Action Script是一種面向對象的腳本語言,在Flex中,用戶可以采用的標簽來嵌入Action Script代碼,也可以從獨立的外部文件來導入相關代碼。在開發虛擬實驗的過程中,Papervision3D作為外部的類庫導入到 Flex Builder開發工具中,放置在Flex工程文件目錄下src文件中來進行調用。

3.總結

作為虛擬現實技術之一的桌面虛擬現實技術具有開發成本低、不需要昂貴的虛擬現實設備、只需在客戶端安裝相應插件即可,應用價值較高,推廣性強,更適合應用于教學之中。同時,虛擬協同工作、儀器的遠程虛擬仿真操作技術等方面有待更深入的探索與創新,這些也將是作者進一步研究的方向。

【參考文獻】

單片機原理與應用范文6

關鍵詞:人工智能;單片機原理及應用;CAI軟件;自主學習

中圖分類號:G642.3 文獻標志碼:A 文章編號:1674-9324(2016)45-0268-03

一、引言

《單片機原理及應用》是自動化、電氣工程及其自動化、測控技術與儀器、等專業的核心課程。隨著電子技術的飛速發展,單片機系列、型號、功能等也不斷地更新換代,涌現出了許多《單片機原理及應用》方面的優秀教材和著作[1-3],由于單片機的快速發展和廣泛應用,促使許多教師在教學內容、方法及實驗方面進行了大量的探討和研究,如“微課程教學”、“MOOC教學”等應用已取得了較好的教學效果[4-8]。然而,人工智能技術應用于教育領域目前仍處于初始研究和探索階段,其應用前景廣闊,具有重要的理論研究意義和實際應用價值。

基于“人工智能”中的“專家系統技術”,研究設計《單片機原理及應用》課程新型教學平臺的總體構架,研究課程知識的表述模型和知識獲取的推理算法,建立知識表述規則集和構建專家系統知識庫,以實現:

(1)學生可以自主學習,基于知識樹規則方便地獲取該課程的全部知識點,學生隨時提出的問題,均可及時獲取答案;學生可及時獲取單片機發展的新知識以及新的應用領域成果;

(2)教師高效處理、分析和制作課程知識點信息,并將其進行規則表述,同時可對知識庫進行不斷的更新;隨時可對課程的知識點進行增添、刪除和修改,基于互聯網技術獲取新型單片機原理及相應的應用知識,不斷更換新課程的教學內容;

(3)基于互聯網技術實現教師與學生之間的互動教學和學生與學生之間的協同學習;基于教堂教學、電子課件、動畫、視頻等多媒體手段,以創造大規模、大數據、跨時空的學習模式。

目前,在教育領域,基于人工智能研究的知識模塊化表述和推理機制構成的專家系統是人工智能的代表之一,基于人工智能-專家系統在高密度、大規模的知識數據庫上模擬人類的信息處理和決策過程,因此智能化的專家系統具備了教育功能、自學習功能、咨詢功能及自適應功能等,將其應用于教育領域潛力巨大、用途廣泛、快速高效。

本文研究了《單片機原理及應用》CAI軟件的研制方法,采用MS Visual Studio 2012作為開發環境,結合人工智能技術,實現了智能搜索算法,達到了自主學習與自動答疑的目的。

二、《單片機原理及應用》CAI系統設計

為了提高本科生的教學質量,基于人工智能-專家系統技術研究《單片機原理及應用》課程的教學內容和教學方法改革措施,并可將其研究成果推廣應用于自動化類專業相關課程建設;培養學生掌握本課程的基本原理和應用知識,引導其自主學習以提高分析問題能力、解決問題的能力及創新能力,實現學生與老師之間的互動,實現教學內容的不斷更新和教學方法的不斷完善。

(一)《單片機原理及應用》課程總體設計

分析目前本課程的教學內容和方法的局限性,提出《單片機原理及應用》課程教學內容和教學方法改革的總體方案。目前,普通高?!秵纹瑱C原理及應用》課程所用教材的目錄大致如圖1中的實線部分所示。虛線表示可即時修改其中的相關內容。

(二)課程知識本體的表達模型

知識的表示對專家系統來說至關重要。知識本體的表述包括事物、個體和對象等,研究其規則、過程和函數,構成應用程序所表述的知識內容,可以作用于表述各種對象類,具有普遍性和通用性。其表達方式如圖2所示。

(三)基于人工智能技術的課程教學內容和教學方法結構設計

專家系統結構一般有六部分:知識庫(Knowledge Base)、數據庫(Data Base)、推理機(Inference Engine)、解釋子系統(Explanatory System)、人機接口(Man-machine Interface)和知識獲取子系統(Knowledge Acquisition)。教學專家系統的基本結構如圖3中的實線部分所示。

①知識厙:用于存儲專家系統知識。主要用于收集和存儲某領域教師、專家的經驗,知識及書本知識、基本常識等。包括事物的表達方式,可行操作、事實和規則等;

②綜合數據庫:綜合數據庫又稱總體數據庫或全局數據庫,主要用于存放有關問題求解的假設、初始數據、目標、求解狀態、中間結果以及最終結果;

③推理機:推理機是專家系統的核心部分,用于模擬專家的思維過程、控制、協調整個專家系統的工作,它根據用戶所提供的初始數據和問題求解要求,運用知識庫中的事實和規則,按照一定的推理方法和控制策略對問題進行推理求解,并將產生的結果輸出給學生;

④知識獲取子系統:在構建和維護知識庫時作為專家系統和教師、領域專家、工程師等的接口;

⑤解釋子系統:解釋機構由一組計算機程序組成,它對推理給出必要的解釋,并根據學生問題的要求做出相應的回應,最后把結果通過人機接口輸出給學生;

⑥人機接口:學生、專家系統和教師、領域專家、工程師之間溝通的媒介,它把相互之間的交互信息轉換成彼此都能夠理解的形式,由一組程序及相應的硬件組成,用于完成I/O工作。

三、CAI軟件實現過程舉例

《單片機原理及應用》課程CAI系統主界面如圖4所示。點擊“進入系統”之后,將出現“課程內容學習”和“知識點概述游覽”兩部分。

(1)“課程內容學習”部分包括“教材知識學習”、“課堂PPT內容講解”以及“實驗教學內容”等,例如目前常用的單片機的類型如圖5所示。本課程的主要設計和創新實驗如圖6所示。

(2)“知識點概述游覽”部分包括:

①知識點獲取方式:即通過引導操作可得到關聯性強的知識點解釋、關聯性中等的知識點解釋以及關聯性弱的知識點解釋;

②問題解答方式:學生可根據自己的學習情況查詢問題的基本答案(即對問題的解釋),若基于專家知識庫無法解釋所提的問題,則可將該問題提交給任課教師,任課教師會盡快對該問題給出解答;

③專家庫知識更新方式:隨著單片機類型、結構、接口技術以及開發方式等的不斷發展,本課程的知識結構和內容的更新也要求同步進行。因此,專家知識庫信息的更新工作可由任課教師來完成,但是更新信息可來源于文獻資料查閱、企業行業應用領域調研以及實踐實驗教學過程總結等。

課程教材與上課PPT和實驗內容具有相關性,在實際教學中也要求其具有一致性,如圖1中虛線部分表示可即時修改相關的內容。

四、結論

本文將人工智能-專家系統技術應用于《單片機原理及應用》課程的教學內容和教學方法的改革方案,構建新型教學平臺。采用《單片機原理及應用》課程知識的綜合表達方式,并研究課程知識的推理機制?;谖墨I資料查閱、企業行業應用領域調研以及實踐實驗教學過程總結,實現《單片機原理及應用》課程教學內容快速更新,實現該課程的智能化和網絡化教學。

在教學過程中,實現學生與老師之間的互動,實現學生和老師之間知識的共享,達到學生能夠自主學習和老師能夠及時了解學生學習情況修改補充教學內容的目的。針對“知識庫”、“綜合數據庫”以及“推理機制”實現在線綜合更新方法?!秵纹瑱C原理及應用》是自動化、電氣工程及其自動化、測控技術與儀器、等專業的核心課程,目前,將人工智能-專家系統技術應用于高等學校該課程的教學,對于提高教學質量,激發學生的學習積極性和增強學生自主學習的能力具有重要的理論研究意義和很好實際應用價值。

參考文獻:

[1]何立民.MCS-51系列單片機應用系統設計[M].北京:北京航天航空大學出版社,1995.

[2]李華,孫曉民,李紅青.MCS-51系列單片機實用接口技術[M].北京航天航空大學出版社,1995.

[3]張毅剛,彭喜元,彭宇.單片機原理及應用(第2版)[M].北京:高等教育出版社,2010.

[4]周冠玲,馮占英,李戰.“單片機原理及應用”課程教學改革的探討[J].中國電化教學,2012,(6):105-107.

[5]趙月靜,陳繼榮,張永弟.單片機原理及應用課程創新實踐教學改革[J].實驗技術與管理,2013,30(1):176-179.

[6]李冰.單片機原理及應用課程的項目化教學改革與探索[J].教學研究,2015,38(1):70-73,82.

亚洲精品一二三区-久久