基于單片機微型打印機系統(tǒng)控制設(shè)計
《基于單片機微型打印機系統(tǒng)控制設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《基于單片機微型打印機系統(tǒng)控制設(shè)計(45頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、精選優(yōu)質(zhì)文檔-----傾情為你奉上 基于單基片機的微型打印機的設(shè)計 摘 要 目前,電子領(lǐng)域正向著數(shù)字化、信息化、微型化發(fā)展。打印機作為數(shù)字輸出設(shè)備之一也朝著多功能、高性能的方向發(fā)展。微型打印機是電子信息領(lǐng)域一種很重要的輸出設(shè)備。 本文設(shè)計的主要目的是運用單片機來控制微型打印機來實現(xiàn)打印的目的。本設(shè)計基于榮達RD-E系列微型打印機,以單片機P80C51以核心元件,輔以必要的外圍電路(包括實時時鐘電路、溫度傳感器和液晶顯示模塊、按鍵、打印機),采用并行接口技術(shù),同時通過液晶顯示器顯示打印的數(shù)字和文字信息??梢詫崿F(xiàn)打印一段固定的文字和單個任意的數(shù)字,同時把打印的內(nèi)容顯示在液晶屏
2、上。本文主要用溫度傳感器測量溫度,再通過單片機控制熱敏電阻打印機打印出小票,設(shè)計了時鐘接口電路,打印機接口電路,溫度傳感器接口電路和液晶顯示接口電路。再輔助軟件設(shè)計來進行調(diào)試。 關(guān) 鍵 詞:打印機,單片機,液晶顯示器,DS1302時鐘 BASED 0N A SINGLE SUBSTRATE MACHINE DESIGNED FOR MICRO PRINTER ABSTRACT At present, the electronics field is developing towards digitalizati
3、on, information, miniaturation. Printer, as one of the digital output devices are also moving into the direction of multi-function, high performance. The micro printer.It is a kind of important electronic information field output device. Design is the main purpose of this article is to use single-c
4、hip microcomputer to control the micro printer for printing purposes. This design based on RD - E series micro printer, P80C51 MCU core components, supplemented by the necessary peripheral circuit (including real time clock circuit, temperature sensor and LCD display module, keys, printer), USES the
5、 parallel interface technology, at the same time, through the LCD display to print Numbers and text messages. Can achieve print a fixed text and a single arbitrary Numbers, and at the same time to print the contents of the display on the LCD screen. Temperature is measured in this paper, with a temp
6、erature sensor, and controlled by single chip thermal resistor printer to print out receipts, designs the interface circuit, clock printer interface circuit and temperature sensor interface circuit and LCD interface circuit. Auxiliary software designed to debug. KEY WORDS:printers, microcontrolle
7、r, liquid crystal display, DS1302 clock 目 錄 專心---專注---專業(yè) 前 言 近年,隨著社會的發(fā)展生活日新月異。人們的工作的也很繁雜,各種大大小小的公司都得到了
8、很大的發(fā)展,公司在日常發(fā)展中難免需要打印各種各樣的文件和資料,所 以各種各樣的打印機也得到很好的應用,但許多打印機成本都很高,體積也比較大,而且性能以及其他的一些都不是很好,所以人們開始研究新型的微型打印機,微型打印機已經(jīng)走進我們的生活中來了,它跟以往的大型打印進來說,最大的優(yōu)點就是體積小,節(jié)約了空間,而且外觀優(yōu)美,性能可觀,而且價格相對以往的來說會便宜許多,性價比很高,其特有的多份拷貝、復寫打印和連續(xù)打印功能,使許多專業(yè)打印領(lǐng)域?qū)ζ淝橛歇氱?。它越來越趨向于被設(shè)計成各種各樣的專業(yè)類型,用以打印各類專業(yè)性較強的報表、存折、發(fā)票、車票、卡片等輸出介質(zhì)。所以微型打印機的前景相當可觀。 從1946
9、年日本大和公司(即現(xiàn)在的EPSON公司)研制出第一臺微型打印機開始,微型打印機如今已有60年的歷史。在這60年里,微型打印機技術(shù)獲得了突飛猛進的發(fā)展。從最初的點陣式打印方式,已經(jīng)擴展到現(xiàn)今的近10種微型打印方式,包括梭式打印、9針擊打、24針擊打、噴墨打印、熱敏打印等。其產(chǎn)品種類也百花齊放,包括工業(yè)儀器、商場POS、醫(yī)院收費、話費清單、餐廳、銀行、加油站、路橋收費等領(lǐng)域都會有它的身影。目前,在國內(nèi)微打市場上主要有EPSON、STAR、SAMSUNG等國際品牌和實達、公達、博施等國內(nèi)品牌。其配套的設(shè)備主要有:收款機、觸摸POS終端、電腦等多項設(shè)備幾乎所有需要打印的地方。 本課題以單片機為核心,
10、設(shè)計和微型打印機的接口電路,編寫微型打印機驅(qū)動程序,實現(xiàn)特定信息的打印輸出。首先系統(tǒng)硬件部分選用MCS-51單片機系列,顯示器部分由液顯示編寫驅(qū)動程序用keil,打印格式是由打印機芯片用電磁鐵打針,再用按鍵的方式按打印格式輸出。 第1章 系統(tǒng)總體設(shè)計 §1.1總體設(shè)計框圖 基于單片機的微型打印機的設(shè)計的總體設(shè)計框圖,如圖1-1 圖1-1總體設(shè)計框圖 §1.2 系統(tǒng)功能簡介 1、溫度傳感器測量的當前溫度值,通過主控制器在液晶屏上顯示當前溫度和時間。 2、按鍵操作可以決定微型打印機的開始,即按鍵后打印機開始打印。 第2章 系統(tǒng)硬件設(shè)計 §2.1 主控制器部分的設(shè)計
11、 §2.1.1主控芯片的選擇 P80C51基于80C51內(nèi)核采用高密度CMOS技術(shù)設(shè)計制造,包含中央處理單元、片內(nèi)4k程序存儲器,128字節(jié)內(nèi)部數(shù)據(jù)存儲器RAM、32個雙向輸入/輸出(I/O)口、3個16位定時/計數(shù)器和6個中斷源,4層優(yōu)先級中斷嵌套結(jié)構(gòu),可用于多機通信的串行I/O口,I/O擴展或全雙工UART,片內(nèi)時鐘振蕩電路。 此外,P80C51采用低功耗靜態(tài)設(shè)計,寬工作電壓范圍(2.7-5.5V),寬工作頻率(可為0Hz),兩種軟件方式選擇電源空閑和掉電模式。空閑模式下,凍結(jié)CPU而RAM定時器、串行口和中斷系統(tǒng)維持其功能。由于是靜態(tài)設(shè)計。所以掉電模式下,時鐘振蕩停止,RAM數(shù)據(jù)
12、會得以保存,停止芯片內(nèi)其它功能。CPU喚醒后,從時鐘斷點處恢復執(zhí)行程序。其引腳及各引腳功能如下圖2-1 2-1引腳圖 單片機的40個引腳大致可分為4類:電源、時鐘、控制和I/O引腳。 ⒈ 電源: ⑴ VCC - 芯片電源,接+5V; ⑵ VSS - 接地端; ⒉ 時鐘: XTAL1、XTAL2 - 晶體振蕩電路反相輸入端和輸出端。 ⒊ 控制線:控制線共有4根, ⑴ ALE/PROG:地址鎖存允許/片內(nèi)EPROM編程脈沖 ① ALE功能:用來鎖存P0口送出的低8位地址 ② PROG功能:片內(nèi)有EPROM的芯片,在EPROM編程期間,此引腳輸入編程脈沖。 ⑵ PSE
13、N:外ROM讀選通信號。 ⑶ RST/VPD:復位/備用電源。 RST(Reset)功能:復位信號輸入端。 ② VPD功能:在Vcc掉電情況下,接備用電源。 ⑷ EA/Vpp:內(nèi)外ROM選擇/片內(nèi)EPROM編程電源。 ⑸ EA功能:內(nèi)外ROM選擇端。 b)Vpp功能:片內(nèi)有EPROM的芯片,在EPROM編程期間,施加編程電源Vpp。 ⒋ I/O線 80C51共有4個8位并行I/O端口:P0、P1、P2、P3口,共32個引腳。 P3口還具有第二功能,用于特殊信號輸入輸出和控制信號(屬控制總線)。 (b)單片機接口電路如圖2-2 圖2-2單片機接口電路 §2
14、.1.2復位電路 在P80C51單片機中的振蕩器運行時,RST非引腳上保持到少2個機器周期的高電平輸入信號,復位過程即可完成。根據(jù)此原理,本設(shè)計采用上系統(tǒng)的實用性。本設(shè)計的具體復如下圖2-3。 圖2-3 復位電路 §2.1.3 晶振電路 P80C51在工作時需要外部提供時鐘信號,因此,本設(shè)計選擇在其18腳19腳之間接上12MHz的晶振,為單片機提供1μs的機器振蕩周期。其電路連接圖如圖所示。在圖中,電容器C3、C4起穩(wěn)定振蕩頻率、快速起振的作用,其電容值一般在20~50pF。晶振電路圖如下圖2-4。 圖2-4晶振電路圖 §2.2 顯示系統(tǒng)的設(shè)計 §2.2.1
15、顯示系統(tǒng)的方案的選擇 方案 1 :用數(shù)碼管或點陣LED 顯示。 方案 2 :用液晶1602 顯示。 方案 3 :用液晶12864 顯示。 時鐘和溫度的顯示可以用數(shù)碼管或LED,而且價格便宜。但是數(shù)碼管的只能顯示簡單的設(shè)計的系統(tǒng),與我們設(shè)計要求也不相符。有很多東西需要顯示,還是用顯示功能更好的液晶顯示器比較好,它能顯示更多的數(shù)據(jù),用1602液晶顯示數(shù)據(jù)有限,1602不能夠顯示指針時鐘,只能夠顯示一些基本的西文字符,顯示數(shù)據(jù)的可讀性不好,用可以顯示漢字的 12864液晶顯示器還可以增加顯示信息的可讀性,用12864 的繪圖功能即可繪制出指針時鐘的框架,至于指針的轉(zhuǎn)動則才12864 加 ds
16、1302同步控制,讓人看起來會很方便。雖然它們在價格上差距很大,但是1602不能夠?qū)崿F(xiàn)我們的要求,12864.是我們唯一的選擇。 §2.2.2 12864F 簡介 帶中文字庫的128X64是一種具有4 位/8 位并行、2 線或 3 線串行多種接口方式,內(nèi)部含有國標一級、二級簡體中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置 8192 個 16*16 點漢字,和128 個16*8 點 ASCII 字符集.利用該模塊靈活的接口方式和單、方便的操作指令,可構(gòu)成全中文人機交互圖形界面??梢燥@示8 ×4 行 16×16 點陣的漢字. 也可完成圖形顯示. 低電壓低功耗是其顯著特點
17、。由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點陣液晶示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序都要簡潔得多,且該模塊的價格也略低于相同點陣的圖形液晶模塊。 §2.2.3 12864F 引腳說明 管腳號 管腳名 電平 管腳功能描述 1 VSS 0V 電源地 2 VCC 3 .0+5V 電源正 3 V0 - 對比度(亮度)調(diào)整 4 RS(CS) H/L RS=“H”, 表示 DB7——DB0 為顯示數(shù)據(jù)RS=“L”, 表示 DB7——DB0 為顯示指令數(shù)據(jù) 5 R/W(SID H/L R/W=“H”,E=“H”, 數(shù)據(jù)被讀到DB7——DB0 R/W=“
18、L”,E=“H→L”, DB7——DB0 的數(shù)據(jù)被寫到IR或 DR 6 E(SCLK) H/L 使能信號 7 DB0 H/L 三數(shù)據(jù)線 8 DB1 H/L 三數(shù)據(jù)線 9 DB2 H/L 三數(shù)據(jù)線 10 DB3 H/L 三數(shù)據(jù)線 11 DB4 H/L 三態(tài)數(shù)據(jù)線 12 DB5 H/L 三態(tài)數(shù)據(jù)線 13 DB6 H/L 三態(tài)數(shù)據(jù)線 14 DB7 H/L 三態(tài)數(shù)據(jù)線 15 PSB H/L H:8 位或 4 位并口方式,L:串口方式(見注釋 1 ) 16 NC - 空腳 17 /RESET H/L H/L
19、復位端,低電平有效(見注釋2 ) 18 VOUT - LCD - LCD 驅(qū)動電壓輸出端 19 A VDD 背光源正端(+5V)(見注釋3 ) 20 K VSS 背光源負端(見注釋3 ) §2.2.4 12864F 液晶顯示電路 圖2-5 液晶顯示電路圖 設(shè)計中采用 LCD12864液晶顯示。它一般串口、并口兩種方式顯示, 而我們一般采用并口顯示。12864的 4 、5 、6 、15、17 腳分別與單片機 的 P3.0~ P3.4 相連。7~14 腳與單片機的P0 口相連。1 、20 號腳接地,2 號腳接電源,19 號腳背光燈正端串一個電阻與電源相連,
20、電阻起限流 的作用,我們?nèi)?R=10K。3 號腳是對比度(亮度)調(diào)整,這里要用一個 滑動變阻器來調(diào)整亮度,這里我們?nèi)‰娢黄鞔笮?0K。 §2.3 溫度系統(tǒng)設(shè)計 §2.3.1 方案的選擇 方案 1 : 用熱敏電阻等測溫元件測出電壓,再轉(zhuǎn)換成對應的溫度。需要比較 多的外部元件(A/D 轉(zhuǎn)換)支持,且硬件電路復雜,制作成本相對較高。 方案 2 : 用 DS18B20直接測溫。DS18B20 溫度傳感器是美國DALLAS半導 體公司最新推出的一種改進型智能溫度傳感器,它能直接讀出被測溫度, 并且可根據(jù)實際要求通過簡單的編程實現(xiàn)9~12位的數(shù)字值讀數(shù)方式。經(jīng)比較,我們選擇方案2
21、 。 溫度實現(xiàn)只能通過外部的溫度傳感器來實現(xiàn)。經(jīng)上網(wǎng)查閱及市場考察,DS18b20體積小,只有3 只腳,電路接法簡單。內(nèi)部含有寄存器為 我們設(shè)計實現(xiàn)上下限報警功能提供保障。精度為0 .5°C,也符合我們設(shè) 計的要求。 DS18B20 也是我們通常使用的型號,因此溫度傳感器 用DS18B20。 §2.3.2 溫度芯片的選擇 溫度實現(xiàn)只能通過外部的溫度傳感器來實現(xiàn)。經(jīng)上網(wǎng)查閱資料及市場考察,DS18b20體積小,只有 3 只腳,電路接法簡單。它能夠直接讀出被測溫度。內(nèi)部含有寄存器為我們設(shè)計實現(xiàn)上下限報警功能提供保障。用戶可定義的非易失性溫度報警設(shè)置;報警搜索命令識別并標志超過程序限定溫度(
22、溫度報警條件)的器件;精度為0 .5°C,也符合我們設(shè)計的要求。DS18B20也是我們通常使用的型號,因此溫度傳感器用 DS18B20。 §2.3.2 DS18B20內(nèi)部結(jié)構(gòu)描述 DS18B20 溫度傳感器的內(nèi)部存儲器還包括一個高速暫存RAM 和一個非易失性的可電擦除的EERAM。高速暫存RAM 的結(jié)構(gòu)為8個字節(jié)的 存儲器,結(jié)構(gòu)如圖 4 .1 所示。頭兩個字節(jié)包含測得的溫度信息,第三和 第四字節(jié)是TH 和 TL 的拷貝,是易失的,每次上電復位時被刷新。第五個字節(jié)為配置寄存器,它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率。DS18B20工作時按此寄存器中的分辨率將溫度轉(zhuǎn)換為相應精度的數(shù)值。該字節(jié)
23、各位的定義如圖4 .2 所示。低5 位一直為1 ,TM 是測試模式位,用于設(shè)置DS18B20 在工作模式還是在測試模式。 表2.1 高速暫存 RAM 結(jié)構(gòu)圖 溫度LSB 1 字節(jié) 溫度MSB 2 字節(jié) TH用戶字節(jié) 1 3 字節(jié) TL用戶字節(jié) 2 4 字節(jié) TH 用戶字節(jié) 1 配置寄存器 5 字節(jié) TL 用戶字節(jié) 2 保留 6 字節(jié) 保留 7字節(jié) EEROM 保留 8 字節(jié) CRC 9字節(jié) 表2.2 配置寄存器 TM R1 R0 1 1 1 1 1 §2.3.3 DS18b20溫度系統(tǒng)電路 圖2
24、-6溫度接口電路圖 §2.4 時鐘系統(tǒng)電路設(shè)計 §2.4 .1 時鐘芯片選擇 我們采用具有涓細電流充電能力的低功耗實時時鐘電路DS1302。它可以對年、月、日、周日、時、分、秒進行計時,且具有閏年補償?shù)榷喾N功能。它采用主電源和備用電源雙電源供電。它的工作電壓范 圍2 .0~5.5V,在 2 .2V 時,小于 300nA。它內(nèi)部含有31個字節(jié)的靜態(tài)RAM,可提供用戶訪問。DS1302可以對年、月、日、周日、時、分、秒進行計時,可以達到我們設(shè)計的基本的要求。內(nèi)部的寄存器為我們調(diào)時,鬧鐘定時提供了寄存空間。備用用電源也實現(xiàn)了當系統(tǒng)斷電后,時鐘仍然可以保持。而且 它是串行接口,與
25、單片機通信所需要的接口少。不像 DS12887等芯片并行通信需要很多IO 口。 §2.4 .2 DS1302管腳及寄存器說明 DS1302的引腳排列Vcc1 為后備電源,VCC2 為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302 由 Vcc1 或 Vcc2 兩者中的較大者供電。當 Vcc2 大于Vcc1+0 .2V 時,Vcc2 給 DS1302供電。當 Vcc2 小于 Vcc1時,DS1302由 Vcc1 供電。因此,我們 vcc1 用 3V 的紐扣電池作為備用電源,vcc2 用系統(tǒng)電源作為主電源。X1 和 X2 是振蕩源,外接 32.768kHz晶振。RST 是復
26、位/ 片選線,通過把RST 輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST 輸入有兩種功能:首先,RST 接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST 提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當RST 為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對 DS1302進行操作。如果在傳送過程中RST 置為低電平,則會終止此次數(shù)據(jù)傳送,I/O 引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc≥2 .5V 之前,RST 必須保持低電平。只有在SCLK 為低電平時,才能將RST 置為高電平。I/O 為串行數(shù)據(jù)輸入輸出端( 雙向) 。SCLK 為時鐘輸入端。DS1302的寄存器說明DS1302有12個寄存器,其
27、中有7個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD 碼形式。此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與RAM 相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。DS1302與 RAM 相關(guān)的寄存器分為兩類:一類是單個RAM 單元,共 3 1個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM 寄存器,此方式下可一次性讀寫所有的RAM的31個字節(jié),命令控制字 為FEH(寫) 、FFH(讀)。 §2.4 .3 DS1302時鐘電路 圖2-7 時鐘接口電路圖
28、 §2.5 鍵盤 只需要選擇一個開始打印鍵接口電路 圖2-8 按鍵接口電路圖 §2.6 微型打印機 §2.6.1 特點與性能 RD-E 型熱敏微型打印機專為儀器儀表面板安裝而設(shè)計,采用獨特的面板式嵌入結(jié)構(gòu),便可將整個打印機固定在儀表面板上。 RD-E 型為前面板易上紙結(jié)構(gòu)設(shè)計,擁有多項專利技術(shù),實現(xiàn)打印機上紙變革。E 型殼體超小、超薄,外觀精巧;安裝開孔尺寸僅為 76mm×76mm, 深度僅:45mm;但可容納直徑為 33mm 的打印紙卷??刂瓢鍨榉缐m設(shè)計安裝,采用原裝進口打印頭有效確保打印效果與打印機的使用壽命。 §2.7 打印機接口電路 圖2-9 打印機接
29、口電路圖
§2.8硬件原理圖
圖2-10 硬件原理圖
第3章 軟件設(shè)計
§3.1并口連接方式例程
#include
30、
_nop_();
STB=1;sbit STB=P1.1;
sbit BUSY=P1.0;
/**************主函數(shù)**************/
main()
{
int i;
char ch[]="北京榮達測試程序"; pprint(0x1b);pprint(0x38);pprint(0x00); //調(diào)用漢字出庫指令
for(i=0;i
31、要改動,頭文件包含特殊功能寄存器的定義 sbit KEY=P3^3; //定義按鍵輸入端口 sbit LED=P1^2; //定義led輸出端口 /*------------------------------------------------ 主函數(shù) ------------------------------------------------*/ void main (void) { KEY=1; //按鍵輸入端口電平置高 while (1) //主循環(huán) {
32、 if(!KEY) //如果檢測到低電平,說明按鍵按下 LED=0; else LED=1; //這里使用if判斷,如果按鍵按下led點亮,否則熄滅 //上述4句可以用一句替代 LED=KEY; //主循環(huán)中添加其他需要一直工作的程序 } } §3.3 12864,DS1302,DS18B20的接口程序 /**************************************************************** 程序名稱: 時鐘+溫度通過 LCD12864
33、顯示 默認時間: 從 12:00 開始
版本: VER1.0
適用板本: PL-51 學習板
*****************************************************************/
/*頭文件*/ #include
34、S_PORT = P2^4; /*LCD12864 引腳定義*/ sbit LCD12864_RW_PORT = P2^65; sbit LCD12864_E_PORT = P2^6; #define LCD12864_DA_PORT P0 /////////////////////////////////////// sbit dula=P2^3;//數(shù)碼管的段選信號 sbit wela=P2^2; //數(shù)碼管的位選信號 void delay1 (void)//關(guān)閉數(shù)碼管延時程序 { int k; for (k=0; k<10
35、00; k++); } ////////////////////////////////////// sbit DQ =P3^7; //定義 DS18B20 通信端口 sbit T_CLK = P3^5; /*實時時鐘時鐘線引腳 */ sbit T_IO = P3^4; /*實時時鐘數(shù)據(jù)線引腳 */ sbit T_RST = P3^6; /*實時時鐘復位線引腳 */ sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; uchar code mun_to_char[] = {""}; /*數(shù)字轉(zhuǎn)換為 ASCII 字符碼
36、*/ uchar code Week1_to_char[] = {"一"}; uchar code Week2_to_char[] = {"二"}; uchar code Week3_to_char[] = {"三"}; uchar code Week4_to_char[] = {"四"}; uchar code Week5_to_char[] = {"五"}; uchar code Week6_to_char[] = {"六"}; /*星期數(shù)字轉(zhuǎn)換為漢字的 ASCII 碼*/ uchar code Week7_to_char[] = {"日"}; uchar hanzi_buff1
37、[]={" 08 年 12 月 20 日 "}; uchar hanzi_buff2[]={" 星期 六 "}; uchar hanzi_buff3[]={" 12:00:00 "}; uchar hanzi_buff4[]={"當前溫度: 20.3 度"}; uchar code lcd1602_line1[]={"Please insert "}; uchar code lcd1602_line2[]={"LCD12864 Display"}; uchar data time_data_buff[7]={0x00,0x00,0x12,0x20,0x12,0x06,0x0
38、8};/* 格式為 : 秒 分 時 日 月 星期 年 */ ////////////////////以下是時鐘讀取程序///////////////// /******************************************************************** 函 數(shù) 名:RTInputByte() 功 能:實時時鐘寫入一字節(jié) 說 明:往 DS1302 寫入 1Byte 數(shù)據(jù) (內(nèi)部函數(shù)) 入口參數(shù):d 寫入的數(shù)據(jù) 返 回 值:無 **********************************************************
39、*************/ void RTInputByte(uchar d) { uchar i; ACC = d; for(i=8; i>0; i --) { T_IO = ACC0; /*相當于匯編中的 RRC */ T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } /******************************************************************** 函 數(shù) 名:RTOutputByte() 功 能:實時時鐘讀取一字節(jié) 說 明:從 DS1302 讀取 1Byte 數(shù)
40、據(jù) (內(nèi)部函數(shù)) 入口參數(shù):無 返 回 值:ACC ***********************************************************************/ uchar RTOutputByte(void) { uchar i; for(i=8; i>0; i --) { ACC = ACC >>1; /*相當于匯編中的 RRC */ ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } return(ACC); } /*******************************************
41、************************* 函 數(shù) 名:W1302() 功 能:往 DS1302 寫入數(shù)據(jù) 說 明:先寫地址,后寫命令/數(shù)據(jù) (內(nèi)部函數(shù)) 調(diào) 用:RTInputByte() , RTOutputByte() 入口參數(shù):ucAddr: DS1302 地址, ucData: 要寫的數(shù)據(jù) 返 回 值:無 ***********************************************************************/ void W1302(uchar ucAddr, uchar ucDa) { T_RST = 0; T
42、_CLK = 0; T_RST = 1; RTInputByte(ucAddr); /* 地址,命令 */ RTInputByte(ucDa); /* 寫 1Byte 數(shù)據(jù)*/ T_CLK = 1; T_RST = 0; } /******************************************************************** 函 數(shù) 名:R1302() 功 能:讀取 DS1302 某地址的數(shù)據(jù) 說 明:先寫地址,后讀命令/數(shù)據(jù) (內(nèi)部函數(shù)) 調(diào) 用:RTInputByte() , RTOutputByte() 入口參數(shù):uc
43、Addr: DS1302 地址 返 回 值:ucData :讀取的數(shù)據(jù) ***********************************************************************/ uchar R1302(uchar ucAddr) { uchar ucData; T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(ucAddr); /* 地址,命令 */ ucData = RTOutputByte(); /* 讀 1Byte 數(shù)據(jù) */ T_CLK = 1; T_RST = 0; r
44、eturn(ucData); } /******************************************************************** 函 數(shù) 名:Set1302() 功 能:設(shè)置初始時間 說 明:先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式) 調(diào) 用:W1302() 入口參數(shù):pClock: 設(shè)置時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年 7Byte (BCD 碼)1B 1B 1B 1B 1B 1B 1B 返 回 值:無 *******************************************
45、****************************/ void Set1302(uchar *pClock) { uchar i; uchar ucAddr = 0x80; EA = 0; W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作*/ for(i =7; i>0; i --) { W1302(ucAddr,*pClock); /* 秒 分 時 日 月 星期 年 */ pClock++; ucAddr +=2; } W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護*/ EA = 1; } /**************
46、****************************************************** 函 數(shù) 名:Get1302() 功 能:讀取 DS1302 當前時間 說 明: 調(diào) 用:R1302() 入口參數(shù):ucCurtime: 保存當前時間地址。當前時間格式為: 秒 分 時 日 月 星期 年 7Byte (BCD 碼) 1B 1B 1B 1B 1B 1B 1B 返 回 值:無 ***********************************************************************/ void Get1302
47、(uchar ucCurtime[]) { uchar i; uchar ucAddr = 0x81; EA = 0; for (i=0; i<7; i++) { ucCurtime[i] = R1302(ucAddr);/*格式為: 秒 分 時 日 月 星期 年 */ ucAddr += 2; } EA = 1; } ///////////////////以上是 DS1302 時鐘讀取程序//////////// //////////////////以下是 DS18B20 驅(qū)動程序//////////////// //延時函數(shù) void delay(uint i)
48、 { while(i--); } //初始化函數(shù) void Init_DS18B20() { unsigned char x=0; DQ = 1; //DQ 復位 delay(8); //稍做延時 DQ = 0; //單片機將 DQ 拉低 delay(80); //精確延時 大于 480us DQ = 1; //拉高總線 delay(14); x=DQ; //稍做延時后 如果 x=0 則初始化成功 x=1 則初始化失敗 delay(20); } //讀一個字節(jié) uchar ReadOneChar() { uchar i=0; uchar dat = 0; for (
49、i=8;i>0;i--){ DQ = 0; // 給脈沖信號 dat>>=1; DQ = 1; // 給脈沖信號 if(DQ) dat|=0x80; delay(4); } return(dat); } //寫一個字節(jié) void WriteOneChar(unsigned char dat) { uchar i=0; for (i=8; i>0; i --){ DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } } //讀取溫度 uint ReadTemperature() { uchar a=0
50、; uchar b=0; uint t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號列號的操作 WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換 Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀 9 個寄存器) 前兩個就是溫度 a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a; tt=t*0.0625; //將溫度的高位與低
51、位合并 t= tt*10+0.5; //對結(jié)果進行 4 舍 5 入 return(t); } //////////////////以上是 DS18B20 驅(qū)動程序//////////////// //////////////////以下是 LCD12864 驅(qū)動程序//////////////// void LCD12864_WaitIdle() //LCD12864 忙 信號檢測 { LCD12864_DA_PORT = 0xff; LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 1; LCD12864_E_PORT = 1; while((L
52、CD12864_DA_PORT&0x80)==1); /*等待 BF 不為 1*/ LCD12864_E_PORT = 0; } void LCD12864_COM_Write( uchar com_da) /* 檢測忙信號寫入命令字 com_da 為待寫入的命令字*/ { LCD12864_WaitIdle(); LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = com_da; LCD12864_E_PORT = 1; Nop(); Nop(); Nop(); Nop(); Nop(); No
53、p(); Nop(); Nop(); LCD12864_E_PORT = 0; } void LCD12864_NoWaitIdle_COM_Write(uchar com_da) /* 不檢測忙信號寫入命令字 com_da 為待寫入的命令字*/ { LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = com_da; LCD12864_E_PORT = 1; Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); LCD12864_E
54、_PORT = 0; } void LCD12864_Data_Write(uchar da) /* 數(shù)據(jù)寫入 da 為待寫入的 8 位數(shù)據(jù)*/ { LCD12864_WaitIdle(); /*檢測忙信號*/ LCD12864_RS_PORT = 1; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = da; LCD12864_E_PORT = 1; Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); LCD12864_E_PORT = 0; } void lcd_de
55、lay_ms(uchar x) /*1MS 為單位的延時程序,不準確*/ { uchar j; while(x--){ for(j=0;j<125;j++) {;} } } void LCD12864_Reset() /*LCD12864 初始化*/ { lcd_delay_ms(100); /*適當延時待 LCD 自動復位完成*/ LCD12864_NoWaitIdle_COM_Write(0x30); /*使用 8 位并口通訊*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x30); /*使用 8 位并口通訊*
56、/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x0c); /*顯示開及光標設(shè)置*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x01); /*顯示清屏*/ lcd_delay_ms(30); LCD12864_NoWaitIdle_COM_Write(0x06); /*DDRAM 的地址計數(shù)器(AC)加 1*/ lcd_delay_ms(30); } void LCD12864_HAIZI_WRITE(uchar xpos,uchar ypos,uchar daH,ucha
57、r daL) //ST7920 漢字字符寫入 //參數(shù)說明: xpos 待寫入的 X 位置 //ypos 待寫入的 Y 位置 //daH 待寫入的漢字的高八位 daL 待寫入的漢字的低八位 { uchar xy_pos; if((xpos>=8)||(ypos>=4) ) return; /*X 位置超出顯示范圍退出*/ if(ypos==0) xy_pos = 0x80 + xpos; else if(ypos==1) xy_pos = 0x90 + xpos; /*計算轉(zhuǎn)換地址*/ else if(ypos==2) xy_pos = 0x88 + xpos; else
58、 if(ypos==3) xy_pos = 0x98 + xpos; LCD12864_COM_Write(xy_pos); /*寫地址*/ lcd_delay_ms(1); LCD12864_Data_Write(daH); /*寫高八位數(shù)據(jù)*/ lcd_delay_ms(1); LCD12864_Data_Write(daL); /*寫低八位數(shù)據(jù)*/ lcd_delay_ms(1); } //////////////////以上是 LCD12864 驅(qū)動程序//////////////// /*1MS 為單位的延時程序*/ void delay_1ms(uchar x)
59、{ uchar j; while(x--){ for(j=0;j<125;j++) {;} } } void main() { uchar i; uint temp_buff; LCD12864_Reset(); /*LCD 初始化*/ ///////////////////////////////////////////////////////////////// P0=0X00;//關(guān)掉數(shù)碼管的信號。阻止數(shù)碼管受到 P0 口信號的影響。 dula=1; wela=0; delay1(); dula=0; wela=0; delay1(); /////
60、/////////////////////////////////////////////////////////// LCD12864_DA_PORT = 0xff; /*釋放 P0 端口*/ Set1302(time_data_buff); /*設(shè)置時間*/ while(1){ for(i=0;i<8;i++) LCD12864_HAIZI_WRITE(i,0,hanzi_buff1[i*2],hanzi_buff1[i*2+1]); /*顯示年月日*/ for(i=0;i<8;i++) LCD12864_HAIZI_WRITE(i,1,hanzi_buff2[i*2],hanzi_
61、buff2[i*2+1]); /*顯示星期*/ for(i=0;i<8;i++) LCD12864_HAIZI_WRITE(i,2,hanzi_buff3[i*2],hanzi_buff3[i*2+1]); /*顯示時間*/ for(i=0;i<8;i++) LCD12864_HAIZI_WRITE(i,3,hanzi_buff4[i*2],hanzi_buff4[i*2+1]); /*顯示溫度*/ temp_buff = Read Temperature(); /*讀取溫度*/ hanzi_buff4[10] = mun_to_char[temp_buff/100]; /*填充溫度到
62、緩存*/ hanzi_buff4[11] = mun_to_char[temp_buff%100/10]; hanzi_buff4[13] = mun_to_char[temp_buff%10]; Get1302(time_data_buff); hanzi_buff1[2] = mun_to_char[time_data_buff[6]/0x10]; hanzi_buff1[3] = mun_to_char[time_data_buff[6]%0x10]; /*年*/ hanzi_buff1[6] = mun_to_char[time_data_buff[4]/0x10]; hanzi_
63、buff1[7] = mun_to_char[time_data_buff[4]%0x10]; /*月*/ hanzi_buff1[10] = mun_to_char[time_data_buff[3]/0x10]; hanzi_buff1[11] = mun_to_char[time_data_buff[3]%0x10]; /*日*/ hanzi_buff3[4] = mun_to_char[time_data_buff[2]/0x10]; hanzi_buff3[5] = mun_to_char[time_data_buff[2]%0x10]; /*時*/ hanzi_buff3[7] =
64、 mun_to_char[time_data_buff[1]/0x10]; hanzi_buff3[8] = mun_to_char[time_data_buff[1]%0x10]; /*分*/ hanzi_buff3[10] = mun_to_char[time_data_buff[0]/0x10]; hanzi_buff3[11] = mun_to_char[time_data_buff[0]%0x10]; /*秒*/ i=time_data_buff[5]%0x10; if(i==7){ hanzi_buff2[10] = Week7_to_char[0] ; hanzi_buf
65、f2[11] = Week7_to_char[1]; /*星期日*/ } else if(i==1){ hanzi_buff2[10] = Week1_to_char[0] ; hanzi_buff2[11] = Week1_to_char[1]; /*星期一*/ } else if(i==2){ hanzi_buff2[10] = Week2_to_char[0] ; hanzi_buff2[11] = Week2_to_char[1]; /*星期二*/ } else if(i==3){ hanzi_buff2[10] = Week3_to_char[0] ; hanzi_
66、buff2[11] = Week3_to_char[1]; /*星期三*/ } else if(i==4){ hanzi_buff2[10] = Week4_to_char[0] ; hanzi_buff2[11] = Week4_to_char[1]; /*星期四*/ } else if(i==5){ hanzi_buff2[10] = Week5_to_char[0] ; hanzi_buff2[11] = Week5_to_char[1]; /*星期五*/ } else if(i==6){ hanzi_buff2[10] = Week6_to_char[0] ; hanzi_buff2[11] = Week6_to_char[1]; /*星期六*/ } delay_1ms(200); delay_1ms(200); delay_1ms(200); } 結(jié)論 本文詳細介紹了應用P80C51單片機控制微型打印機實現(xiàn)打印輸出的硬件設(shè)計及軟件設(shè)計。經(jīng)過測試表明,利用設(shè)計能夠?qū)崿F(xiàn)數(shù)據(jù)打印,并且能夠通過串口通信實現(xiàn)對打印機輸出的控制,打印結(jié)果正確無
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年防凍教育安全教育班會全文PPT
- 2025年寒假安全教育班會全文PPT
- 初中2025年冬季防溺水安全教育全文PPT
- 初中臘八節(jié)2024年專題PPT
- 主播直播培訓提升人氣的方法正確的直播方式如何留住游客
- XX地區(qū)機關(guān)工委2024年度年終黨建工作總結(jié)述職匯報
- 心肺復蘇培訓(心臟驟停的臨床表現(xiàn)與診斷)
- 我的大學生活介紹
- XX單位2024年終專題組織生活會理論學習理論學習強黨性凝心聚力建新功
- 2024年XX單位個人述職述廉報告
- 一文解讀2025中央經(jīng)濟工作會議精神(使社會信心有效提振經(jīng)濟明顯回升)
- 2025職業(yè)生涯規(guī)劃報告自我評估職業(yè)探索目標設(shè)定發(fā)展策略
- 2024年度XX縣縣委書記個人述職報告及2025年工作計劃
- 寒假計劃中學生寒假計劃安排表(規(guī)劃好寒假的每個階段)
- 中央經(jīng)濟工作會議九大看點學思想強黨性重實踐建新功