單片機實驗指導書(C語言).doc_第1頁
單片機實驗指導書(C語言).doc_第2頁
單片機實驗指導書(C語言).doc_第3頁
單片機實驗指導書(C語言).doc_第4頁
單片機實驗指導書(C語言).doc_第5頁
已閱讀5頁,還剩46頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

單單 片片 機機 原原 理理 及及 應用應用 實實 驗驗 指指 導導 書書 C 語言 華南師范大學物電學院 微機教研室 宋暉 2011 09 前前 言言 由于單片機具有高可靠性 超小型 低價格 容易產品化等特點 在儀 器儀表智能化 實時工業控制 實時數據采集 智能終端 通信設備 導航 系統 家用電器等控制應用領域 具有十分廣泛的用途 由于目前在國內單 片機應用中 MCS 51 系列單片機仍然是一種主流單片機 所以本實驗指導 書為學習 MCS 51 單片機的學生 配合 單片機原理 及應用 課程的教學 結合本學院自制 單片機教學實驗 板編寫了這本實驗指導書 單片機原理 應用及 是一門實踐性很強的課程 提高教學質量的一 個重要環節是上機實習和訓練 無論是學習匯編語言程序設計 還是學習接 口電路和外設與計算機的連接 或者軟硬兼施地研制單片機應用系統 不通 過加強動手是不能獲得預期效果的 本實驗指導書提供多個實驗的指導性 材料 有些實驗還有一些有一定難度的選做項目 可以根據課時的安排和教 學要求進行取舍 為了達到某些實驗的目的 書中提供的參考程序與實際應 用中的程序會有些差別 所以不一定是最優的 由于時間緊迫 需要趕課程進度與實驗時間的同步 加上編者學識有 限 如有不妥之處 歡迎讀者批評指正 實實 驗驗 須須 知知 1 實驗前必須閱讀教科書的有關部分和本實驗指導書 了解 實驗目的 內容 步驟 做好實驗前的準備工作 編寫好實驗中 要求自編或修改的程序 完成實驗前要求完成的準備工作后方可 以上機實驗 否則不得上機操作 2 各種電源的電壓和極性不能接錯 嚴禁帶電接線和接插元 器件 通電前須經過指導教師檢查認可后方能通電 3 不準隨意撥弄各種與實驗無關的旋鈕和開關 凡與本次實 驗無關的任何設備都禁止動用和摸弄 注意安全 4 嚴禁用手觸摸實驗系統印制電路板和元器件的引腳 防止 靜電擊穿芯片 5 實驗中若損壞儀器或元器件 應及時向指導教師報告 6 在實驗室內保持安靜和衛生 不得隨意走動和喧嘩 集中 精力完成實驗 7 實驗完成后 關掉電源 及時整理實驗臺桌面 保持環境 整潔 8 按規定認真完成實驗報告 在規定的時間內繳上實驗報告 9 凡實驗或實驗報告未能按規定完成的學員 不能參加本課 程的考試或考查 單片機實驗報告格式 實驗報告標題 一 實驗目的 二 實驗內容 三 實驗設計及調試 1 實驗分析及內容 2 實驗電路 畫出與實驗內容有關的簡單實驗電路 3 實驗設計及調試步驟 根據內容寫出實驗程序 調試程序 觀 察結果 4 實驗調試過程中所遇到的問題 解決問題的思路和解決的方法 四 實驗后的經驗教訓總結 五 對實驗課的建議 目 錄 實驗一實驗一 實驗板使用 實驗板使用 KEIL C51 軟件使用軟件使用 6 實驗二實驗二 單片機控制單片機控制 LED 燈點亮燈點亮 12 實驗三實驗三 模擬開關燈模擬開關燈 16 實驗四實驗四 單片機控制數碼管實驗單片機控制數碼管實驗 21 實驗五實驗五 中斷系統應用實驗中斷系統應用實驗 25 實驗六實驗六 LED 數碼管的動態驅動數碼管的動態驅動 29 實驗七實驗七 定時器定時器 計數器使用計數器使用 32 實驗八實驗八 數字電子鐘數字電子鐘 36 實驗九實驗九 矩陣鍵盤識別實驗矩陣鍵盤識別實驗 37 實驗十實驗十自動演奏樂曲自動演奏樂曲 41 實驗十一實驗十一 綜合實驗綜合實驗 交通信號燈控制器的設計交通信號燈控制器的設計 45 實驗十二實驗十二 教學板自檢程序設計教學板自檢程序設計 46 實驗十三實驗十三 綜合實驗 數據采集綜合實驗 數據采集 火災報警裝置的軟硬件設計火災報警裝置的軟硬件設計 47 附錄 實驗教學板電路原理圖附錄 實驗教學板電路原理圖 48 實驗一實驗一 實驗板使用 實驗板使用 Keil C51 軟件使用軟件使用 一 實驗目的一 實驗目的 1 熟悉單片機實驗板 Keil C51軟件使用 二 實驗說明二 實驗說明 本實驗介紹實驗板的組成 Keil C51 軟件使用以及燒錄軟件的使用 通過該實驗學生 可以了解單片機編程 調試方法 三 實驗內容及步驟三 實驗內容及步驟 1 啟動 PC 機 安裝好 Keil C51 軟件以及燒錄軟件 用串口線連接計算機與實驗板 USB 線提供電源 2 打開 Keil uVision2 仿真軟件 首先建立本實驗的項目文件 接著建立源程序 編譯 無誤后 全速運行程序 3 可把源程序編譯成可執行文件 用燒錄器燒錄到 89 芯片中 四 四 Keilc 軟件使用說明軟件使用說明 1 打開程序 雙擊程序 2 新建工程 Project New Project 保存工程 選擇 CPU 一般選 ATMEL 公司的 AT89S51 17 3 設置工程 右擊 Options for Target 1 選擇 Create HEX 輸出 HEX 文件 18 4 新建源文件 選 File New 輸入 編輯源程序 保存 匯編源程序 文件名 asm C 源程序 文件名 c 5 為工程添加源文件 在 Project 出口 File 頁上單擊文件組 選擇 Add Files to Group Source Group 1 選項 選擇你的源文件和文件類型 然后點擊 ADD 再點擊 close 19 6 編譯 點擊 或右擊 Target 1 Build Target F7 就可對源程序進行編譯 當程序有語法錯誤時 會在輸出窗口 Output Windows 中顯示錯誤信息和警告信息 修改編譯成功后會生成 HEX 文件 7 下載 調試 編譯成功后 用在線燒錄程序將 HEX 文件下載到單片機內部 ROM 中 運行 在運行過程中若發現錯誤要重新修改程序 并編譯后再下載運行 五 燒錄軟件的使用五 燒錄軟件的使用 1 打開在線燒錄程序 2 選擇 MCU 類型 STC89C51RC 1 點擊 打開工程目錄下的 hex 文件 2 選擇端口 一般是 COM1 3 點擊 Download 燒錄程序 4 打開實驗板上的電源 如果燒錄的時候出現問題 點擊 stop 注意 注意 5 5 6 6 兩步驟的順序不能顛倒 即在兩步驟的順序不能顛倒 即在點擊 Download 之前要先關掉實驗板上的電源 實驗二實驗二 單片機控制單片機控制 LED 燈點亮燈點亮 一 實驗目的一 實驗目的 1 進一步熟悉編程和程序調試 2 學習 P1 口的使用方法 3 學習延時子程序的編寫和使用 二 實驗說明二 實驗說明 1 輸出控制 如圖 1 所示 當 P1 0 端口輸出高電平 即 P1 0 1 時 根據發光二極管的單向導電性 可知 這時發光二極管 L1 熄滅 當 P1 0 端口輸出低電平 即 P1 0 0 時 發光二極管 L 1 亮 我們可以使用 SETB P1 0 指令使 P 1 0 端口輸出高電平 使用 CLR P1 0 指令 使 P1 0 端口輸出低電平 XTAL1A 11 0592MHz C3A 22pF C2A 22pF P1 0 1 P1 1 2 P1 2 3 P1 3 4 P1 4 5 P1 5 6 P1 6 7 P1 7 8 RST 9 P3 0 RXD 10 P3 1 TXD 11 P3 2 INT0 12 P3 3 INT1 13 P3 4 T0 14 P3 5 T1 15 P3 6 WR 16 P3 7 RD 17 XTAL2 18 XTAL1 19 VSS 20 P2 0 21 P2 1 22 P2 2 23 P2 3 24 P2 4 25 P2 5 26 P2 6 27 P2 7 28 PSEN 29 ALE PROG 30 EA 31 P0 7 32 P0 6 33 P0 5 34 P0 4 35 P0 3 36 P0 2 37 P0 1 38 P0 0 39 VCC 40 89C51 U1F C3F 10uF VCC VCC P3 0 P3 1 P1 0 P1 1 P1 2 P1 3 P1 4 P1 5 P1 6 P1 7 P0 0 P0 1 P0 2 P0 3 P0 4 P0 5 P0 6 P0 7 EA ALE PSEN P2 7 P2 6 P2 5 P2 4 P2 3 P2 2 P2 1 P2 0 P3 2 P3 3 P3 4 P3 5 P3 6 P3 7 510 8 VCC P1 0 P1 1 P1 2 P1 3 P1 4 P1 5 P1 6 P1 7 RESET R2F 100 R1F 1K L0 L1 L2 L3 L4 L5 L6 L7 2 延時子程序的設計方法 作為單片機的指令的執行時間是很短的 數量達微秒級 因此 如果我們要求的閃爍時間 間隔為 0 2 秒 相對于微秒來說 相差太大 所以我們在執行某一指令時 插入延時程序 來達到我們的要求 但這樣的延時程序是如何設計呢 下面具體介紹其原理 石英晶體為 12MHz 因此 1 個機器周期為 1 微秒 機器周期 微秒 MOV R6 20 2 個機器周期 2 D1 MOV R7 248 2 個機器周期 2 20 DJNZ R7 2 個機器周期 2 248 20 DJNZ R6 D1 2 個機器周期 2 20 40 10002 因此 上面的延時程序時間為 10 002ms XTAL1A 11 0592MHz C3A 22pF C2A 22pF P1 0 1 P1 1 2 P1 2 3 P1 3 4 P1 4 5 P1 5 6 P1 6 7 P1 7 8 RST 9 P3 0 RXD 10 P3 1 TXD 11 P3 2 INT0 12 P3 3 INT1 13 P3 4 T0 14 P3 5 T1 15 P3 6 WR 16 P3 7 RD 17 XTAL2 18 XTAL1 19 VSS 20 P2 0 21 P2 1 22 P2 2 23 P2 3 24 P2 4 25 P2 5 26 P2 6 27 P2 7 28 PSEN 29 ALE PROG 30 EA 31 P0 7 32 P0 6 33 P0 5 34 P0 4 35 P0 3 36 P0 2 37 P0 1 38 P0 0 39 VCC 40 89C51 U1F C3F 10uF VCC VCC P3 0 P3 1 P1 0 P1 1 P1 2 P1 3 P1 4 P1 5 P1 6 P1 7 P0 0 P0 1 P0 2 P0 3 P0 4 P0 5 P0 6 P0 7 EA ALE PSEN P2 7 P2 6 P2 5 P2 4 P2 3 P2 2 P2 1 P2 0 P3 2 P3 3 P3 4 P3 5 P3 6 P3 7 510 8 VCC P1 0 P1 1 P1 2 P1 3 P1 4 P1 5 P1 6 P1 7 RESET R2F 100 R1F 1K L0 L1 L2 L3 L4 L5 L6 L7 由以上可知 當 R6 10 R7 248 時 延時 5ms R6 20 R7 248 時 延時 10ms 以此 為基本的計時單位 如要求 0 2 秒 200ms 10ms R5 200ms 則 R5 20 匯編延時子程 序如下 DELAY MOV R5 20 D1 MOV R6 20 D2 MOV R7 248 DJNZ R7 DJNZ R6 D2 DJNZ R5 D1 RET C 語言延時子程序如下 void delay02s void 延時 0 2 秒子程序 unsigned char i j k for i 20 i 0 i for j 20 j 0 j for k 248 k 0 k 三 實驗步驟及參考例子三 實驗步驟及參考例子 實驗步驟說明 實驗步驟說明 本實驗需要用到單片機最小應用系統 用 P1 口做輸出口 程序功能使發光二極管點亮 1 用串行數據通信線連接計算機與實驗板 用 USB 給實驗板提供電源 3 打開 Keil uVision2 仿真軟件 首先建立本實驗的項目文件 輸入源程序 參考程序 1 進行編譯 直到編譯無誤 生成 hex 文件 5 通過 STC ISP 下載軟件 將 hex 文件下載到實驗板內 觀察發光二極管顯示情況 參考例子參考例子 1 點亮板子上的第一個燈 D0 2 讓第一個燈閃爍 四 參考程序四 參考程序 一 適用于 mini80E 實驗板 1 include void main P1 0 xfe 2 include define uint unsigned int define uchar unsigned char delay void main while 1 P1 0 xfe delay P1 0 xff delay void delay uint x y for x 100 x 0 x for y 600 y 0 y 二 適用于自制最小系統實驗板 1 include void main void P2 0 x00 P2 0 x10 P0 0 xfe 2 include void delay void void main void P2 0 x00 while 1 P2 0 x10 P0 0 xfe delay P2 0 x00 P0 0 xff delay void delay void int x y for x 600 x 0 x for y 100 y 0 y 六 實驗內容六 實驗內容 請在 keil 環境下編寫以下程序 1 點亮最后一個 LED 或者任意一個 LED 或者任意幾個 LED 2 讓點亮的 LED 閃爍 3 點亮板子上的 D0 D2 D4 D6 燈 與 D1 D3 D5 D7 燈交替閃爍 4 設計出流水燈程序 從 D7 D0 或從 D0 D7 實驗三實驗三 模擬開關燈模擬開關燈 1 實驗目的 1 進一步熟悉編程和程序調試 2 學習獨立按鍵的使用方法 2 實驗說明 如果系統只需幾個按鍵 可直接采用 I O 線構成單個按鍵電路 各個按鍵之間相互獨 立 一根線上的按鍵狀態不會影響其他輸入線上的工作狀態 又稱獨立式鍵盤接口電路 檢測是否有鍵閉合 如有鍵閉合 則去除鍵抖動 判斷鍵號并轉入相應的按鍵處理 編寫單片機的鍵盤檢測程序時 一般在檢測按下時加入去抖延時 檢測松手時就不用加了 3 參考例子參考例子 1 通過四個按鍵來控制 LED 燈的顯示情況 S1 D0 點亮 S2 D1 點亮 S3 D2 點亮 S4 D3 點亮 4 參考程序 一 適用于自制實驗板 include define uint unsigned int define uchar unsigned char uchar flag uchar key down sbit LED2 P0 0 sbit LED3 P0 1 sbit LED4 P0 2 sbit LED5 P0 3 void delay uint k uint data i j for i 0 i k i for j 0 j 121 j uchar scan key void uchar temp temp P3 return temp void main void key down 0 P3 0 xf7 P2 0 x10 P0 0 xff while 1 P3 0 xf7 if P3 0 xf7 if P3 0 xf7 key down 1 switch flag case 0 xe7 LED2 LED2 break case 0 xd7 LED3 LED3 break case 0 xb7 LED4 LED4 break case 0 x77 LED5 LED5 break default break if P3 0 xf7 key down 0 二 適用與 mini80E 板 include define uint unsigned int define uchar unsigned char uchar flag void delay uint k uint data i j for i 0 i k i for j 0 j 121 j uchar scan key void uchar temp temp P3 return temp void main void while 1 P3 0 xff if P3 0 xff delay 20 if P3 0 xff flag scan key else flag 0 switch flag case 0 xfe P1 0 xfe break case 0 xfd P1 0 xfd break case 0 xfb P1 0 xfb break case 0 xf7 P1 0 xf7 break default P1 0 xff break 或者 include define uint unsigned int define uchar unsigned char uchar flag uchar key down sbit LED2 P1 0 sbit LED3 P1 1 sbit LED4 P1 2 sbit LED5 P1 3 void delay uint k uint data i j for i 0 i k i for j 0 j 121 j uchar scan key void uchar temp temp P3 return temp void main void key down 0 P3 0 xff P1 0 xff while 1 P3 0 xff if P3 0 xff if P3 0 xff key down 1 switch flag case 0 xfe LED2 LED2 break case 0 xfd LED3 LED3 break case 0 xfb LED4 LED4 break case 0 xf7 LED5 LED5 break default break if P3 0 xff key down 0 5 實驗內容 1 8 個按鍵分別對應 8 盞 led 燈的亮滅 針對自制教學板 2 通過四個按鍵來控制 LED 燈的顯示情況 S1 D0 D3 點亮 S2 D2 點亮 S3 D0 D7 點亮 S4 D0 D5 點亮 實驗四實驗四 單片機控制數碼管實驗單片機控制數碼管實驗 一 實驗目的一 實驗目的 1 掌握數碼管是如何顯示出字符 2 進一步掌握延時子程序的使用 二 實驗原理二 實驗原理 1 數碼管兩種接法數碼管兩種接法 2 共陰極數碼管編碼共陰極數碼管編碼 0 x3f 0 x06 0 x5b 0 x4f 0 x66 0 x6d 0 1 2 3 4 5 0 x7d 0 x07 0 x7f 0 x6f 0 x77 0 x7c 6 7 8 9 A B 0 x39 0 x5e 0 x79 0 x71 0 x00 C D E F 無顯示 請思考共陽極數碼管的編碼 三 參考例子參考例子 1 讓第一個數碼管顯示一個 8 字 A 對于 MINI80E 實驗板 共陰極共陰極 數碼管的選通是通過 P2 口控制三八譯碼器得 到的 要讓第一個數碼管顯示 8 字 那么別的數碼管的位選就要關閉 即只打開第一 個數碼管的位選 控制位選的 P2 口要輸出的數據位 0 xf7 二進制為 1111 0111 位選 確定后 在確定段選 要顯示的是 8 那么只有 dp 段為 0 其余段為 1 所以 P0 口要 輸出 0 x7f 二進制 0111 1111 B 對于自制實驗板 共陽極 數碼管的選通是通過 P2 口控制的 要讓第一個數碼管 顯示 8 字 那么別的數碼管的位選就要關閉 即只打開第一個數碼管的位選 控制位 選的 P2 口要輸出的數據位 0 x08 二進制為 0000 1000 位選確定后 在確定段選 要 顯示的是 8 那么只有 dp 段為 1 其余段為 0 所以 P0 口要輸出 0 x80 二進制 1000 0000 ab cde g GND f dp GND a b c e f g d dp a b c d e f g dp dp g f e d c b a 5V a b 2 在四個數碼管上顯示 1 2 3 4 位選 接 P2 口 左邊四個數碼管 DS3 DS2 DS1 DS0 對應的 P2 口 0 xf3 0 xf2 0 xf1 0 xf0 右邊四個數碼管 DS3 DS2 DS1 DS0 對應的 P2 口 0 xf7 0 xf6 0 xf5 0 xf4 段選 接 P0 口 四 參考程序四 參考程序 一 一 mini80e 實驗板實驗板 1 include void main void while 1 P2 0 xf7 P0 0 x7f 2 include define uint unsigned int define uchar unsigned char void delay void main void while 1 P2 0 xf7 P0 0 x66 delay P2 0 xf6 P0 0 x4f delay P2 0 xf5 P0 0 x5b delay P2 0 xf4 P0 0 x06 delay void delay 延時程序 1 uint x y for x 2 x 0 x for y 112 y 0 y 二 自制教學實驗板 共陽極數碼管 1 include void main void while 1 P2 0 x08 P0 0 x80 2 include define uint unsigned int define uchar unsigned char void delay void main void while 1 P2 0 x08 P0 0 x99 delay P2 0 x04 P0 0 xb0 delay P2 0 x02 P0 0 xa4 delay P2 0 x01 P0 0 xf9 delay void delay 延時程序 1 uint x y for x 2 x 0 x for y 112 y 0 y 五 原理圖五 原理圖 六 實驗內容六 實驗內容 1 用一位數碼管循環顯示 0 9 2 用數碼管顯示字母 A F 3 交替點亮 4 個數碼管 例如 開始時在數碼顯示器的最右邊一位上顯示 1 個 0 字 以后每隔 0 5 秒將 0 字左移 1 位 直到最左邊一位后則停止顯示 4 結合實驗 3 實現按鍵與數字的一一對應 實驗五實驗五 中斷系統應用實驗中斷系統應用實驗 一 實驗目的一 實驗目的 1 掌握外部中斷技術的基本使用方法 2 掌握中斷處理程序的編寫方法 二 實驗說明二 實驗說明 1 外部中斷的初始化設置共有三項內容 中斷總允許即 EA 1 外部中斷允許即 EXi 1 i 0 或 1 中斷觸發方式設置 中斷觸發方式設置一般有兩種方式 電平觸發方式 和脈沖 邊沿 觸發方式 本實驗選用后者 其前一次為高電平后一次為低電平時為有效 中斷請求 因此高電平狀態和低電平狀態至少維持一個周期 中斷請求信號由引腳 INT0 P3 2 和 INT1 P3 3 引入 本實驗由 INT0 P3 2 引入 2 中斷控制原理 中斷控制是提供給用戶使用的中斷控制手段 實際上就是控制一些寄存器 51 系列用 于此目的的控制寄存器有四個 TCON IE SCON 及 IP 3 中斷響應的過程 首先中斷采樣然后中斷查詢最后中斷響應 采樣是中斷處理的第一步 對于本實驗的 脈沖方式的中斷請求 若在兩個相鄰周期采樣先高電平后低電平則中斷請求有效 IE0 或 IE1 置 1 否則繼續為 0 所謂查詢就是由 CPU 測試 TCON 和 SCON 中各標志位的狀態 以確定有沒有中斷請求發生以及是那一個中斷請求 中斷響應就是對中斷請求的接受 是 在中斷查詢之后進行的 當查詢到有效的中斷請求后就響應一次中斷 4 8051 的中斷系統 8051 的中斷系統包括 5 個中斷源 并提供兩個優先級 允許用戶對中斷源進行獨立控制 和中斷優先級設置 8051 支持的 5 個中斷源分別為外部中斷 0 定時器 0 溢出中斷 外部中 斷 1 定時器 1 溢出中斷和串口中斷 對應的中斷號為 0 1 2 3 4 寄存器有 4 個工 作組可以切換 為 0 3 C51 中 中斷服務程序是以中斷函數的方式來時實現的 5 中斷函數格式如下 void 函數名 interrupt 中斷號 using 工作組 中斷服務程序內容 三 參考例子三 參考例子 1 右邊的三個數碼管從 000 開始進行加法計數 按動按鍵時計數暫停 再按繼續計 數 四 參考程序四 參考程序 一 適用于自制教學實驗板 一 適用于自制教學實驗板 include define uchar unsigned char define uint unsigned int sbit P37 P3 7 uchar code table 10 0 xc0 0 xf9 0 xa4 0 xb0 0 x99 0 x92 0 x82 0 xf8 0 x80 0 x90 uchar code wei 4 0 x08 0 x04 0 x02 0 x01 uint cnt bit flag void init void bit flag 0 設置標志 EA 1 開中斷 EX0 1 外部中斷 0 開中斷 IT0 1 外部中斷 0 的觸發方式 void delay uint k uint data i j for i 0 i k i for j 0 j999 cnt 0 for i 0 i 100 i P0 table cnt 100 P2 wei 2 delay 1 P0 table cnt 100 10 P2 wei 1 delay 1 P0 table cnt 10 P2 wei 0 delay 1 void extern int0 void interrupt 0 using 0 flag flag 二 適用于 二 適用于 MINI80E 實驗板實驗板 include define uchar unsigned char define uint unsigned int sbit P37 P3 7 uchar code table 10 0 x3f 0 x06 0 x5b 0 x4f 0 x66 0 x6d 0 x7d 0 x07 0 x7f 0 x6f uchar code wei 4 0 xf7 0 xf6 0 xf5 0 xf4 uint cnt bit flag void init void bit flag 0 設置標志 EA 1 開中斷 EX0 1 外部中斷 0 開中斷 IT0 1 外部中斷 0 的觸發方式 void delay uint k uint data i j for i 0 i k i for j 0 j999 cnt 0 for i 0 i 100 i P0 table cnt 100 P2 wei 2 delay 1 P0 table cnt 100 10 P2 wei 1 delay 1 P0 table cnt 10 P2 wei 0 delay 1 void extern int0 void interrupt 0 using 0 flag flag 五 實驗內容五 實驗內容 1 使用外部中斷 使用外部中斷 1 實現上述功能 注意實現上述功能 注意 C51 中的不同中斷號 中的不同中斷號 2 數碼管從 數碼管從 0000 開始計數 高兩位和低兩位獨立計數 采用兩個按鍵 一個對應開始計數 高兩位和低兩位獨立計數 采用兩個按鍵 一個對應 前兩位的暫停和繼續 另一個對應后兩位的暫停和繼續 前兩位的暫停和繼續 另一個對應后兩位的暫停和繼續 實驗六實驗六 LED 數碼管的動態驅動數碼管的動態驅動 一 實驗目的 1 學習 LED 數碼管的動態驅動編程 2 學習使用定時 計數器 二 實驗內容 編寫程序 使實驗板上的 4 個 LED 數碼管穩定顯示 4 個不同的數字 并使這四位數從 0000 開始 每秒鐘加一 三 實驗說明 在前面實驗中 我們已經能夠讓某一個 LED 數碼管顯示需要的數字 比如選讓第一 個 LED 顯示 1 隔一較短的時間 如 5 毫秒 后關閉第一個 LED 讓第二個 LED 顯示 2 如此周而復始 讓 4 個 LED 依次顯 1 2 3 4 我們就能看到 4 個 LED 上穩 定地顯示 4 個不同的數字 當然 每個瞬間只有一個 LED 被點亮 大家亮的時間相同 均為 5 毫秒 4 個 LED 數碼管點亮一遍需要 20 毫秒 一秒鐘各亮 50 次 所以看上去 不會有閃爍感 但亮度只是實驗四中 LED 亮度的四分之一 要實現每隔 5 毫秒變換一個 LED 最好的方法是使用定時器中斷 四 參考程序 一 自制實驗教學板 C51 參考程序如下 include define U8 unsigned char U8 tab 0 xc0 0 xf9 0 xa4 0 xb0 0 x99 0 x92 0 x82 0 xf8 0 x80 0 x90 U8 scn 0 x01 0 x02 0 x04 0 x08 先點亮左邊一個數碼管 U8 buf 4 0 0 0 0 顯示緩沖區 開機先顯示 0000 U8 cnt 0 掃描計數 void main void EA 1 允許中斷 TMOD 0 x01 設定時器 0 為模式 1 16 位 ET0 1 定時器 0 中斷允許 TH0 0 xee 晶振 11 0592MHz 5mS TL0 0 TR0 1 開始計數 while 1 死循環 等待中斷 void timeint void interrupt 1 定時器 0 中斷服務程序 char i TH0 0 xee 設置定時器時間常數 TL0 0 i cnt 求應點亮的 LED 號 從左到右依次為 0 1 2 3 P0 tab buf i 筆劃代碼送 P0 口 P2 scn i 控制掃描碼送 P2 口 if cnt 200 cnt 0 到 1 秒鐘 顯示的數字加一 for i 3 i 0 i buf i if buf i 10 buf i 0 加到 10 向前進位 else break cnt 二 mini80e 實驗板 C51 參考程序如下 include define U8 unsigned char U8 tab 0 x3f 0 x06 0 x5b 0 x4f 0 x66 0 x6d 0 x7d 0 x07 0 x7f 0 x6f U8 scn 0 xf4 0 xf5 0 xf6 0 xf7 先點亮左邊一個數碼管 U8 buf 4 0 0 0 0 顯示緩沖區 開機先顯示 0000 U8 cnt 0 掃描計數 void main void EA 1 允許中斷 TMOD 0 x01 設定時器 0 為模式 1 16 位 ET0 1 定時器 0 中斷允許 TH0 0 xee 晶振 11 0592MHz 5mS TL0 0 TR0 1 開始計數 while 1 死循環 等待中斷 void timeint void interrupt 1 定時器 0 中斷服務程序 char i TH0 0 xee 設置定時器時間常數 TL0 0 i cnt 求應點亮的 LED 號 從左到右依次為 0 1 2 3 P0 tab buf i 筆劃代碼送 P0 口 P2 scn i 控制掃描碼送 P2 口 if cnt 200 cnt 0 到 1 秒鐘 顯示的數字加一 for i 3 i 0 i buf i if buf i 10 buf i 0 加到 10 向前進位 else break cnt 五 實驗內容 1 每個按鍵控制一個數碼管 按任意一個鍵 可在相應的數碼管上實現數字加 1 2 如何讓 4 個 LED 數碼管從 0000 開始 每秒鐘自動加 1 前兩位代表分 后兩位代 表秒 實驗七實驗七 定時器定時器 計數器使用計數器使用 一 實驗目的一 實驗目的 1 學習 89C51 內部定時計數器的使用和編程方法 2 進一步掌握中斷處理程序的編寫方法 二 實驗說明二 實驗說明 1 51 單片機有 兩個 16 位內部定時器 計數器 T C Timer Counter 若是計數內 部晶振驅動時鐘 則是定時器 若是計數 8051 的輸入引腳的脈沖信號 則它是計數器 定 時器實際上也是工作在計數方式下 只不過對固定頻率的脈沖計數 由于脈沖周期固定由 計數值可以計算出時間 有定時功能 定時器有關的寄存器有工作方式寄存器 TMOD 和控制寄存器 TCON TMOD 用于設 置定時器 計數器的工作方式 0 3 并確定用于定時還是用于計數 TCON 主要功能是為定 時器在溢出時設定標志位 并控制定時器的運行或停止等 2 TMOD 1 M1M0 工作方式控制位 2 C T 定時器方式或計數器方式選擇位 若 C T 1 時 為計數器方式 C T 0 時 為定時器方式 3 GATE 定時器 計數器運行門控標志位 當 GATE 1 時 T C 的啟動受雙重控制 即要求 INT0 或 INT1 引腳為高電平且 TR0 或 TR1 置 1 時 相應的 T C 才被選通工作 若 GATE 0 T C 的啟動僅受 TR0 或 TR1 控制 即置 1 T C 就被選通 而不管 INT0 或 INT1 的電平是高還是低 3 TCON TF0 TF1 分別是定時器 計數器 T0 T1 的溢出中斷標志位 加法計數器計滿溢出時 置 1 申請中斷 在中斷響應后自動復 0 TF 產生的中斷申請是否被接受 還需要由中斷 是否開放來決定 TR1 TR0 分別是定時器 計數器 T1 T0 的運行控制位 通過軟件置 1 后 定時器 計數器才開始工作 在系統復位時被清 0 4 初始化 1 初始化步驟 在使用 51 系列單片機的 T C 前 應對它進行編程初始化 主要是對 TCON 和 TMOD 編程 還需要計算和裝載 T C 的計數初值 一般完成以下幾個步驟 1 確定 T C 的工作方式 編程 TMOD 寄存 2 計算 T C 中的計數初值 并裝載到 TH 和 TL 3 T C 在中斷方式工作時 必須開 CPU 中斷和源中斷 編程 IE 寄存器 4 啟動定時器 計數器 編程 TCON 中 TR1 或 TR0 位 2 計數初值的計算 1 定時器的計數初值 在定時器方式下 T C 是對機器周期脈沖計數的 fOSC 6MHZ 一個機器周期為 12 fOSC 2us 則 方式 0 13 位定時器最大定時間隔 213 2us 16 384ms 方式 1 16 位定時器最大定時間隔 216 2us 131 072ms 方式 2 8 位定時器最大定時間隔 28 2us 512us 若 T C 工作在定時器方式 1 時 要求定時 1ms 求計數值 如設計數初值為 x 則 有 216 x 2us 1000us 推出 x 216 500 因此 TH TL 可置 65 536 500 2 計數器的計數初值 在計數器方式下 方式 0 13 位計數器的滿計數值 213 8192 方式 1 16 位計數器的滿計數值 216 65 536 方式 2 8 位計數器的滿計數值 28 256 若 T C 工作在計數器方式 2 時 則要求計數 10 個脈沖的計數初值 如設計數初值 為 x 則有 28 x 10 即 x 28 10 因此 TH TL 256 10 三 參考例子三 參考例子 1 設單片機晶振頻率為 12 MHz 利用定時器在 P1 0 腳輸出周期為 2 ms 的方波 分析 選用定時器 計數器 T0 作定時器 輸出為 P1 0 引腳 2 ms 的方波可由間隔 1 ms 的高低電平相間而成 因而只要每隔 1 ms 對 P1 0 取反一次即可得到這個方波 機器周期 12 12MHz 1 s 1 ms 內 T0 需要計數 N 次 N 1 ms 1 s 1000 由于計數器向上計數 為得到 1000 個計數之后的定時器溢出 必須給定時器置初值為 65 536 1000 2 在 P1 7 端接有一個發光二極管 要求利用 T C 控制 使 LED 亮 1s 滅 1s 周而復始 分析 要求定時 1s T C 的三種工作方式都不能滿足 為什么 對于較長時間的定時 應采用符合定時的方法 使 T C0 工作在定時器方式 1 定時 100ms 定時時間到后 P1 0 反相 即 P1 0 端輸 出周期 200ms 的方波脈沖 另設 T C1 工作在計數器方式 2 對 T1 輸出的脈沖計數 當計滿 5 次 定時 1s 時間到 將 P1 7 端方向 改變燈的狀態 采用 6MHZ 晶振 方式 1 的最大定時才能達到 100 多 ms 對于 100ms 機器周期 為 12 fOSC 2us 需要計數的次數 100 1000 2 50 000 即初值為 65 536 50 000 方式 2 滿 5 次溢出中斷 初值為 256 5 四 參考程序四 參考程序 一 適用于自制實驗教學板 1 設置周期為 2ms 的方波 查詢方式 include sbit P1 0 P1 0 void main TMOD 0 x01 T CO 工作在定時器方式 1 16 位定時器 TR0 1 啟動 T C0 for 主程序循環 TH0 65536 1000 256 預置計數初值 TL0 65536 1000 256 do P1 0 P1 0 P1 0 取反 TF0 0 軟件清 TF0 while TF0 查詢等待 TF0 置位 中斷方式 include sbit P1 0 P1 0 void timer0 void interrupt 1 using 1 T C 中斷服務程序入口 TF0 0 清楚中斷標志位 P1 0 P1 0 P1 0 取反 TH0 65536 1000 256 計數初值重裝載 TL0 65536 1000 256 void main TMOD 0 x01 T CO 工作在定時器方式 1 P1 0 0 TH0 65536 1000 256 預置計數初值 TL0 65536 1000 256 EA 1 CPU 開中斷 TF0 0 ET0 1 T C0 開中斷 TR0 1 啟動 T C0 開始定時 do while 1 2 燈的閃爍 時間間隔為 1s P1 0 與 P3 5 相連 作為定時器 1 的輸入 include sbit P1 0 P1 0 sbit P0 7 P0 7 timer0 interrupt 1 using 1 T C0 中斷服務程序入口 TF0 0 清楚中斷 T0 標志位 P1 0 P1 0 P1 0 取反 TH0 65536 1000 256 計數初值重裝載 TL0 65536 1000 256 timer1 interrupt 3 using 2 T C1 中斷服務程序入口 TF1 0 清楚中斷 T1 標志位 P0 7 P0 7 1s 到 燈改變狀態 void main P2 0 x10 打開 LED 電源開關 P0 7 1 置燈初始滅 P1 0 1 保證第一次方向便開始計數 TMOD 0 x61 T CO 工作在定時器方式 1 T C1 工作在計數器方式 2 TH0 65536 10000 256 預置計數初值 10 毫秒 TL0 65536 10000 256 TH1 256 100 TL1 256 100 IP 0X08 置優先級存儲器 EA 1 CPU 開中斷 TF0 0 清除中斷 T0 標志位 TF1 0 清除中斷 T1 標志位 ET0 1 T C0 開中斷 ET1 1 T C1 開中斷 TR0 1 啟動 T C0 開始定時 TR1 1 啟動 T C1 do while 1 二 適用于 MINI80E 實驗板 2 P0 7 與 P3 5 相連 作為定時器 1 的輸入 include sbit P1 0 P1 0 sbit P0 7 P0 7 timer0 interrupt 1 using 1 T C0 中斷服務程序入口 TF0 0 清除中斷 T0 標志位 P0 7 P0 7 P1 0 取反 TH0 65536 1000 256 計數初值重裝載 TL0 65536 1000 256 timer1 interrupt 3 using 2 T C1 中斷服務程序入口 TF1 0 清除中斷 T1 標志位 P1 0 P1 0 1s 到 燈改變狀態 void main P2 0 x10 打開 LED 電源開關 P0 7 1 置燈初始滅 P1 0 1 保證第一次方向便開始計數 TMOD 0 x61 T CO 工作在定時器方式 1 T C1 工作在計 數器方式 2 TH0 65536 10000 256 預置計數初值 10 毫秒 TL0 65536 10000 256 TH1 256 100 TL1 256 100 IP 0X08 置優先級存儲器 EA 1 CPU 開中斷 TF0 0 清除中斷 T0 標志位 TF1 0 清除中斷 T1 標志位 ET0 1 T C0 開中斷 ET1 1 T C1 開中斷 TR0 1 啟動 T C0 開始定時 TR1 1 啟動 T C1 do while 1 五 電路圖五 電路圖 六 實驗內容六 實驗內容 1 利用定時 計數器 T1 產生定時時鐘 由 P1 口 或 P0 口 控制 8 個發光二極管 使 8 個指 示燈依次一個一個閃動 閃動頻率為 10 次 秒 8 個燈依次亮一遍為一個周期 循環 GATE C T M1 M0 GATE C T M1 M0 TH1TL1TH0TL0 T1方式 T0方式 T1引腳 T0引腳 機器周 期脈沖 內部總線 TMOD TCON 外部中斷相關位 TF1 TR1 TF0 TR0 實驗八實驗八 數字電子鐘數字電子鐘 一 實驗目的 進一步熟悉定時 計數器的使用 二 實驗內容 在實驗板上編寫程序 實現電子鐘功能 時間顯示格式為 HH MM 中間的小數點每秒鐘 閃爍一次 用兩個按鍵控制分和小時的調整 每按一次分或者小時加 1 三 實驗說明 前面實驗鐘 LED 數碼管的筆劃代碼均不含小數點 h 位為 1 小數點不亮 為了讓第 2 個 LED 的小數點在每一秒的前半秒亮 后半秒滅 應在定時器的中斷子程序中 判斷當 前時間為前半秒 而且動態掃描到第 2 個 LED 時 將其筆劃代碼取出 和 0 xDF 相與 后再寫入 P0 口 實驗九實驗九 矩陣鍵盤識別實驗矩陣鍵盤識別實驗 一 實驗目的一 實驗目的 1 掌握矩陣鍵盤的檢測原理 二 實驗說明二 實驗說明 1 矩陣式鍵盤中 行 列線分別連接到按鍵開關的兩端 行線通過上拉電阻接到 5V 上 當無鍵按下時 行線處于高電平狀態 當有鍵按下時 行 列線將導通 此時 行線電平 將由與此行線相連的列線電平決定 這一點是識別矩陣按鍵是否被按下的關鍵 然而 矩 陣鍵盤中的行線 列線和多個鍵相連 各按鍵按下與否均影響該鍵所在行線和列線的電平 各按鍵間將相互影響 因此 必須將行線 列線信號配合起來作適當處理 才能確定閉合 鍵的位置 掃描方式是利用 CPU 完成其他工作的空余調用鍵盤掃描子程序來響應鍵盤輸入的要求 在執行鍵功能程序時 CPU 不再響應鍵輸入要求 直到 CPU 重新掃描鍵盤為止 鍵盤掃 描程序一般應包括以下內容 1 判別有無鍵按下 2 鍵盤掃描取得閉合鍵的行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論