回覆列表
  • 1 # 使用者2409647570344

    51微控制器定時器初值計算:

    void main(void)

    {

    s1=1;

    TMOD=0x01; //使用定時器T0的模式1

    TH0=(65536-46083)/256; //定時器T0的高8位設定初值

    TL0=(65536-46083)%256; //定時器T0的低8位設定初值

    函式功能:定時器T0的中斷服務函式

    void Time0(void ) interrupt 1 using 0 //定時器T0的中斷編號為1,使用第1組工作暫存器

    {

    count++; //每產生1次中斷,中斷累計次數加1

    if(count==20) //如果中斷次數計滿20次

    count=0; //中斷累計次數清0

    s++; //秒加1

    定時器初值 46083 是怎麼計算出來的? 一般我們如用 AT892051的話 定時50MS 就是 TH0=(65536-50000)/256。使用的12M晶體 ,20次為1S。

    擴充套件資料:

    使用說明

    以12M晶振為例:每秒鐘可以執行1000000次機器週期個機器週期。而T 每次溢位最多65536 個機器週期。我們儘量應該讓溢位中斷的次數最少(如50ms),這樣對主程式的干擾也就最小。

    開發的時候可能會根據需要更換不同頻率的晶振(比如c51微控制器,用11.0592M的晶振,很適合產生串列埠時鐘,而12M晶振很方便計算定時器的時間),使用插接式比較方便。

    對12MHz 1個機器週期 1us 12/fosc = 1us,方式0 13位定時器最大時間間隔 = 2^13 = 8.192ms,方式1 16位定時器最大時間間隔 = 2^16 = 65.536ms,方式2 8位定時器最大時間間隔 = 2^8 = 0.256ms =256 us。

    定時5ms,計算計時器初值 M = 2^K-X*Fosc/12 12MHz。方式0: K=13,X=5ms,Fosc=12MHz 則 M = 2^13 - 5*10^(-3)*12*10^6/12= 3192 = 0x0C78。

    THx = 0CH,TLx = 78H,方式1: K=16,X=5ms,Fosc=12MHz 則 M = 2^16 - 5*10^(-3)*12*10^6/12= 60536 = 0xEC78。

    THx = ECH,TLx = 78H,50ms 12MHz THx = 3CH,TLx = B0H,10ms THx = D8H,TLx = F0H。

  • 中秋節和大豐收的關聯?
  • 我是一名船員,目前是實習三副,面對工作和以後的規劃有點迷茫,請哪位幫我規劃一下?