基于單片機(jī)微型打印機(jī)系統(tǒng)控制設(shè)計(jì)

上傳人:2127513****773577... 文檔編號:67026194 上傳時(shí)間:2022-03-30 格式:DOC 頁數(shù):45 大?。?32.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
基于單片機(jī)微型打印機(jī)系統(tǒng)控制設(shè)計(jì)_第1頁
第1頁 / 共45頁
基于單片機(jī)微型打印機(jī)系統(tǒng)控制設(shè)計(jì)_第2頁
第2頁 / 共45頁
基于單片機(jī)微型打印機(jī)系統(tǒng)控制設(shè)計(jì)_第3頁
第3頁 / 共45頁

下載文檔到電腦,查找使用更方便

20 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《基于單片機(jī)微型打印機(jī)系統(tǒng)控制設(shè)計(jì)》由會員分享,可在線閱讀,更多相關(guān)《基于單片機(jī)微型打印機(jī)系統(tǒng)控制設(shè)計(jì)(45頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、精選優(yōu)質(zhì)文檔-----傾情為你奉上 基于單基片機(jī)的微型打印機(jī)的設(shè)計(jì) 摘 要 目前,電子領(lǐng)域正向著數(shù)字化、信息化、微型化發(fā)展。打印機(jī)作為數(shù)字輸出設(shè)備之一也朝著多功能、高性能的方向發(fā)展。微型打印機(jī)是電子信息領(lǐng)域一種很重要的輸出設(shè)備。 本文設(shè)計(jì)的主要目的是運(yùn)用單片機(jī)來控制微型打印機(jī)來實(shí)現(xiàn)打印的目的。本設(shè)計(jì)基于榮達(dá)RD-E系列微型打印機(jī),以單片機(jī)P80C51以核心元件,輔以必要的外圍電路(包括實(shí)時(shí)時(shí)鐘電路、溫度傳感器和液晶顯示模塊、按鍵、打印機(jī)),采用并行接口技術(shù),同時(shí)通過液晶顯示器顯示打印的數(shù)字和文字信息??梢詫?shí)現(xiàn)打印一段固定的文字和單個(gè)任意的數(shù)字,同時(shí)把打印的內(nèi)容顯示在液晶屏

2、上。本文主要用溫度傳感器測量溫度,再通過單片機(jī)控制熱敏電阻打印機(jī)打印出小票,設(shè)計(jì)了時(shí)鐘接口電路,打印機(jī)接口電路,溫度傳感器接口電路和液晶顯示接口電路。再輔助軟件設(shè)計(jì)來進(jìn)行調(diào)試。 關(guān) 鍵 詞:打印機(jī),單片機(jī),液晶顯示器,DS1302時(shí)鐘 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ī)也得到很好的應(yīng)用,但許多打印機(jī)成本都很高,體積也比較大,而且性能以及其他的一些都不是很好,所以人們開始研究新型的微型打印機(jī),微型打印機(jī)已經(jīng)走進(jìn)我們的生活中來了,它跟以往的大型打印進(jìn)來說,最大的優(yōu)點(diǎn)就是體積小,節(jié)約了空間,而且外觀優(yōu)美,性能可觀,而且價(jià)格相對以往的來說會便宜許多,性價(jià)比很高,其特有的多份拷貝、復(fù)寫打印和連續(xù)打印功能,使許多專業(yè)打印領(lǐng)域?qū)ζ淝橛歇?dú)鐘。它越來越趨向于被設(shè)計(jì)成各種各樣的專業(yè)類型,用以打印各類專業(yè)性較強(qiáng)的報(bào)表、存折、發(fā)票、車票、卡片等輸出介質(zhì)。所以微型打印機(jī)的前景相當(dāng)可觀。 從1946

9、年日本大和公司(即現(xiàn)在的EPSON公司)研制出第一臺微型打印機(jī)開始,微型打印機(jī)如今已有60年的歷史。在這60年里,微型打印機(jī)技術(shù)獲得了突飛猛進(jìn)的發(fā)展。從最初的點(diǎn)陣式打印方式,已經(jīng)擴(kuò)展到現(xiàn)今的近10種微型打印方式,包括梭式打印、9針擊打、24針擊打、噴墨打印、熱敏打印等。其產(chǎn)品種類也百花齊放,包括工業(yè)儀器、商場POS、醫(yī)院收費(fèi)、話費(fèi)清單、餐廳、銀行、加油站、路橋收費(fèi)等領(lǐng)域都會有它的身影。目前,在國內(nèi)微打市場上主要有EPSON、STAR、SAMSUNG等國際品牌和實(shí)達(dá)、公達(dá)、博施等國內(nèi)品牌。其配套的設(shè)備主要有:收款機(jī)、觸摸POS終端、電腦等多項(xiàng)設(shè)備幾乎所有需要打印的地方。 本課題以單片機(jī)為核心,

10、設(shè)計(jì)和微型打印機(jī)的接口電路,編寫微型打印機(jī)驅(qū)動程序,實(shí)現(xiàn)特定信息的打印輸出。首先系統(tǒng)硬件部分選用MCS-51單片機(jī)系列,顯示器部分由液顯示編寫驅(qū)動程序用keil,打印格式是由打印機(jī)芯片用電磁鐵打針,再用按鍵的方式按打印格式輸出。 第1章 系統(tǒng)總體設(shè)計(jì) §1.1總體設(shè)計(jì)框圖 基于單片機(jī)的微型打印機(jī)的設(shè)計(jì)的總體設(shè)計(jì)框圖,如圖1-1 圖1-1總體設(shè)計(jì)框圖 §1.2 系統(tǒng)功能簡介 1、溫度傳感器測量的當(dāng)前溫度值,通過主控制器在液晶屏上顯示當(dāng)前溫度和時(shí)間。 2、按鍵操作可以決定微型打印機(jī)的開始,即按鍵后打印機(jī)開始打印。 第2章 系統(tǒng)硬件設(shè)計(jì) §2.1 主控制器部分的設(shè)計(jì)

11、 §2.1.1主控芯片的選擇 P80C51基于80C51內(nèi)核采用高密度CMOS技術(shù)設(shè)計(jì)制造,包含中央處理單元、片內(nèi)4k程序存儲器,128字節(jié)內(nèi)部數(shù)據(jù)存儲器RAM、32個(gè)雙向輸入/輸出(I/O)口、3個(gè)16位定時(shí)/計(jì)數(shù)器和6個(gè)中斷源,4層優(yōu)先級中斷嵌套結(jié)構(gòu),可用于多機(jī)通信的串行I/O口,I/O擴(kuò)展或全雙工UART,片內(nèi)時(shí)鐘振蕩電路。 此外,P80C51采用低功耗靜態(tài)設(shè)計(jì),寬工作電壓范圍(2.7-5.5V),寬工作頻率(可為0Hz),兩種軟件方式選擇電源空閑和掉電模式??臻e模式下,凍結(jié)CPU而RAM定時(shí)器、串行口和中斷系統(tǒng)維持其功能。由于是靜態(tài)設(shè)計(jì)。所以掉電模式下,時(shí)鐘振蕩停止,RAM數(shù)據(jù)

12、會得以保存,停止芯片內(nèi)其它功能。CPU喚醒后,從時(shí)鐘斷點(diǎn)處恢復(fù)執(zhí)行程序。其引腳及各引腳功能如下圖2-1 2-1引腳圖 單片機(jī)的40個(gè)引腳大致可分為4類:電源、時(shí)鐘、控制和I/O引腳。 ⒈ 電源: ⑴ VCC - 芯片電源,接+5V; ⑵ VSS - 接地端; ⒉ 時(shí)鐘: XTAL1、XTAL2 - 晶體振蕩電路反相輸入端和輸出端。 ⒊ 控制線:控制線共有4根, ⑴ ALE/PROG:地址鎖存允許/片內(nèi)EPROM編程脈沖 ① ALE功能:用來鎖存P0口送出的低8位地址 ② PROG功能:片內(nèi)有EPROM的芯片,在EPROM編程期間,此引腳輸入編程脈沖。 ⑵ PSE

13、N:外ROM讀選通信號。 ⑶ RST/VPD:復(fù)位/備用電源。 RST(Reset)功能:復(fù)位信號輸入端。 ② 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個(gè)8位并行I/O端口:P0、P1、P2、P3口,共32個(gè)引腳。 P3口還具有第二功能,用于特殊信號輸入輸出和控制信號(屬控制總線)。 (b)單片機(jī)接口電路如圖2-2 圖2-2單片機(jī)接口電路 §2

14、.1.2復(fù)位電路 在P80C51單片機(jī)中的振蕩器運(yùn)行時(shí),RST非引腳上保持到少2個(gè)機(jī)器周期的高電平輸入信號,復(fù)位過程即可完成。根據(jù)此原理,本設(shè)計(jì)采用上系統(tǒng)的實(shí)用性。本設(shè)計(jì)的具體復(fù)如下圖2-3。 圖2-3 復(fù)位電路 §2.1.3 晶振電路 P80C51在工作時(shí)需要外部提供時(shí)鐘信號,因此,本設(shè)計(jì)選擇在其18腳19腳之間接上12MHz的晶振,為單片機(jī)提供1μs的機(jī)器振蕩周期。其電路連接圖如圖所示。在圖中,電容器C3、C4起穩(wěn)定振蕩頻率、快速起振的作用,其電容值一般在20~50pF。晶振電路圖如下圖2-4。 圖2-4晶振電路圖 §2.2 顯示系統(tǒng)的設(shè)計(jì) §2.2.1

15、顯示系統(tǒng)的方案的選擇 方案 1 :用數(shù)碼管或點(diǎn)陣LED 顯示。 方案 2 :用液晶1602 顯示。 方案 3 :用液晶12864 顯示。 時(shí)鐘和溫度的顯示可以用數(shù)碼管或LED,而且價(jià)格便宜。但是數(shù)碼管的只能顯示簡單的設(shè)計(jì)的系統(tǒng),與我們設(shè)計(jì)要求也不相符。有很多東西需要顯示,還是用顯示功能更好的液晶顯示器比較好,它能顯示更多的數(shù)據(jù),用1602液晶顯示數(shù)據(jù)有限,1602不能夠顯示指針時(shí)鐘,只能夠顯示一些基本的西文字符,顯示數(shù)據(jù)的可讀性不好,用可以顯示漢字的 12864液晶顯示器還可以增加顯示信息的可讀性,用12864 的繪圖功能即可繪制出指針時(shí)鐘的框架,至于指針的轉(zhuǎn)動則才12864 加 ds

16、1302同步控制,讓人看起來會很方便。雖然它們在價(jià)格上差距很大,但是1602不能夠?qū)崿F(xiàn)我們的要求,12864.是我們唯一的選擇。 §2.2.2 12864F 簡介 帶中文字庫的128X64是一種具有4 位/8 位并行、2 線或 3 線串行多種接口方式,內(nèi)部含有國標(biāo)一級、二級簡體中文字庫的點(diǎn)陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置 8192 個(gè) 16*16 點(diǎn)漢字,和128 個(gè)16*8 點(diǎn) ASCII 字符集.利用該模塊靈活的接口方式和單、方便的操作指令,可構(gòu)成全中文人機(jī)交互圖形界面??梢燥@示8 ×4 行 16×16 點(diǎn)陣的漢字. 也可完成圖形顯示. 低電壓低功耗是其顯著特點(diǎn)

17、。由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點(diǎn)陣液晶示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序都要簡潔得多,且該模塊的價(jià)格也略低于相同點(diǎn)陣的圖形液晶模塊。 §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、復(fù)位端,低電平有效(見注釋2 ) 18 VOUT - LCD - LCD 驅(qū)動電壓輸出端 19 A VDD 背光源正端(+5V)(見注釋3 ) 20 K VSS 背光源負(fù)端(見注釋3 ) §2.2.4 12864F 液晶顯示電路 圖2-5 液晶顯示電路圖 設(shè)計(jì)中采用 LCD12864液晶顯示。它一般串口、并口兩種方式顯示, 而我們一般采用并口顯示。12864的 4 、5 、6 、15、17 腳分別與單片機(jī) 的 P3.0~ P3.4 相連。7~14 腳與單片機(jī)的P0 口相連。1 、20 號腳接地,2 號腳接電源,19 號腳背光燈正端串一個(gè)電阻與電源相連,

20、電阻起限流 的作用,我們?nèi)?R=10K。3 號腳是對比度(亮度)調(diào)整,這里要用一個(gè) 滑動變阻器來調(diào)整亮度,這里我們?nèi)‰娢黄鞔笮?0K。 §2.3 溫度系統(tǒng)設(shè)計(jì) §2.3.1 方案的選擇 方案 1 : 用熱敏電阻等測溫元件測出電壓,再轉(zhuǎn)換成對應(yīng)的溫度。需要比較 多的外部元件(A/D 轉(zhuǎn)換)支持,且硬件電路復(fù)雜,制作成本相對較高。 方案 2 : 用 DS18B20直接測溫。DS18B20 溫度傳感器是美國DALLAS半導(dǎo) 體公司最新推出的一種改進(jìn)型智能溫度傳感器,它能直接讀出被測溫度, 并且可根據(jù)實(shí)際要求通過簡單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。經(jīng)比較,我們選擇方案2

21、 。 溫度實(shí)現(xiàn)只能通過外部的溫度傳感器來實(shí)現(xiàn)。經(jīng)上網(wǎng)查閱及市場考察,DS18b20體積小,只有3 只腳,電路接法簡單。內(nèi)部含有寄存器為 我們設(shè)計(jì)實(shí)現(xiàn)上下限報(bào)警功能提供保障。精度為0 .5°C,也符合我們設(shè) 計(jì)的要求。 DS18B20 也是我們通常使用的型號,因此溫度傳感器 用DS18B20。 §2.3.2 溫度芯片的選擇 溫度實(shí)現(xiàn)只能通過外部的溫度傳感器來實(shí)現(xiàn)。經(jīng)上網(wǎng)查閱資料及市場考察,DS18b20體積小,只有 3 只腳,電路接法簡單。它能夠直接讀出被測溫度。內(nèi)部含有寄存器為我們設(shè)計(jì)實(shí)現(xiàn)上下限報(bào)警功能提供保障。用戶可定義的非易失性溫度報(bào)警設(shè)置;報(bào)警搜索命令識別并標(biāo)志超過程序限定溫度(

22、溫度報(bào)警條件)的器件;精度為0 .5°C,也符合我們設(shè)計(jì)的要求。DS18B20也是我們通常使用的型號,因此溫度傳感器用 DS18B20。 §2.3.2 DS18B20內(nèi)部結(jié)構(gòu)描述 DS18B20 溫度傳感器的內(nèi)部存儲器還包括一個(gè)高速暫存RAM 和一個(gè)非易失性的可電擦除的EERAM。高速暫存RAM 的結(jié)構(gòu)為8個(gè)字節(jié)的 存儲器,結(jié)構(gòu)如圖 4 .1 所示。頭兩個(gè)字節(jié)包含測得的溫度信息,第三和 第四字節(jié)是TH 和 TL 的拷貝,是易失的,每次上電復(fù)位時(shí)被刷新。第五個(gè)字節(jié)為配置寄存器,它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率。DS18B20工作時(shí)按此寄存器中的分辨率將溫度轉(zhuǎn)換為相應(yīng)精度的數(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 時(shí)鐘系統(tǒng)電路設(shè)計(jì) §2.4 .1 時(shí)鐘芯片選擇 我們采用具有涓細(xì)電流充電能力的低功耗實(shí)時(shí)時(shí)鐘電路DS1302。它可以對年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),且具有閏年補(bǔ)償?shù)榷喾N功能。它采用主電源和備用電源雙電源供電。它的工作電壓范 圍2 .0~5.5V,在 2 .2V 時(shí),小于 300nA。它內(nèi)部含有31個(gè)字節(jié)的靜態(tài)RAM,可提供用戶訪問。DS1302可以對年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),可以達(dá)到我們設(shè)計(jì)的基本的要求。內(nèi)部的寄存器為我們調(diào)時(shí),鬧鐘定時(shí)提供了寄存空間。備用用電源也實(shí)現(xiàn)了當(dāng)系統(tǒng)斷電后,時(shí)鐘仍然可以保持。而且 它是串行接口,與

25、單片機(jī)通信所需要的接口少。不像 DS12887等芯片并行通信需要很多IO 口。 §2.4 .2 DS1302管腳及寄存器說明 DS1302的引腳排列Vcc1 為后備電源,VCC2 為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302 由 Vcc1 或 Vcc2 兩者中的較大者供電。當(dāng) Vcc2 大于Vcc1+0 .2V 時(shí),Vcc2 給 DS1302供電。當(dāng) Vcc2 小于 Vcc1時(shí),DS1302由 Vcc1 供電。因此,我們 vcc1 用 3V 的紐扣電池作為備用電源,vcc2 用系統(tǒng)電源作為主電源。X1 和 X2 是振蕩源,外接 32.768kHz晶振。RST 是復(fù)

26、位/ 片選線,通過把RST 輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST 輸入有兩種功能:首先,RST 接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST 提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST 為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對 DS1302進(jìn)行操作。如果在傳送過程中RST 置為低電平,則會終止此次數(shù)據(jù)傳送,I/O 引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc≥2 .5V 之前,RST 必須保持低電平。只有在SCLK 為低電平時(shí),才能將RST 置為高電平。I/O 為串行數(shù)據(jù)輸入輸出端( 雙向) 。SCLK 為時(shí)鐘輸入端。DS1302的寄存器說明DS1302有12個(gè)寄存器,其

27、中有7個(gè)寄存器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為BCD 碼形式。此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時(shí)鐘突發(fā)寄存器及與RAM 相關(guān)的寄存器等。時(shí)鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。DS1302與 RAM 相關(guān)的寄存器分為兩類:一類是單個(gè)RAM 單元,共 3 1個(gè),每個(gè)單元組態(tài)為一個(gè)8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM 寄存器,此方式下可一次性讀寫所有的RAM的31個(gè)字節(jié),命令控制字 為FEH(寫) 、FFH(讀)。 §2.4 .3 DS1302時(shí)鐘電路 圖2-7 時(shí)鐘接口電路圖

28、 §2.5 鍵盤 只需要選擇一個(gè)開始打印鍵接口電路 圖2-8 按鍵接口電路圖 §2.6 微型打印機(jī) §2.6.1 特點(diǎn)與性能 RD-E 型熱敏微型打印機(jī)專為儀器儀表面板安裝而設(shè)計(jì),采用獨(dú)特的面板式嵌入結(jié)構(gòu),便可將整個(gè)打印機(jī)固定在儀表面板上。 RD-E 型為前面板易上紙結(jié)構(gòu)設(shè)計(jì),擁有多項(xiàng)專利技術(shù),實(shí)現(xiàn)打印機(jī)上紙變革。E 型殼體超小、超薄,外觀精巧;安裝開孔尺寸僅為 76mm×76mm, 深度僅:45mm;但可容納直徑為 33mm 的打印紙卷??刂瓢鍨榉缐m設(shè)計(jì)安裝,采用原裝進(jìn)口打印頭有效確保打印效果與打印機(jī)的使用壽命。 §2.7 打印機(jī)接口電路 圖2-9 打印機(jī)接

29、口電路圖 §2.8硬件原理圖 圖2-10 硬件原理圖 第3章 軟件設(shè)計(jì) §3.1并口連接方式例程 #include #include #include bit STB=P1.1; sbit BUSY=P1.0; /**************并口打印子程序**************/ void pprint(unsigned char ch) { while(BUSY) { }; P0=ch; STB=0; _nop_();

30、 _nop_(); STB=1;sbit STB=P1.1; sbit BUSY=P1.0; /**************主函數(shù)**************/ main() { int i; char ch[]="北京榮達(dá)測試程序"; 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點(diǎn)亮,否則熄滅 //上述4句可以用一句替代 LED=KEY; //主循環(huán)中添加其他需要一直工作的程序 } } §3.3 12864,DS1302,DS18B20的接口程序 /**************************************************************** 程序名稱: 時(shí)鐘+溫度通過 LCD12864

33、顯示 默認(rèn)時(shí)間: 從 12:00 開始 版本: VER1.0 適用板本: PL-51 學(xué)習(xí)板 *****************************************************************/ /*頭文件*/ #include #include #define uint unsigned int #define uchar unsigned char #define Nop() _nop_() #define _Nop() _nop_() /*引腳端口定義*/ sbit LCD12864_R

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ù)碼管延時(shí)程序 { int k; for (k=0; k<10

35、00; k++); } ////////////////////////////////////// sbit DQ =P3^7; //定義 DS18B20 通信端口 sbit T_CLK = P3^5; /*實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 */ sbit T_IO = P3^4; /*實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 */ sbit T_RST = P3^6; /*實(shí)時(shí)時(shí)鐘復(fù)位線引腳 */ 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[]={"當(dāng)前溫度: 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í) 日 月 星期 年 */ ////////////////////以下是時(shí)鐘讀取程序///////////////// /******************************************************************** 函 數(shù) 名:RTInputByte() 功 能:實(shí)時(shí)時(shí)鐘寫入一字節(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; /*相當(dāng)于匯編中的 RRC */ T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } /******************************************************************** 函 數(shù) 名:RTOutputByte() 功 能:實(shí)時(shí)時(shí)鐘讀取一字節(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; /*相當(dāng)于匯編中的 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í)間 說 明:先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式) 調(diào) 用:W1302() 入口參數(shù):pClock: 設(shè)置時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年 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); /* 秒 分 時(shí) 日 月 星期 年 */ pClock++; ucAddr +=2; } W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護(hù)*/ EA = 1; } /**************

46、****************************************************** 函 數(shù) 名:Get1302() 功 能:讀取 DS1302 當(dāng)前時(shí)間 說 明: 調(diào) 用:R1302() 入口參數(shù):ucCurtime: 保存當(dāng)前時(shí)間地址。當(dāng)前時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年 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);/*格式為: 秒 分 時(shí) 日 月 星期 年 */ ucAddr += 2; } EA = 1; } ///////////////////以上是 DS1302 時(shí)鐘讀取程序//////////// //////////////////以下是 DS18B20 驅(qū)動程序//////////////// //延時(shí)函數(shù) void delay(uint i)

48、 { while(i--); } //初始化函數(shù) void Init_DS18B20() { unsigned char x=0; DQ = 1; //DQ 復(fù)位 delay(8); //稍做延時(shí) DQ = 0; //單片機(jī)將 DQ 拉低 delay(80); //精確延時(shí) 大于 480us DQ = 1; //拉高總線 delay(14); x=DQ; //稍做延時(shí)后 如果 x=0 則初始化成功 x=1 則初始化失敗 delay(20); } //讀一個(gè)字節(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); } //寫一個(gè)字節(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 個(gè)寄存器) 前兩個(gè)就是溫度 a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a; tt=t*0.0625; //將溫度的高位與低

51、位合并 t= tt*10+0.5; //對結(jié)果進(jìn)行 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 為單位的延時(shí)程序,不準(zhǔn)確*/ { uchar j; while(x--){ for(j=0;j<125;j++) {;} } } void LCD12864_Reset() /*LCD12864 初始化*/ { lcd_delay_ms(100); /*適當(dāng)延時(shí)待 LCD 自動復(fù)位完成*/ 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); /*顯示開及光標(biāo)設(shè)置*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x01); /*顯示清屏*/ lcd_delay_ms(30); LCD12864_NoWaitIdle_COM_Write(0x06); /*DDRAM 的地址計(jì)數(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; /*計(jì)算轉(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 為單位的延時(shí)程序*/ 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è)置時(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]); /*顯示時(shí)間*/ 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]; /*時(shí)*/ 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é)論 本文詳細(xì)介紹了應(yīng)用P80C51單片機(jī)控制微型打印機(jī)實(shí)現(xiàn)打印輸出的硬件設(shè)計(jì)及軟件設(shè)計(jì)。經(jīng)過測試表明,利用設(shè)計(jì)能夠?qū)崿F(xiàn)數(shù)據(jù)打印,并且能夠通過串口通信實(shí)現(xiàn)對打印機(jī)輸出的控制,打印結(jié)果正確無

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!