<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 消費(fèi)電子 > 設(shè)計(jì)應(yīng)用 > PIC16C55單片機(jī)控制多用電子鐘

          PIC16C55單片機(jī)控制多用電子鐘

          ——
          作者:侯振勇 時(shí)間:2005-10-10 來源: 收藏
          本電子鐘采用單片機(jī)控制,適于溫室的定時(shí)恒溫或自來水的定時(shí)定壓控制等。單片機(jī)工作電壓為2.5~6.25V,功耗低、驅(qū)動(dòng)能力強(qiáng)。本電子鐘可以控制一路負(fù)載在24小時(shí)內(nèi)的3次開/關(guān);一個(gè)雙限觸發(fā)的定時(shí)輸出口,既可接傳統(tǒng)的功率保持型繼電器,也可接脈沖繼電器。本機(jī)用四位LED數(shù)碼管掃描式顯示,還有消隱(省電)工作方式,使用起來非常靈活、方便。
            一、工作原理
            電子鐘電路見圖1。
            RB7口是定時(shí)指示端,在定時(shí)開期間輸出高電平,驅(qū)動(dòng)V1發(fā)光,該口也可經(jīng)緩沖作定時(shí)輸出口;RB6是雙限觸發(fā)控制的定時(shí)輸出口,其工作方式是:在RB7高電平期間,若RB1為高電平,則RB6輸出高電平;若RB0為高電平,RB6輸出低電平;若RB1、RB0同為低電平,RB6保持原態(tài);同為高電平時(shí),RB6輸出低電平。RB5、RB4用于驅(qū)動(dòng)脈沖繼電器,RB6上升沿觸發(fā)RB5輸出高電平開脈沖;在RB6下降沿觸發(fā)RB4時(shí),RB4端輸出高電平關(guān)脈沖,開/關(guān)脈沖的持續(xù)時(shí)間均為125ms。
            RB3是消隱控制器,接高電平(即SK1閉合)時(shí),顯示屏及秒閃正常;否則,顯示消隱。顯示消隱時(shí),時(shí)鐘及各控制邏輯都正常運(yùn)行,如忽略RB4至RB7各口的驅(qū)動(dòng)電流,則在3V供電時(shí),整機(jī)電流不足20μA,即兩節(jié)5號(hào)電池可用數(shù)月!RB2選擇數(shù)碼管極性,RB2為低電平,使用共陰LED;RB2為高電平,則用共陽LED。數(shù)碼管的極性是在上電初始化時(shí),根據(jù)RB2口狀態(tài)確定的,工作過程中改變RB2的電平則不起作用。
            本機(jī)設(shè)S1~S4四個(gè)按鍵,S1是功能選擇鍵,S2是小時(shí)增量調(diào)整,S3是分鐘增量,S4用于分鐘減量調(diào)節(jié),其使用方法為:
            上電時(shí),RB5至RB7均為低電平,RB4端送出一個(gè)關(guān)脈沖,使SK1閉合,整機(jī)正常顯示、工作,RC7口送出秒閃脈沖,RC6~RC0送字段碼。RA3~RA0分別為10時(shí)、時(shí)、10分、分位的位碼輸出。這時(shí),按一下S2或S3(時(shí)增量/分增量鍵),可使RB7端置位或復(fù)位。
            在正常走時(shí)期間,秒閃正常;在校對(duì)或設(shè)置定時(shí)時(shí),秒停閃。例如:在正常走時(shí)期間,按一下S1鍵,秒閃停止,屏幕顯示J-,表示可以校對(duì)時(shí)間。這時(shí)再按S2~S4中任一鍵,屏幕顯示現(xiàn)在時(shí)間,但秒不閃,此刻可按S2~S4校對(duì)時(shí)鐘。再次按S1,屏幕顯示1∪,表示可以設(shè)定第一次開時(shí)間,此時(shí)按S2~S4對(duì)時(shí)間進(jìn)行查看及設(shè)置。繼續(xù)按S1,系統(tǒng)顯示1∩,表示可設(shè)置第一次關(guān)時(shí)間……依次進(jìn)行。設(shè)置好系統(tǒng)及3次開關(guān)時(shí)間后,整機(jī)回到正常顯示狀態(tài),秒閃恢復(fù)。
            如欲取消某次開/關(guān)定時(shí),只需把該次的開與關(guān)時(shí)間設(shè)置成相同值即可。
            筆者曾把該時(shí)鐘用于定時(shí)定壓供水控制系統(tǒng),RB6端用于驅(qū)動(dòng)繼電器(也可用RB5與RB4兩端驅(qū)動(dòng)脈沖繼電器),RB1端接水壓(水位)的低限輸入,RB0端接高限輸入,設(shè)置好定時(shí),一個(gè)簡(jiǎn)易的定時(shí)定壓自動(dòng)供水系統(tǒng)即告完成。
            二、編程技巧
            單片機(jī)程序存儲(chǔ)器只有512字節(jié),加上采用外接32768Hz晶體振蕩方式,時(shí)鐘速度較低,因此,統(tǒng)籌好系統(tǒng)的工作時(shí)序與人機(jī)界面之間的關(guān)系是軟件設(shè)計(jì)成敗的關(guān)鍵。本機(jī)編程采用如下方案:
            軟件工作流程見附圖2。
            PIC16C55單片機(jī)的一個(gè)機(jī)器周期是4個(gè)時(shí)鐘周期,不難算出,本系統(tǒng)中每秒有8192個(gè)機(jī)器周期。在編制軟件時(shí),先設(shè)定單片機(jī)內(nèi)部定時(shí)計(jì)數(shù)器F1的計(jì)數(shù)方式為機(jī)器周期的64分頻。這樣,每當(dāng)F1溢出時(shí),系統(tǒng)遞加2秒。平時(shí),系統(tǒng)每128個(gè)機(jī)器周期內(nèi)用RC口與RA口驅(qū)動(dòng)掃描一次顯示屏,可保證每秒內(nèi)掃描64次顯示屏,基本上無閃爍感。而128個(gè)機(jī)器周期正是F1的第0位(為便于敘述以下簡(jiǎn)記為F10)每次下降沿的間隔時(shí)間,我們可以編一段程序,當(dāng)F10的下降沿到來時(shí),掃描一次顯示屏,每當(dāng)F1的低4位為全0時(shí)(125ms一次)使系統(tǒng)檢測(cè)一次RB口與按鍵狀態(tài),并進(jìn)行相關(guān)處理,部分相關(guān)程序如下:
          WAIT  BTFSC 1,0    ;等待F10的下降沿,編程時(shí)
                GOTO  WAIT   ;要保證每次下降沿前到此
                MOVFW 1
                SKPNZ
                GOTO  CLOCK ;F1=0,滿2秒,轉(zhuǎn)時(shí)鐘處理
                ANDLW 0FH ;屏蔽F1高4位
                SKPZ
                GOTO DISPLAY;F1低4位不為0,轉(zhuǎn)顯示
                MOVLW 0C0H ;滿125mS,使RB口脈沖復(fù)位
                ANDWF 6,1
                MOVLW 0FH   ;檢測(cè)按鍵
                TRIS  7
                MOVFW 7
                ANDLW 0FH??;保留按鍵數(shù)據(jù)
                SKPZ
                GOTO AN ??;有鍵值,轉(zhuǎn)按鍵處理
          DISPLAY ……      ;顯示掃描,定時(shí)管理RB口
          CLOCK    ……      ;時(shí)鐘,定時(shí)處理程序
          AN    ……      ;按鍵管理程序
            

           



          關(guān)鍵詞: PIC16C55

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();