




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 學號: 密級: 基于單片機的CO濃度檢測及報警系統 設計與制作學 院 名 稱:培黎工程技術學院專 業 名 稱:電子信息科學與技術學 生 姓 名:指 導 教 師: 二一五年五月Design and Manufacture of CO Concentration Detection and Alarm System Based on SCMCollege :School of Bailie EngineeringTechnologySubject :Electronic Information Science and TechnologyName :Directed by :May 2015鄭
2、重 聲 明本人呈交的學位論文,是在導師的指導下,獨立進行研究工作所取得的成果,所有數據、圖片資料真實可靠。盡我所知,除文中已經注明引用的內容外,本學位論文的研究成果不包含他人享有著作權的內容。對本論文所涉及的研究工作做出貢獻的其他個人和集體,均已在文中以明確的方式標明。本學位論文的知識產權歸屬于培養單位。本人簽名: 日期: I摘 要本文是以STC89C52芯片為核心設計制作了一種CO濃度檢測及報警系統。通過CO傳感器檢測空氣中CO濃度,經電路處理實現報警及降低其濃度作用。該系統主要包括ADC0832模數轉換芯片,CO檢測,蜂鳴器預警電路,LCD液晶顯示電路等。軟件編程采用C語言,具有功耗低,成
3、本低等特點。關鍵詞:CO檢測;單片機;報警系統 IIABSTRACT A detection and alarm system for CO concentration is designed with STC89C52 chip. It detects concentration of CO in air through carbon monoxide sensors, the role of alarm and reduce its concentration is achieved by circuit.This system mainly consists of ADC0832 chi
4、p,detection of CO, buzzer alarm circuit and LCD liquid crystal display circuit.The software is programmed with C language. Therefore,the system is characterized by low power dissipation and low cost. Key words: detection of CO;Single chip microcomputer; alarmsystem III目 錄TOC o 1-3 h u HYPERLINK l _T
5、oc21777 第1章 緒論 第1章 緒論1.1課題的背景和意義一氧化碳是無色、無臭、無味、有毒的氣體,熔點199,沸點191.5。標準狀況下氣體密度為l.25g/L,和空氣密度(標準狀況下1.293g/L)相差很小,這也是容易發生煤氣中毒的因素之一。一氧化碳分子中碳元素的化合價是2價,能進一步被氧比成4價,從而使一氧化碳具有可燃性和還原性,一氧化碳能夠在空氣中或氧氣中燃燒,生成二氧化碳。一氧化碳中毒(carbon monoxide poisoning),亦稱煤氣中毒。一氧化碳是無色、無臭、無味的氣體,故易于忽略而致中毒。常見于家庭居室通風差的情況下,煤爐產生的煤氣或液化氣管道漏氣或工業生產煤
6、氣以及礦井中的一氧化碳吸入而致中毒。中毒原理:一氧化碳會與肺部的血紅蛋白結合,造成機體缺氧。一是輕度中毒。患者可出現頭痛、頭暈、失眠、視物模糊、耳鳴、惡心、嘔吐、全身乏力、心動過速、短暫昏厥。血中碳氧血紅蛋白含量達10%-20%。二是中度中毒。除上述癥狀加重外,口唇、指甲、皮膚粘膜出現櫻桃紅色,多汗,血壓先升高后降低,心率加速,心律失常,煩躁,一時性感覺和運動分離(即尚有思維,但不能行動)。癥狀繼續加重,可出現嗜睡、昏迷。血中碳氧血紅蛋白約在30%-40%。經及時搶救,可較快清醒,一般無并發癥和后遺癥。三是重度中毒。患者迅速進入昏迷狀態。初期四肢肌張力增加,或有陣發性強直性痙攣;晚期肌張力顯著
7、降低,患者面色蒼白或青紫,血壓下降,瞳孔散大,最后因呼吸麻痹而死亡。經搶救存活者可有嚴重合并癥及后遺癥。一氧化碳的后遺癥。中、重度中毒病人有神經衰弱、震顫麻痹、偏癱、偏盲、失語、吞咽困難、智力障礙、中毒性精神病。部分患者可發生繼發性腦病。在當今社會發展中,現代化的發展給人類帶了很大的方便,但與此同時,人生安全越來越受到人們的重視,一氧化碳在工業領域所給我們帶來的方便不言而喻,但它對人體的危害也是顯而易見的。所以我們設計一款基于單片機控制的一氧化碳檢測儀,對一氧化碳進行檢測,為人們提供了安全的保障。1.2 CO檢測儀的種類目前,市場上一氧化碳檢測儀的種類是多種多樣,目前應用得較為廣泛的是熱催化監
8、測方式,但由于多種可熱性氣體都能催化氧化燃燒,導致檢測精度下降,另外,采用這種方式的檢測儀體積和功率都較大,不便于隨身攜帶,本設計使用的是一種采用點調制非光紅外(NDIR)氣體成分分析技術檢測一氧化碳氣體的方法的一氧化碳傳感器,該方法提高了檢測精度,大大降低了檢測儀的尺度和功耗,延長了電池供給時間,體積和功耗的有效降低。1.3 設計任務本設計的任務是設計一個由單片機控制的一氧化碳的濃度檢測及報警系統,它將傳感器輸出的電壓信號進行A/D轉換、濾波、線性化,由單片機將電壓值轉換為氣體濃度和溫度送LCD1602液晶顯示,并判斷是否超過報警上限,若超過,則發出聲光報警,并打開風扇降低一氧化碳的濃度。同
9、時用戶可以自己設定報警上限,使用戶可以根據實際情況方便的掌握安全狀況。該系統以STC89C52單片機為核心,可以實現聲光報警、故障自診斷、濃度顯示、報警限設置。它結構簡單、性能穩定、使用方便、價格低廉、智能化,具有一定的實用價值。第2章 CO檢測系統硬件設計本論文主要完成一氧化碳檢測儀軟件和硬件仿真設計,設計內容包括:A/D轉換器程序、控制程序、超標報警、鍵盤檢測、數據顯示等。硬件設計部分主要包括:單片機、A/D轉換器、時鐘芯片、LCD、外圍擴展數據RAM等芯片的選擇;硬件主電路設計、數據采集、模數轉換電路設計、液晶顯示電路設計、外圍擴充存儲器接口電路、時鐘電路、復位電路、鍵盤接口電路等功能模
10、塊電路設計。硬件結構框圖2.1。硬件設計總體電路圖見附錄A1。圖2.1 硬件結構框圖2.1 STC89C52單片機簡介本系統采用STC89C52單片機。而目前世界上較為著名的8位單片機的生產廠家和主要機型如下:美國Intel公司:MCS51系列及其增強型系列;美國Motorola公司:6801系列和6805系列;美國Atmel公司:89C51等單片機;美國Zilog公司:Z8系列及SUPER8;美國Fairchild公司:F8系列和3870系列;美國Rockwell公司:6500/1系列;美國TI(德克薩司儀器儀表)公司:TMS7000系列;NS(美國國家半導體)公司:NS8070系列等等。M
11、CS51系列單片機包括三個基本型8031、8051、8751。本系統采用STC89C52單片機為控制核心。而相比之下52型功能更為強大,ROM和RAM存儲空間更大,52還兼容51指令系統。基于本系統設計內容的需要,綜合考慮后,我們選擇單片機ATME公司的STC89C52為控制核心;主要基于考慮 HYPERLINK /datasheet/atmel/At89c52_cn.pdf t _blank STC89C52是一個低電壓,高性能CMOS 8位單片機,片內含8KB的可反復擦寫的Flash只讀程序存儲器和256 bytes的隨機存取數據存儲器(RAM)、6個中斷源;時鐘頻率024MHz;器件采用
12、高密度、非易失性存儲技術生產,并兼容標準MCS-51指令系統,功能強大。STC89C52是美國ATMEL公司生產的低電壓,高性能CMOS 8位單片機,片內含8K bytes的可反復擦寫的只讀程序存儲器(PEROM)和256K bytes的隨機存取數據存儲器,器件采用ATMEL公司的高密度,非易失性存儲技術生產,與標準MCS-51指令系統及8052產品引腳兼容,片內置通用8位中央處理器和FLASH存儲單元,功能強大,STC89C52單片機適合于許多較為復雜控制應用場合。 圖2.2 引腳圖主要性能參數:與MCS-51產品指令和引腳完全兼容;8K字節可重擦寫FLASH閃存存儲器;1000次寫/擦循環
13、;時鐘頻率:0Hz24MHz;三級加密存儲器;256字節內部RAM;32個可編程I/O口線;3個16位定時/計數器;6個中斷源;可編程串行UART通道。2.2單片機最小系統的設計 采用STC89C52來設計一個單片機系統能運行起來的需求最小的系統15,電路圖見圖2.3:圖2.3 單片機最小系統圖上圖的最小單片機系統包含有晶振電路和復位電路,STC89C52芯片組成。晶振電路在各種指令的微操作在時間上有嚴格的次序,這種微操作的時間次序稱作時序, STC89C52的時鐘產生方式有兩種,一種是內部時鐘方式,一種是外部時鐘方式。本系統中采用了內部時鐘方式,為了盡量降低功耗的原則。電路圖見圖2.4。圖2
14、.4 晶振電路圖在89C52單片機的內部有一個震蕩電路,只要在單片機的XTAL1和XTAL2引腳外接石英晶體(簡稱晶振)就構成了自激振蕩器并在單片機內部產生時鐘脈沖信號,圖中電容器C1和C2穩定頻率和快速起振,晶振CRY選擇的是12MHz。復位電路在單片機工作中仍然是不可缺少的主要部件中,單片機工作時必須處于一種確定的狀態。端口線電平和輸入輸出狀態不確定可能使外圍設備誤動作,導致嚴重事故的發生;內部一些控制寄存器(專用寄存器)內容不確定可能導致定時器溢出、程序尚未開始就要中斷及串口亂傳向外設發送數據1。 圖2.5 上電復位電路圖本設計中復位電路采用的是上電復位與手動復位電路,開關未按下是上電復
15、位電路,上電復位電路在上電的瞬間,由于電容上的電壓不能突變,電容處于充電(導通)狀態,故RST腳的電壓與VCC相同。隨著電容的充電,RST腳上的電壓才慢慢下降。選擇合理的充電常數,就能保證在開關按下時是RST端有兩個機器周期以上的高電平從而使STC89C52內部復位。開關按下時是按鍵手動復位電路,RST端通過電阻與VCC電源接通,通過電阻的分壓就可以實現單片機的復位4。電路圖見圖2.6: 圖2.6 復位電路圖2.3數據采集系統的簡介CO傳感器選用CO/CF-1000探頭組成,如下表2.1。表2.1 傳感器參數名稱一氧化碳傳感器 CO/CF-1000測量范圍0 - 1 000 ppm輸 出100
16、20nA/ppm分辨率0.05 ppm響應時間 (T 90)50 seconds濕度范圍15-90 %RH(非凝結)最大零點漂移(20to 40)10 ppm長期漂移2% /每月推薦負載值10線性度輸出線性測量電路由CO/CF-1000一氧化碳傳感器、ADC0832組成。當空氣被內部的采樣系統接收后,產生一個與一氧化碳濃度成正比的電壓信號,該電壓信號經ADC0832與STC89C52單片機相連,在顯示器上顯示出一氧化碳的濃度值,當超過國家規定的標準時報警5。2.4模數轉換器的簡介由于ADC0832模數轉換器具有8位分辨率、雙通道A/D轉換、輸入輸出電平與TTL/CMOS相兼容、5V電源供電時輸
17、入電壓在05V之間、工作頻率為250KHZ 、轉換時間為32微秒、一般功耗僅為15MW等優點,適合本系統的應用,所以我們采用ADC0832為模數轉換器件3。電路圖見圖2.7如下:圖2.7 模數轉換電路圖ADC0832 具有以下特點:8位分辨率;雙通道A/D轉換;輸入輸出電平與TTL/CMOS相兼容;5V電源供電時輸入電壓在05V之間;工作頻率為250KHZ,轉換時間為32S;一般功耗僅為15mW;8P、14PDIP(雙列直插)、PICC 多種封裝;商用級芯片溫寬為0到+70,工業級芯片溫寬為40到+85;芯片接口說明:CS_片選使能,低電平芯片使能;CH0模擬輸入通道0,或作為IN+/-使用;
18、CH1模擬輸入通道1,或作為IN+/-使用;GND芯片參考0電位(地);DI數據信號輸入,選擇通道控制;DO數據信號輸出,轉換數據輸出;CLK芯片時鐘輸入;Vcc/REF電源輸入及參考電壓輸入(復用)。由于ADC0832模數轉換器的位數為8位,所以ADC0832模數轉換器的精度為:10ppm/256=0.039ppm。2.5按鍵電路的設計本系統選擇獨立式按鍵。鍵盤分為:獨立式和矩陣式兩類,每一類按其編碼方法又可以分為編碼和非編碼兩種。本系統具有人機對話功能,該功能即能隨時發出各種控制命令和數據輸入以及和LCD連接顯示運行狀態和運行結果。由于本系統只有UP、DOWN、OK、CANCEL4個控制命
19、令,所需按鍵較少,所以本系統選擇獨立式按鍵13。電路圖見圖2.8。圖2.8 按鍵電路圖2.6外圍擴充存儲器的簡介由于考慮STC89C52單片機具有8KB的程序存儲器(ROM),256B的數據存儲器(RAM),由于考慮到本系統的數據處理與存儲所需的容量,現在需要擴充存儲器的容量。在應用中要保存一些參數和狀態,本系統選用AT24C128存儲器8。電路圖見圖2.9。 圖2.9 外圍擴充存儲電路圖2.7上拉電阻電路的設計在主電路圖中接在P0口處有一個排阻RP1,由于P0口沒有內接上拉電阻,為了為P0口外接線路有確定的高電平,所以要接上排阻RP1,以確保有P0口有穩定的電平11。電路連接圖見圖2.10。
20、 圖2.10 上拉電阻電路圖2.8液晶顯示器簡介我們選用了AMPIRE128X64液晶顯示模塊,是由于本系統要有顯示裝置完成顯示功能,顯示器最好能夠顯示數據、圖形,考慮到同種LCD顯示器的屏幕越大體積越大,功耗越大的特點,該型號顯示器消耗電量比較低,可以滿足系統要求。該類液晶顯示模塊采用動態的液晶驅動,可用5V供電。AMPIRE128X64液晶共有22個引腳9。AMPIRE128X64液晶顯示模塊與計算機的接口電路有兩種方式。分為直接訪問方式和間接控制方式。直接訪問方式是把液晶模塊作為存儲器或I/O設備直接接在單片機的總線上,單片機以訪問存儲器或I/O設備的方式操作液晶顯示模塊的工作。間接控制
21、方式則不使用單片機的數據系統,而是利用它的I/O口來實與顯示模塊的聯系。即將液晶顯示模塊的數據線與單片機的Pl口連接作為數據總線,另外三根時序控制信號線通常利用單片機的P3口中未被使用的I/O口來控制。這種訪問方式不占用存儲器空間,它的接口電路與時序無關,其時序完全靠軟件編程實現。本系統采用間接控制方式14。液晶顯示電路連接原理圖見圖下:圖2.11 液晶顯示器電路圖2.9報警電路的設計圖2.12 報警電路接線圖報警信號通常有三種類型:一是閃光報警,因為閃動的指示燈更能提醒人們注意;二是鳴音報警,發出特定的音響,作用于人的聽覺器官,易于引起和加強警覺;三是語音報警,不僅能起到報警作用,還能直接給
22、出警報種類的信息。其中,前兩種報警裝置因硬件結構簡單,軟件編程方便,常常在單片機應用系統中使用;而語音報警雖然警報信息較直接,但硬件成本高,結構較復雜。單頻音報警實現單頻音報警的接口電路比較簡單,其發音元件通常可采用壓電蜂鳴器,當在蜂鳴器兩引腳上加315V直流工作電壓,就能產生3kHZ左右的蜂鳴振蕩音響。壓電式蜂鳴器,約需10mA的驅動電流,可在某端口接上一只三極管和電阻組成的驅動電路來驅動,如圖2.12所示。在圖2.12中,P1.0接三極管基極輸入端,當P1.0輸出高電平“1”時,三極管導通,蜂鳴器的通電而發音,當P1.0輸出低電平“0”時,三極管截止,蜂鳴器停止發音12。第3章 CO檢測系
23、統軟件設計3.1軟件設計結構軟件設計部分主要包括:主程序/子程序流程的設計、功能模塊程序的編寫、軟/硬件結合調試與演示。主要包括以下功能模塊:51驅動、檢測、液晶顯示、時鐘、鍵盤、模數軟換10,軟件結構框圖3.1。 系統初始化、按鍵掃描顯示選擇菜單測量相關設置數據處理串行通信對軟件進行處理圖3.1 軟件結構框圖3.2主程序模塊的設計主程序實現的功能:與硬件相結合實現便攜式一氧化碳檢測儀的各個功能。主要是檢測與顯示,時間調整與顯示,數據存儲,功能子函數的調用,見圖3.2。檢測主程序程序見附錄A2。開 始初始化CPU初始化時鐘初始化LED屏顯示開機畫面顯示時間顯示主菜單讀 鍵 圖3.2 主程序流程
24、圖3.3模數轉換的設計ADC0832轉換的流程圖見下圖3.3;ADC0832程序見附錄A3。開始使能芯片產生時鐘信號輸入通道控制字讀取2字節數據讀取2字節數據字節數據校正送入指定寄存器結束圖3.3 數轉換流程圖3.4按鍵模塊的設計和時鐘模塊的設計按鍵查詢式的流程圖見下圖,按鍵程序見附錄A4。按鍵程序入口按鍵按下調用延時程序按鍵釋放NYN鍵值傳送 圖3.4 按鍵查詢式的流程圖時鐘模塊操作流程圖見下圖,時鐘程序見附錄A5。開始初始化保護寄存器操作向DS寫入字節數據向DS讀取字節數據結束圖3.5 時鐘模塊操作流程圖3.5液晶顯示模塊的設計 LCD模塊在本系統中主要起著開界面漢字顯示,以及各控制效果的
25、顯示。采用直接訪問方式。液晶顯示的操作流程圖見下圖3.6,液晶程序見附錄A6。入口 讀狀態字 否忙? 是寫指令代碼/顯示數據讀顯示數據圖3.6 液晶顯示的操作流程圖系統調試及功能實現4.1總體系統調試 4.1.1軟件調試打開keil軟件,打開程序,檢查后單擊編譯按鍵,如果未發現錯誤和警告則說明程序能夠正常運行。編譯結果如圖所示:圖4.1 軟件編譯結果圖所以程序能夠正常運行。 4.1.2 軟件下載通過串口將電腦中已經編寫好的程序傳輸入51單片機中,打開電源,檢查各模塊是否正常工作。首先將STC_ISP_V483這個串口通信軟件打開,選擇打開程序文件選項,找到需要錄入單片機的hex文件,選擇下載選
26、項,點擊后給單片機上電復位,等待信息框中顯示已下載成功,說明程序已經錄入單片機。接下來首先通過按鍵選擇工作模式,然后根據傳感器模塊的類型將相應的氣體放置在傳感器探頭附近,等待聲光報警模塊工作,當報警模塊工作后,通過按下外部中斷按鍵選擇報警模式,按一下則led二極管關閉,按第二下則蜂鳴器關閉,按第三下則led和蜂鳴器都打開。將三個傳感器模塊都檢查完畢后,按下復位鍵,并關閉電源。通過監測總體系統能夠正常工作。4.2 實物展示焊接成品如下圖4.2所示:4.2 焊接成品圖在焊接過程中,本設計采用萬能板來焊接,同時外接電源采用的是USB供電。接通電源初始圖如4.3所示 :4.3 接通電源初始圖在電源剛接
27、通時,液晶屏顯示當前CO濃度為000 PM,設置的界限值為100 PM,風扇處于未轉動狀態,發光二極管未亮并且蜂鳴器不報警。系統工作時如圖4.4所示:4.4 工作實物圖當CO傳感器檢測到的CO濃度大于國家標準值100ppm時,蜂鳴器報警同時紅色指示燈發光、風扇轉動。結論本次設計的任務是設計制作CO濃度檢測報警器,設計中使用了低電壓、高性能CMOS8位微處理器STC89C52 單片機作為控制核心,總體電路具有運行速度快,穩定,結構簡單,散熱迅速等特點,采用模塊化設計,這樣不僅有利于系統硬件的設計和調試,同時也方便對系統進行更改和系統硬件的升級。CO/CF-1000氣體傳感器模塊的特點在于其簡易性
28、和高效性,由于其輸出口在監測到有害氣體時直接輸出低電平,這樣就免去了從氣體傳感器上采集信號,這樣硬件設計更加簡潔,所需的器件也更加易于購買,硬件出錯率也就更小,更加符合本設計的目的。本次設計涉及到的知識面較多,由于本人理論水平和實踐經驗有限,本次設計還存在一些有待改進和優化的地方,比如在檢測氣體種類上可以增加對煙霧、NO等方面。在實用性方面可以考慮將濃度監測系統與室內換氣系統連接,這樣就不僅做到了氣體監測和警報,還做到了對有害氣體及時處理,使整個室內監控系統更加完善。參考文獻1何立民MCS-51系列單片機應用系統設計 M北京航空航天大學出版社,1990,34-50.2馬忠梅單片機的C語言應用程
29、序設計M北京航空航天大學出版社,2001,60-90.3陳小忠單片機接口技術實用子程序M人民郵電大學出版社,2005,80-120.4張淑清單片微型計算機接口技術及其應用M國防工業大學出版社,2001,60-70.5曹琳琳單片機原理及接口技術M國防科技大學出版社,2000,80-102.6郭天祥.新概念51單片機C語言教程M.北京:電子工業出版社,2009,120-140.7周航慈.單片機應用程序設計技術M.北京:北京航空航天大學出版社,2011,70-103.8石秀名.嵌入式系統原理與應用M.北京:北京航空航天大學出版社,2009,30-50.9王宜懷.嵌入式技術基礎與實踐M.北京:北京航空
30、航天大學出版社,2007,90-100.10譚浩強.C程序設計M.第四版.北京:清華大學出版社,2010,87-90.11陳志旺.51系列單片機系統設計與實踐M.北京:電子工業出版社,2008,98-115.12余錫存,曹國華.單片機原理及接口技術.第二版.西安:西安電子科技大學出版社,2012,150-170.13徐煜明單片機原理及接口技術M電子工業出版社,2005,110-140.14趙新民智能儀器原理及設計M哈爾濱工業大學出版社,1995,67-98.15徐英慧.嵌入式系統設計M.北京航空航天大學出版社,2010,35-60.致謝 我的畢業課題是便攜式一氧化碳檢測儀的設計,是一個實際的小
31、工程。作為一個本科的學生,我對實際的工程設計認識不夠,經驗不足,難免在設計的整體框架中,有很多的細節沒有考慮。但*老師和同學們給予我鼓勵和很多寶貴的建議,并且悉心引導,給予我一個比較清晰的設計思路,幫助我解決了許多設計上的困難。最后還要感謝在百忙之中進行論文評審的老師們,對論文的不足之處敬請批評點。附錄附錄A1 硬件設計總體電路圖附錄A2 檢測主程序程序#include /調用外函數/#include #include #include #include #include #include /*初始化CPU*2/void init_cpu() /初始化cpu EA=1;TR0=1;TR1=1;
32、TMOD=0 x11;TH1=0 x3c;TL1=0 xb0;/*void time1(void) interrupt 3 using 1 TH1=(65536-50000)/256;TL1=(65536-50000)%256; keyval=P1; * /初始化CPU結束/void main_menu_initial() /LCD主菜單初始化./main1_menu0.menu_count=4; /有4個菜單項./main1_menu0.display=measurearray; /定義一個”開始測量“數組/main1_menu0.subs=NULL; main1_menu0.childre
33、n_menus=measure_menu;/當前菜單子菜單的指針main1_menu0.parent_menus=NULL;void measure_menu_initial() /“開始測量”菜單設置/ measure_menu0.menu_count=2; measure_menu0.display=qr; /開始測量函數, 確認. measure_menu0.subs=start_measure_function; /開始測量函數 measure_menu0.children_menus=NULL; measure_menu0.parent_menus=main1_menu; measu
34、re_menu1.menu_count=2; measure_menu1.display=qx; /開始測量函數, 取消. measure_menu1.subs=NULL; measure_menu1.children_menus=NULL; measure_menu1.parent_menus=main1_menu; /還有void store_menu_initial()、void time_menu_initial()/void led_menu_pro() max_item=menu_led-menu_count;switch(keyval)case 0: break;case 1:
35、/向上鍵.if(user_choosen=0)user_choosen=max_item;shuaxin=1;user_choosen-;break; /“向上”“向下”“確認”“取消”鍵/if(shuaxin)/是否需要刷新LCD標志位. Clr_Scr(); shuaxin=0;led_menu_show();v oid led_menu_show()uchar n;max_item=menu_led-menu_count;if (max_item=4) /菜單項為3則表示為主菜單.for(n=0;n4;n+) draw_bmp(n*2,20,96,0,menu_ledn.display)
36、;select_item(user_choosen); /標記出當前菜單項.elseswitch(temp_choosen) case 0:draw_bmp(0,20,96,0,measurearray); /“開始測量”數組/break; default:break;for(n=0;n1)&0 x1; _nop_(); _nop_(); ADCLK=0;/拉低CLK端,形成下降沿3 ADDI=1;/控制命令結束 _nop_(); _nop_(); dat=0; for(i=0;i8;i+) dat|=ADDO;/收數據 ADCLK=1; _nop_(); _nop_(); ADCLK=0;/
37、形成一次時鐘脈沖 _nop_(); _nop_(); dat=1; if(i=7)dat|=ADDO; for(i=0;i8;i+) j=0; j=j|ADDO;/收數據 ADCLK=1; _nop_(); _nop_(); ADCLK=0;/形成一次時鐘脈沖 _nop_(); _nop_(); j=j7; ndat=ndat|j; if(i=1; ADCS=1;/拉低CS端 ADCLK=0;/拉低CLK端 ADDO=1;/拉高數據端,回到初始狀態 dat0; i-) IO = ACC0; CLK = 1; /下降沿寫入數據/ CLK = 0; ACC = ACC 1; /*函數:讀出字節子函
38、數*/OutputByte(void) /上升沿讀出數據/*函數:設置初始時間*/void SetTime(unsigned char *pSecDa) WriteTo1302(0 x8e,0 x00); / 控制命令,WP=0,寫操作 / for(i =7;i0;i-) WriteTo1302(Addr,*pSecDa); / 秒 分 時 日 月 星期 年 / pSecDa+; Addr +=2; WriteTo1302(0 x8e,0 x80); / 控制命令,WP=1,寫保護 / /*函數:讀取DS1302當前時間*/void GetTime(void) for (i=0;i 返回給小時
39、位/ if(sec&0 x0f)=0 x0a) sec&=0 xf0; sec+=0 x10; / 如果秒位滿十,向十秒位進一 if(day=8) day=1; / 如果星期滿七,重新從星期一開始計 / if(sec&0 xf0)=0 x60) sec&=0 x0f; / 如果十秒位滿六,清零 /if(date&0 xf0)=0 x30)&(date&0 x0f)=0 x02) date&=0 x00;if(month&0 xf0)=0 x10)&(month&0 x0f)=0 x03) month&=0 x00;if(year&0 xf0)=0 xa0) year&=0 x0f; Curti
40、me0 = sec; Curtime1 = min; SetTime(&Curtime0); / 將調整過后的時間值寫入DS1302 / / *時鐘初始化子函數*/void Init_Clock(void) K1=1; K2=1; K3=1; K4=1; K5=1; K6=1; K7=1; KT=0; n=0; Init_T0(); /*刷新顯示子函數*/ void Refresh(void) GetTime(); CS1=1;CS2=0; if(K6) sz_disp16(5,40,1,shuzisec&0 x0f); / 秒位 / sz_disp16(5,32,1,shuzisec4);
41、/ 十秒位 / else hz_disp16(5,32,1,kongbai2); / 秒位 十秒位 / if(K5) sz_disp16(5,8,1,shuzimin&0 x0f); / 分鐘位 / sz_disp16(5,0,1,shuzimin4); / 十分位 / else hz_disp16(5,0,1,kongbai2); /*狀態判斷于提示*/void State(void)CS1=1;CS2=0;if(KT=1) hz_disp16(1,32,1,tiao); hz_disp16(1,48,1,shi2); else hz_disp16(1,32,1,kongbai2); hz_
42、disp16(1,48,1,kongbai2); 附錄A6 液晶程序/*位定義*/sbit RST = P20; / 復位端 /sbit E = P21; / 使能端 / #define Disp_On 0 x3f / 顯示開指令 /#define Disp_Off 0 x3e / 顯示關指令 /#define Col_Add 0 x40 / 定位到第0列指令 /#define Page_Add 0 xb8 / 定位到第0頁指令 /#define Start_Line 0 xc0 / 定位從DDROM中的第0行開始往屏幕上顯示 unsigned char code measurearray/*
43、調入了一幅圖像:測量:寬度x高度=96x16*/ unsigned char code storearray /*調入了一幅圖像:存儲:寬度x高度=96x16*/ /還有時間設置,開始測量等圖像/*漢字點陣碼*/char code huan= / 歡 16*16 /0 x14,0 x24,0 x44,0 x84,0 x64,0 x1C,0 x20,0 x18,0 x0F,0 xE8,0 x08,0 x08,0 x28,0 x18,0 x08,0 x00,0 x20,0 x10,0 x4C,0 x43,0 x43,0 x2C,0 x20,0 x10,0 x0C,0 x03,0 x06,0 x18
44、,0 x30,0 x60,0 x20,0 x00;/迎,使,用,等漢字如其所示/*字母點陣碼*/char code Kg_K= / 字母K 8*16 /0 x08,0 xF8,0 x88,0 xC0,0 x28,0 x18,0 x08,0 x00,0 x20,0 x3F,0 x20,0 x01,0 x26,0 x38,0 x20,0 x00,;nsigned char code FirstPage= / 開機畫面 DPY工作室 /void delay(unsigned int t) /延時/ unsigned int i,j; for(i=0;it;i+) for(j=0;j10;j+) ;
45、/*寫命令到LCD*/void write_command(unsigned char cmdcode) RS = 0; RW = 0; P0 = cmdcode; delay(0); E = 1; delay(0); E = 0; /*寫數據到LCD*/void write_data(unsigned char Dispdata)/*清顯示屏*/void Clr_Scr() unsigned char j ,k; CS2=1;CS1=0; / 清左半屏 / write_command(Page_Add+0); write_command(Col_Add+0); for(k=0;k4;k+)
46、/ 清左上半屏 / / write_command(Page_Add+k); for(j=0;j64;j+) write_data(0 x00); for(k=0;k4;k+) / 清左下半屏 / write_command(Page_Add+4); for(j=0;j64;j+) write_data(0 x00); CS2=0;CS1=1; / 清右半屏 / write_command(Page_Add+0); write_command(Col_Add+0); for(k=0;k4;k+) / 清右上半屏 / for(j=0;j64;j+) write_data(0 x00); for(
47、k=0;k4;k+) / 清右下半屏 / write_command(Page_Add+4); for(j=0;j64;j+) write_data(0 x00); /*顯示12864圖片*/void Disp_Img(unsigned char code *img)/*指定位置顯示數字8*16*/void sz_disp16(unsigned char pag,unsigned char col,unsigned char mod, unsigned char code *szk) unsigned char j=0,i=0; for(j=0;j2;j+) write_command(Pag
48、e_Add+pag+j); write_command(Col_Add+col); for(i=0;i 1. 在.h/.cpp的開頭應有一段格式統一的說明,內容包括: a. 文件名 (FileName); b. 創建人 (Creater); c. 文件創建時間 (Date); d. 簡短說明文件功能、用途 (Comment)。好習慣 2. 除非極其簡單,否則對函數應有注釋說明。內容包括:功能、入口/出口參數,必要 時還可有備注或補充說明。還是好習慣 3. 每列代碼的長度推薦為 80列,最長不得超過120列;折行以對齊為準。太寬了,我的限制是60列,因為文本方式下屏幕一共80列,如果你用BC這一
49、類的編輯器,窗口邊框等又要占據一定空間,所以80列太寬 4. 循環、分支代碼,判斷條件與執行代碼不得在同一行上。很對 5. 指針的定義,* 號既可以緊接類型,也可以在變量名之前。 例:可寫做:int*pnsize; 也可寫做:int*pnsize; 但不得寫做:int*pnsize;建議采用第二種,除非附加另外一條規定:一次只聲明一個變量,否則就會讓人混淆,比如:int* a, b;看起來b好像也是個指針,其實不是。 6. 在類的成員函數內調用非成員函數時,在非成員函數名前必須加上:。這一條我倒覺得并不是必需的,我的看法是決不要讓你的類成員函數和全局函數的名稱相同(或類似) 7. 函數入口參數
50、有缺省值時,應注釋說明。 例:BOOL CWpsDib:PaintDIB(CDC* pDC, CRect& rc,int nBrightness, file:/*=0*/BOOL bGrayScale file:/*=FALSE*/ )每個變量寫一行,必要時加上/*in, out*/注釋 8. elseif 必須寫在一行。應該盡量避免else if這樣的結構 9. 與、有關的各項規定:9.1、應獨占一行。在該行內可有注釋。 9.2 必須另起一行, 之后的代碼必須縮進一個Tab。與必須在同 一列上。 9.3 在循環、分支之后若只有一行代碼,雖然可省略、,但不推薦這么 做。若省略后可能引起歧義,則
51、必須加上、。持保留意見,因為GNU的代碼規范是這樣的:if ( NULL = ptr )/ do something here或者if ( NULL = ptr ) / do something here爭論哪個更好并沒有意義,關鍵是統一,如果用VC當然你的辦法最方便,可是如果你用emacs或者vi,就不是這樣了。 10. 與空格有關的各項規定。 10.1 在所有兩目、三目運算符的兩邊都必須有空格。在單目運算符兩端不必空格。但 在、:、.、等運算符前后,及&(取地址)、* (取值)等運算符之后不得有空格。 10.2for、while、if 等關鍵詞之后應有1個空格,再接(,之后無空格;在結尾
52、的)前不得有空格。我認為在括號兩端加空格并不是什么錯誤,尤其是在一個條件十分復雜的if語句里 10.3 調用函數、宏時,(、)前后不得有空格。 10.4類型強制轉換時,()前后不得有空格同上 11. 與縮進有關的各項規定 11.1 縮進以 Tab 為單位。1 個 Tab 為 4 個空格我認為這個值應該更大,我自己使用8個空格,如果你的代碼因為縮進幅度太大而導致折行,那么幾乎可以肯定你的程序設計方案有問題。 11.2 下列情況,代碼縮進一個 Tab: 1. 函數體相對函數名及、。 2. if、else、for、while、do 等之后的代碼。 3. 一行之內寫不下,折行之后的代碼,應在合理的位置
53、進行折行。若有 + - * / 等運 算符,則運算符應在上一行末尾,而不應在下一行的行首。這一條我反對,運算符應該放在下一行行首,以使人能清楚的知道這一行是續上一行的,比如if ( something& somethingelse& otherthings )如果寫做if ( something &somethingelse &otherthings )反而看不清楚 11.3 下列情況,不必縮進:switch 之后的 case、default。編程規范與范例目 錄1 排版 62 注釋 113 標識符命名 184 可讀性 205 變量、結構 226 函數、過程 287 可測性 368 程序效率
54、409 質量保證 4410 代碼編輯、編譯、審查 5011 代碼測試、維護 5212 宏 53 1 排版1-1:程序塊要采用縮進風格編寫,縮進的空格數為4個。說明:對于由開發工具自動生成的代碼可以有不一致。1-2:相對獨立的程序塊之間、變量說明之后必須加空行。示例:如下例子不符合規范。if (!valid_ni(ni) . / program coderepssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;應如下書寫if (!valid_ni(ni) . / program coderepssn_ind = ss
55、n_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;1-3:較長的語句(80字符)要分成多行書寫,長表達式要在低優先級操作符處劃分新行,操作符放在新行之首,劃分出的新行要進行適當的縮進,使排版整齊,語句可讀。示例:perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN + STAT_SIZE_PER_FRAM * sizeof( _UL );act_task_tableframe_id * STAT_TASK_CHECK_NUMBER + index.occupied = stat_poi
56、index.occupied;act_task_tabletaskno.duration_true_or_false = SYS_get_sccp_statistic_state( stat_item );report_or_not_flag = (taskno MAX_ACT_TASK_NUMBER) & (n7stat_stat_item_valid (stat_item) & (act_task_tabletaskno.result_data != 0); 1-4:循環、判斷等語句中若有較長的表達式或語句,則要進行適應的劃分,長表達式要在低優先級操作符處劃分新行,操作符放在新行之首。示例
57、:if (taskno max_act_task_number) & (n7stat_stat_item_valid (stat_item) . / program codefor (i = 0, j = 0; (i BufferKeywordword_index.word_length) & (j NewKeyword.word_length); i+, j+) . / program codefor (i = 0, j = 0; (i first_word_length) & (j ),后不應加空格。說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。由于留空格所產生的清晰性是相對的,所
58、以,在已經非常清晰的語句中沒有必要再留空格,如果語句已足夠清晰則括號內側(即左括號后面和右括號前面)不需要加空格,多重括號間不必加空格,因為在C/C+語言中括號已經是最清晰的標志了。在長語句中,如果需要加的空格非常多,那么應該保持整體清晰,而在局部不加空格。給操作符留空格時不要連續留兩個以上空格。示例:(1) 逗號、分號只在后面加空格。int a, b, c; (2)比較操作符, 賦值操作符=、 +=,算術操作符+、%,邏輯操作符&、&,位域操作符= MAX_TIME_VALUE) a = b + c;a *= 2;a = b 2;(3)!、+、-、&(地址運算符)等單目操作符前后不加空格。*
59、p = a; / 內容操作*與內容之間flag = !isEmpty; / 非操作!與內容之間p = &mem; / 地址操作& 與內容之間i+; / +,-與內容之間(4)-、.前后不加空格。p-id = pid; / -指針前后不加空格(5) if、for、while、switch等與后面的括號間應加空格,使if等關鍵字更為突出、明顯。if (a = b & c d) 1-1:一行程序以小于80字符為宜,不要寫得過長。 2 注釋2-1:一般情況下,源程序有效注釋量必須在20以上。說明:注釋的原則是有助于對程序的閱讀理解,在該加的地方都加了,注釋不宜太多也不能太少,注釋語言必須準確、易懂、簡
60、潔。2-2:說明性文件(如頭文件.h文件、.inc文件、.def文件、編譯說明文件.cfg等)頭部應進行注釋,注釋必須列出:版權說明、版本號、生成日期、作者、內容、功能、與其它文件的關系、修改日志等,頭文件的注釋中還應有函數功能簡要說明。示例:下面這段頭文件的頭注釋比較標準,當然,并不局限于此格式,但上述信息建議要包含在內。/* Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. File name: / 文件名 Author: Version: Date: / 作者、版本及完成日期 Description: / 用于詳細說明此程序文件完成的主要功
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025外貿合同樣本模板
- 2025年城區商業店鋪租賃合同
- 公司收購合同協議
- 2025青海省投資集團有限公司招聘59人筆試參考題庫附帶答案詳解
- 2025陜西榆林市吳堡縣縣屬國有企業招聘20人筆試參考題庫附帶答案詳解
- 2025年阜陽市皖西北(阜南)糧食產業園有限公司招聘14人筆試參考題庫附帶答案詳解
- 2025國網北京市電力公司高校畢業生招聘85人(第二批)筆試參考題庫附帶答案詳解
- 2025京能集團錫林郭勒公司招聘21人(內蒙古)筆試參考題庫附帶答案詳解
- 跨學科地理教學策略與實踐路徑
- 四川省內江市二中2023-2024學年高三上學期10月月考語文試題 含解析
- 客車安全培訓課件
- 2025年度麻醉科人才培養計劃
- 2025-2031年中國電競俱樂部行業市場需求預測及投資規劃建議報告
- 學校環境對兒童心理健康的積極影響
- (高清版)DB52∕T 1450-2019 河道管理范圍劃界技術規程
- 2025年中國石油集團招聘筆試參考題庫含答案解析
- 《基于單片機的智能風扇設計》11000字(論文)
- 《kdigo專家共識:補體系統在腎臟疾病的作用》解讀
- 智能制造能力成熟度模型(-CMMM-)介紹及評估方法分享
- 網絡協議優化與適配-洞察分析
- (輸血科)培訓計劃
評論
0/150
提交評論