信號發生器系統設計_第1頁
信號發生器系統設計_第2頁
信號發生器系統設計_第3頁
信號發生器系統設計_第4頁
信號發生器系統設計_第5頁
已閱讀5頁,還剩18頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、信號發生器系統設計摘要本系統是基于AT89S52 單片機的數字式低頻信號發生器。采用AT89S52 單片機作為控制核心,外圍采用數字/ 模擬轉換電路(DAC0832)、穩壓電路(MC1403)、運放電路(UA741)、按鍵和液晶顯示屏模塊等。通過按鍵控制可產生方波、鋸齒波、三角波、正弦波等,并能通過鍵盤的輸入快速改變波的形狀和頻率,達到人機交互的目的,同時用液晶顯示屏顯示對應波形的名稱和頻率。其設計簡單、性能優良,可用于多種需要低頻信號源的場所,具有一定的實用性。 關鍵詞: 單片機;信號發生器;D/A 轉換 一、信號發生器現狀 信號發生器又稱函數發生器,指用于產生被測電路所需特定參數的電測試信

2、號的儀器。作為當前科研、教學、制造業中一種最常見的通用儀器,市場上常見的信號發生器波形種類有限,輸出波形一般固定為正弦波、三角波、鋸齒波和方波,不能實現有時在實驗或工程應用中需要的特殊信號,給用戶使用帶來不便。 傳統的信號發生器作為一種實驗用信號源設備,可以不采用單片機芯片,而完全利用 555 振蕩電路由硬件搭接而成,但該結構產生的正弦波信號、矩形波信號和三角波信號卻存在波形失真、操控難、頻率范圍小、結構復雜和體積大等缺陷。在生產實踐和科技研究過程中,如工業、農業、通信、生物醫學等領域常常要用到低頻信號發生器。而由硬件電路構成的低頻信號源因其所需的電阻和電容制作上較難,所以參數的精度難以保證;

3、更因其存在體積大、損耗顯著、漏電等弱點,在實際應用過程中,電路復雜程度會大大增加,性能往往難以令人滿意。 二、單片機在低頻信號發生器中的應用單片機是將中央處理器、存儲器、定時器/計數器、輸入輸出接口等主要計算機件集成在一塊芯片上,它是在大規模集成電路技術的基礎上發展起來的。因其獨特的結構形式,單片機承擔了許多大中型計算機無法完成的工作,被廣泛的應用于工農業生產、科研、國防及日常生活的各個領域。單片機的制造商主要有荷蘭的 Philip 公司、日本的 NEC 公司以及美國的 Intel、Motorola 公司等。和通用微型機相比,單片機主要有以下幾個方面的優勢: (1)使用方便、可靠性高 (2)體

4、積小、低功耗 (3)功能強大、擴展性強 (4)性價比較高、易于產品化采用單片機和 DAC0832 數模轉換器生成波形,由于是軟件濾波,所以可以有效的濾除高次諧波分量,生成的波形不失真。DAC0832 主要由 8 位 D/A 轉換器、8 位DAC 寄存器、8 位輸入寄存器以及輸入控制電路四部分組成。它的特點是在低頻范圍內穩定性好、性能高,操作靈活、體積小、價格便宜。三、基本原理 系統框圖如圖 3-1 所示低頻信號發生器系統主要由 CPU、D/A 轉換電路、基準電壓電路、電流/電壓轉換電路、按鍵和波形指示電路、電源等電路組成。其工作原理為當分別按下鍵盤上的不同按鍵時就會分別出現方波、鋸齒波、三角波

5、、正弦波,并且有液晶顯示屏同步顯示波的類型和頻率。3.1 單片機的介紹 1.AT89S52 的引腳圖如圖 3-2 所示 2.管腳說明 低頻信號發生器采用 AT89S52 單片機作為控制核心,其內部組成包括:一個 8 位的微處理器 CPU 及片內振蕩器和時鐘產生電路,但石英晶體和微調電容需要外接;片內數據存儲器 RAM 低 128 字節,存放讀/寫數據;高 128 字節被特殊功能寄存器占用;片內程序存儲器 4KB ROM;四個 8 位并行 I/O(輸入/輸出)接口 P3 -P0,每個口可以用作輸入,也可以用作輸出;兩個定時/計數器,每個定時/計數器都可以設置成計數方式,用以對外部事件進行計數,也

6、可以設置成定時方式,并可以根據計數或定時的結果實現計算機控制;五個中斷源的中斷控制系統;一個全雙工 UART(通用異步接收發送器)的串行 I/O 口。 VCC:供電電壓。 GND:接地。 RST:復位輸入端。當 RST 端持續出現兩個機器周期以上的高電平時,實現振蕩器器件復位。ALE/PROG:當訪問外部程序存儲器或數據存儲器時, ALE (地址鎖存允許)輸出脈沖用于鎖存地址的低 8 位字節。通常,ALE 仍以時鐘振蕩頻率的 1/6 輸出固定的脈沖信號,因此它可用于定時或對外輸出時鐘目的。要注意的是:每當訪問外部數據存儲器時將跳過一個 ALE 脈沖。該引腳在 FLASH 存儲器編程期間,還用于

7、輸入編程脈沖(PROG)。應用中還可通過對特殊功能寄存器(SFR)區中的 8EH 單元的 D0 位置位,可禁止 ALE 操作。該位置位后,只有一條 MOVX 和 MOVC 指令才能將 ALE 激活。此外,單片機執行外部程序時,應設置 ALE 禁止位無效。 /PSEN:程序儲存允許( PSEN)輸出是外部程序存儲器的讀選通信號,當 AT89S52由外部程序存儲器取指令(或數據)時,每個機器周期兩次 PSEN 有效,即輸出兩個脈沖,在此期間,當訪問外部數據存儲器,將跳過兩次 PSEN 信號。 /EA/VPP:外部訪問允許,欲使 CPU 僅訪問外部程序存儲器(地址為 0000H-FFFFH),EA

8、端必須保持低電平(接地)。需注意的是:如果加密位 LB1 被編程,復位時內部會鎖存 EA 端狀態。如 EA 端為高電平(接 Vcc 端),CPU 則執行內部程序存儲器的指令。FLASH存儲器編程時,該引腳加上+12V 的編程允許電源 Vpp。 XTAL1:內部時鐘工作電路的輸入及反向振蕩放大器的輸入端。 XTAL2:振蕩器反相放大器的輸出端。89S52 單片機外部有32 個端口可供用戶使用,其功能如下:P0 口:P0 口是一個 8 位漏極開路的雙向 I/O 口。作為輸出口,每位能驅動8個TTL邏 輯電平。對 P0 端口寫“1”時,引腳用作高阻抗輸入。當訪問外部程序和數據存儲器時,P0 口也被作

9、為低 8 位地址/數據復用。在這種模式下,P0 不具有內部上拉電阻。在 flash 編程時,P0 口也用來接收指令字節;在程序校驗時,輸出指令字節。程序校驗時需要外部上拉電阻。 P1 口:P1 口是一個具有內部上拉電阻的 8 位雙向 I/O 口,p1 輸出緩沖器能驅動4 個 TTL 邏輯電平。對 P1 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入 口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。 P2 口:P2 口為一個內部上拉電阻的 8 位雙向 I/O 口,P2 口緩沖器可接收,輸出 4個 TTL 門電流,當 P2 口被寫“1”時,其管

10、腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2 口的管腳被外部拉低,將輸出電流。P2 口當用于外部程序存儲器或16 位地址外部數據存儲器進行存取時,P2 口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2 口輸出其特殊功能寄存器的內容。 P3 口:P3 口管腳是 8 個帶內部上拉電阻的雙向 I/O 口,可接收輸出 4 個 TTL 門電流。當 P3 口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3 口將輸出電流(ILL),這是由于上拉的緣故。 3.AT89S52 的晶振及其連接方法CPU 工作時

11、都必須有一個時鐘脈沖。有兩種方式可以向 89S52 提供時鐘脈沖:一是外部時鐘方式,即使用外部電路向89S52 提供始終脈沖,見圖3-3-(a); 二是內部時鐘方式,即使用晶振由 89S52 內部電路產生時鐘脈沖。一般常用第二種方法,其電路見圖3-3-(b)。圖 33 中:J 一般為石英晶體,其頻率由系統需要和器件決定,在頻率穩定度要求不高時也可以使用陶瓷濾波器。 C1、C2:使用石英晶體時,C1=C2=30(±10)pF 使用陶瓷濾波器時,C1=C2=40(±10)pF 4.AT89S52 的復位 使 CPU 開始工作的方法就是給 CPU 一個復位信號,CPU 收到復位信

12、號后將內部特殊功能寄存器設置為規定值,并將程序計數器設置為“0000H”。復位信號結束后,CPU從程序存儲器“0000H”處開始執行程序。89S52 為高電平復位,一般有 3 種復位方法。 上電復位。接通電源時 手動復位。設置一個復位按鈕,當操作者按下按鈕時產生一個復位信號。 自動復位。設計一個復位電路,當系統滿足某一條件時自動產生一個復位信號。 最簡單的上電復位和手動復位方法如圖 3-4 所示。圖 3-4 89S52 的復位電路關于 CPU 的復位電路應當注意,在調試單片機程序時有兩種工作方式。一是仿真器方式,主要用于調試程序。此時程序的執行由仿真器控制,復位電路不起作用,系統時鐘也經常設置

13、為仿真器產生,此時用戶的晶振也不起作用。二是用戶方式,即脫離仿真器的實際工作方式,用戶的時鐘振蕩電路和復位電路都必須正常工作。因此,如果系統復位電路或晶振電路有故障,就會出現仿真器方式工作正常,而用戶方式不工作的現象,這是許多初學者常遇到的問題。 5.芯片擦除對 EPROM 進行程序固化時,先要用紫外燈照射擦除片內的信息,然后用萬能編程器編程。EPROM 在芯片封裝時頂部有一個石英玻璃窗口,要擦除片內信息時,將芯片放在專門的紫外燈下通過窗口照射 15-20 分鐘,全部存儲單元的 0 變為 1,此時表示信息擦除正常,可以重新寫入程序。 3.2 資源分配 軟、硬件設計是設計中不可缺少的,為了滿足功

14、能和指標的要求,資源分配如下: 1.晶振采用 12MHZ 2.內存分配 P1 口的 P1.0-P1.3 分別與四個按鍵連接,分別控制鋸齒波、三角波、正弦波和方波,P1.4-P1.7 與四個發光二極管相連,按鍵一對應發光二極管一,依次類推,發光二極管四對應按鍵四,實現輸出一個波形對應亮一個燈。 P0 口與 DAC0832 的 DI0-DI7 數據輸入端相連。 P2 口用來控制 DAC0832 的輸入寄存器選擇信號 CS、輸入寄存器寫選通信號 WR1 及DAC 寄存器寫選通信號 WR2 和數據傳送信號 XFER。 3.3 各部分電路原理1.DAC0832 芯片原理 (1) 管腳功能如圖 3-5 所

15、示圖 3-5 DAC0832 管腳圖c DI7DI0:8 位的數據輸入端,DI7 為最高位。 d IOUT1: 模擬電流輸出端 1,當 DAC 寄存器中數據全為 1 時,輸出電流最大,當 DAC寄存器中數據全為0時,輸出電流為0。 e IOUT2:模擬電流輸出端 2, IOUT2 與 IOUT1 的和為一個常數,即 IOUT1IOUT2常數。 f RFB:反饋電阻引出端,DAC0832 內部已經有反饋電阻,所以 RFB 端可以直接接到外部運算放大器的輸出端,這樣相當于將一個反饋電阻接在運算放大器的輸出端和輸入端之間。g VREF:參考電壓輸入端,此端可接一 個正電壓,也可接一個負電壓,它決定

16、0至 255 的數字量轉化出來的模擬量電壓值的幅度,VREF 范圍為(+10-10)V。VREF 端與D/A內部 T 形電阻網絡相連。 h Vcc:芯片供電電壓,范圍為(+5 15)V。 i AGND:模擬量地,即模擬電路接地端。 j DGND:數字量地。當 WR2 和 XFER 同時有效時,8 位 DAC 寄存器端為高電平“1”,此時 DAC 寄存器的輸出端 Q 跟隨輸入端 D 也就是輸入寄存器 Q 端的電平變化;反之,當端為低電平“0”時,第一級 8 位輸入寄存器 Q 端的狀態則鎖存到第二級 8 位 DAC 寄存器中,以便第三8位 DAC 轉換器進行 D/A 轉換。 一般情況下為了簡化接口

17、電路,可以把 WR2 和 XFER 直接接地,使第二級 8 位 DAC寄存器的輸入端到輸出端直通,只有第一級 8 位輸入寄存器置成可選通、可鎖存的單緩沖輸入方式。特殊情況下可采用雙緩沖輸入方式,即把兩個寄存器都分別接成受控方式 制作低頻信號發生器有許多方案:主要有單緩沖方式,雙緩沖方式和直通方式。 單緩沖方式具有適用于只有一路模擬信號輸出或幾路模擬信號非同步輸出的情形的優點,但是電路線路連接比較簡單。而雙緩沖方式適用于在需要同時輸出幾路模擬信號的場合,每一路模擬量輸出需一片 DAC0832 芯片,構成多個 DAC0832 同步輸出電路,程序簡單化,但是電路線路連接比較復雜。 (2) 工作原理

18、DAC0832 主要由 8 位輸入寄存器、8 位 DAC 寄存器、8 位 D/A 轉換器以及輸入控制路四部分組成。8 位輸入寄存器用于存放主機送來的數字量,使輸入數字量得到緩沖鎖存,由加以控制;8 位 DAC 寄存器用于存放待轉換的數字量,由加以控制;8 位轉換器輸出與數字量成正比的模擬電流;由與門、非與門組成的輸入控制電路來控個寄存器的選通或鎖存狀態。 DAC0832 與反相比例放大器相連,實現電流到電壓的轉換,因此輸出模擬信號的性與參考電壓的極性相反,數字量與模擬量的轉換關系為 Vout1=-Vref×(數字碼/256) 若 D/A 轉換器輸出為雙極性,如圖 3-6 所示 3-6

19、 D/A 轉換器雙極性輸出電路運算放大器 A2 的作用是把運算放大器 A1 的單向輸出電壓轉換成雙向輸出電壓。其原理是將 A2 的輸入端通過電阻 R1 與參考電壓 VREF 相連,VREF 經 R1 向 A2 提供一個偏流 I1,其電流方向與 I2 相反,因此運算放大器 A2 的輸入電流為 I1、I2 之代數和。則 D/A 轉換器的總輸出電壓為: VOUT2= -(R3/R2) VOUT1+(R3/R1) VREF設 R1=R3=2R R2=R,則 VOUT2= -(2VOUT1+VREF)DAC0832 主要是用于波形的數據的傳送,是本題目電路中的主要芯片。 (3) DAC0832 電路原理

20、如圖 3-7 所示2.UA741 管腳圖如圖 3-8 所示 圖 3-8 UA741 管腳圖3.MC1403 管腳功能如圖 3-9 所示MC1403 是低壓基準芯片。一般用作 8 到 12bit 的 D/A 芯片的基準電壓等一些需要本精準的基準電壓的場合。 輸出電壓:2.5V+/-25Mv 輸入電壓范圍:4.5Vto40V 輸出電流:10Ma 因為輸出是固定的,所以電路很簡單。就是 Vin 接電源輸入,GND 接地,Vout 加個 0.1uf 到 1uf 的電容就可以了。Vout 一般用于 8 到 12bit 的 D/A 芯片的基準電壓在此項目里 MC1403 起到了穩壓的作用,它基準了 DAC

21、0832 的 8 腳需要的 2.5V。其 DAC0832 能夠正常工作。 四、 軟件設計 單片機技術比較成熟,開發過程可利用的資源和工具豐富,最大的優點是價格便宜,成本低。調試軟件采用Keil51.keiluVison是眾多單片機應用開發軟件中優秀軟件之一,界面友好,易寫易操作。在調試程序中,軟件仿真 protues 功能也很強,軟件調通,再通過編程器下載到 AT89S52 中,然后插到系統中即可獨立完成所有的控制。根據功能不同,軟件設計上分了主程序模塊、延時子程序模塊、正弦波模塊、齒波模塊、三角波模塊、方波模塊等幾個模塊編程。顯示波形模塊是利用 DAC0832 的 8 位特點,把波形的數據以

22、 8 位數據的形勢送進 CPU中,只要一按鍵就能顯示波形。4.1主程序流程圖如圖 4-1 所示圖 4-1 主程序流程圖本軟件設計過程中主要實現利用按鍵來控制不同波形的輸出,當按鍵 1 按下時,函數發生器就輸出鋸齒波;當按鍵 2 按下時,函數發生器就輸出三角波;當按鍵 3 按下時,函數發生器就輸出正弦波;當按鍵 4 按下時,函數發生器就輸出方波。通過按鍵可以以任意循環方式輸出不同波形。  4.2 子程序流程圖 1. 鋸齒波流程圖 如圖 4-2 所示 圖 4-2 鋸齒波流程圖鋸齒波產生首先將 DAC0832 口地址至為 4000H,然后將 00H 送入寄存器 A輸出 A 中的內容,當 A

23、 中的內容等于 F0H 返回開始,當 A 中的內容不為 0FH內容累加,從而輸出波形。 2. 三角波程序流程圖 如圖 4-3 所示三角波產生首先將 DAC0832 口地址至為 4000H,通過 A 中數值的加一遞升,當 A 中的內容為 0 時,與 0FFH 相比,相等時 A 中的內容減一遞減,從而循環產生三角波。 3. 正弦波程序流程圖 如圖 4-4 所示圖 4-4 正弦波流程圖4. 方波程序流程圖 如圖 4-5 所示圖 4-5 方波流程圖方波產生首先將 DAC0832 口地址至為 4000H,當 A 中的內容為 0 時,輸出對應模擬量,然后延時,當 A 中的內容為 0FFH 時,同樣輸出對應

24、模擬量,再延時,從而得到方波。 5. 延時子程序流程圖 如圖 4-6 所示延時程序如下: DELY: MOV R7,#10H DLY0: MOV R6,#0EDH NOP DLY1: DJNZ R6,DLY1 DJNZ R7,DLY0 RET 方波的上限和下限的延時時間為:7ms S=1+(1+1+2×237+2)×16+1=7648S 參考文獻 1 蔡美琴.MCS-51 系列 單片機系統及其應用M.北京:高等教育出版社,2000:5-7. 2 潘新民,王燕芳.微型計算機控制技術.北京:高等教育出版社,2004:10. 3 孫育才,孫華芳,王榮興.單片機原理及應用

25、M.北京:電子工業出版社,2003: 4 李鴻.單片機原理及應用M.湖南:湖南大學出版社,2004: 5 胡漢才.單片機原理及接口技術M. 北京:清華大學出版社,1996:66-78. 6 劉守義.單片機應用技術.西安:西安電子科技大學出版社,2002: 7 范立南.單片微機接口與控制技術M.沈陽:遼寧大學出版社,1996: 8 李朝青.單片機原理及接口技術北京:北京航空航天大學出版社,1994: 9 孫俊逸,盛秋林,張錚.單片機原理及應用M.北京:清華大學出版社,2001: 10 陸子明,徐長根.單片機設計與應用基礎教程.北京:國防工業出版社,2005: 11 杜華.任意波形發生器及應用J.

26、國外電子測量技術,2005,12(1):38-40. 12 張永瑞.電子測量技術基礎M.西安:西安電子科技大學出版社,2006: 13 童詩白.模擬電路技術基礎M. 北京:高等教育出版社,2000:171-202.14 王新賢.通用集成電路速查手冊.濟南:山東科學技術出版社,2002: 15 馬忠梅.單片機的 C 語言應用程序設計M.北京:北京北航出版社,2003: 16 張毅剛,彭喜元,姜守達.新編 MCS-51 單片機應用設計M.哈爾濱:哈爾濱工業大學出版社,2003:153-168. 17 朱清慧.proteus 電子線路設計與仿真.北京:清華大學出版社,2008: 18 江世明.基于

27、proteus 的單片機應用技術.北京:電子工業出版社,2009: 19 劉紅兵.電子 EDA.北京:中國勞動社會保障出版社,2009: 20 高建國.電子技術應用專業 proteus 仿真軟件應用.上海:華中科技大學出版社,2010:    附     錄  附錄 1 電路原理圖 附錄 2 程序清單 #include <reg52.h> #include <intrins.h> #include<absacc.h> #define uint unsigned int

28、#define uchar unsigned char sbit lcden=P36; sbit lcdrs=P37; sbit dula=P26; sbit wela=P27; uchar code table1="0123456789HZPinLv:" uchar code table2="Zheng Xian Bo "  uchar code table3= " Fang Bo " uchar code table4= " Jv Chi Bo " uchar code table5= "S

29、an Jiao Bo " uchar tab2; uchar val, sec, t_50ms; uint a; uchar code table=0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5 ,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,

30、0xf1,0xf2,0xf4,0xf5 ,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd ,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda ,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0x

31、c7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51 ,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,

32、0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0 x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,

33、0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0 x76,0x79,0x7c,0x80 ; void delay(uint z) uint i,j; for(i=z;i>0;i-)for(j=110;j>0;j-); void write_com(uchar com) lcdrs=0; P0=com;delay(5); lcde

34、n=1; delay(5); lcden=0; void write_data(uchar date) lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; void init() lcden=0;dula=0; wela=0; write_com(0x38);write_com(0x08);write_com(0x01); write_com(0x06); write_com(0x0c); void Display(uchar k) /tab0=sec/1000; / tab1=sec%1000/100; / uchar code t

35、able= /0xc0,0xf9,0xa4,0xb0, / 0x99,0x92,0x82,0xf8, /0x80,0x90,0x88,0x83, /0xc6,0xa1,0x86,0x8e; / P0 = 0; dula=1; /消隱 / P0 =tablek / 10; /dula=0;wela=1; / /P0 = 0xfe; wela=0;delay(5); /顯示 5ms 十位 / P0 = 0; dula=1; /消隱 / P3 =tablek % 10;/;dula=0;wela=1; / P0 = 0xfd; wela=0; delay(5); /顯示 5ms 個位 tab0=se

36、c%100/10; write_com(0x80+0x40); for(a=12;a<18;a+)write_data(table1a); delay(1); for(a=0;a<2;a+) write_data(table1taba); delay(1); write_data(table110); write_data(table111);delay(100); tab1=sec%10; write_com(0x80+0x40); for(a=12;a<18;a+) write_data(table1a); delay(1); for(a=0;a<2;a+) wri

37、te_data(table1taba); delay(1); write_data(table110); write_data(table111); /* 名稱: Keyscan() * 功能: P1 外接 4×4 按鍵, 按照掃描法讀出鍵值 * 輸出: 按鍵值 015/如無鍵按下, 返回 16 */ uchar Keyscan(void) uchar i, j, temp, Buffer4 = 0xef, 0xdf, 0xbf, 0x7f; for(j = 0; j < 4; j+) /循環四次 P1 = Bufferj; /在 P1 高四位分別輸出一個低電平 temp =

38、0x01; /計劃先判斷 P1.0 位 for(i = 0; i < 4; i+) /循環四次 if(!(P1 & temp) /從 P1 低四位,截取 1 位 return (i + j * 4); /返回取得的按鍵值 temp <<= 1; /判斷的位,左移一位 return 16; /判斷結束,沒有鍵按下,返回 16 /* * 名稱: GetKey()  * 功能: 讀出按鍵、消抖、等待按鍵釋放 * 輸出: 按鍵值 015/如無鍵按下, 返回 16 */ uchar GetKey(void) uchar Key_Temp1, Key_Temp2; /兩

39、次讀出的鍵值 P1 = 0xff; Key_Temp1 = Keyscan(); /先讀入按鍵 if(Key_Temp1 = 16) return 16; /沒有鍵按下,返回 16 / Display(sec); /用顯示代替延時 Key_Temp2 = Keyscan(); /再讀一次按鍵 if(Key_Temp1 != Key_Temp2) return 16; /不同,返回 16 while(Keyscan() < 16) /等待按鍵釋放 / Display(sec); /等待期間顯示 return Key_Temp1; void fang() P2=0X00;delay(500/

40、sec); P2=0xff;delay(500/sec); void jvchi() uchar k; for(k=0;k<255;k+) P2=k;delay(1000/(256*sec); void sanjiao() uchar k; for(k=0;k<128;k+) P2=k;delay(500/(256*sec); for(k=128;k>0;k-) P2=k;delay(500/(256*sec); void zhengxian() uchar k; for(k=0;k<255;k+)P2=tablek;delay(1000/(256*sec); /* *

41、 名稱 : Main() * 功能 : 主函數 */ void Main(void) uchar num, Key_Value; /讀出的鍵值 /int temp; ; sec = 20; init(); / tab0=sec/1000; / tab1=sec%1000/100; tab0=sec%100/10; tab1=sec%10; write_com(0x80+0x40); for(a=12;a<18;a+) write_data(table1a); delay(1); for(a=0;a<2;a+) write_data(table1taba); delay(1); wr

42、ite_data(table110); write_data(table111); while(1) /主循環 = / Display(sec); /不停的顯示 / if(GetKey=11) / m=500/sec; / temp=(int)m; / P2=0x00;delay(temp); / P2=0xff;delay(temp ); / P2=0x00;delay(500/sec); / Display(sec); / P2=0xff;delay(500/sec ); if (GetKey() = 10) /如果按下了'A'鍵 num = 0; /停止計時 while (num= 0) Key_Value = GetKey();/再次輸入鍵值 if (Key_Value < 10) /如果按下了 09 sec %= 10; sec = sec * 10 + Key_Value;/修改秒數   Display(sec); if (Key_Value = 11) num = 2; if (Key_Value = 12) num = 3; if (Key_Value = 13) num = 4; if (

溫馨提示

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

評論

0/150

提交評論