Ⅰ 51單片機四路搶答器畢業論文 只要四路
第一章 緒論設計的四路數字搶答器,每路設計一搶答按鈕供選手使 用,並設置一個系統清除和搶答控制總開關 S,該開關由主持 人控制。 搶答器具有限時搶答功能,每一輪的限時搶答時間設定為 30 秒。主持人啟動"開始"鍵後,在設定的時間內,參賽選手 進行搶答有效,否則無效。 搶答器具有鎖存與顯示功能。選手搶答成功則顯示相應 的編號,此時其他選手無法搶答。優先搶答選手的編號一直 保持到主持人將系統清除為止。用計時器數碼管顯示當前剩 余的答題時間, 當答題剩餘時間為 5 秒時,小燈閃爍提示;當答題時間結束 時,蜂鳴器發出響聲,提示答題者答題時間到。 本課題我們主要採用單片機電路來實現的,主要設計思 路是:在主持人下達命令之後,若選手在 30s 內沒有閉合開 關,就進入下一環節;若有選手閉合開關,主機就能夠准確 判斷出第一搶答信號並將其鎖存,同時將其餘輸入信號封鎖, 使其它搶答無效,此時主持人根據屏幕上顯示的號碼判斷是 哪位選手可以做答,此時最先閉合開關的選手開始進入答題 倒計時,若在 60s 內答題則視為有效;否則無效。 程序流程圖如圖 1-1.1-2 所示: 選手發送圖: 開始 初始化:P0.P2 口清零 定時器 T1 方式選擇;串列口發送方式選 擇;啟動定時器 1 並裝入初值 判斷搶答是否成功 向主機發送選手號 顯示答題倒計時 圖 1-1 主持人接受圖:開始 初始化: P0.P1.P2.口清零, 串列口接受方式選擇,T1 接收方 式選擇,啟動計數器 T1,並裝入初值,開總中斷和串列口 中斷 總開關是否按下 允許接收,並顯示搶答時間倒計時 是否接受到搶答信號 顯示優先按下鍵的選手號碼, 並屏蔽其他選手 號碼 圖 1-2 系統方案論證 第二章 系統方案論證方案一:如圖 2-1,採用一個單片機,一個計時器,一個 數碼管,選手通過按下開關作為輸入信號,完成搶答輸入信 號的觸發。主持人根據選手的輸入信號准確判斷出最先按下 開關的選手,並屏蔽其他搶答信號,讓優先按鍵的選手開始 作答,同時計時器開始計時倒計時。電路主要運用了定時器 和計數器,該電路的優點是電路圖比較簡單,缺點是抗干擾 能力差,缺乏實際利用價值。 圖 2-1 方案二:採用五個單片機,五個計時器,一個數碼管, 電路主要運用串列口中斷和定時器計數器的工作原理。接通 電源後, 主持人將開關撥到"清零"狀態, 搶答器處於禁止狀態, 編號顯示器滅燈,主持人將開關置開始"狀態,宣布"開始"搶 答器工作,開始搶答時間倒計時,如果在搶答時間倒計時內 無人搶答,則直接進入下一環節,若有人在這時間內優先搶 答,則其開始作答,與此同時搶答倒計時,改換成作答倒計 時,當倒計時到 5s 時,信號燈閃爍提醒作答選手,當計時結 束時,蜂鳴器發出報警聲響提示選手。選手搶答實行優先鎖 存,優先搶答,選手的編號一直保持到裁判將系統清零為止。 該電路的缺點是電路復雜,優點是便於每位選手觀看倒計時, 實用性較好,在實際生活中應用較多。 通過以上兩個方案的比較,我們不難發現第二個電路增 加了一些控制電路,控制起來比較容易一些,效果和實用性 比第一個好,故本實驗採用第二個原理圖。 系統圖各位選手通過按鍵發送請求信號告知主持人,主持人通 過數碼管上號碼告訴哪位選手可以答題,如圖 2-2 1號 4號 主 持 人 2號 3號 圖 2-2 第三章 理論分析本課題的電路採用單片機 AT89C51 作為控制晶元, 分別是 主持人和每位參賽選手都有自己的控制器。每位選手的控制 晶元 P0 和 P2 口上都接一個共陰極的數碼管作為答題倒計時 的顯示。P1^4 口接一按鍵,按鍵的另一端接地,供選手搶答 使用。 P1^6 接音頻放大電路, 並在其輸出端接一個喇叭,作 為答題剩餘時間提醒。當選手按下按鍵搶答成功時,它就會 通過控制晶元上的串列口發送自己的選手號,同時也啟動了 答題倒計時,當答題時間只剩下 5 秒時,喇叭就會發出「叮 咚」提醒選手抓緊時間答題。 主持人的控制晶元的 P0 . P1 和 P2 口都接一共陰極的數碼 管,其中 P1 口的數碼管用來顯示搶答成功選手的號碼。P1 和 P2 口的數碼管開始時用來顯示允許搶答的時間限制,當有 選手搶答成功時,就轉為顯示搶答時間倒計時。P3^7 接開關 和指示燈,當開關按下指示燈亮時才允許選手們進行搶答。當 有一號選手搶答成功,則通過軟體關閉串列口中斷屏蔽其他 的選手。 選手向主持人發送自己的選手號碼是採用串列口單工通 訊的原理。 每個控制晶元內部都有一個功能強大的全雙工的 非同步通信串列口, 其內部有兩個物理上獨立的接收. 發送緩沖 期 SBUF,可同時發送. 接收數據。每次串列口的使用,串列 口需初始化後, 才能完成數據的輸入、輸出。其初始化過程如 下: (1) 按選定串列口的操作模式設定 SCON 的 SM0、SM1 兩 位二進制編碼。(2) 對於操作模式 2 或 3, 應根據需要在 TB8 中寫入待發送的第 9 位數據。(3) 若選定的操作模式不 是模式 0, 還需設定接收/發送的波特率。設定 SMOD 的狀態, 以控制波特率是否加倍。 若選定操作模式 1 或 3, 則應對定 時器 T1 進行初始化以設定其溢出率。 這些初始化須通過軟體 編程來實現。 本設計採用的是模式 2--9 位數據非同步通訊方式。 其工作原理為: (1).一幀為 11 位:9 位數據位,1 個起始位(0),1 個停 止位(1)。第 9 位數據位在 TB8/RB8 中,常用作校驗位和多機 通訊標識位(2).RXD:接收數據端,TXD:發送數據端。(3). 波特率: 方式 2:B=(2SMOD/64)×fosc ,本設計用定時器 1 來產生。(4).發送:先裝入 TB8,寫入 SBUF 並啟動發送, 發送結束,TI=1。接收:REN=1,允許接收。接收完一幀,若 RI=0 且第 9 位為 1 (或 SM2=0),將接收數據裝入接收 SBUF, 第 9 位裝入 RB8,使 RI=1;否則丟棄接收數據,不置位 RI。 原理圖如下: 圖3 試驗及數據分析 第四章 試驗及數據分析 1. 實驗環境在實驗室里用 proteus 模擬,用 keil 編程,最後得到模擬 結果。 2. 數據(1)主機工作 ) 主持人閉和開關後,數碼管顯示零,計時器顯示搶答倒 計時,從 30s 開始倒計時。如圖 4-2-1: 圖 4-2-1 (2)選手一搶答 ) 在搶答倒計時時間內,選手一閉合開關,主機數碼管上 顯示」1」,選手一旁邊的發光二極體亮,與此同時,主持人和選 手一的計時器開始顯示答題倒計時,時間在 60s 內,如圖 4-2-2: 圖 4-2-2 (3)選手二搶答 ) 在搶答倒計時時間內,選手二閉合開關,主機數碼管上 顯示」2」,選手二旁邊的發光二極體亮,與此同時,主持人和選 手二的計時器開始顯示答題倒計時,時間在 60s 內,如圖 4-2-3: 圖 4-2-3 (4)選手三搶答 ) 在搶答倒計時時間內,選手三閉合開關,主機數碼管上 顯示」3」,選手三旁邊的發光二極體亮,與此同時,主持人和選 手三的計時器開始顯示答題倒計時,時間在 60s 內,如圖 4-2-4: 圖 4-2-4 (5)選手四搶答 ) 在搶答倒計時時間內,選手四閉合開關,主機數碼管上 顯示」4」,選手四旁邊的發光二極體亮,與此同時,主持人和選 手四的計時器開始顯示答題倒計時,時間在 60s 內,如圖 4-2-5: 圖 4-2-5 3. 分析搶答器由單片機以及外圍電路組成,由於採用單片機, 使得外圍電路非常簡單,有如下功能搶答限時、選手答題計 時搶答自鎖,燈光指示、暫停復位、電子音樂報聲;搶答規 定時限 0-30 秒可調; 面板上設有組號與計時窗口, 顯示清晰, 同步顯示,互不幹擾集搶答器、數顯倒計時器於一機; 可設 定搶答、答題兩種倒計時時間;搶答器具有鎖存與顯示功能。 即選手按動按鈕, 鎖存相應的編號, 並在 LED 數碼管上顯示; 搶答器具有定時搶答功能,且一次搶答的時間由主持人設定, 本次時間設定為 30 秒,當主持人啟動"開始"鍵後,定時器進 行減計時等等,總之搶答器很有實用價值。 第五章 心得體會今年參加了全國大學生電子設計大賽培訓,培訓過程中 的艱辛只有親身經歷過才知道裡面的酸甜苦辣,我相信這段 時間會給我們留下美好的回憶。在經歷了艱苦的培訓之後, 我們組只有一個信念,就是無論如何也要盡我們最大的努力, 讓老師選上我們,只有選上了,我們的夢想才真的開始了, 否則前面的付出就付諸東流了。 我們做的是搶答器。我們本來很快就有思路了,但給老 師一看的時候,他說太沒難度了,會影響我們的選拔分,沒 辦法,我們只好把難度往上提了,這一提難度我們可就連續 整了 3 天,在這 3 天我們除下吃飯和睡覺的時間不在外,其 余時間通通泡在實驗室內,最終通過我們的集體努力,我們 的實驗也算有所成果吧。 通過參加這次培訓,發現有了很多的體會和收獲:首先 是學習能力的加強。這種學習能力包括獲取資料的能力、理 解前人思路的能力、系統設計能力、動手能力、分析排除故 障能力、表達能力等多方面,電子設計競賽的賽制就決定了 上述能力缺一不可。其次是團隊精神的培養。電子設計競賽 要求三人組隊參賽,集體計算成績,這就使得三個人必須互 相信任、互相配合、分工合作。在順境時要相互提醒保持冷 靜,逆境時要相互鼓勵共度難關,不能相互埋怨。 我們組永遠忘不了這次經歷,永遠忘不了和我們一起奮 斗的老師和學哥,我們永遠堅信我們組是最棒的! 參 考 文 獻 [1] 余發山, 單片機原理及應用技術 ,中國礦業大學出版社, 2003; [2]王衛東,基於單片機的最簡連線搶答器的設計與製作,1999; [3]李朝青.2001.單片機原理與介面技術.北京:北京航空航天 大學出版社.94-103,339-348; [4] 沈慶陽、郭庭吉 版社; [5]李朝青主編,《單片機原理與介面技術》,北京航天航空大學 出版社,1994; [6]何立民主編,《單片機應用與設計》,北京航天航空大學出版 社,1990; 8051 單片機實踐與應用 清華大學出
電子科協競賽項目報告書 參賽作品: 單片機的 參賽作品:基於 51 單片機的四路電子搶答器 作品 小 組 成 員: TH XZ 專 業 班 級: 電信 1005 班 報告提交日期: 2011 報告提交日期: 2011 年 3 月 16 日 日期 目錄 1 設計要求與功能 ........................................................................................................... 4 1.1 設計基本要求…………………………………………………………………...4 2 硬體設計 ...................................................................................................................... 4 2.1 控制系統及所需元件…………………………………………………………. 4 2.2 搶答器顯示模塊………………………………………………………………...5 2.3 電源方案的選擇 ............................................................................................... 6 2.4 搶答器鍵盤的選擇 ........................................................................................... 6 2.5 蜂鳴器模塊 ........................................................................................................ 7 2.6 外部振盪電路 .................................................................................................... 7 3 程序設計 ...................................................................................................................... 7 3.1 程序流程圖 ........................................................................................................ 7 3.2 系統的調試…… ………………………………….. …………………………9 3.3 焊接的問題及解決……………………………………………………… …10 4 總結 ............................................................................................................................. 10 附錄 C 程序 ................................................................................................................... 11 II 一設計要求與功能 1.1 設計基本要求(1)搶答器同時供 4 名選手或 4 個代表隊比賽使用,分別用 4 個按鈕 K1~ K4 表示。 (2)設置裁判開關 k5 和清零開關 k6,該開關由主持人控制,當主持人按 下 k6,系統復位,預備搶答,當主持人按下總控制控制開關 k5,開始搶答; (3) 搶答器具有定時搶答功能, 搶答時間為倒計時 15 秒。 當主持人啟動 「開 始」鍵後,定時器進行減計時,同時揚聲器發出短暫的提示聲響,聲響持續的時 間 0.5 秒左右,當計時小於 5 秒後,每減少一秒,便報警一次以提示選手。 (4)搶答器具有鎖存功能,參賽選手在設定的時間內進行搶答,搶答有效, 蜂鳴器發聲,計時停止,數碼管上顯示選手的編號和時間,選手相應的信號燈被 點亮,其他選手再搶答時無效。 (5)如果定時時間已到,無人搶答,本次搶答無效,系統報警並禁止搶答。 等待下一輪搶答。 。 二 硬體設計 2.1 控制系統及所需元件控制系統主要由單片機應用電路、存儲器介面電路、顯示介面電路組成。其 中單片機 STC89C52 是系統工作的核心,它主要負責控制各個部分協調工作。 所需元件:該系統的核心器件是 STC89C52。各口功能: P0.0-P0.3 是數碼管的位選口; P2.0-P2.7 是數碼管的段選口,為其傳送段選信號; P1.0-P1.3 是 4 組搶答信號的輸入口; P1.4、P1.5 由裁判控制,分別是搶答開始\復位功能鍵; P1.6 為蜂鳴器的控制口; P3.4-P3.7 為選手信號燈輸出口; 在其外圍接上電復位電路、數碼管電路、LED 發光二極體、按鍵電路及揚聲 器電路。 電子搶答器用單片機來設計製作完成的, 由於其功能的實現主要是通過軟體 3 編程來完成的,所以採用單片機 STC89C52,它是一個低電壓,高性能 CMOS 8 位 單片機,片內含 8k bytes 的可反復擦寫的 Flash 只讀程序存儲器和 512 bytes 的隨機存取數據存儲器(RAM) ,器件採用 ATMEL 公司的高密度、非易失性存儲技 術生產,兼容標准 MCS-51 指令系統,片內置通用 8 位中央處理器和 Flash 存儲 單元,功能強大的 STC89C52 單片機可為您提供許多較復雜系統控制應用場合。 下圖為其 I/O 口引腳圖: STC89C52 管腳圖 2.2. 搶答器顯示模塊顯示模塊分為數碼管模塊和 LED 信號燈模塊 分別採用四位一體共陰極數碼管和四個發光二極體,體積小,功耗低,故障 率低,程序編譯容易,資源佔用較少。 (見圖 1,圖 2) 圖1 4 圖2 2.3 電源方案的選擇系統需要 5V 電源來驅動單片機 STC89C52。 利用電腦的 USB 介面可以提供 5V 電壓來驅動單片機。 2.4 搶答器鍵盤的選擇鍵盤是單片機不可缺少的輸入設備,是實現人機對話的紐帶。鍵盤按結構形 式可以分為非編碼鍵盤和編碼鍵盤,前者用軟體方法產生鍵碼,而後者則用硬體 方法來產生鍵碼。 在單片機中使用的都是非編碼鍵盤, 因為非編碼鍵盤結構簡單, 成本低廉,非編碼鍵盤的類型很多,常用的有獨立式鍵盤,行列式鍵盤等。 本設計採用獨立式鍵盤。 鍵盤介面中使用多少根 I/O 線,鍵盤中就有幾個按鍵,鍵盤介面使用了 6 根 I/O 口線,該鍵盤就有 6 個按鍵,這種類型的鍵盤,其按鍵比較少,且鍵盤中 各按鍵的工作互不幹擾。因此可以根據實際需要對鍵盤中的按鍵靈活的編碼。如 圖所示。 最簡單的編碼方式就是根據 I/O 輸入口所直接反映的相應按鍵, 按下的狀態 進行編碼,稱按鍵直接狀態碼,對於這樣編碼的獨立式鍵盤,CPU 可以通過直接 讀取 I/O 口的狀態來獲取按鍵的直接狀態編碼值,根據這個值直接進行按鍵識 別,這樣形式的鍵盤結構簡單,按鍵識別容易。 5 獨立式鍵盤的缺點是需要佔用比較多的 I/O 口線, 當單片機應用系統鍵盤中 需要的按鍵比較少或 I/O 口線比較富餘時,可以採用這樣類型的鍵盤。 其模塊電路圖如圖 4 所示。採用六個 BUTTON 按鈕作為搶答的選擇按鈕,與 STC89C52 的 P1.0-P1.5 相連。 圖 4 鍵盤模塊 2.5 蜂鳴器模塊蜂鳴器是一種一體化結構的電子訊響器,採用直流電壓供電,廣泛應用於計 算機、列印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等 電子產品中作發聲器件,其圖形如圖所示. 6 2.6 外部振盪電路外部振盪電路單片機必須在 AT89C52 的驅動下才能工作.在單片機內部有一個 時鍾振盪電路,只需要外接一個振盪源就能產生一定的時鍾信號送到單片機內部 的各個單元,外部振盪電路見圖所示。 三 程序設計 3.1 程序流程圖: 程序流程圖:開始 初始化部分 N K5= =0 Y 啟動中斷,數碼管開始倒計時 N 若有選手搶答 Y 中斷停止,數碼管顯示選手的標號並點亮信號燈 結束搶答器主程序流程圖 7 定時器 0 中斷 N 1 秒時間到? Y 秒加 1 數碼管顯示秒值 中斷返回 搶答器定時器中斷流程圖 掃 描 鍵 盤 Y K0 鍵按下 N Y K1 鍵按下 N Y K2 鍵按下 N K3 鍵按下 N 與 K2 鍵對應的發光二極體亮及數碼管顯示 與 K1 鍵對應的發光二極體亮及數碼管顯示 與 K0 鍵對應的發光二極體亮及數碼管顯示 Y 與 K3 鍵對應的發光二極體亮及數碼管顯示 掃描停止 鍵盤掃描流程圖 主程序我們組所設計的搶答器的程序採用的是 C 程序設計,C 語言的顯著特點是用 二進制來編寫程序,程序的各個部分除了必要的信息交流外彼此之間相互獨立。 8 這種結構化方式可使程序層次清晰, 便於使用、維護以及調試。C 語言是以函數 形式提供給用戶的,這些函數可方便的調用,並具有多種循環、 條件語句控製程序 流向,從而使程序完全結構化。雖然 C 語言也是強類型語言,但它的語法比較靈 活,允許程序編寫者有較大的自由度。本次設計的主程序中包括時鍾設計程序, 定時器中斷子程序,LED 顯示程序以及按鍵控制子程序,具體程序見附件。 3.2 系統的調試系統調試包括硬體調試和軟體調試,而且兩者是密不可分的。我們設計好的 硬體電路和軟體程序,只有經過聯合調試,才能驗證其正確性;軟硬體的配人情 況以及是否達到設計任務的要求,也只有經過調試,才能發現問題並加以解決、 完善,最終開發成實用產品。 硬體調試分單元電路調試和聯機調試, 單元電路試驗在硬體電路設計時已經 進行,這里的調試只是將其製成印刷電路板後試驗電路是否正確,並排除一些加 工工藝性錯誤(如錯線、開路、短路等) 。這種調試可單獨模擬進行,也可通過 開發裝置由軟體配合進行。硬體聯機調試則必須在系統軟體的配合下進行。 軟體調試一般包括分塊調試和聯機調試兩個階段。 程序的分塊調試一般在單 片機開發裝置上進行, 可根據所調程序功能塊的入口參量初值編制一個特殊的程 序段,並連同被調程序功能塊一起在開發裝置上運行;也可配合對應硬體電路單 獨運行某程序功能塊,然後檢查是否正確,如果執行結果與預想的不一致,可以 通過單步運行或設置斷點的方法, 查出原因並加以改正, 直到運行結果正確為止。 這時該 程序功能塊已調試完畢,可去掉附加程序段。其它程序功能塊可按此法 進行調試。 程序聯機調試就是將已調試好的各程序功能塊按總體結構聯成一個完 整程序,在所研製的硬體電路上運行。從而試驗程序整體運行的完整性、正確性 和與硬體電路的配合情況。在聯調中可能會有某些支路上的程序、功能塊因受條 件制約而得不到相應的輸入參數,這時,調試人員應創造條件進行模擬調試。在 聯調中如發現硬體問題也應及時修正,直到單片機系統的軟體、硬體全部調試成 功為止。系統調試完成後,還要進行一段時間的試運行,從而檢驗系統的穩定性 和抗干擾能力,驗證系統功能是否達到設計要求,是否達到預期的效果。 9 3.3 焊接的問題及解決一般來說,造成硬體問題的首要問題就是焊接了,也就是說焊接的好與壞直 接響產品的正常運行。 造成焊接質量不高的常見原因是:①焊錫用量過多,形成焊 點的錫堆積;焊錫過少,不足以包裹焊點。②冷焊。焊接時烙鐵溫度過低或加熱 時間不足,焊錫未完全熔化、浸潤、焊錫表面不光亮(不光滑),有細小裂紋(如同 豆腐渣一樣!)。 ③夾松香焊接,焊錫與元器件或印刷板之間夾雜著一層松香,造成 電連接不良。若夾雜加熱不足的松香,則焊點下有一層黃褐色松香膜;若加熱溫 度太高,則焊點下有一層碳化松香的黑色膜。對於有加熱不足的松香膜的情況, 可以用烙鐵進行補焊。 對於已形成黑膜的,則要"吃"凈焊錫,清潔被焊元器件或印 刷板表面,重新進行焊接才行。④焊錫連橋。指焊錫量過多,造成元器件的焊點之 間短路。這在對超小元器件及細小印刷電路板進行焊接時要尤為注意。⑤焊劑過 量,焊點明圍松香殘渣很多。當少量松香殘留時,可以用電烙鐵再輕輕加熱一下, 讓松香揮發掉,也可以用蘸有無水酒精的棉球,擦去多餘的松香或焊劑。 ⑥焊點表 面的焊錫形成尖銳的突尖。這多是由於加熱溫度不足或焊劑過少,以及烙鐵離開 焊點時角度不當浩成的內。 。 總 結 經過近半個月的努力,在我們合作下,我們較好的完成了這次設計項目,通 過此次電子製作比賽,我們重新認識到了自學的重要性,以及學以致用的道理。 我們在圖書館和網上查閱了大量的資料,同時也認識到了圖書館的重要作用。 通過此次的搶答器的設計,讓我們更加重視到專業知識的重要性及動手能力的 必要性,在整個製作過程中,我們出現很多問題,但我們並沒有因此而放棄, 在不斷調試和失敗中,我們不僅學到了專業知識,更是磨煉了我們的心智,讓 我們受益匪淺。任何事情只要去做,多多去嘗試,努力的要以自己去做為前提 的心態,那麼任何事情即使做的不好,也會受益很多,不是有句話叫做:心態 決定的成敗的話嗎,實在是有理。無論做什麼事情都不可能一帆風順,碰到阻 礙不要舍棄,不要踟躕不前,不經歷風雨,怎麼見彩虹! 在今後的學習過程中,應該多到圖書館看一些專業方面的書籍,比如 protel 畫圖,proteus 模擬軟體,以豐富自己的知識,掌握更多的硬體與軟體設計技巧, 使我們在今後的製作中提高效率。 這次設計任務也使我們加深了對單片機及介面 10 技術的理解和應用,由於知識水平的局限,設計中可能會存在著一些不足,我們 真誠的接受老師和同學的批評和指正.。 附錄( 程序) 附錄(C 程序) #include<reg52.h> #define uchar unsigned char #define uint unsigned int Uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰數碼管 0~9 編碼 uint i,j,time,num; uchar ge,shi; bit flag,flag1; sbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2; sbit k4=P1^3;sbit k5=P1^4;sbit k6=P1^5; //k1~k4 為選手按鍵,k5 為主持人開關,k6 為復位鍵 sbit beep=P1^6;//定義蜂鳴器的埠 sbit wei1=P0^0;sbit wei2=P0^1; sbit wei3=P0^2;sbit wei4=P0^3;//定義數碼管的位選埠 sbit led1=P3^4;sbit led2=P3^5; sbit led3=P3^6;sbit led4=P3^7;//定義 LED 燈的埠 void delay(uint a)//延時函數 { uint i,j; for(i=a;i>0;i--) for(j=110;j>0;j--); } 11 void display()//顯示函數 { shi=time/10; ge=time%10; P2=table[num];//顯示選手編號 wei1=0;delay(1); wei1=1; P2=table[shi]; wei3=0; delay(1); wei3=1; P2=table[ge]; wei4=0; delay(1); wei4=1; } void keyscan() { if(k1==0)//按鍵按下 { delay(10);//延時去抖動 if(k1==0) { num=1;led1=0;flag=1;TR0=~TR0;TR1=0;//開定時器 0,關定時器 1 beep=1;delay(500);beep=0;//蜂鳴器響 500 毫秒 while(!k1);//等待按鍵釋放 } } if(k2==0) { delay(10); if(k2==0) //顯示時間 12 { num=2;led2=0;flag=1;TR0=~TR0;TR1=0; beep=1;delay(500);beep=0; while(!k2); } } if(k3==0) { delay(10); if(k3==0) { num=3;led3=0;flag=1;TR0=~TR0;TR1=0; beep=1;delay(500);beep=0; while(!k3); } } if(k4==0) { delay(10); if(k4==0) { num=4;led4=0;flag=1;TR0=~TR0;TR1=0; beep=1;delay(500);beep=0; while(!k4); } } display();//顯示選手編號和時間 if(time==0) { TR0=0; TR1=0; flag=1;//關計時器 0 和 1 13 } if(time==6) TR1=1; } void init() { TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1;ET0=1;ET1=1; beep=0;//作品上蜂鳴器是賦高電平響,開始置低關閉 } void main() { init();//初始化 while(1) { display(); if(k6==0) { delay(10); if(k6==0) { P3=0xff;//關閉所有 LED 燈 flag1=k6; time=15; wei1=0; num=0; P2=table[num]; 14 while(!flag1) { if(k5==0) { delay(10); if(k5==0) { flag1=1;flag=k5; TR0=1; beep=1;delay(500);beep=0; while(!k5); while(!flag) keyscan();//掃描鍵盤 } } } } } } } void time0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; i++; if(i==20) { i=0; time--; } } 15 void time1() interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; j++; if(j==10) { j=0; beep=~beep; } } 16
Ⅱ 三菱PLC中 指令 MOV D6114Z5 K4M6140Z5 怎麼解釋
這條在我編譯器里是錯誤的
如果是MOV D611Z5 K4M614Z5才是對的
意思是把以D611中的值傳送到K4M614中
注意,Z是變址,改變Z5的值相當於已變了以D611開頭往後的地址,如Z5=4,把D611改為D6114,K4M611,K4=4組,每組=4位,共16位
Ⅲ 請問如何將C或匯編源程序或燒到自己製作的PCB板上 謝謝···
一. 安裝單片機程序編譯軟體KEIL。
1.點擊圖標 運行直至安裝完成。
2.點擊圖標 運行KEIL,然後選擇菜單「project」點擊「new……」點擊「 」建立新的工程。填寫好工程文件名選擇保存路徑後按「保存」,此時彈出一個窗口如下圖所示
點擊Atmel左邊的+號展開CPU的型號,選擇「AT89C51」按「確定」再生成一個對話框如下圖,再按「是」即可。
這時在工程左邊的文件指示欄中多了一個 這樣的圖標,點其左邊的+號可展開當前所包含的文件。
選擇菜單「File」「new」新建一個文本編輯器,按保存按鈕,在彈出的窗口填入文件名後綴為.C ,然後按保存即把這個C文本文件保存到這個工程的目錄下。
再在工程左邊的文件指示欄中指著 點擊右鍵選擇 選項把剛才建立的C文件加入來,按「Add」即可加入,這時就可以在C文本編輯器里編號程序了。
寫好程序後選擇菜單「project」選擇「 」打開的對話框如下圖所示
如果彈出來的不是這個對話框時可以重復一次「project」選擇「 」便可以打開,打開後在 這個方框里打上勾然後按「確定」才可以編譯生成單片機的燒寫文件HEX文件。這些選項都設置好並寫好源程序後就可以在菜單選項project選項中選擇 選項對源程序進行編譯,生成的HEX文件就在工程的目錄下。
本文章後面附帶的是HJSMSY-V1.0開發板的測試源程序,讀者可以將其復制到編譯器里編譯。此程序為一個簡單的計算器功能程序,數寫鍵依次對應電路板上的數字0--9,「A」鍵功能為清除,「B」鍵功能為等於,「C」鍵功能為+,「D」鍵功能為-,「E」鍵功能為*,「F」鍵功能為除。
二. 把單片機開發板用9針串口線與電腦連接好,用配套的USB供電線將單片機開發板供電,並關閉電路板上的電源開關。運行STC晶元燒寫軟體,
點擊圖標
打開下載界面如下圖
按這個圖裡面的設置設好參數後,點擊「Open File/打開文件」打開HEX文件,在打開的對話框中找到剛才所建立工程的目錄,在此目錄下可以找到剛才編譯得到的HEX文件,如果找不到則是還沒有在 這個方框里打上勾,回到工程里打上勾並按 編譯一次就行了。打開HEX文件確定後就點擊下載軟體的 ,再打開單片機開發板上的電源開關,這時電腦便自動與單片機連接並把程序下載到單片機里,下載完成後會有聲音提示的,或者可以在軟體界面上看得到。註:STC系列單片機是在開機的瞬間下載程序的,如果還未能連接成功可以關掉電源再開一次即可。
//HJSMSY-V1.0單片機開發板測試程序.C
//-----------------------------------------------
// <<計算器>>
//-----------------------------------------------
//編寫人:李春起
//編定日期:2010.06.26
//修改日期:
//============================================================
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
uint comdata,vardata,dispdata;
unsigned char flag=0,incflag=0,maxflag=10,maxvar=1;
//===========共陽數碼管段碼表==================================
uchar code SEG7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code ACT[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//================引腳定義=======================================
sbit yy=P3^2;
sbit jk=P3^4;
sbit k1=P2^3;
sbit k2=P2^2;
sbit k3=P2^1;
sbit k4=P2^0;
//=====子函數聲明======================================
void init(void);
void delay1(uint z);
void kk(void);
//===========程序初始化===============================
void init(void)
{
TMOD=0x01;
TH0=0xf4;
TL0=0x48;
ET0=1;
TR0=1;
EA=1;
}
//=====空操作延時子程序=======================
void delay1(uint z)
{
uint j,y;
yy=0;
for(j=0;j<z;j++)
{for(y=0;y<100;y++){;}}
yy=1;
for(j=0;j<z;j++)
{
for (y=0;y<3422;y++);
}
}
//========鍵盤掃描子程序===================
void kk(void)
{ P2=0xf0;
if(P2!=0xf0)
{
P2=0xef;
if(!k1){delay1(15);comdata=vardata;vardata=0;incflag=1;} //k13
if(!k2){delay1(15);comdata=vardata;vardata=0;incflag=2;} //k14
if(!k3){delay1(15);comdata=vardata;vardata=0;incflag=3;} //k15
if(!k4){delay1(15);comdata=vardata;vardata=0;incflag=4;} //k16
P2=0xdf;
if(!k1){delay1(15);if(vardata>6553){goto ab1;};vardata=((vardata*10)/maxflag+8*maxvar);dispdata=vardata;} //k9
ab1:if(!k2){delay1(15);if(vardata>6553){goto ab2;};vardata=((vardata*10)/maxflag+9*maxvar);dispdata=vardata;} //k10
ab2:if(!k3){delay1(15);vardata=0;dispdata=vardata;} // k11
if(!k4){delay1(15);switch (incflag){
case 1:{vardata=(comdata+vardata);dispdata=vardata;}break;
case 2:{vardata=(comdata-vardata);dispdata=vardata;}break;
case 3:{vardata=(comdata*vardata);dispdata=vardata;}break;
case 4:{vardata=(comdata/vardata);dispdata=vardata;}break;
default:break;
}
}//k12
P2=0xbf;
if(!k1){delay1(15);if(vardata>6553){goto ab3;};vardata=((vardata*10)/maxflag+4*maxvar);dispdata=vardata;} //k5
ab3:if(!k2){delay1(15);if(vardata>6553){goto ab4;};vardata=((vardata*10)/maxflag+5*maxvar);dispdata=vardata;} //k6
ab4:if(!k3){delay1(15);if(vardata>6553){goto ab5;};vardata=((vardata*10)/maxflag+6*maxvar);dispdata=vardata;} //k7
ab5:if(!k4){delay1(15);if(vardata>6553){goto ab6;};vardata=((vardata*10)/maxflag+7*maxvar);dispdata=vardata;} //k8
ab6:P2=0x7f;
if(!k1){delay1(15);if(vardata>6553){goto ab7;};vardata=((vardata*10)/maxflag+0*maxvar);dispdata=vardata;} //k1
ab7:if(!k2){delay1(15);if(vardata>6553){goto ab8;};vardata=((vardata*10)/maxflag+1*maxvar);dispdata=vardata;} //k2
ab8:if(!k3){delay1(15);if(vardata>6553){goto ab9;};vardata=((vardata*10)/maxflag+2*maxvar);dispdata=vardata;} //k3
ab9:if(!k4){delay1(15);if(vardata>6553){goto ab10;};vardata=((vardata*10)/maxflag+3*maxvar);dispdata=vardata;} //k4
ab10:;
}
}
//======定時器0中斷服務子程序================
void time0(void) interrupt 1
{
TH0=0xf4;
TL0=0x48;
P0=0xff;P1=0xff;
// 時鍾顯示子程序
switch(flag)
{
case 0:{P0=SEG7[dispdata%10];P1=ACT[0];flag=1;}break;
case 1:{P0=SEG7[(dispdata/10)%10];P1=ACT[1];flag=2;}break;
case 2:{P0=SEG7[(dispdata/100)%10];P1=ACT[2];flag=3;}break;
case 3:{P0=SEG7[(dispdata/1000)%10];P1=ACT[3];flag=4;}break;
case 4:{P0=SEG7[dispdata/10000];P1=ACT[4];flag=5;}break;
case 5:{P0=SEG7[0];P1=ACT[5];flag=0;}
default:break;
}
}
//=========主函數======================================
void main()
{
init();
yy=1;
jk=0;
while(1)
{
if((vardata/1000)>=9){maxflag=10;maxvar=0;}
else {maxflag=1;maxvar=1;}
kk();
}
}