專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

C8051F320-時(shí)鐘和4in1八段管

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2011年09月06日   【字體:

人都是自己折騰自己。

       C8051F320包含一個(gè)內(nèi)部振蕩器,也可以采用其他方式提供振蕩。手頭沒(méi)有任何元器件,所以只考慮使用內(nèi)部振蕩器。

一、時(shí)鐘設(shè)定

       系統(tǒng)復(fù)位時(shí),默認(rèn)使用內(nèi)部振蕩器作為系統(tǒng)時(shí)鐘,出廠前已經(jīng)將基頻定為12MHZ,可以根據(jù)需要對(duì)其進(jìn)行分頻操作。 

分頻方法: 寄存器OSCICN 最低兩位 D1D0的值決定了分頻數(shù),00~11分別為8分頻、4分頻、2分頻、不分頻。

                   此外,D7=1表示內(nèi)部振蕩器使能,反之禁止內(nèi)部振蕩器

                           D6=1內(nèi)部振蕩器頻率準(zhǔn)備好標(biāo)志

                           D5=1強(qiáng)行掛起內(nèi)部振蕩器

       寄存器OSCICL 內(nèi)部振蕩器校準(zhǔn),D4~D0的數(shù)值決定了校準(zhǔn)后的頻率偏差,計(jì)算方法由如下公式?jīng)Q定:


                                            
 

                     第二項(xiàng)的分母為基準(zhǔn)頻率,第三項(xiàng)為D4~D0,浮動(dòng)范圍0~31,根據(jù)這個(gè)公式,當(dāng)基準(zhǔn)設(shè)置為12M時(shí),能夠設(shè)置的偏差很小。

                                          △T=0.0025×0.083us×(0~31)=0 ~ 0.0064325 us

                     以12Mhz為例,12M對(duì)應(yīng)的周期為0.0833us,加上該偏差為0.0897625us,對(duì)應(yīng)頻率為11.14M。

                     也就是說(shuō),當(dāng)基準(zhǔn)頻率為 12 Mhz時(shí),最多可以調(diào)整為11.14M

                     以此類(lèi)推。2分頻時(shí),6Mhz,最多可以5.57M

                                       4分頻時(shí),3Mhz,最多可以2.78M

                                       8分頻時(shí),1.5Mhz,最多可以1.39M

 

 

二、八段管的一點(diǎn)小收獲

       偶然發(fā)現(xiàn)自己以前寫(xiě)顯示程序?qū)嵲谑翘贤亮,display()鐵打不動(dòng)就是選一個(gè)管,送個(gè)段碼,延時(shí),選下一個(gè)管,段碼,延時(shí),再選下一個(gè)管。。。  這樣一來(lái)顯示程序必定要消耗大量的時(shí)間在顯示程序上。當(dāng)系統(tǒng)時(shí)序要求高時(shí),這種寫(xiě)法根本就是自殺行為。

      正確方法應(yīng)該是,設(shè)置定時(shí)器在一個(gè)足夠小的時(shí)間上,比如10ms,利用一個(gè)變量保存中斷的次數(shù)。每次進(jìn)入中斷,根據(jù)(變量%4)的值,來(lái)驅(qū)動(dòng)一個(gè)管顯示數(shù)字,下一次中斷時(shí)切換下個(gè)管,以此類(lèi)推。。

 

 

三、F320內(nèi)部定時(shí)/計(jì)數(shù)器的使用

       芯片內(nèi)部有4個(gè)定時(shí)計(jì)數(shù)器,其中T0T1與51兼容,T2T3只能定時(shí)不能計(jì)數(shù),但可以實(shí)現(xiàn)16位自動(dòng)重裝計(jì)數(shù)值。

       寄存器TMOD TH0 TL0 TH1 TL1 以及T0T1相應(yīng)的啟停位中斷位不變。

新增部分:

       1、CKCON 時(shí)鐘控制器 復(fù)位值00H

            D7D6控制T3高低位的時(shí)鐘源,1為選擇系統(tǒng)時(shí)鐘,0為用戶(hù)設(shè)定。

            D5D4控制T2高低位的時(shí)鐘源,1為選擇系統(tǒng)時(shí)鐘,0為用戶(hù)設(shè)定。

            *如果設(shè)置為單個(gè)16位定時(shí)器,則D5D7無(wú)效

           D3D2作用類(lèi)似,分別控制T1T0的時(shí)鐘源,1為系統(tǒng)時(shí)鐘,0為分頻時(shí)鐘,默認(rèn)為分頻時(shí)鐘。其分頻系數(shù)由D1D0決定,

            00——12分頻  01——4分頻 10——48分頻 11——8分頻

      2、定時(shí)器T2

           和T0做個(gè)對(duì)照:

            TH0 —— TMR2H        TL0 —— TMR2L  

            TMOD —— TMR2CN (D4D3決定T2工作方式)

            TF0 —— TF2H(16位時(shí),H起作用)/TF2L   ET0 —— IE.5  TR0 —— TR2(雙8位時(shí),只能控制高八位定時(shí)器,低八位永遠(yuǎn)工作)

            TF2LEN =1  低八位時(shí)鐘中斷允許位

            TMR2RLH   TMR2RLL 專(zhuān)用于高低八位的計(jì)數(shù)值重載

            設(shè)為2個(gè)八位時(shí)鐘時(shí),共用一個(gè)中斷,必須在中斷程序中檢查對(duì)應(yīng)的標(biāo)志位才能確定是哪一個(gè)時(shí)鐘計(jì)數(shù)到,且標(biāo)志位必須手動(dòng)清零

            另有usb起始幀捕捉模式,暫時(shí)不研究

 細(xì)節(jié): TMR2H 控制字  D7D6  為T(mén)F2H 、TF2L ,中斷標(biāo)志

                                      D5       為 TF2LEN,定時(shí)器2低字節(jié)中斷允許位

                                      D4       為T(mén)2SOF 沒(méi)研究那部分,應(yīng)該給0,表示禁用

                                      D3       為T(mén)2SPLIT  1表示雙8位,0表示單16位,均可自動(dòng)重載計(jì)數(shù)值

                                      D2       為T(mén)R2,高八位時(shí)鐘啟動(dòng)(16位時(shí)鐘不知道怎么啟動(dòng)。。。。)

                         D1無(wú)用 D0        為T(mén)2外部時(shí)鐘選擇,需要與上面的CKCON對(duì)應(yīng),沒(méi)研究。

 

         小結(jié):T2可以工作在3種方式下,單個(gè)16位時(shí)鐘,2個(gè)8位時(shí)鐘,USB起始幀捕捉。使用前,必須設(shè)置TM2RCN控制字的D4D3決定工作方式。還必須設(shè)置時(shí)鐘源,在CKCON和TMR2H都有涉及。

                   對(duì)于16位時(shí)鐘,計(jì)數(shù)值存放在TMR2H和TMR2L,有專(zhuān)門(mén)的重載寄存器TMR2RLH和TMR2RLL。啟動(dòng)時(shí)可能是用TR2,開(kāi)中斷用IE.5(ET2),計(jì)數(shù)到標(biāo)志位叫TF2H,另有TF2L,必須專(zhuān)門(mén)在控制字的D5進(jìn)行設(shè)置才能使用。

                   對(duì)于8位時(shí)鐘,和上面基本差不多,共用一個(gè)中斷。

                    

                  T3和T2沒(méi)啥區(qū)別,名字?jǐn)?shù)字改改,中斷允許叫ET3,但位置不在IE,無(wú)所謂。

 

四、程序?qū)崪y(cè)

1、T2   單16位,16位中斷實(shí)測(cè)

     初始化: 

   CKCON=0x00;             //D1D0定了分頻數(shù),就是在系統(tǒng)分頻振蕩器后,定時(shí)器還能分頻一次。
                                    //D3D2比較爽,寫(xiě)個(gè)0x0c,不分頻直接給時(shí)鐘用,很快。。。
  TMR2CN=0x00;         //D5不允許低8位中斷 D4禁止SOF D3單16位 D2暫不啟動(dòng) D0使用12分頻時(shí)鐘      
  TMR2L=0x78;
  TMR2H=0xEC;
  TMR2RLH =0xEC;
  TMR2RLL =0x78;
  EA=1;
  ET2=1;

    啟動(dòng):TR2=1; 

   中斷號(hào) :5

   中斷里面必須加 TF2H=0;

    結(jié)果,成功

2、T2 單16位,允許低八位中斷,嘗試根據(jù)中斷標(biāo)志決定處理或者不處理低八位。

    上面的初始化改一句 TMR2CN=0x20;             由于低八位計(jì)數(shù)到就中斷,且低八位中斷沒(méi)清除,分針又跑得飛快了

    中斷多一句清除指令 TF2L=0;                        秒針走很快,合理。因?yàn)槊?55就中斷一

    中斷最前面多一段       if(TF2L==1){TF2L=0;return;}     忽略低八位時(shí)鐘中斷,秒針正常了

3、T2雙8位,實(shí)在懶得測(cè)試了。    測(cè)試一下T3的中斷號(hào) 

      悲劇了,T3的寄存器都沒(méi)有定義!查資料。。。

 修正1  : 在頭文件里把TMR2CN的位定義復(fù)制一份,改成3,成功

 修正2  : 在頭文件里手動(dòng)編寫(xiě)EIE1的位定義

/*  EIE1  */
sbit ET3           = EIE1 ^ 7;
sbit ECP1        = EIE1 ^ 6;
sbit ECP0        = EIE1 ^ 5;
sbit EPCA0      = EIE1 ^ 4;
sbit EADC0C   = EIE1 ^ 3;
sbit EWADC0  = EIE1 ^ 2;
sbit EUSB0       = EIE1 ^ 1;
sbit ESMB0      = EIE1 ^ 0;

失敗,提示該地址無(wú)效?(invalid base address)

修正3: 直接用 EIE1 |= 0x80;  編譯通過(guò)

運(yùn)行后還是不走,估計(jì)是中斷號(hào)有錯(cuò)。!

直接在main函數(shù)中查詢(xún)T3中斷標(biāo)志位,手動(dòng)跳轉(zhuǎn)到中斷程序,可以運(yùn)行,但是速度慢得沒(méi)天理。

可見(jiàn)T3中斷確實(shí)不是這么用的,待查。。。。

還有一個(gè)猜測(cè),是不是keil對(duì)interrupt 14不支持??

又多了個(gè)疑點(diǎn),改回T2,同樣用查詢(xún)方式,手動(dòng)跳轉(zhuǎn),速度非常正常!看來(lái)T3的PDF沒(méi)有看是個(gè)嚴(yán)重錯(cuò)誤!

關(guān)閉窗口

相關(guān)文章