久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6270|回復: 2
打印 上一主題 下一主題
收起左側

基于單片機的停車場計數系統設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:355617 發表于 2018-6-20 23:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
前言        2
第1章 理論分析及總體方案        3
第1.1節 方案比較        3
第1.2節 總體設計方案        4
第2章 系統的硬件設計        6
第2.1節 控制電路設計        6
第2.2節 對射紅外檢測電路設計        11
第2.3節 液晶顯示電路設計        13
第2.4節 繼電器開關電路與報警電路的設計        15
第2.5節 按鍵電路設計        17
第3章 系統的程序設計        18
第3.1節 主程序設計        18
第3.2節 數據采集模塊程序設計        19
第3.3節 液晶顯示程序設計        20
第4章 系統測試        22
第4.1節 系統的硬件調試        22
第4.2節 系統的軟件調試        22
第4.3節 測試及結果        22
結論        23
參考文獻        23
致謝        24
附錄        24
附錄1:原理圖及實物照片說明        25
附錄2:部分源程序        25



基于單片機的停車場計數系統設計
【摘  要】以STC89C52單片機為核心,利用紅外對射式傳感器電路作為信號的輸入模塊,設計了一個基于單片機的停車場計數系統。對射式光電傳感器由發射器和接收器組成,當有物體經過發射器和接收器之間阻斷光線時,形成電平信號,經過放大、整流并送入單片機控制模塊進行控制計數。通過液晶顯示電路、繼電器電路和蜂鳴器電路構成系統的輸出模塊,實現了對停車場內汽車數量的計數、顯示、停車場進出門以及報警的控制。
【關鍵詞】:單片機;紅外對射式傳感器;繼電器;液晶顯示;
[Abstract]: In this paper, the STC89C52 microcontroller as the core of the control circuit, the signal output module is used infrared photoelectric couple, designed a parking lot counting system that based on a microcontroller. Infrared photoelectric couple by the transmitter and the receiver is composed of two parts. When an object through the transmitter and the receiver will break the light beams, and produce level signal, amplified, rectified and finally put into microcontroller to control counting. Via Liquid Crystal Display circuit, relay circuit and buzzer circuit form the output module. So this system achieves counting of cars, display, alarm and the controller of pulling or pushing the door in the parking lot.
[Key words]: microcontroller; infrared photoelectric couple; relay; Liquid Crystal Display;
前言
在當今社會經濟飛速發展的格局下,越來越多的廠家采用流水線技術進行產品生產作業,而怎樣對其線上的產品進行實時的、有效率的、精確的計數成為廣大生產廠家十分關注的問題。而基于單片機為核心控制的計數器有著能夠實時,精確,可靠,穩定等計數優點已成為廣大廠家的首選自動計數的裝置。
當今,單片微型計算機技術迅速發展,基于單片機技術開發的計數設備和產品廣泛應用到各個領域,單片機技術產品和設備促進了生產技術水平的提高,企業迫切需要大量熟練掌握單片機技術并能開發、應用和維護管理這些智能化產品的高級工程技術人才。單片機以體積小、功能強、可靠性高、性能價格比高等特點,已成為實現工業生產技術進步和開發機電一體化和智能化測控產品的重要手段。電子計數器是一種多功能的電子測量儀器,它利用電子學的方法測出一定時間內輸入的脈沖數目,并將結果以數字形式顯示出來。而基于單片機的紅外線計數器能夠滿足廣大廠家的要求,它擁有實時,精確,可靠,穩定等特點。
對射式傳感器計數是一種多功能的電子測量儀器。它利用對射式傳感器發射紅外線,當有車輛阻擋紅外線,紅外線中斷并轉換為電脈沖,并由放大電路進行放大,通過單片機分析,計算出進出車輛的次數,通過液晶顯示方式顯示進出車輛數從而進行計數。隨著紅外技術的提高,用于存在狀態的傳感,位置編碼極限傳感,運動檢測和計數(如風速儀、數控機床等)。典型應用:光柵尺、編碼器、邦定機、壓焊機、火花機、醫療儀器、atm取款機、自動售貨機、收款機、復印機、打印機、磁帶驅動、轉球式鼠標、工業設備、膠片感測、郵件存在/分揀、料位監控、輸送帶控制、過程控制、物料的到位監控等。隨著傳感器的不斷改進,抗干擾能力增強,可以在許多惡劣的地方代替科研人員進行科學工作。
本設計主要任務是以STC89C52單片機為核心,利用紅外對射式傳感器電路作為信號的輸入模塊進行車輛計數。基于單片機構成的車輛計數研究的主要內容包括:如對射式傳感器的應用以及發展、STC89C52單片機用何種方式對外部計數脈沖進行計數顯示控制、LCD顯示驅動模塊的選擇、STC89C52單片機的擴展、74LS245如何驅動繼電器與蜂鳴器工作的。
主要技術指標:
1.整個系統的抗干擾能力強
2.計數范圍廣:0000~9999
3.車輛計數值精確
第1章  理論分析及總體方案第1.1節 方案比較
三種不同設計方案:
方案一:如圖1-1所示:
   
圖1-1 紅外線計數器硬件框圖
原理闡述:專業檢測芯片形成計數脈沖后送給控制單元AT89C2051單片機。
通過對它片內計數、顯示編程。PS7219是專用LED顯示驅動芯片可以同時驅動8個7段數碼管。 X2504P是一塊有電源電壓監控、EEPROM 和看門狗定時器電路三種功能于一體的芯片,它保證了在電源接通、關斷、瞬間電源電壓不穩時,不會造成系統死機、數據誤寫或誤動作,大大提高了系統的可靠性和抗干擾能力.HT7044A能夠保證系統突然掉電后保護數據。
方案二:如圖1-2所示:
    圖1-2 紅外線計數器硬件框圖
原理闡述:通過紅外發射與接收對信號采集,使用了四合一芯片CL102計數控制顯示,它是集譯碼、驅動、鎖存、顯示一體。
方案三:如圖1-3所示:
圖1-3 對射式紅外傳感器計數硬件框圖
原理闡述:當有通過發射器發出的光線直接進入接收器,當被檢測物體經過發射器和接收器之前阻斷光線時,并將其放大、整流形成高電平信號送入控制單元。
方案一既可準確的實現車輛計數功能且能讓系統處于異常狀態和抗干擾時通過外圍專用芯片得到非常好的解決。外圍電路架設相對簡單、在市場上屬于高端計數產品,同時它也暴露出了一個重大問題:由于成本太貴的原因此類產品并沒有得到普及,故雖然這個方案只有舍棄。
方案二是一個簡易的產品自動計數器,價格低廉、計數精確。但在系統處于異常狀態時工作十分不穩定、也是屬于現在計數市場上的淘汰產品。僅用于在計數要求不高的場合中,這個方案太過于簡單故不選用。     
方案三便是這次畢業設計選用的方案。之所以選用主要是這個方案涉及面廣、輸出有效信號為低電平、可辨別不透明的反光物體、有效距離大、不易受干擾、高靈敏度、高解析、高亮度、低功耗、響應時間快、使用壽命長、無鉛、應用廣泛等特點。
第1.2節 總體設計方案
以STC89C52單片機為核心,利用紅外對射式傳感器電路作為信號的輸入模塊。按照設計的基本要求,可分為三個模塊,即數據采集模塊、控制器模塊、數據顯示模塊。其中數據采集模塊由紅外對射式傳感器組成,光線中斷后將信號送給控制模塊,由單片機完成對該信號的處理,由數據顯示模塊完成信息交換。在擴展功能上,本設計增加了一個繼電器電路、按鍵電路和過載報警電路。系統設計框圖,如圖1-4所示:
圖1-4 系統總體設計框圖
第2章  系統的硬件設計第2.1節 控制電路設計2.1.1. 單片機的發展及趨勢
1.CPU的改進
(1)增加CPU的數據總線寬度。例如,各種16位單片機和32位單片機,其數據處理能力要優于8位單片機。另外,8位單片機內部采用16位數據總線,其數據處理能力明顯優于一般8位單片機。
(2)采用雙CPU結構,以提高數據處理能力。
2.存儲器的發展
(1)片內的程序存儲器現在普遍采用閃速(Flash)存儲器。Flash存儲器能在+5V下讀/寫,既有靜態RAM的讀/寫操作簡便,又有在掉電時數據不會丟失的優點。使用片內Flash存儲器,單片機可不用片外擴展程序存儲器,大大簡化了其應用系統結構。
(2)加大存儲容量。目前有的單片機片內程序存儲器容量可達128 KB甚至更多。
3.片內I/O的改進
(1)增加并行口的驅動能力,以減少外部驅動芯片。有的單片機可以直接輸出大電流和高電壓,以便能直接驅動LED和VFD(熒光顯示器)。
(2)有些單片機設置了一些特殊的串行I/O功能,為構成分布式、網絡化系統提供了方便條件。
4.低功耗化
8位單片機產品已CMOS化,CMOS芯片的單片機具有功耗小的優點,而且為了充分發揮低功耗。
特點,這類單片機普遍配置有等待狀態、睡眠狀態、關閉狀態等工作方式。在這些狀態下低電壓工作作的單片機,其消耗的電流僅在μA或nA量級,非常適合于電池供電的便攜式、手持式的儀器儀表以及其他消費類電子產品。
5.外圍電路內裝化
隨著集成電路技術及工藝的不斷發展,把所需的眾多外圍電路全部裝入單片機內,即系統的單片化是目前單片機發展趨勢之一。例如,美國Cygnal公司的C8051F020 8位單片機,內部采用流水線結構,大部分指令的完成時間為1或2個時鐘周期,峰值處理能力為25MIPS。片上集成有8通道A/D、兩路D/A、兩路電壓比較器,內置溫度傳感器、定時器、可編程數字交叉開關和64個通用I/O口、電源監測、看門狗、多種類型的串行接口(兩個UART、SPI)等。一片芯片就是一個“測控”系統。
綜上所述,單片機正在向多功能、高性能、高速度(時鐘達40MHz)、低電壓(2.7V即可工作)、低功耗、低價格(幾元錢)、外圍電路內裝化以及片內程序存儲器和數據存儲器容量不斷增大的方向發展。
2.1.2. 主控芯片簡介
本設計上網主控芯片由單片機STC89C52控制完成;驹頌楫攲ι涫郊t外傳感器檢測部分檢測到有車輛經過時,紅外對射傳感器被中斷即產生一個低電平信號,這個信號將供給單片機進行計數控制。
計數控制部分是將計數脈沖送入單片機STC89C52兩個中斷入口的INT0入口,經過單片機內部對這個中斷信號進行計數編程。
單片機的引腳圖如圖2-1所示:
圖2-1 STC89C52RC引腳圖
主要特性如下:
1.時鐘電路
STC89C52內部有一個用于構成振蕩器的高增益反相放大器,引腳RXD和TXD分別是此放大器的輸入端和輸出端。時鐘可以由內部方式產生或外部方式產生。內部方式的時鐘電路如圖2—2(a) 所示,在RXD和TXD引腳上外接定時元件,內部振蕩器就產生自激振蕩。定時元件通常采用石英晶體和電容組成的并聯諧振回路。晶體振蕩頻率可以在1.2~12MHz之間選擇,電容值在5~30pF之間選擇,電容值的大小可對頻率起微調的作用。
外部方式的時鐘電路如圖2—2(b)所示,RXD接地,TXD接外部振蕩器。對外部振蕩信號無特殊要求,只要求保證脈沖寬度,一般采用頻率低于12MHz的方波信號。片內時鐘發生器把振蕩頻率兩分頻,產生一個兩相時鐘P1和P2,供單片機使用。
(a)內部方式時鐘電路        (b)外部方式時鐘電路
圖2—2時鐘電路
2.復位及復位電路
(1)復位操作
復位是單片機的初始化操作。其主要功能是把PC初始化為0000H,使單片機從0000H單元開始執行程序。除了進入系統的正常初始化之外,當由于程序運行出錯或操作錯誤使系統處于死鎖狀態時,為擺脫困境,也需按復位鍵重新啟動。
除PC之外,復位操作還對其他一些寄存器有影響,它們的復位狀態如表2-1所示:
表2-1 一些寄存器的復位狀態

   
   
(2)復位信號及其產生
RST引腳是復位信號的輸入端。復位信號是高電平有效,其有效時間應持續24個振蕩周期(即二個機器周期)以上。若使用頗率為6MHz的晶振,則復位信號持續時間應超過4us才能完成復位操作。
產生復位信號的電路邏輯如圖2—3所示:
圖2—3復位信號的電路邏輯圖
整個復位電路包括芯片內、外兩部分。外部電路產生的復位信號(RST)送至施密特觸發器,再由片內復位電路在每個機器周期的S5P2時刻對施密特觸發器的輸出進行采樣,然后才得到內部復位操作所需要的信號。
復位操作有上電自動復位相按鍵手動復位兩種方式。
上電自動復位是通過外部復位電路的電容充電來實現的,其電路如圖2—4(a)所示。這佯,只要電源Vcc的上升時間不超過1ms,就可以實現自動上電復位,即接通電源就成了系統的復位初始化。
按鍵手動復位有電平方式和脈沖方式兩種。其中,按鍵電平復位是通過使復位端經電阻與Vcc電源接通而實現的,其電路如圖2—4(b)所示;而按鍵脈沖復位則是利用RC微分電路產生的正脈沖來實現的。
其電路如圖2—4(c)所示:
        
(a)上電復位          (b)按鍵電平復位           (c)按鍵脈沖復位
圖2—4復位電路
上述電路圖中的電阻、電容參數適用于6MHz晶振,能保證復位信號高電平持續時間大于1個機器周期。
STC89C52具體介紹如下:
① 主電源引腳(2根)
VCC(Pin40):電源輸入,接+5V電源
GND(Pin20):接地線
②外接晶振引腳(2根)
XTAL1(Pin19):片內振蕩電路的輸入端
XTAL2(Pin20):片內振蕩電路的輸出端
③控制引腳(4根)
RST/VPP(Pin9):復位引腳,引腳上出現2個機器周期的高電平將使單片機復位。
ALE/PROG(Pin30):地址鎖存允許信號
PSEN(Pin29):外部存儲器讀選通信號
EA/VPP(Pin31):程序存儲器的內外部選通,接低電平從外部程序存儲器讀指令,如果接高電平則從內部程序存儲器讀指令。
④可編程輸入/輸出引腳(32根)
STC89C52單片機有4組8位的可編程I/O口,分別位P0、P1、P2、P3口,每個口有8位(8根引腳),共32根。
PO口(Pin39~Pin32):8位雙向I/O口線,名稱為P0.0~P0.7
P1口(Pin1~Pin8):8位準雙向I/O口線,名稱為P1.0~P1.7
P2口(Pin21~Pin28):8位準雙向I/O口線,名稱為P2.0~P2.7
P3口(Pin10~Pin17):8位準雙向I/O口線,名稱為P3.0~P3.7
STC89C52主要功能如表2-2所示:
表2-2  STC89C52主要功能
主要功能特性
兼容MCS51指令系統
   
8K可反復擦寫Flash ROM
32個雙向I/O口
   
256x8bit內部RAM
3個16位可編程定時/計數器中斷
   
時鐘頻率0-24MHz
2個串行中斷
   
可編程UART串行通道
2個外部中斷源
   
共6個中斷源
2個讀寫中斷口線
   
3級加密位
低功耗空閑和掉電模式
   
軟件設置睡眠和喚醒功能
2.1.3. 單片機最小系統的設計
STC89C52單片機的最小系統設計如圖2-5所示:
圖2-5 單片機最小系統圖
STC89C52單片機的最小系統由單片機、晶振電路、復位電路組成。其介紹如下:
(1)晶振電路為單片機提供時序使單片機能夠正常工作,在圖2-5中采用單片機內部振蕩方式。此時,只要接上兩個電容和一個晶振即可。電容的大小影響著振蕩的穩定性和起振的快速性,通常選擇10~30pF的相等的兩個瓷片電容。
(2)C3和R1構成了復位電路。剛開始上電時時,C3瞬間相當于短路,C3兩端保持0V電壓,VCC的電源電壓就都加在了R1上,因此在單片機9腳RST上變成了高電平,此后C3上逐漸充電,即在C3上出現電壓,R1上的電壓開始下降,最后單片機9腳RST上變成了低電平。在此過程中只要滿足單片機9腳RST上的高電平持續24個振蕩周期即可使單片機復位。
第2.2節 對射紅外檢測電路設計
對射紅外檢測電路由紅外對射式傳感器完成,對射式紅外傳感器由發射器和接收器組成,其工作原理是:通過發射器發出的光線直接進入接收器,當被檢測物體經過發射器和接收器之前阻斷光線時,產生電平信號,通過介質完成。對射式紅外傳感器的特點在于:可辨別不透明的反光物體,有效距離大,不易受干擾,高靈敏度,高解析,高亮度,低功耗,響應時間快,使用壽命長,無鉛,應用廣泛。當接收器接通工作電壓后,發射端上的紅色電源指示二極管就會點亮。接收端上有一個紅色的輸出狀態指示LED,正常情況下接收器能持續收到發射器發出的紅外信號,此時接收端上的輸出狀態指示LED熄滅,接收器的耗電保持在5毫安的低水平。在門開啟或關閉的過程中,若意外地有行人或車輛從門間通過,則從發射器發出的紅外信號被遮擋,接收器在此瞬間無法接收到該紅外信號。此時,接收端上的輸出狀態指示LED立即被點亮,導致接收器的耗電因此而上升到15毫安,此電流變化促使接收板上的輸出繼電器吸合,通過接線柱輸出一個閉合信號,對開門機發出停止運轉的指令。
圖2-6 紅外對射電路
如圖2-6所示,紅外線發射電路以時鐘定時集成芯片LM393AD為核心,可以將模擬量轉化為數字量。LM393是由兩個獨立的、高精度電壓比較器組成的集成電路,失調電壓低,最大為2.0mV。它專為獲得寬電壓范圍、單電源供電而設計,也可以以雙電源供電;而且無論電源電壓大小,電源消耗的電流都很低。它還有一個特性:即使是單電源供電,比較器的共模輸入電壓范圍接近地電平。
主要應用于限幅器、簡單的模/數轉換器、脈沖發生器、延時發生器、寬頻壓控振蕩器、MOS時鐘計時器、多頻振蕩器和高電平數字邏輯門電路。393被設計成能直接連接TTL和CMOS;當用雙電源供電時,它能兼容MOS邏輯電路——這是低功耗的393相較于標準比較器的獨特優勢。其管腳圖,如圖2-7所示:
         
管腳排列圖解(頂視)                管腳排列圖解(俯視)
圖2-7 LM393管腳圖
表2-3 管腳功能表

   
電源電壓
管腳功能,如表2-3:
應用說明:
LM393是高增益,寬頻帶器件,象大多數比較器一樣,如果輸出端到輸入端有寄生電容而產生耦合,則很容易產生振蕩。這種現象僅僅出現在當比較器改變狀態時,輸出電壓過渡的間隙。電源加旁路濾波并不能解決這個問題,標準PC板的設計對減小輸入—輸出寄生電容耦合是有助的。減小輸入電阻至小于10K將減小反饋信號,而且增加甚至很小的正反饋量(滯回1.0~10mV)能導致快速轉換,使得不可能產生由于寄生電容引起的振蕩。除非利用滯后,否則直接插入IC并在引腳上加上電阻將引起輸入—輸出在很短的轉換周期內振蕩,如果輸入信號是脈沖波形,并且上升和下降時間相當快,則滯回將不需要。比較器的所有沒有用的引腳必須接地。
LM393偏置網絡確立了其靜態電流與電源電壓范圍 2.0~30V無關。
通常電源不需要加旁路電容。
差分輸入電壓可以大于Vcc并不損壞器件.保護部分必須能阻止輸入電壓向負端超過-0.3V。LM393的輸出部分是集電極開路,發射極接地的 NPN輸出晶體管,可以用多集電極輸出提供。
功能:輸出負載電阻能銜接在可允許電源電壓范圍內的任何電源電壓上,不受 Vcc端電壓值的限制.此輸出能作為一個簡單的對地SPS開路(當不用負載電阻沒被運用),輸出部分的陷電流被可能得到的驅動和器件的β值所限制,當達到極限電流(16mA)時,輸出晶體管將退出而且輸出電壓將很快上升,輸出飽和電壓被輸出晶體管大約60ohm 的γSAT限制。當負載電流很小時,輸出晶體管的低失調電壓(約1.0mV)允許 輸出箝位在零電平。
第2.3節 液晶顯示電路設計
液晶顯示屏的英文名稱是Liquid Crystal Display(Device),簡稱LCD。根據LCD所采用的材料構造,可把液晶分為TN、STN、TFT等三大類,而據目前的技術原理又可以將它們再次分為TN、STN、FSTN、DSTN、TFT等諸多類別:
LCD的特點是體積小、形狀薄、重量輕、耗能少(1~10微瓦/平方厘米)、低發熱、工作電壓低(1.5~6伏)、無污染,無輻射、無靜電感應,尤其是視域寬、顯示信息量大、無閃爍,并能直接與CMOS集成電路相匹配,同時還是真正的“平板”式顯示設備。這些特點正在使顯示領域從傳統CRT走向LCD。本設計選擇的是諾基亞5110液晶顯示器,其原理圖如圖2-8所示,各個引腳功能說明如表2-4所示:
圖2-8諾基亞5110液晶顯示器原理圖
表2-4各個引腳功能說明

   
對應背光板上2個定位柱
該液晶具有以下特點:
●84x48 的點陣LCD,可以顯示4 行漢字,
●采用串行接口與主處理器進行通信,接口信號線數量大幅度減少,包括電源和地在內的信號線僅有9 條。支持多種串行通信協議(如AVR 單片機的SPI、MCS51 的串口模式0等),傳輸速率高達4Mbps,可全速寫入顯示數據,無等待時間。
●可通過導電膠連接模塊與印制版,而不用連接電纜,用模塊上的金屬鉤可將模塊固定到印制板上,因而非常便于安裝和更換。
●LCD 控制器/驅動器芯片已綁定到LCD 晶片上,模塊的體積很小。
●采用低電壓供電,正常顯示時的工作電流在200μA 以下,且具有掉電模式。連線圖如圖2-9所示:
圖2-9 諾基亞5110液晶顯示器連線圖
第2.4節 繼電器開關電路與報警電路的設計2.4.1. 74LS245芯片介紹
74LS245是我們常用的芯片,本設計采用來驅動繼電器和蜂鳴器,它是8路同相三態雙向總線收發器,可雙向傳輸數據。
74LS245還具有雙向三態功能,既可以輸出,也可以輸入數據。 當單片機的P0口總線負載達到或超過P0最大負載能力時,必須接入74LS245等總線驅動器。
圖2-10 74LS245引腳圖
如圖2-10所示,當片選端/CE低電平有效時,DIR=“0”,信號由 B 向 A 傳輸;(接收)。DIR=“1”,信號由 A 向 B 傳輸;(發送)當/CE為高電平時,A、B均為高阻態。由于P2口始終輸出地址的高8位,接口時74LS245的三態控制端/1G和/2G接地,P2口與驅動器輸入線對應相連。
P0口與74LS245輸入端相連,/E端接地,保證數據現暢通。8051的/RD和/PSEN相與后接DIR,使得/RD或/PSEN有效時,74LS245輸入(P0.i←Di),其它時間處于輸出(P0.i→Di)。
2.4.2. 繼電器開關電路設計
為了驅動繼電器導通時線圈有足夠的磁力,在繼電器之前加了74LS245驅動。繼電器一般由鐵芯、線圈、銜鐵、觸點簧片等組成的。只要在線圈兩端加上一定的電壓,線圈中就會流過一定的電流,從而產生電磁效應,銜鐵就會在電磁力吸引的作用下克服返回彈簧的拉力吸向鐵芯,從而帶動銜鐵的動觸點與靜觸點(常開觸點)吸合。當線圈斷電后,電磁的吸力也隨之消失,銜鐵就會在彈簧的反作用力返回原來的位置,使動觸點與原來的靜觸點(常閉觸點)釋放。這樣吸合、釋放,從而達到了在電路中的導通、切斷的目的。對于繼電器的“常開、常閉”觸點,可以這樣來區分:繼電器線圈未通電時處于斷開狀態的靜觸點,稱為“常開觸點”;處于接通狀態的靜觸點稱為“常閉觸點”。繼電器一般有兩股電路,為低壓控制電路和高壓工作電路,其原理圖如圖2-11所示,繼電器A1恒為高電平,當74LS245的relay為低電平時,繼電器的A2為低電平,繼電器處于通電狀態,開關閉合,B0、B1處于導通狀態,發光二級管點亮。
圖2-11繼電器連線圖
2.4.3. 蜂鳴器報警電路設計
為了保證蜂鳴器足夠的響亮,在蜂鳴器之前也加了74LS245驅動。本設計采用軟件處理報警,利用有源蜂鳴器進行報警輸出,采用直流供電。蜂鳴器的A0也恒為高電平,當74LS245的buzzer為低電平時,蜂鳴器的A1為低電平,此時蜂鳴器報警。報警電路硬件連接見下圖2-12所示:
圖2-12 蜂鳴器電路連接圖
第2.5節 按鍵電路設計
為了使設計操作更加方便,設計了按鍵電路,這樣就可以人為設定車輛進出值。圖2-13為設計的按鍵電路圖。S1、S2按鍵按下,車輛加、減”1”;S3按鍵按一次,S1、S2按鍵按下,車輛數加、減“10”;S3按鍵按二次,S1、S2按鍵按下,車輛數加、減“100”;S3按鍵按三次,系統復位。S3按鍵按四次,恢復到復位前的車輛數,開始接著計數。
圖2-13按鍵電路圖
第3章  系統的程序設計第3.1節 主程序設計
STC89C52RC單片機可以用匯編語言和C語言進行編程。匯編語言與機器指令一一對應,所以用匯編語言編寫的程序在單片機里運行起來效率較高,而且對于對射式紅外計數器數據的讀寫上,所用到的語句比較簡單易懂。而C語言程序可讀性高,更便于理解。本設計使用C語言編程。
第一次開機,系統進行初始化,LCD顯示初始數字,對停車場內的車輛數進行設定一個初值N,并開始運行。如果有物體通過進入對射式紅外傳感器時,繼電器開關打開,LED燈點亮,LCD的最后一位開始累加。如果這個時候有物體通過駛出紅外對射式傳感器時,另一繼電器開關打開,LED點亮,LCD的最后一位開始累減。如果這個時候有兩個物體同時通過駛出和駛入對射式紅外傳感器時,兩個繼電器開關同時打開,兩個發光二極管LED同時點亮,LCD的最后一位開始累加。當此停車場車輛數大于500時,蜂鳴器報警,等待復位命令重新進行計數。
圖3-1 主程序流程圖
第3.2節 數據采集模塊程序設計
數據采集模塊主要是指在系統開始運行時,當有車輛經過紅外對射式傳感器時,紅外傳感器的發射器和接收器之間阻斷光線時,形成電平信號,經過放大、整流并送入單片機控制模塊進行控制計數。開始,首先是接通電源對設備初始化,啟動紅外對射式傳感器,判斷光線是否被阻斷,若光線被阻斷將數據儲存轉化并送入單片機控制系統,最后返回到主程序,其流程圖如圖3-2:
圖3-2 數據采集流程圖
第3.3節 液晶顯示程序設計
顯示程序設計主要顯示當前車輛數:首先,開始顯示初始化界面,顯示“停車場計數、作者:韓年猛”、“當前車輛數: 100”,完后判斷有無車輛通過紅外對射式傳感器,如果沒有返回到上一步,如果有車輛通過則經單片機控制后顯示控制后的當前車輛數,超出500輛車,則蜂鳴器報警,結束返回。其流程圖如圖3-3:
圖3-3 液晶顯示流程圖
第4章  系統測試
調試工作可分硬件調試和軟件調試兩個部分,調試方法如下:
第4.1節 系統的硬件調試
首先,軟件調試之前主要是先制作硬件電路板,然后用萬用表等工具對電路檢查,最后應用程序進行功能調試。硬件調試比較費時,需要細心和耐心,也需要熟練掌握電路原理。
然后,用仿真軟件keil進行軟件調試,該軟件提供一個集成開發環境u-Vision,它包括C編輯器、宏編輯器、連接器、庫管理和一個功能強大的仿真調試器。通過編譯、運行,可以檢查程序錯誤。但應用此方法,仍需要十分了解所使用元器件的工作方式和管腳連接方式。
第4.2節 系統的軟件調試   
本次設計則是直接完成電路的硬件設計,出現的硬件問題基本解決,主要在軟件的程序上進行調試。
在軟件調試過程中,曾遇到以下問題:
當硬件初次開機的時候,發現LCD亮度不夠均勻。進行分析,是程序設里面對顯示程序的延時不夠造成的。對于本系統的硬件調試中,對于單個端口(進口或者出口,另一個端口不接通)進行仿真調試可以實現,然而兩個端口同時接通,系統卻不進行工作,經分析,是程序編輯問題。
在調試按鍵的時候,當按下S1按鍵,系統顯示正常,再按下S2按鍵則沒有任何反應。查詢程序,由于端口編寫有誤。
第4.3節 測試及結果
給電路供電后,LCD上顯示:“停車場計數”,“作者:韓年猛”, “當前車輛數:100”。表示等待車輛進入,當有車輛進出時,繼電器打開,LED點亮,車輛數超過500時,系統報警。S3按鈕按一次,S1、S2按下,車輛加減”1”;S3按鈕按二次,S1、S2按下,車輛數加減“10”;S3按鈕按三次,S1、S2按下,車輛數加減“100”;S3按鈕按四次,系統復位。測試結果見附件一。
結論
經過幾個月的努力設計出基于單片機的停車場計數功能,基本符合設計要求。基于單片機構成的計數器能夠實現實時、穩定、精確的計數。對這個課題進行深入的研究。采用STC89C52為控制單元的車輛計數器就可以很好的提高整個系統的抗干擾能力。
通過本次設計,對單片機的內部模塊更加熟悉,使用上也更加的清晰,對于今后用單片機設計產品提供了極大的幫助,并且培養了良好的編程習慣,對子程序命名的規范。對傳感器的選擇使用上,有了一定的良好意識。對液晶顯示屏與數碼管的區別有了一定的認識,理解兩者之間的差別。
參考文獻
[1]. 王松德、朱小龍,對射式紅外線計數器的設計[J],農業機械學報,2005,36卷 7期
[2]. 劉向宇、秦龍,PIC單片機C語言[M],電子工業出版社,2010
[3]. 金杰,單片機技術應用項目教程[M],電子工業出版社,2010
[4]. 來清民,傳感器與單片機接口及實例[M],北京航空航天大學出版社,2008
[5]. 王慶友,光電傳感器應用技術[M],機械工業出版社,2007
[6]. 林雪梅,熱釋電紅外傳感器及其應用[J],甘肅科技縱橫,2005
[7]. 艾紅、孫碩.,紅外測量在車流量監測中的應用,北京信息科技大學自動化學院控制工程系,北京 100085
[8]. 肖興達、李繼方,基于熱釋電紅外傳感器的車流檢測裝置[J] 激光與紅外 2005
[9]. 張洪潤等,傳感器技術大全(上冊)[M],北京航空航天大學出版社,2007
[10]. 江曉軍,光電傳感與檢測技術[M], 機械工業出版社,2011
致謝
感謝學院給我提供了一個展現自己的平臺,給了我一次煅煉機會,提高我的動手能力和并把知識付諸于實踐。本設計的完成是在彭靜玉老師的細心指導下進行的,每次設計遇到問題時彭老師不辭辛苦的講解才使得我的設計順利的進行。從設計的選題到資料的搜集直至最后設計的修改的整個過程中,花費了彭老師很多的寶貴時間和精力,在此向彭老師表示衷心地感謝!彭老師嚴謹的治學態度,開拓進取的精神和高度的責任心都將使我受益終生!還要感謝我的幾位同學,是你們在我平時設計中和我一起探討問題,并指出我設計上的誤區,使我能及時的發現問題把設計順利的進行下去,沒有你們的幫助我不可能這樣順利地結稿,在此表示深深的謝意。
附錄
附錄1:原理圖及實物照片說明
   
附錄2:部分源程序
主文件程序
#include <reg51.h>
sbit SCLK = P2^5;               
sbit SDIN = P2^4;      
sbit LCD_DC = P2^3;      
sbit LCD_CE = P2^2;               
sbit LCD_RST = P2^1;
void LCD_init(void);
void LCD_clear(void);
void LCD_move_chinese_string(unsigned char X, unsigned char Y, unsigned char T);
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s);
void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row);
void chinese_string(unsigned char X, unsigned char Y, unsigned char T);                 
void LCD_write_char(unsigned char c);
void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,unsigned char Pix_x,unsigned char Pix_y);
void LCD_write_byte(unsigned char dat, unsigned char dc);
void LCD_set_XY(unsigned char X, unsigned char Y);
void delay_1us(void);
extern void delay_nms(unsigned int n) ;
void LCD_write_number(unsigned char x);
void number_saved();
unsigned int x;
sbit count_in=P1^0;
sbit count_out=P1^1;
#define                delay_time        25767
void main(void)
{      
        LCD_init(); //初始化液晶   
        LCD_clear();
      
                LCD_write_chinese_string(6,2,12,5,6,4); //停車場計數
                LCD_write_chinese_string(2,4,12,6,0,0); //作者:哈年猛
                delay_nms(380);
                LCD_clear();
                LCD_write_chinese_string(0,1,12,6,11,0);//當前車輛數
               
                x=100;
                number_saved() ;
                  while(1)
                {
               
                       
          if(count_in )//如果有車輛,則執行下面的
          {
          delay_nms(2);//消斗
         if(count_in)
          {
                  x++;
                number_saved();         while(count_in);//松開有效
                }
          }
         
          if(count_out )
          {
                  delay_nms(2);
        if(count_out )
                {
                x--;
                number_saved();                while(count_out);
               
                }
          }
         
                }
}
void LCD_write_number(unsigned char x)
{
        switch(x)
        {
                case 0:        LCD_write_char('0');break;
                case 1:        LCD_write_char('1');break;
                case 2:        LCD_write_char('2');break;
                case 3:        LCD_write_char('3');break;
                case 4:        LCD_write_char('4');break;
                case 5:        LCD_write_char('5');break;
                case 6:        LCD_write_char('6');break;
                case 7:        LCD_write_char('7');break;
                case 8:        LCD_write_char('8');break;
                case 9:        LCD_write_char('9');break;
        }
}
void number_saved()
{
                LCD_set_XY(48,4);
                LCD_write_number(x/1000);
               
                LCD_set_XY(54,4);
                LCD_write_number(x%1000/100);
                              
                LCD_set_XY(60,4);
                LCD_write_number(x%100/10);
               
                LCD_set_XY(66,4);
                LCD_write_number(x%10);
}
/****************以下是液晶驅動函數*****************/
#include <reg51.h>
sbit SCLK = P2^5;               
sbit SDIN = P2^4;      
sbit LCD_DC = P2^3;      
sbit LCD_CE = P2^2;               
sbit LCD_RST = P2^1;
void LCD_init(void);
void LCD_clear(void);
void LCD_move_chinese_string(unsigned char X, unsigned char Y, unsigned char T);
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s);
void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row);
void chinese_string(unsigned char X, unsigned char Y, unsigned char T);                 
void LCD_write_char(unsigned char c);
void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,unsigned char Pix_x,unsigned char Pix_y);
void LCD_write_byte(unsigned char dat, unsigned char dc);
void LCD_set_XY(unsigned char X, unsigned char Y);
void delay_1us(void);  
code unsigned char write_chinese[][24]={
/*--  文字:  作  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x10,0x08,0xFC,0x13,0x08,0x04,0xFF,0x24,0x24,0x24,0x04,0x00,0x00,0x00,0x07,0x00,
0x00,0x00,0x07,0x01,0x01,0x01,0x01,0x00,
/*--  文字:  者  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x10,0x12,0x92,0xD2,0x7F,0x52,0x5A,0x56,0xD2,0x19,0x10,0x00,0x01,0x01,0x00,0x07,
0x05,0x05,0x05,0x05,0x07,0x00,0x00,0x00,
/*--  文字:  :  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  韓  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x02,0xFA,0xAF,0xAA,0xFA,0x20,0x2A,0xFF,0x2A,0x2A,0xEA,0x00,0x02,0x02,0x07,0x02,
0x02,0x02,0x00,0x07,0x01,0x02,0x01,0x00,
/*--  文字:  年  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x88,0x84,0xF3,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  猛  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x8A,0x44,0xFA,0x01,0x88,0xA9,0xA9,0xBD,0x8B,0x89,0x88,0x00,0x04,0x04,0x03,0x04,
0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x00,
/*--  文字:  停  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x10,0xFC,0x03,0x62,0xBA,0xAA,0xAB,0xAA,0xAA,0xBA,0x62,0x00,0x00,0x07,0x00,0x00,
0x00,0x04,0x04,0x07,0x00,0x00,0x00,0x00,
/*--  文字:  車  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x02,0x22,0x32,0x2E,0x23,0xFA,0x22,0x22,0x22,0x22,0x02,0x00,0x01,0x01,0x01,0x01,
0x01,0x07,0x01,0x01,0x01,0x01,0x01,0x00,
/*--  文字:  場  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x08,0x08,0xFF,0x88,0x49,0x91,0x79,0x95,0x73,0x11,0xF0,0x00,0x03,0x01,0x00,0x00,
0x05,0x02,0x01,0x04,0x04,0x06,0x01,0x00,
/*--  文字:  計  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x10,0xF1,0x02,0x00,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,0x00,0x07,0x02,0x01,
0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,
/*--  文字:  數  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0xA5,0x96,0xCC,0xBF,0x96,0xA5,0x18,0x67,0x84,0x7C,0x04,0x00,0x04,0x05,0x02,0x02,
0x03,0x04,0x04,0x02,0x01,0x02,0x04,0x00,
/*--  文字:  當  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x10,0x92,0x94,0x90,0x90,0x9F,0x90,0x98,0x94,0xF2,0x00,0x00,0x04,0x04,0x04,0x04,
0x04,0x04,0x04,0x04,0x04,0x07,0x00,0x00,
/*--  文字:  前  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x04,0xF4,0x54,0x55,0xF6,0x04,0x06,0xF5,0x04,0xF6,0x04,0x00,0x00,0x07,0x01,0x05,
0x07,0x00,0x00,0x05,0x04,0x07,0x00,0x00,
/*--  文字:  車  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x02,0x22,0x32,0x2E,0x23,0xFA,0x22,0x22,0x22,0x22,0x02,0x00,0x01,0x01,0x01,0x01,
0x01,0x07,0x01,0x01,0x01,0x01,0x01,0x00,
/*--  文字:  輛  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x3A,0x27,0xFA,0xA2,0xFA,0x8A,0x7E,0x8A,0x7E,0x8B,0xFA,0x00,0x01,0x01,0x07,0x00,
0x07,0x00,0x00,0x01,0x04,0x04,0x07,0x00,
/*--  文字:  數  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0xA5,0x96,0xCC,0xBF,0x96,0xA5,0x18,0x67,0x84,0x7C,0x04,0x00,0x04,0x05,0x02,0x02,
0x03,0x04,0x04,0x02,0x01,0x02,0x04,0x00,
/*--  文字:  :  --*/
/*--  宋體9;  此字體下對應的點陣為:寬x高=12x12   --*/
/*--  高度不是8的倍數,現調整為:寬度x高度=12x16  --*/
0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
        };
code unsigned char font6x8[][6] =
{
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp
    { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !
    { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },   // "
    { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #
    { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $
    { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },   // %
    { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },   // &
    { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },   // '
    { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (
    { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )
    { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 },   // *
    { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 },   // +
    { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 },   // ,
    { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },   // -
    { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },   // .
    { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },   // /
    { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0
    { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1
    { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2
    { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3
    { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4
    { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5
    { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6
    { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7
    { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8
    { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E },   // 9
    { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },   // :
    { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;
    { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },   // <
    { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },   // =
    { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },   // >
    { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?
    { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E },   // @
    { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },   // A
    { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 },   // B
    { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 },   // C
    { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C },   // D
    { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 },   // E
    { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 },   // F
    { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A },   // G
    { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F },   // H
    { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 },   // I
    { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 },   // J
    { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 },   // K
    { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 },   // L
    { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F },   // M
    { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F },   // N
    { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E },   // O
    { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 },   // P
    { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E },   // Q
    { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 },   // R
    { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },   // S
    { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 },   // T
    { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F },   // U
    { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F },   // V
    { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F },   // W
    { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },   // X
    { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },   // Y
    { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },   // Z
    { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 },   // [
    { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 },   // 55
    { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^
    { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },   // _
    { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },   // '
    { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },   // a
    { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 },   // b
    { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },   // c
    { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F },   // d
    { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },   // e
    { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 },   // f
    { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C },   // g
    { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 },   // h
    { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 },   // i
    { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 },   // j
    { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 },   // k
    { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 },   // l
    { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 },   // m
    { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 },   // n
    { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },   // o
    { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 },   // p
    { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC },   // q
    { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 },   // r
    { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },   // s
    { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 },   // t
    { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C },   // u
    { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C },   // v
    { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C },   // w
    { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },   // x
    { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C },   // y
    { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 },   // z
    { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 }    // horiz lines
};
void delay_1us(void)                 //1us延時函數
  {
   unsigned int i;
  for(i=0;i<1000;i++);
  }
  void delay_1ms(void)                 //1ms延時函數
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延時函數
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
  }
void LCD_init(void)
  {
            // 產生一個讓LCD復位的低電平脈沖
   LCD_RST = 0;
    delay_1us();
   LCD_RST = 1;
   
                // 關閉LCD
   LCD_CE = 0;
    delay_1us();
                // 使能LCD
   LCD_CE = 1;
    delay_1us();
    LCD_write_byte(0x21, 0);        // 使用擴展命令設置LCD模式
    LCD_write_byte(0xc8, 0);        // 設置偏置電壓
    LCD_write_byte(0x06, 0);        // 溫度校正
    LCD_write_byte(0x13, 0);        // 1:48
    LCD_write_byte(0x20, 0);        // 使用基本命令
    LCD_clear();                // 清屏
    LCD_write_byte(0x0c, 0);        // 設定顯示模式,正常顯示
        
           // 關閉LCD
   LCD_CE = 0;
  }
void LCD_clear(void)
  {
    unsigned int i;
    LCD_write_byte(0x0c, 0);                       
    LCD_write_byte(0x80, 0);                       
    for (i=0; i<504; i++)
      LCD_write_byte(0, 1);                       
  }
/*-----------------------------------------------------------------------
LCD_set_XY        : 設置LCD坐標函數
輸入參數:X       :0-83
          Y       :0-5
-----------------------------------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
  {
    LCD_write_byte(0x40 | Y, 0);                // column
    LCD_write_byte(0x80 | X, 0);                  // row
  }
/*-----------------------------------------------------------------------
LCD_write_char    : 顯示英文字符
輸入參數:c       :顯示的字符;
-----------------------------------------------------------------------*/
void LCD_write_char(unsigned char c)
  {
    unsigned char line;
    c -= 32;
    for (line=0; line<6; line++)
      LCD_write_byte(font6x8[c][line], 1);
  }
/*-----------------------------------------------------------------------
LCD_write_english_String  : 英文字符串顯示函數
輸入參數:*s      :英文字符串指針;
          X、Y    : 顯示字符串的位置,x 0-83 ,y 0-5               
-----------------------------------------------------------------------*/
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
  {
    LCD_set_XY(X,Y);
    while (*s)
      {
         LCD_write_char(*s);
         s++;
      }
  }
/*-----------------------------------------------------------------------
LCD_write_chinese_string: 在LCD上顯示漢字
輸入參數:X、Y    :顯示漢字的起始X、Y坐標;
          ch_with :漢字點陣的寬度
          num     :顯示漢字的個數;  
          line    :漢字點陣數組中的起始行數
          row     :漢字顯示的行間距
測試:
        LCD_write_chi(0,0,12,7,0,0);
        LCD_write_chi(0,2,12,7,0,0);
        LCD_write_chi(0,4,12,7,0,0);      
-----------------------------------------------------------------------*/                        
void LCD_write_chinese_string(unsigned char X, unsigned char Y,
                   unsigned char ch_with,unsigned char num,
                   unsigned char line,unsigned char row)
  {
    unsigned char i,n;
   
    LCD_set_XY(X,Y);                             //設置初始位置
   
    for (i=0;i<num;)
      {
              for (n=0; n<ch_with*2; n++)              //寫一個漢字
                {
                  if (n==ch_with)                      //寫漢字的下半部分
                    {
                      if (i==0) LCD_set_XY(X,Y+1);
                      else
                         LCD_set_XY((X+(ch_with+row)*i),Y+1);
              }
                  LCD_write_byte(write_chinese[line+i][n],1);
                }
              i++;
              LCD_set_XY((X+(ch_with+row)*i),Y);
      }
  }
  
/*-----------------------------------------------------------------------
LCD_draw_map      : 位圖繪制函數
輸入參數:X、Y    :位圖繪制的起始X、Y坐標;
          *map    :位圖點陣數據;
          Pix_x   :位圖像素(長)
          Pix_y   :位圖像素(寬)
-----------------------------------------------------------------------*/
void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,
                  unsigned char Pix_x,unsigned char Pix_y)
  {
    unsigned int i,n;
    unsigned char row;
   
    if (Pix_y%8==0) row=Pix_y/8;      //計算位圖所占行數
      else
        row=Pix_y/8+1;
   
    for (n=0;n<row;n++)
      {
              LCD_set_XY(X,Y);
        for(i=0; i<Pix_x; i++)
          {
            LCD_write_byte(map[i+n*Pix_x], 1);
          }
        Y++;                         //換行
      }      
  }
void LCD_write_byte(unsigned char dat, unsigned char command)
  {
    unsigned char i;
    //PORTB &= ~LCD_CE ;                        // 使能LCD
    LCD_CE = 0;
   
    if (command == 0)
     // PORTB &= ~LCD_DC ;                // 傳送命令
     LCD_DC = 0;
    else
     // PORTB |= LCD_DC ;                        // 傳送數據
     LCD_DC = 1;
                for(i=0;i<8;i++)
                {
                        if(dat&0x80)
                                SDIN = 1;
                        else
                                SDIN = 0;
                        SCLK = 0;
                        dat = dat << 1;
                        SCLK = 1;
                }
   // SPDR = data;                        // 傳送數據到SPI寄存器
    //while ((SPSR & 0x80) == 0);         // 等待數據傳送完畢
      
    //PORTB |= LCD_CE ;                        // 關閉LCD
     LCD_CE = 1;
  }



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:668657 發表于 2020-1-7 22:14 來自觸屏版 | 只看該作者
程序和仿真圖呢
回復

使用道具 舉報

板凳
ID:750900 發表于 2020-5-13 16:07 | 只看該作者
有仿真圖嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品久久久久 | 99精品国产一区二区三区 | 亚洲一区二区免费电影 | 国产精品影视 | 亚洲精品一区二区在线观看 | 欧美日韩在线一区 | 一级黄在线观看 | 亚欧洲精品在线视频免费观看 | 久久综合九九 | 一区二区免费高清视频 | 色综网 | 国产视频福利 | 精品国产一级片 | 久久精品色欧美aⅴ一区二区 | 超碰伊人 | 日日草天天干 | 久久新 | 精品一区二区三区中文字幕 | 91视频91| 国产免费自拍 | 免费毛片网 | 亚洲精品乱码久久久久久9色 | 91在线精品视频 | 久久久久久久久久一区二区 | 欧美激情在线观看一区二区三区 | 成人精品国产一区二区4080 | 精品一二区 | 米奇狠狠鲁 | www国产成人免费观看视频,深夜成人网 | 成人亚洲性情网站www在线观看 | 日本精品一区二区三区在线观看视频 | av黄在线观看| 中文字幕在线视频精品 | 日日操av | 乱码av午夜噜噜噜噜动漫 | 久久这里只有精品首页 | 欧美日韩视频在线第一区 | 国产精品不卡 | 羞羞视频网站 | 日日操夜夜操天天操 | 午夜免费福利电影 |