這些都是我自己理解的如果跟書上答案有誤就有勞大佬們的糾正
機械週期是甚麼?
就是機器在處理事件狀態的一個步驟
而我們在任何程式方面都會運用到這個東西
當然也有另外的指令週期(我們這邊不區分它們差異)
書上說8051的一個機械週期為12MHZ = 1us
1us = 10的-6次s
為甚麼要理解這個呢?
因為你如果要讓8051的延遲準確執行
你就需要理解這個基本條件
好啦基本上 機械週期不用太深入去理解
講個大概就差不多了
問題是在8051的延遲(DELAY) 這塊要怎麼清楚呢?
請看以下延遲範例 :
DELAY: mov r6,#250
DL1: mov r7,#200
DL2:djnz r7,DL2
djnz r6,DL1
ret
首先我們要了解指令上的周期
所以我把它們都標註 它們指令各個週期分別為
DELAY: mov r6,#250 //T1 = 1
DL1: mov r7,#200 //T2 = 1
DL2:djnz r7,DL2//T3 = 2
djnz r6,DL1 //T4 = 2
ret //T5 = 2
接下來我們要清楚知道這邊關西
才能算出這個範例的延遲時間
從中關西就是 DL1 給R7得到200數值後
DL2使用DJNZ這個指令操作R7 而它的機械週期為2做完後要接下一個指令週期為2
所以關西為 1+(2*200)+2
執行完 djnz R7,DL2後,接下來執行的是 djnz r6,DL1
r6的數值為 250,所以算式必須在乘上250
關西為 [1+(2*200)+2]*250
為甚麼不用再乘2了呢?
就我自行理解是 你在一個相同算式中最先乘2的週期已經達到乘2的作用
所以不需要再乘2 不然出來的數值會多正確數值的2次倍
djnz r6,DL1做這個指令前它一樣也有把數值移到R6的動作
所以mov r6,#250為一個週期
還有ret這個返回指令週期為二
總結出來的算式關西為 1+[1+(2*200)+2]*250+2
出來的數值跟如果你在程式上運行的一次結果應該為相同
功課 要求做一個0.2秒延遲 跟 0.05秒延遲
只要知道這些關西加上計算機操作
就很簡單啦
0.05秒
DELAY: mov r6,#250
DL1: mov r7,#99
DL2:djnz r7,DL2
djnz r6,DL1
ret
1+[1+(2*99)+2]*250+2
0.2秒
DELAY: mov r5,#10
DL1: mov r6,#100
DL2:mov r7,#100
djnz r7,$
djnz r6,DL1
djnz r7,DL2
ret
1+{1+[1+(2*100)+2]*100+2}*10+2