AT89S52 24PU ЦИКЛ ЧАСОВ - PullRequest
       89

AT89S52 24PU ЦИКЛ ЧАСОВ

0 голосов
/ 03 декабря 2018

Я использую Timer0 на AT89S52 24PU для включения / выключения светодиода с 1,5 мс на выводе P1.0, Crystal i, который я использовал для чипа, составляет 11,0592 МГц с 2 конденсаторами 22 мкФ, и я кодировал на Keil51.Я использовал Proteus, чтобы проверить пульс каждого переключателя, как показано на рисунке: https://drive.google.com/open?id=1ub5UgujjsDn47DrAq69ZjpHzVoTnG9Md.И затем, я хочу убедиться, что мой код правильный, я использовал модуль Logic Analyzer 24Mhz-8CH для проверки импульса с помощью программного обеспечения Saleae Logic (которое поддерживает использование этого модуля), и импульс, который я собрал как рисунок: https://drive.google.com/open?id=1ZLDfu8DbzDMqMkuEbLNCuPUNidRseonR.

Оба из 2 результатов - 1,5 мс, но, когда я попытался вычислить Cycles Machine (Tosc) для каждой команды, это 3 мс.Я не знаю почему, мой код и как я вычислил Tosc ниже:

ORG 0000H  
LJMP MAIN

MAIN:

MOV TMOD, #001h     ; Mod 1 timer 0 (16 bit) ;2Cycles

TIMER:              ; The counter start at FAA5h
MOV TL0, #0A5h      ;2Cycles
MOV TH0, #0FAh      ;2Cycles

SETB TR0            ;Start timer 0  ;3Cycles

AGAIN1: JNB TF0, AGAIN1     ;2Cycles

CLR TR0  ;Stop timer0       ;3Cycles
CLR TF0  ;Clear Flag        ;3Cycles

CPL P1.0                    ;3Cycles
JMP TIMER                   ;2Cycles

END

Итак, код об использовании Timer0 с 1,5 мс в качестве кода по умолчанию в Интернете.Циклы для каждой команды различны, я последовал за KeilArm, чтобы завершить циклы по этой ссылке: http://www.keil.com/support/man/docs/is51/is51_mov.htm И ниже показано, как я вычислил Tosc.

  • Первый: для расчета серии 8051Я должен разделить Кристалл на 12: F = 11,0592 / 12 = 0,9216 МГц.Tosc равен 1 / F = 1 / 0,9216 = 1,085us (время выполнения команды (цикла)).
  • Второе: я использую формулу для вычисления 1,5 мс: 1,5 мс / 1,085us = 1382 (приблизительно 1371 все еще в порядке), затем я беру 65536 - 1382 = 0FA9Ah (приблизительно 0FAA5h все еще в порядке).Я использовал приведенное ниже значение, чтобы заменить вычисленное выше значение, которое я вычислил (чтобы точное время составило 1,5 мс: D.)

  • Третье: запуск счетчика в 0FAA5h (64165) и максимуме16 бит - это 0xFFFFh (65536) -> Программа должна считать 65536-64145 = 1371 раз.

  • Последнее: я вычислил свои циклы кода: 2 + 2 + 2 + 3 + 2* 1371 + 2 + 3 + 3 + 3 + 2 = 2764 циклов. Затем я кратен 1,085us = 2,9994 мс (3 мс).Это вдвое больше 1,5 мс, как я измерил.Я не знаю почему.Мне нужно, чтобы кто-нибудь объяснил мне в ближайшее время, крайний срок моего проекта приближается

Спасибо за ответ С наилучшими пожеланиями!

...