多功能氣溫計_第1頁
多功能氣溫計_第2頁
多功能氣溫計_第3頁
多功能氣溫計_第4頁
多功能氣溫計_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、多功能氣溫計一、摘要該設計方案是以89c52單片機為核心,采用dsl302控制顯示系統(tǒng),dsl8b20控制溫度采 集模塊,輔于日期提醒、鍵盤時間調整預設置等模塊,所構建的數(shù)字時鐘系統(tǒng),能動態(tài)顯示 實時時鐘的年、月、日、時、分、秒,對蜂鳴器與溫度調節(jié)模塊進行了重點設計,實現(xiàn)按鍵 控制時鐘正常顯示,調時等設置。本系統(tǒng)設計大部分功能有軟件來實現(xiàn),使電路簡單明了, 系統(tǒng)穩(wěn)定性也得大大提高。二、引言單片機技術是當今電子信息產業(yè)發(fā)展最迅速的領域,也是應用電子技術專業(yè)的一門重要 課程。高職應用電子技術專業(yè)更注重學生理論聯(lián)系實際,進行動手操作的能力,因此教學和 實驗應該滿足這樣的需求。本方案是針對單片機原理課

2、程為主的單片機模塊化創(chuàng)新電子綜合 實驗,從基本項目開始,由易到難,讓學生真正掌握單片機應用開發(fā)的相關技術,具備獨立 設計和制作簡單的單片機相關產品的能力。三、方案分析及論證按照系統(tǒng)設計的要求和功能,將系統(tǒng)分為主控模塊、時鐘電路模塊、按鍵掃描模塊、 蜂鳴器模塊、電源電路、復位電路、晶振電路幾個模塊,系統(tǒng)框圖如下。主控模塊采用 AT89C52 單片機,按鍵模塊幾個按鍵用于調整時間和設定鬧鐘,顯示模塊采用DS18B20,時鐘電路 模塊采用DS1302實時實現(xiàn)對時間,日期的操作。氣溫計采用DS18B20作為測溫元件,要求通過功能鍵K2控制實現(xiàn)氣溫顯示;溫度測量值每秒鐘更新 1 次;日歷和時鐘采用DS1

3、302進行控制顯示,通過功能鍵K3、K4控制分別實現(xiàn)“年月日”和“時分秒”顯示;(3)要求設置啟動鍵K1和停止鍵K16,啟動鍵和功能鍵實現(xiàn)聯(lián)鎖控制(即啟動鍵按下后 功能鍵按下才有效);( 4 )初始狀態(tài)時,數(shù)碼管不顯示, 8 個流水燈全滅,蜂鳴器不響,繼電器、直流電機、步進電機均不工作;要求啟動鍵K1按下,數(shù)碼管顯示全8并按500ms亮滅閃爍,8個流水燈 也按500ms亮滅閃爍;停止鍵K16按下后回復初始狀態(tài);(5)按下K4鍵進行“時分秒”顯示時,可以通過K5、K6鍵進行小時和分鐘時間的校正; 要求能夠整點報時(即分鐘為59,秒為55、 56、 57、 58時蜂鳴器短鳴4聲,秒為59時長 鳴1

4、 聲);如果時間顯示到“23-59-59”秒時,直流電動機啟動10秒鐘后關閉;(6)按下K2鍵顯示氣溫時,要求溫度超過35度時,蜂鳴器“滴一滴一”慢速連續(xù)鳴響; 溫度低于0度時,蜂鳴器“滴滴滴滴”急促連續(xù)鳴響;溫度為035度時,蜂鳴器不響。(7)要求按下啟動鍵K1、功能鍵K2、K3、K4和停止鍵K16時,蜂鳴器短促響一聲。四、電路原理分析1、AT89C52單片機T2/P1. 0匚1T2EK/P1. 1匚239P1. T2/P1. 0匚1T2EK/P1. 1匚239P1. 2匚338P1. 3匚斗37P1.4匚536M0SI/P1. 5匚635XIS0/P1.6匚734SCK/P1. 7匚833

5、RST匚932KKD/P3. 0匚1031TKD/P3. 1匚1130INT0/P3. 2匚1223INT1/P3. 3匚1328的一個型號,它是Vcc P0. P0.P0.P0.0 /AD0 1/AD1 2/AD2 3/AD3P0. 4/AD4P0. 5/AD5 P0. 6/AD6 P0. 7/AD7 EA/VPP ALE/PEOG PESNP2. 7/A15AT89C5戲是系列單片機AT89C5 寫的Flash只讀程ATMEL 公司的高置通用8位中央處許多較復雜系統(tǒng)控PDIP 1HtMEL公司生產的。塾一個低電壓,高性能 CMOSg位單片機,片內含bytes的可反復擦 的隨機存取數(shù)據(jù)存儲器

6、( I 玉容標準3/MCS-51 能強大的 at8捋 FZ 0/A8序存儲器和1256 byte 度、非易失性存儲技術生 理器和耳a?h眷存儲單 軸場合品RAM),器件采用1指令系統(tǒng),片內9C5才單片機可為您提供AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中 斷口, 3 個 16 位可編程定時計數(shù)器 ,2 個全雙工串行通信口, 2 個讀寫口線, AT89C5 2 可以按照常規(guī)方法進行編程 , 但不可以在線編程 (S 系列的才支持在線編程 ) 。其將通 用的微處理器和 Flash 存儲器結合在一起,特別是可反復擦寫的 Flash 存儲器可有效 地降低開發(fā)成本

7、。兼容MCS51指令系統(tǒng) 8k可反復擦寫(1000次)Flash ROM32 個雙向 I/O 口 256x8bit 內部 RAM3個16位可編程定時/計數(shù)器中斷時鐘頻率0-24MHZ2 個串行中斷 可編程 UART 串行通道2個外部中斷源 共6個中斷源2個讀寫中斷口線 3級加密位低功耗空閑和掉電模式 軟件設置睡眠和喚醒功能AT89C52 P為40腳雙列直插封裝的8位通用微處理器,采用工業(yè)標準的C51內核, 在內部功能及管腳排布上與通用的 8xc52 相同,其主要用于會聚調整時的功能控制。 功能包括對會聚主 IC 內部寄存器、數(shù)據(jù) RAM 及外部接口等功能部件的初始化,會 聚調整控制,會聚測試圖

8、控制,紅外遙控信號IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1( 19腳)和XTAL2( 18腳)為振蕩器輸入輸出端口,外接12 MHZ 晶振。 RST/Vpd (9 腳)為復位輸入端口,外接電阻電容組成的復位電路。 VC C(40 腳)和 VSS(20 腳)為供電端口,分別接 +5V 電源的正負端。 P0P3 為可 編程通用 I/O 腳,其功能用途由軟件定義,在本設計中, P0 端口(3239 腳)被定 義為N1功能控制端口,分別與N1的相應功能管腳相連接,13腳定義為IR輸入端, 10腳和11腳定義為I2C總線控制端口,分別連接 N1的SDAS( 18腳)和SCLS (19腳

9、)端口, 12 腳、27 腳及 28 腳定義為握手信號功能端口,連接主板 CPU 的相應功能端,用于當前制式的檢測及會聚調整狀態(tài)進入的控制功能。P0 口P0 口是一組 8 位漏極開路型雙向 I/O 口, 也即地址/數(shù)據(jù)總線復用口。作為輸出口 用時,每位能吸收電流的方式驅動 8 個 TTL 邏輯門電路,對端口 P0 寫“1”時,可作為高阻抗輸入端用。 在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉換地址(低 8 位)和數(shù)據(jù) 總線復用,在訪問期間激活內部上拉電阻。在 Flash 編程時, P0 口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時, 要求外接上拉電阻。P1 口P1 是一個帶內部

10、上拉電阻的 8 位雙向 I/O 口, P1 的輸出緩沖級可驅動(吸收或 輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平, 此時可作輸入口。 作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流 (IIL)。與 AT89C51 不同之處是, P1.0 和 P1.1 還可分別作為定時 /計數(shù)器 2 的外部計 數(shù)輸入( P1.0/T2 )和輸入( P1.1/T2EX ),參見表 1。Flash 編程和程序校驗期間, P1 接收低 8 位地址。P2 口P2是一個帶有內部上拉電阻的8位雙向I/O 口,P2的輸出緩沖級可驅動(吸收或 輸出電流)4

11、個TTL邏輯門電路。對端口 P2 寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入 口,作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一 個電流(IIL)。在訪問外部程序存儲器或 16 位地址的外部數(shù)據(jù)存儲器(例如執(zhí)行 MOVX DPTR 指令)時, P2 口送出高 8 位地址數(shù)據(jù)。在訪問 8 位地址的外部數(shù)據(jù)存儲器(如執(zhí) 行 MOVX RI 指令)時, P2 口輸出 P2 鎖存器的內容。Flash 編程或校驗時, P2 亦接收高位地址和一些控制信號。P3 口P3 口是一組帶有內部上拉電阻的 8 位雙向 I/O 口。 P3 口輸出緩沖級可驅動(吸收 或輸出電流)

12、4個TTL邏輯門電路。對 P3 口寫入“1”時,它們被內部上拉電阻拉高并可作為輸入端口。此 時,被外部拉低的 P3 口將用上拉電阻輸出電流( IIL)。P3 口除了作為一般的 I/O 口線外,更重要的用途是它的第二功能P3 口還接收一些用于 Flash 閃速存儲器編程和程序校驗的控制信號。RST 復位輸入。當振蕩器工作時, RST 引腳出現(xiàn)兩個機器周期以上高電平將使單片機復位。 ALE/PROG當訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE (地址鎖存允許)輸出脈沖用于鎖存地址的低 8 位字節(jié)。一般情況下, ALE 仍以時鐘振蕩頻率的 1/6 輸出固定的脈沖信號, 因此它可對外輸出時鐘或用于定時目

13、的。要注意的是:每當訪問外部數(shù)據(jù)存儲器時將 跳過一個 ALE 脈沖。對 Flash 存儲器編程期間,該引腳還用于輸入編程脈沖( PRO G)。如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的DO位置位, 可禁止 ALE 操作。該位置位后,只有一條 MOVX 和 MOVC 指令才能將 ALE 激活。 此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應設置 ALE 禁止位無效。PSEN程序儲存允許(PSEN )輸出是外部程序存儲器的讀選通信號,當 AT89C52由外部 程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次 PSEN 有效,即輸出兩個脈沖。 在此期間,當訪問外部數(shù)據(jù)存儲器,將跳

14、過兩次 PSEN 信號。EA/VPP外部訪問允許。欲使 CPU 僅訪問外部程序存儲器(地址為 OOOOHFFFFH) , EA 端必須保持低電平(接地)。需注意的是:如果加密位 LB1 被編程,復位時內部會 鎖存 EA 端狀態(tài)。如 EA 端為高電平(接 Vcc 端), CPU 則執(zhí)行內部程序存儲器中 的指令。 Flash 存儲器編程時,該引腳加上 +12V 的編程允許電源 Vpp ,當然這必須 是該器件是使用 12V 編程電壓 Vpp 。XTAL1振蕩器反相放大器的及內部時鐘發(fā)生器的輸入端。XTAL2振蕩器反相放大器的輸出端。2、復位電路復位電路的基本功能是:系統(tǒng)上電時提供復位信號,直至系統(tǒng)電

15、源穩(wěn)定后,撤銷復位信號。 為可靠起見,電源穩(wěn)定后還要經一定的延時才撤銷復位信號,以防電源開關或電源插頭分- 合過程中引起的抖動而影響復位。圖1所示的RC復位電路可以實現(xiàn)上述基本功能,圖3為 其輸入-輸出特性。但解決不了電源毛刺(A點)和電源緩慢下降(電池電壓不足)等問題 而 且調整 RC 常數(shù)改變延時會令驅動能力變差。左邊的電路為高電平復位有效右邊為低電平 Sm為手動復位開關Ch可避免高頻諧波對電路的干擾VCChuazhoucn. com十*22VCChuazhoucn. com十*22站VCC3、時鐘電路時鐘是單片機的心臟,單片機各功能部件的運行都是以時鐘頻率為基準,有條不紊的 一拍一拍地工

16、作。因此,時鐘頻率直接影響單片機的速度,時鐘電路的質量也直接影響單片 機系統(tǒng)的穩(wěn)定性。常用的時鐘電路有兩種方式:一種是內部時鐘方式,另一種為外部時鐘方 式。本文用的是內部時鐘方式。電路圖如下:30pFI12MHz30pFMCS-51 單片機內部有一個用于構成振蕩器的高增益反相放大器,該高增益反向放大器的輸入端為芯片引腳XTAL1,輸出端為引腳XTAL2。這兩個引腳跨接石英晶體振蕩器和微調電容,就構成一個穩(wěn)定的自激振蕩器。4、DS1302 時鐘芯片DS1302 包括時鐘/日歷寄存器和 31 字節(jié)(8 位)的數(shù)據(jù)暫存寄存器,數(shù)據(jù)通信僅通過一條串行輸入輸出口。實時時鐘/日歷提供包括秒、分、日、星期、

17、月、年等信息。閏年課自行調整,課選擇12小時制和24小時制,可以設置AM、PM。只通過三根線進行數(shù)據(jù)的控制盒傳遞:RST非、I/O的控制盒傳遞:RST非、I/O、SCLK通過備用電源可以讓芯片在小于1MW的功率下運作。VcC2 C1 8J VcciX1C2 S 73 SCLKX2匸3? 6ni/oGND匸4 g 5JCE各引腳的功能說明:Vccl:備用電池端;Vcc2:5V 電源。當 Vcc2Vcc1 時,由 Vcc2 向 DS1302 供電,當 Vcc2Vcc1 時,由Vcc2 向 DS1302 供電。SCLK :串行時鐘,輸入;I/O:數(shù)據(jù)輸入輸出口;CE/RST:復位腳X1X2是外界晶振

18、腳(32.768Khz的晶振)地( GND)5、DS18B20不同而不同,,且溫度轉換時的延時時間由2s減為750ms。DS18B20測溫原理如圖3所示。 圖中低溫度系數(shù)晶振的振蕩頻率受溫度影響很小,用于產生固定頻率的脈沖信號送給計數(shù)器 1。高溫度系數(shù)晶振隨溫度變化其振蕩率明顯改變,所產生的信號作為計數(shù)器2的脈沖輸入。 計數(shù)器1和溫度寄存器被預置在一55r所對應的一個基數(shù)值。計數(shù)器1對低溫度系數(shù)晶振 產生的脈沖信號進行減法計數(shù),當計數(shù)器1 的預置值減到0時,溫度寄存器的值將加1,計 數(shù)器1 的預置將重新被裝入,計數(shù)器1 重 新開始對低溫度系數(shù)晶振產生的脈沖信號進行計 數(shù),如此循環(huán)直到計數(shù)器2計

19、數(shù)到0時,停止溫度寄存器值的累加,此時溫度寄存器中的數(shù) 值即 為所測溫度。圖 3 中的斜率累加器用于補償和修正測溫過程中的非線性,其輸出用于 修正計數(shù)器 1 的預置值。DS18B20內部結構主要由四部分構成:64位光刻ROM、溫度傳感器、非揮發(fā)的溫度報警觸 發(fā)器TH和TL、配置寄存器。DS18B20引腳定義(1)DQ 為數(shù)字信號輸入、輸出端;(2)GND 為電源地;3)VDD 為外接供電電源輸入端(在寄生電源接線方式時接地)。6、按鍵電路按鍵的開關狀態(tài)通過一定的電路轉換為高、低電平狀態(tài)。按鍵閉合過程在相應的 I/O 端口形成一個負脈沖。閉合和釋放過程都要經過一定的過程才能達到穩(wěn)定,這一過程是處

20、于 高、低電平之間的一種不穩(wěn)定狀態(tài),稱為抖動。抖動持續(xù)時間的常長短與開關的機械特性有 關,一般在5-10ms之間。為了避免CPU多次處理按鍵的一次閉合,應采用措施消除抖動。 本文采用的是獨立式按鍵,直接用I/O 口線構成單個按鍵電路,每個按鍵占用一條I/O 口線, 每個按鍵的工作狀態(tài)不會產生互相影響。五、程序設計(1)各模塊程序主程序Main.c#include common.h#include timer.h#include pcf8591.h#include display.h#include ds18b20.h#include ds1302.huchar DRIVERS=0 x00;/定

21、義電機,蜂鳴器等設備初始化 值void SYS_init(void)/初始化設備LED=0 xff;SMG_WE=0 x00;SMG_DU=0 xff;OTHERS=DRIVERS;/定時器初始化Timer_init();/初始化數(shù)碼管 不顯示DIS_init();/初始化 ds1302DS_init();/初始化 ds18b20DQ_rst();DQ_write(0 xcc);DQ_write(0 xbe);void main(void)/系統(tǒng)初始化SYS_init();while(1)/功能鍵設置/當 k1 按下,實現(xiàn)速度顯示,當速度超過 100 ,蜂鳴器報警,當?shù)陀?0 繼電器工作 le

22、d1 閃爍if(start&(!stop)&(!ds1302_dis)&(!Temperature)G_point_vec=1;LED_1s();if(d eal_adc)deal_adc=0;SPEND_deal();/當k2按下,模擬停車,led 1 8亮if(stop=1) LED=0 x7e;DIS_init();/當 k5 按下,系統(tǒng)還原if(stop=2&(!start)&(!stop) SYS_init();/當 k4 按下,顯示當前實時溫度 if(ds1302_dis&(!start)&(!stop)DEAL_ds1302();/當 k5 按下,顯示當前實時時間 if(Temp

23、erature&(!start)&(!ds1302_dis) G_point_tem=1;OTHERS=0 x00;if(temp_flash) temp_flash=0;Temp_read();Deal_tem();Common.h#ifndef _COMMON_H_#define _COMMON_H_ #include reg52.h#include absacc.h#include intrins.h typedef unsigned int uint; typedef unsigned char uchar;extern uchar DRIVERS;#define LED#define

24、 SMG_WE#define LED#define SMG_WE#define SMG_DU#define OTHERSXBYTE0 x9fffXBYTE0 xdfffXBYTE0 xffffXBYTE0 xbfff#endifDisplay.c#include common.h#include pcf8591.h#include ds18b20.huchar code Disp_Seg12 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xbf,0 xff;uchar Disp_Dec8;/數(shù)碼管初始化,全關閉voi

25、d DIS_init(void)uchar i;for(i=0;i8;i+)Disp_Deci=8;/數(shù)碼管顯示函數(shù)void display(void)static uchar wela=0 x01,dula=0;static uchar count;SMG_WE=0 x00;SMG_DU=0 xff;/暫存段碼值count=Disp_SegDisp_Decdula;/當溫度鍵按下,打開顯示小數(shù)點if(G_point_tem)G_point_tem=0;if(dula=2) count=count&0 x7f; /當速度鍵按下,打開顯示小數(shù)點if(G_point_vec)G_point_vec

26、=0;if(dula=2)count=count&0 x7f; SMG_WE=wela;SMG_DU=count;dula+;wela0;x-);/復位函數(shù)void DQ_rst(void)uchar presece=1;while(presece)while(presece)DQ=1;_nop_();_nop_();DQ=0;DQ_delay(50);DQ=1;DQ_delay(6); presece=DQ;DQ_delay(45); presece=DQ;DQ=1;/寫字節(jié)函數(shù)void DQ_write(uchar dat)uchar i;for(i=0;i1;DQ=1;DQ_delay(

27、1);/讀字節(jié)函數(shù)uchar DQ_read(void)uchar i,val=0;for(i=0;i=1;DQ=0; _nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_(); if(DQ)val|=0 x80;DQ_delay(6);DQ=1;return (val);/讀溫度值void Temp_read(void)DQ_rst();DQ_write(0 xcc);DQ_write(0 xbe);tempe_count0=DQ_read();tempe_count1=DQ_read();DQ_rst();DQ

28、_write(0 xcc);DQ_write(0 x44);/處理溫度值void Deal_tem(void)uchar n,tem;/當溫度為負值時,高位取反,低位取反加一 if(tempe_count1127) tempe_count1=255-tempe_count1; tempe_count0=256-tempe_count0; n=1;tem=tempe_count0&0 x0f;Disp_Dec3=point_bittem; tem=(tempe_count1&0 x0f)4); Disp_Dec2=tem%100%10;Disp_Dec1=tem%100/10;Disp_Dec0

29、=tem/100;if(!Disp_Dec0)Disp_Dec0=11;if(!Disp_Dec1)Disp_Dec1=11;if(n) Disp_Dec0=10;Disp_Dec4=11;Disp_Dec5=11;Disp_Dec6=11;Disp_Dec7=11; Ds18b20.h#ifndef _DS18B20_H_#define _DS18B20_H_extern bit G_point_tem;extern void Deal_tem(void); extern void Temp_read(void);extern void DQ_write(uchar dat); extern

30、 void DQ_rst(void);extern void TempProc(void); extern void ReadTemp(void);#endifDs1302.c#include common.h /時鐘芯片特殊位申明sbit SCLK=P7;sbit DATI0=P23;sbit RST二P3;/寫字節(jié)函數(shù)void DS_write(uchar dat)uchar i;SCLK=0;for(i=0;i=1;/讀字節(jié)函數(shù)uchar DS_read(void)uchar i,val;for(i=0;i=1;return (val);/寫寄存器地址一個字節(jié)void SET_write

31、(uchar addr,uchar dat) RST=0;SCLK=0;RST=1;DS_write(addr);DS_write(dat);SCLK=1;RST=0;/讀寄存器地址一個地址uchar SET_read(uchar addr) uchar val;RST=0;SCLK=0;RST=1;DS_write(addr); val=DS_read();SCLK=1;RST=0;return (val); /讀秒uchar read_sec(void) uchar val; val=SET_read(0 x81);return (val); /讀分uchar read_min(void)

32、uchar val;val=SET_read(0 x83);return (val);/讀時uchar read_hou(void)uchar val;val=SET_read(0 x85);return (val);/關時鐘芯片寫保護void DISable(void)SET_write(0 x8e,0 x00);/開時鐘芯片寫保護void ENable(void)SET_write(0 x8e,0 x80);/初始化時鐘芯片 初始值 08:30:00void DS_init(void)DISable();SET_write(0 x80,0 x00);SET_write(0 x82,0 x3

33、0);SET_write(0 x84,0 x08);ENable();Ds1302.h#ifndef _DS1302_H_#define _DS1302_H_extern void DS_init(void);extern uchar read_hou(void);extern uchar read_min(void);extern uchar read_sec(void);#endifKeyscan.c#include common.h/鍵盤掃描函數(shù)uchar keyscan(void)static uchar k;uchar readdata1,readdata2;uchar trg,tr

34、g1,trg2,count1,count2;P3=0 x0f;readdatai二P30 x0f;tr gl二readda ta1&( readda tacou ntl); counti=readdatai;P3=0 xf0;readdata2二P30 xf0;trg2二readdata2&(readdata2count2); count2=readdata2;trg=trgi+trg2;switch(trg)case 0 x8i:k=i;break;case 0 x4i:k=2;break;case 0 x2i:k=3;break;case 0 xii:k=4;break;case 0 x8

35、2:k=5;break;case 0 x42:k=6;break;case 0 x22:k=7;break;case 0 xi2:k=8;break;case 0 x84:k=9;break;case 0 x44:k=i0;break;case 0 x24:k=ii;break;case 0 xi4:k=i2;break;case 0 x88:k=i3;break;case 0 x48:k=i4;break;case 0 x28:k=i5;break;case 0 xi8:k=i6;break;default :k=0; break;return (k);Keyscan.h#ifndef _K

36、EYSCAN_H_#define _KEYSCAN_H_ extern uchar keyscan(void);#endifPcf8591.c#include common.h#include display.h#include timer.hbit G_point_vec=0;/全局變量 速度顯示小數(shù)點標志sbit SDA二P2l;sbit SCL=P20;/起始函數(shù)void I2C_start(void)SDA=1;SCL=1;SDA=0;SCL=0;/停止函數(shù)void I2C_stop(void)SDA=0;SCL=0; SCL=1;SDA=1;/應答信號bit I2C_ack(void

37、)uchar i; SCL=1;while(SDA=1)&(i255)i+;SCL=0;if(i=255) return (0);elsereturn (1);/寫字節(jié)函數(shù)void I2C_write(uchar dat)uchar i;for(i=0;i8;i+)SDA=(bit)(dat&0 x80);/ 先寫高位SCL=1; SCL=0;dat=1;/讀字節(jié)函數(shù)uchar I2C_read(void)uchar i,val; SDA=1;for(i=0;i8;i+) val120km/h void SPEND_deal(void)uint val,val1,val2,val3,val4;

38、/將 AD 值讀出處理 val=ADC_read(0 x03); val1=val*196/10000; val2=(val*196%10000)/1000; val4=(val*196%10000)%1000)/100; val3=val1*100+val2*10+val4;/當速度超過100ms,蜂鳴器報警 if(val3416)BUZZER_100ms(); else BUZZER_100ms_off();/當速度低于100ms,繼電器工作 if(val3208)RELAY_500ms(); else RELAY_500ms_off(); Disp_Dec0=val3*24/10000;

39、 Disp_Dec1=(val3*24%10000)/1000;Disp_Dec2=(val3*24%10000)%1000)/100;Disp_Dec3=(val3*24%10000)%1000)%100)/10; Disp_Dec4=11;Disp_Dec5=11;Disp_Dec6=11;Disp_Dec7=11;Pcf8591.h#ifndef _PCF8591_H_#define _PCF8591_H_extern bit G_point_vec;extern void SPEND_deal(void);#endifTimer.c#include common.h#include k

40、eyscan.h#include display.h#include ds1302.h /全局變量 功能鍵值初始化 uchar start=0,deal_adc=0,stop=0;uchar Temperature=0,ds1302_dis=0;uchar LED_flash=0;/ds1302 的時分秒 uchar sec,min,hou;bit buzzer_flash=0,relay_flash=0;bit temp_flash=0,read_ds1302=0;/定時器初始化void Timer_init(void)/選擇定時方式與時基 1msTMOD=0 x01;TH0=0 xfc;T

41、L0=0 x18; TR0=1; ET0=1; EA=1;void timer0(void) interrupt 1static uchar num,num1;static uchar key_num;static uint num2,num3,num4;TR0=0;TH0=0 xfc;TL0=0 x18;display();/讀取鍵盤掃描值 50msnum+;if(num=5)num=0;key_num=keyscan();/記錄功能鍵值,返回給主程序if(key_num=5)start=1;stop=0;Temperature=0;ds1302_dis=0;if(key_num=6)Tem

42、perature=1;start=0;ds1302_dis=0;if(key_num=7)stop=1;if(key_num=8)stop=2;if(key_num=9)ds1302_dis=1;start=0;stop=0;/處理 AD 轉換時間標志 50msnum1+;if(num1=50)num1=0;deal_adc=1;/led 閃爍間隔標志 500msnum2+;if(num2=500)num2=0;LED_flash=LED_flash;/溫度采集間隔與蜂鳴器 時間間隔標志 100msnum3+;if(num3=100)num3=0;temp_flash=1;buzzer_flash=buzzer_flash;/繼電器工作時間 間隔 500msnum4+;if(num4=500)num4=0;read_ds1302=1;relay_flash=relay_flash;TR0=1;/led 閃爍程序void LED_1s(void

溫馨提示

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

評論

0/150

提交評論