用單片機(jī)驅(qū)動(dòng)LED數(shù)碼管有很多方法,按顯示方式分,有靜態(tài)顯示和動(dòng)態(tài)(掃描)顯示,按譯碼方式可分硬件譯碼和軟件譯碼之分。
靜態(tài)顯示就是顯示驅(qū)動(dòng)電路具有輸出鎖存功能,單片機(jī)將所要顯示的數(shù)據(jù)送出后就不再管,直到下一次顯示數(shù)據(jù)需要更新時(shí)再傳送一次新數(shù)據(jù),顯示數(shù)據(jù)穩(wěn)定,占用很少的CPU時(shí)間。動(dòng)態(tài)顯示需要CPU時(shí)刻對(duì)顯示器件進(jìn)行數(shù)據(jù)刷新,顯示數(shù)據(jù)有閃爍感,占用的CPU時(shí)間多。這兩種顯示方式各有利弊;靜態(tài)顯示雖然數(shù)據(jù)穩(wěn)定,占用很少的CPU時(shí)間,但每個(gè)顯示單元都需要單獨(dú)的顯示驅(qū)動(dòng)電路,使用的硬件較多;動(dòng)態(tài)顯示雖然有閃爍感,占用的CPU時(shí)間多,但使用的硬件少,能節(jié)省線路板空間。
硬件譯碼就是顯示的段碼完全由硬件完成,CPU只要送出標(biāo)準(zhǔn)的BCD碼即可,硬件接線有一定標(biāo)準(zhǔn)。軟件譯碼是用軟件來完成硬件的功能,硬件簡(jiǎn)單,接線靈活,顯示段碼完全由軟件來處理,是目前常用的顯示驅(qū)動(dòng)方式。
比較常用的顯示驅(qū)動(dòng)芯片有:74LS164 , CD4094+ULN2003(2803) ,74HC595+ULN2003(2803) , TPIC6B595,AMT9095B, AMT9595等許多。另外,市場(chǎng)上還有一些專用的LED掃描驅(qū)動(dòng)顯示模塊如MAX7219等,功能很強(qiáng),價(jià)格稍高一些。下面是一個(gè)用74LS164驅(qū)動(dòng)顯示的例子和一個(gè)用4094掃描驅(qū)動(dòng)顯示的例子
系統(tǒng)硬件設(shè)計(jì) 為了能夠顯示電梯的運(yùn)行狀態(tài),電梯樓頂?shù)闹骺貑卧c轎廂節(jié)點(diǎn)微處理器之間需要信號(hào)線相連。傳統(tǒng)的電梯控制 系統(tǒng)C作業(yè)方式下需要的信號(hào)傳輸線有11根之多,這樣對(duì)于現(xiàn)場(chǎng)施工很不方便,而且增加了系統(tǒng)的不穩(wěn)定因素。為此我們?cè)O(shè)計(jì)在主控單元與節(jié)點(diǎn)微處理器之間采用雙絞線串行通訊,這即節(jié)省了成本,又提高了傳輸?shù)目?性,方便施工。 本系統(tǒng)主要的硬件設(shè)計(jì)是節(jié)點(diǎn)處單片機(jī)顯示控制部分。主控單元和節(jié)點(diǎn)之間的通訊為標(biāo)準(zhǔn)RS-485接口。 LED顯示模塊控制電路如圖1所示。整個(gè)電路由單片機(jī)AT89C51、列驅(qū)動(dòng)電路ULN2803、行驅(qū)動(dòng)電路TIP122、移位寄存器4094及附屬電路組成。設(shè)計(jì)的顯示界面可顯示6個(gè)漢字,需要24個(gè)8×8 LED點(diǎn)陣模塊,組成16×96的矩形點(diǎn)陣。由于AT89C51只有4K ROM,如何合理的安排顯示內(nèi)容的點(diǎn)陣數(shù)據(jù)及顯示運(yùn)行程序是需要考慮的問題。通常電梯顯示的提示信息不是很多,主要有樓層顯示、電梯運(yùn)行狀態(tài)顯示、電梯故障顯示等,大概需要40個(gè)左右漢字就足夠了,另外還有數(shù)字,特殊圖符等,總共大約需要2K的存儲(chǔ)空間,所以4K ROM是夠用的。 顯示采用逐行掃描方式。單片機(jī)從內(nèi)存中取出第一行需要顯示的12字節(jié)點(diǎn)陣數(shù)據(jù),由列點(diǎn)陣數(shù)據(jù)輸入端P1.2口按位依次串行輸入至列移位寄存器,數(shù)據(jù)輸入的順序與顯示內(nèi)容順序相反。然后置行點(diǎn)陣選通端P1.3為1,即行移位寄存器的D為高電平,STR使能,(所有4094的OE引腳接+5V電平)則列移位寄存器中的數(shù)據(jù)同時(shí)并行輸出,從而選通該行。延時(shí)一段時(shí)間后,再進(jìn)行下一行點(diǎn)陣數(shù)據(jù)的顯示。需要注意的是,每次只能選通一行數(shù)據(jù)。通過不斷的逐行掃描,實(shí)現(xiàn)了數(shù)字或提示信息的顯示。
顯示程序設(shè)計(jì) 點(diǎn)陣數(shù)據(jù)文件的建立 根據(jù)顯示要求,本系統(tǒng)需要的點(diǎn)陣數(shù)據(jù)庫(kù)應(yīng)包括如下幾個(gè)部分:(1)樓層數(shù)字顯示,這些點(diǎn)陣數(shù)據(jù)可以使用一些取模軟件(如字模提取v2.1)獲得,非常簡(jiǎn)便。為顯示方便,點(diǎn)陣格式應(yīng)為16×8。(2)電梯運(yùn)行狀態(tài)漢字信息顯示,本字模數(shù)據(jù)取自UCDOS下的字庫(kù)文件HZK16。HZK16文件的字符為16×16點(diǎn)陣。所有字符按照區(qū)位碼從小到大升序排列。計(jì)算漢字字符首地址的公式如下:漢字首地址=((區(qū)碼-1)×94+位碼-1)×32。(3)特殊圖形(如產(chǎn)品商標(biāo)、箭頭等)的點(diǎn)陣數(shù)據(jù)的提取。與(1)類似,可以先做一個(gè)BMP文件,然后用取模軟件(如字模提取v2.1)獲得。為了顯示方便,點(diǎn)陣數(shù)據(jù)的格式應(yīng)為n*(16×8)(箭頭圖形這里取16×16),不足要求的則以0數(shù)據(jù)補(bǔ)充。需要指出的是,為了使編程處理簡(jiǎn)單,以上的點(diǎn)陣數(shù)據(jù)均為橫向取模。 特殊顯示效果的生成 這里我們采用C51編程。C語(yǔ)言編程具有快捷,模塊功能強(qiáng)大,可讀性好,效率高等優(yōu)點(diǎn),目前很多公司的單片機(jī)產(chǎn)品都支持C語(yǔ)言開發(fā)。為了使轎廂內(nèi)顯示面板的顯示更加醒目,形象生動(dòng),我們?cè)诔绦蛑性O(shè)計(jì)了諸如閃動(dòng)、箭頭移動(dòng)等動(dòng)態(tài)顯示效果。 在電梯運(yùn)行期間,顯示面板上的信息應(yīng)包括箭頭、樓層數(shù)字顯示、電梯上(下)行文字說明三部分。其中箭頭可以上下滾動(dòng),顯示電梯正在運(yùn)行及指示電梯運(yùn)行方向,當(dāng)達(dá)到預(yù)定樓層時(shí),箭頭停止運(yùn)行,而樓層數(shù)字則顯示當(dāng)前電梯所處的樓層。 電梯運(yùn)行期間信息顯示子程序。該子程序函數(shù)的參數(shù)說明如下:指針pt_num、pt_arr、pt_info分別指示數(shù)字、箭頭、漢字信息點(diǎn)陣數(shù)據(jù)存儲(chǔ)區(qū)首地址,變量num傳遞當(dāng)前電梯所處樓層值,arr_offset為箭頭點(diǎn)陣數(shù)據(jù)存儲(chǔ)區(qū)的偏移量。該程序中調(diào)用的TRT(unsigned char dat )為發(fā)送1個(gè)字節(jié)數(shù)據(jù)到移位寄存器的函數(shù)。 void dis_num(unsigned char code*pt_num, unsigned char code*pt_arr, unsigned char code*pt_info ,unsigned char num, unsigned char arr_offset) { unsigned char num_dis,HS,VC, n_10,n_1; n_10=num/10; //提取樓層的個(gè)位、十位數(shù)字 n_1=num-n_10*10; for(VC=0;VC<16;VC++)//顯示信息 { for(num_dis=0;num_dis<4;num_dis++)//電梯上( 下)行信息顯示 { for(HS=0;HS<2;HS++) TRT(*(pt_info+VC*2+1-HS+32*(3-num_dis))); } TRT(*(pt_num+n_1*16+VC));//樓層數(shù)值個(gè)位顯示 TRT(*(pt_num+n_10*16+VC));// 樓層數(shù)值十位顯示 for(HS=0;HS<2;HS++)//箭頭顯示 TRT(*(pt_arr-n_layer+(n_layer+VC*2+1-HS)%32)); } } 然后在主程序中調(diào)用該函數(shù)。電梯層數(shù)由主控單元傳送給顯示面板控制器,為了使箭頭能夠動(dòng)態(tài)顯示,只需在調(diào)用時(shí)更改箭頭點(diǎn)陣數(shù)據(jù)的偏移量即可。 {... ... n_flore=ele_floor;//獲取當(dāng)前電梯所處樓層值 if(ele_dir==1)//判斷電梯是否電梯上行 for(n_layer=0;n_layer<16;n_layer++)//箭頭圖形滾動(dòng) {if(n_flore==store[1])//判斷當(dāng)前樓層是否變化 for(num_t=0;num_t<20;num_t++)//循環(huán)運(yùn) 行,使箭頭圖形顯示一段時(shí)間_ //NUM、ARROW_UP、ele_up分別為數(shù)字、向上箭 頭、漢字信息點(diǎn)陣數(shù)據(jù)存儲(chǔ)區(qū)首地址 dis_num(NUM, ARROW_UP+n_layer*2, ele_up, n_flore, n_layer*2); } ... ...}
通訊功能的實(shí)現(xiàn) 電梯系統(tǒng)主控單元與轎廂內(nèi)的顯示面板控制器之間采用串行通訊。其工作流程是這樣的:主控單元的單片機(jī)控制器定時(shí)監(jiān)測(cè)信號(hào)線的狀態(tài),如若信號(hào)線狀態(tài)發(fā)生變化,則把當(dāng)前的狀態(tài)發(fā)給轎廂內(nèi)顯示模塊單元?紤]到現(xiàn)場(chǎng)環(huán)境比較惡劣,通訊時(shí)有可能受到干擾,我們?cè)谠O(shè)定通訊約定時(shí)做了考慮,具體通訊約定如下: 通訊時(shí)首先發(fā)通信開始標(biāo)志,接著發(fā)送顯示工作命令字。工作命令字包括2個(gè)字節(jié),提供給顯示面板控制器顯示內(nèi)容編碼,如表1所示。最后對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),發(fā)送數(shù)據(jù)校驗(yàn)和。然后等待接收端發(fā)回的確認(rèn)信息,若確認(rèn)信息正確,則該次通訊結(jié)束,否則主控單元嘗試第二次發(fā)送,如果第二次仍然出錯(cuò),則主控單元提示報(bào)警,同時(shí)在轎廂內(nèi)的顯示面板顯示出錯(cuò)信息。該通訊規(guī)約非常簡(jiǎn)便,較好的解決了上述問題。下面給出主要的程序: 發(fā)送程序: void timer0()interrupt 1 using 1//定時(shí)監(jiān)測(cè)信號(hào)線的狀態(tài) { if(t_data[1]!=P0)||t_data[2]!=P2}//判斷信號(hào)線是否 變化 { t_data[1]=P0; t_data[2]=P2; chk_data=t_data[0]+t_data[1]+t_data[2]; t_data[3]=chk_data>>8; t_data[4]=(unsigned char)chk_data;//校驗(yàn)和 } TH0=0x4c;//重裝初始值 TL0=0x00;} 相關(guān)主程序: {...... for(i=0;i<5;i++)//重裝輸出緩沖區(qū) { tdata[i]=t_data[i];} for(i=0;i<5;i++)//發(fā)送數(shù)據(jù) { SBUF=tdata[i]; while(TI==0); TI=0; } for(count=0;count<2;count++)//接收下位機(jī)發(fā)回的確 認(rèn)信息 { while(RI==0); RI=0; rdata[count]=SBUF; } if(rdata[0]==0x45&&rdata[1]==0x52)//如果出現(xiàn)錯(cuò)誤 再次發(fā)送 for(i=0;i<5;i++) { SBUF=tdata[i]; while(TI==0); TI=0; } ...... } 串行中斷接收程序與此類似,這里不再列出。
結(jié)語(yǔ) 本文設(shè)計(jì)了實(shí)現(xiàn)電梯控制系統(tǒng)LED點(diǎn)陣顯示模塊的設(shè)計(jì)方案,并成功應(yīng)用于實(shí)際系統(tǒng)。 |