導航:首頁 > 編程語言 > 8051單片機編程300例

8051單片機編程300例

發布時間:2025-07-25 01:21:28

⑴ 8051單片機的匯編程序編程問題!!!

既然向我求助,那我就寫一下大概的思路和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;
}

(3)8051單片機編程300例擴展閱讀:

程序存儲器特定入口:

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%的矩形波稱之為方波,方波有低電平為零與為負之分。必要時,可加以說明「低電平為零」、「低電平為負」。

閱讀全文

與8051單片機編程300例相關的資料

熱點內容
安卓11系統用什麼虛擬機 瀏覽:687
蘇州製冷壓縮機 瀏覽:791
安卓手機如何看抖音注冊時間 瀏覽:867
imvu為什麼伺服器錯誤 瀏覽:777
雲免費雲伺服器購買費用 瀏覽:539
級聯多模演算法 瀏覽:923
安卓系統如何設置數字簽名 瀏覽:467
dll存密碼防反編譯 瀏覽:443
醫學專業編程用什麼筆記本 瀏覽:939
廣州地鐵app為什麼無法開通 瀏覽:377
單片機模擬整流電路 瀏覽:342
搜狐雲伺服器的設置方法 瀏覽:503
程序員誰 瀏覽:716
怎麼把本地在密鑰導入伺服器上 瀏覽:74
蘋果筆記本文件夾白條 瀏覽:523
systemsav文件夾可以刪除嗎 瀏覽:901
串口伺服器怎樣改ip地址 瀏覽:771
當前伺服器正在維護中是什麼意思 瀏覽:775
樹莓派編寫代碼編譯 瀏覽:836
正負數統計編程 瀏覽:327