既然向我求助,那我就寫一下大概的思路和C語言程序,至於匯編語言,兄弟可自己由C語言翻譯,我今天的確沒太有時間.
周期為2個ms的方波,也就是說半個周期為1ms,也就是說,P1.2每1ms翻轉一次;
同理,P1.3每3.5ms翻轉一次,因為只能用一個定時器,所以,取1ms和3.5ms的最大公約數,是0.5ms,也就是說,讓定時器0.5ms中斷一次,然後每兩個中斷,翻轉一次P1.2,每7個中斷翻轉一次P1.3;
這就是編程思路,那麼我們來看具體的編程細節;
6Mhz,也就是指令周期是2us,0.5ms需要250個計數,250<256,為了速度和效率,我們讓定時器1工作在自動重載模式下,也就是模式2;
C語言整個程序編程如下;
#include <reg52.h>
bit P1_2_Turn_Cnt = 0; //----用於P1.2的計數翻轉,因為只有兩次,大可不必用unsigned char類型的
unsigned char P1_3_Turn_Cnt = 0; //----用於P1.3的計數翻轉,因為要7次,所以用unsigned char
sbit P1_3 = P1^3;
sbt P1_2 = P1^2;
void main(void)
{
//----初始化定時器,工作在模式2,自動重載,開中斷,每0.5ms中斷一次
TH1 = 256 - 250; //----設置定時器,250 X 2us = 500us = 0.5ms
TL1 = 256 -250;
TMOD = 0x20; //----定時器/計數器1 工作在模式2下;
ET1 = 1; //----開定時器1中斷
TR1 = 1; //-----啟動定時器
EA = 1; //----開總中斷
while(1); //----定時器初始化完成,方波工作在定時器內部完成;
}
void ISR_Timer1(void) interrupt 3
{
P1_2_Turn_Cnt = ~P1_2_Turn_Cnt;//---P1_2翻轉計數,由於初始化為0,所以第1次會翻轉為1;
//---由此推論,奇數次翻轉後狀態為1,偶數次中斷會翻轉為
//---0,所以當P1_2_Turn_Cnt = 0時,P1_2翻轉.
if(P1_2_Turn_Cnt == 0)
{
P1_2 = ~P1_2;
}
P1_3_Turn_Cnt++;
if(P1_3_Turn_Cnt >= 7)
{
P1_3_Turn_Cnt = 0;
P1_3 = ~P1_3;
}
}
以上就是這個程序實現的全部過程,你可以自己手動翻譯成匯編語言,也可以用Keil的Debug模式自動翻譯,因為我時間有限,所以就不給你翻譯了,請見諒!
⑵ 用單片機8051如何做一個定時器的一秒延時
使用單片機8051實現一秒延時的基本思路是通過循環等待定時器的中斷,或者通過軟體方式循環等待一定次數。這里提供一個簡單的軟體延時方法。
首先,我們需要在程序中定義兩個存放延時期數的寄存器,這里用30H和31H來表示。具體數值需要根據晶振頻率來確定。
接下來是延時程序的實現:
MOV 30H,#一個數
MOV 31H,#一個數
LOOP:DJNZ 30H,LOOP1
LOOP1:DJNZ 31H,LOOP
這段代碼的意思是先將一個延時期數寫入30H,再將另一個延時期數寫入31H。然後進入一個循環,先檢查30H中的數值是否為0,如果不為0則繼續循環,直到30H中的數值為0,跳轉到LOOP1標簽處。在LOOP1標簽處,再次檢查31H中的數值是否為0,如果不為0則繼續循環,直到31H中的數值為0,再返回到LOOP標簽處繼續循環。
這樣的設計思路是基於8051單片機的內部定時器工作原理,通過軟體循環等待的方式實現延時。
需要注意的是,具體延時期數的數值需要根據實際使用的晶振頻率來計算,通常晶振頻率為12MHz或6MHz時,可以利用8051的機器周期來計算延時期數。例如,對於12MHz的晶振,每個機器周期為1/12us,那麼要實現一秒延時,就需要等待1000000個機器周期。
具體計算方法可以參考8051單片機的數據手冊,或者使用在線的單片機延時計算工具進行計算。
總之,通過上述代碼實現的延時方法雖然簡單,但適用於8051單片機的基本開發和實驗。對於更復雜的應用場景,可能需要考慮使用硬體定時器或更精確的延時演算法。
⑶ 已知8051單片機的fosc=12MHz,用T1 定時,試編程由P1.2 和P1.3 引腳分別輸出周期為2ms 和500μs 的方波
代碼如下:
第一個代碼程序:
ORG 0000H
LJMP MAIN
ORG 001BH
JMP T1_INT
ORG 0030H
MAIN:
MOV TMOD, #20H
MOV TH1, #6
MOV TL1, #6
MOV IE, #88H
SETB TR1
MOV R7, #4
SJMP $
T1_INT:
CPL P1.3
DJNZ R7, T1_END
CPL P1.2
MOV R7, #4
T1_END:
RETI
END
第二個500us程序:
#include <reg51.h>
sbit P1_0=P1^0;
void main()
{
TMOD=0x01;
TH0=0xFC;
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void time0_int(void) interrupt 1
{
TH0=0xFC;
TL0=0x18;
P1_0=!P1_0;
}
程序存儲器特定入口:
0000H: 復位或開機後的程序入口
0003H: 外部中斷0 服務程序入口
000BH: 定時/計數器0 中斷服務程序入口
0013H: 外部中斷1 服務程序入口
001BH: 定時/計數器1 中斷服務程序入口
0023H: 串列I/O 中斷服務程序入口
定時/計數器
8031 片內有兩個16位定時/計數器(增量式計數)
工作方式(方式0、方式1、方式2、方式3)
以定時/計數器1為例
⑴方式0(13位定時/計數)
方波是一種非正弦曲線的波形,通常會於電子和訊號處理時出現。理想方波只有「高」和「低」這兩個值。電流的波形為矩形的電流即為方波電流。不論時間軸上下是不是對稱的,只要是矩形就可叫方波,必要時,可加「對稱」,「不對稱」加以說明
通過單片機內部的計數器/定時器,採用軟體編程來產生方波,這種方法的硬體線路較簡單,系統的功能一般與軟體設計相關。
選擇MCS-51系列中的8031單片機,由於是用指示燈顯示輸出方波信號,一個LED顯示燈即可滿足設計要求。
方波是一種非正弦曲線的波形,通常會與電子和訊號處理時出現。理想方波只有「高」和「低」這兩個值。電流或電壓的波形為矩形的信號即為矩形波信號,高電平在一個波形周期內佔有的時間比值稱為占空比,也可理解為電路釋放能量的有效釋放時間與總釋放時間的比值。
占空比為50%的矩形波稱之為方波,方波有低電平為零與為負之分。必要時,可加以說明「低電平為零」、「低電平為負」。