便携式红外接收热敏打印机软件设计
steempress·@julian2013·
0.000 HBD便携式红外接收热敏打印机软件设计
我是一个电子研发工程师。工作以后,做的第一个产品就是便携式红外打印机的软件和部分硬件的设计。 当时刚毕业,经验不算多,那真是没日没夜地查资料,思考,搞了3个月,最终搞出来了,而且出货量一直很稳定,还没出什么问题,可以算作是奇迹了。 今天闲着没事,翻看原来的资料,看到了这份青涩的软件设计报告,觉得挺有意义的,就把它放上区块链吧。 *** # IrPrinter firmware说明 ***  IrPrinter 工作状态图 IrPrinter工作状态如上图所示,正常上电后IrPrinter处于等待接收数据状态,当收到红外打印数据时,则开始打印数据。IrPrinter使用电池时,如果在十分钟内未收到打印数据,它就会自动关机,以节省电池电能。  打印数据流程图 IrPrinter firmware 主要由红外通讯解码和打印两个模块组成,如图,它们通过一个缓冲区连接起来工作。要被打印的数据通过红外通讯解码模块还原后,保存在缓冲区中,打印模块从缓冲区读取数据,然后把它们打印出来,这样实现打印红外数据的功能。 ## 红外通讯解码模块: 红外通讯解码模块包括IReceived(),Timer_0(),InitRecv()三个函数。 InitRecv()实现红外通讯解码模块的初始化功能。IReceived()和Timer_0()共同实现红外通讯数据帧解码、校验、纠错功能。  *** ## 红外通讯数据帧协议: 红外通讯协议为如上图所示的Redeye协议,每个单元的周期为470us,调制信号的宽度占一个单元的50%。一个完整的数据帧由帧头START、帧尾STOP、纠错数据和数据DATA组成。 帧头为3个有调制信号的单元,帧尾是3个无调制信号的单元,纠错数据和数据都用2个单元来表示每bit,有调制信号的在前无调制信号的在后表示1,无调制信号的在前有调制信号的在后表示0,数据为8bits,纠错数据为4bits的Hamming Code。 经过红外接收硬件电路的解调,上图中黑框表示的调制信号变为高电平信号。 IReceived()为外部中断函数,当接收到的信号发生上升沿跳变时,IReceived()就被调用一次。Timer_0()为定时器0的溢出中断函数。IReceived()、Timer_0()流程如下图(图中的T为数据帧中一个单元的时间)。 当接收红外通讯信号时,外部中断将捕获解调信号每一次上升沿,用定时器T0计算每个上升沿的间隔时间。 从通讯协议可以知道,在正常情况下间隔只能是T、2T、3T(除了停止位)。帧头一定是连续2个为T的间隔,并且在每个帧里是唯一的。 接收数据位时,由间隔和前一位数据值判断当前位的数据值,如果间隔为T且前一位为0,则当前位为1;如果间隔为3T且前一位为1,则当前位为0;如果间隔为2T,则当前位和前一位相同;初始数据位的前一位值为0。所有的帧长度都是固定的30T,因此以通过间隔来求得接收的数据。 在通讯受到干扰的情况下,红外调制脉冲可能丢失或增加,因此加入抗干扰程序来增强通讯的可靠性。 由于数据帧长度是固定的,并且间隔一定是T的倍数,因此可以检测出脉冲丢失或增加。在每个帧里包含4bits的Hamming Code,并且知道出错数据位的位置,所以Hamming Code可以检验错误并且可纠正小于3bits的错误。   ## 打印模块 打印模块包含打印文本、图形及出错溢出符号的功能。 Print()为打印子程序。 PrintChar()为打印字符子程序,打印文本,包含Roma和ECMA两种字体。 SetMode()为打印图形及设置控制字子程序,控制字包含加下划线、宽字体、字体切换等。 PrintError()为打印出错符号█ 的子程序,PrintLost()为溢出符号▒ 的子程序。 SelfTest()为打印机自检子程序,检测打印标准字体的正确性,同时还检测电池电量。 PrintHWInit()为打印硬件初始化子程序, PrintSWInit()为打印软件初始化子程序,在上电时初始化打印机内部I/O端口。 OnPrintInt()为TG信号中断程序,提供打印点阵位置信号。 TestContrast()为打印浓度设置子程序,随电源电压变化自动调整打印浓度设置,保证打印浓度的一致性。 LoadingHead()为打印头复位子程序。 PutChar()为向缓冲区放数据子程序。 GetChar()为从缓冲区读数据子程序。 WaitOnHome()为打印头每行起始定位子程序。 ToLeft()为打印头复位至左端子程序。 ToRight()为打印头复位至右端子程序。 Delay()为打印加热延时子程序,决定打印时的浓度。 CheckDelay()为检测延时子程序。RestartPrinter()为打印机复位子程序。 下面为各个子程序的流程图:  打印子程序Print()  打印字符子程序PrintChar()  打印图形及设置控制字子程序SetMode() 和打印相关还有一些流程图,就不一一贴出来了,打印头的控制相对来说时序要求高,还是挺繁琐的。 ## 主程序及其他模块: 主程序主要完成各模块间的调度和协调,上电后对整个打印机进行初始化,当缓冲区收到数据时,调用打印程序模块进行打印,详细流程见图。 打印机还包括键盘模块和I2C接口模块。键盘模块用外部中断来获得按键信号,用定时器1除去按键的抖动信号。I2C接口模块提供与E2PROM芯片24C02的接口,来保存打印浓度值和其他一些要保存的设定值。   当初就是这个项目,让我3个月从实习期转正,然后一直做到现在。电子研发工程师的工作,还是很神奇的。 --- 希望喜欢我文字的人,去看看这个吧,说说对我的看法,请我吃星星,谢谢啦~ [我的 @ReviewMe 凭证留言板!](https://steemit.com/cn/@julian2013/reviewme-yoursteemitname)
👍 hdu, curation.trail, bukiland, dancingapple, xiaoshancun, ordinaryamerican, wilhb81, devsup, sskiller, steemall, kissfirer, julian2013, zy-sb, minnowsupport, tanlikming, cnbuddy, hmayak, davidke20, namchau, yumisee, joeliew, r3aperz, iipoh06, lemooljiang, angelina6688, sbi2, partiko, osobiggie, sweetpee, amayahaley21, daeshawn, shila, steempress, steempress-io, aiyanna, ericet, jmiller05, blockgatorsarmy, moneybaby, steemstem, alexzicky, dna-replication, huilco, traviseric, praditya, curie, emmanuel293, alexworld, doneliseo, moniroy, kingnosa, liberosist, erikkun28, aalok, locikll, suesa, amin-ove, steemmyphoto, vact, anwenbaumeister, wstanley226, jesse5th, hendrikdegrote, jesusj1, suasteguimichel, kevinwong, lemouth, enzor, adetola, rionpistorius, ajpacheco1610, effofex, count-antonio, beautyinscience, alexander.alexis, fancybrothers, howo, tanyaschutte, felixrodriguez, tfcoates, tristan-muller, fejiro, sco, rharphelle, shoganaii, jlmol7, olajidekehinde, real2josh, kingabesh, lianaakobian, anyes2013, de-stem, ari16, michaelwrites, temitayo-pelumi, ibk-gabriel, osariemen, scottallen, bloom, kryzsec, samminator, ludmila.kyriakou, esteemguy, mr-aaron, fbslo, nicola71, kenadis, gentleshaid, mathowl, mondodidave73, dexterdev, alexdory, flugschwein, francostem, deholt, kingabesh1, purelyscience, swapsteem, stem.witness, gammagooblin, helo, tsoldovieri, abigail-dantes, gra, maticpecovnik, reyvaj, jrevilla, herbayomi, regularowl, aboutyourbiz, howtostartablog, cryptokrieg, zacherybinx, gambit.coin, phogyan, kerry234, motivatorjoshua, speaklife, randomwanderings, giovaabbatichio, chimtivers96, pacokam8, makrotheblack, vadimlasca, markmorbidity, skycae, esaia.mystic, alprazo.lamb, strings, loydjayme25, sissyjill, morbyjohn, bil.prag, recordpool, dashfit, lrsm13, muliadi, smafey, marialefleitas, debbietiyan, phaazer1, nitego, onethousandwords, leyla5, derekvonzarovich, sireh, operahoser, jpmkikoy, niouton, anna-mi, clweeks, gotgame, digitalpnut, itchyfeetdonica, beladro, hiddenblade, kendallron, qberryfarms, joanpablo, oezixxx, raymondspeaks, moksamol, thatsweeneyguy, mrstaf, jayna, g0nr0gue, indy8phish, paddygsound, joendegz, davidcentenor, hansmast, getrichordie, stahlberg, bavi, onethousandpics, kimchi-king, creatrixity, didic, bookoons, hardaeborla, mahmudulhassan, ashfaaaq, cynicalcake, ogsenti, tombstone, arconite, joshglen, neumannsalva, nurhayati, lesmouths-travel, misia1979, resteemer, nolasco, zonguin, mountain.phil28, kingswisdom, irishcoffee, poodai, drmake, tomatom, monie, darkiche, dolphinscute, galam, jaycem, technotroll, doctor-cog-diss, avizor, romanleopold, steemzeiger, biomimi, funster, call-me-howie, testomilian, synthtology, lafona-miner, gangstayid, corsica, akumar, catalincernat, m1alsan, adamzi, dragibusss, niko3d, ameliabartlett, joelagbo, kookyan, nigerian-yogagal, disruptivas, deividluchi, clement.poiret, kiikoh, mrunderstood, predict-crypto, lenin-mccarthy, hectgranate, gabrielatravels, hetty-rowan, idkpdx, positiveninja, galione, momimalhi, raghao, rhethypo, chickenmeat, lola-carola, the-eliot, click3rs, mininthecity, fanta-steem, zerokun, bluntrunner, daddywilliam, gmedley, slickhustler007, venalbe, all-right, adalhelm, wanasoloben, justasperm, annaabi, ananas.studio, ejgarcia, stonecoin, andydream, zeldacroft, alom8, positiveninja2, boynashruddin, azulear, profnuhu, abeyaimary, pechichemena, hkmoon, gordon92, reizak, zlatkamrs, lilianajimenez, warpedpoetic, as-abir, sarhugo, expanse, jan-mccomas, riche-gould, weirdheadaches, jlsplatts, jordan.white306, payger, thabiggdogg, patchnotes, melaniesaray, lil-splatts, bflanagin, trang, kuku-splatts, brutledge, edprivat, ivansnz, elsll, kipswolfe, krasnalek, naomipangolin, blewitt, sina-adventure, hairgistix, splatz-1, splatz-2, improv, jakesdewet, teukurival, talli-art, freddysanchez, psionic-tremors, gpiglioni, outtheshellvlog, altobot, somegaming, bdqst, splatz, wisewoof, serylt, finanzamt, imamalkimas, steemit-bot, perpetuum-lynx, dbddv01, supposer, zest, bohemian.machine, jewlzie, cooperfelix, communityisyou, stem-espanol, smacommunity, anthive, lorenzor, iamphysical, carloserp-2000, amestyj, ivymalifred, yrmaleza, miguelangel2801, emiliomoron, ulisesfl17, arac, tomastonyperez, elvigia, luiscd8a, geadriana, elpdl, josedelacruz, joseangelvs, viannis, majapesi, yusvelasquez, jesusfl17, ubaldonet, mary11, lupafilotaxia, fran.frey, xeliram, giulyfarci52, wilmer14molina, alaiza, lapp, steemtpistia, crassipes, agrovision, peaceandwar, psicoluigi, flores39, medicnet, thescubageek, mahdiyari, lamouthe, eniolw, ozgurcinarli, wackou, wdoutjah, thomaskatan, drifter1, mammasitta, mf2hdlife, stevenwood, paramimd, angelica7, homespun, drifter2, diyanti86, raoufwilly, alvin0617, jiujitsu, rival, gracelbm, knightbjj, deadcountry, landria, opheliapoe, velmafia, michelios, damzxyno, velourex, massivevibration, happychild, benleemusic, drsensor, lacher-prise, gribouille, eric-boucher, cobloc, robertbira, eroticabian, sanderdieryck, eurogee, laurentiu.negrea, acont, yomismosoy, kafupraise, egotheist, langford, steepup, ninyea, hillaryaa, delph-in-holland, xanderslee, williams-owb, mrxplicit, nwjordan, faithfullwills, lk666, honeysara, cooknbake, cordeta, christianyocte, mindscapephotos, ivan-g, bitmycoin, apteacher, golbang, oghie, danlipert, wargof, guga34, forestplane, ennyta, anaestrada12, musicvoter, grizzle, atomcollector, a0i, elamental, lillywilton, skorup87, woolnami, silkroadgo, woolnyeo, ujhg1004, jonmagnusson, stonermedal, idx, abit, lucacroce,