導航:首頁 > 操作系統 > 8051單片機程序設計

8051單片機程序設計

發布時間:2023-01-09 22:59:49

『壹』 單片機8051報警器程序設計

唉,現在啊都是一群來混積分的傢伙,可你知道你們那樣是賺不到分的嗎?像上面叫老水說的"比較簡單的問題.可是程序寫好了之後給你,你不會用怎麼辦?"說這什麼話啊,既然你都說了是簡單的問題,那你干嗎不直接給人家程序啊,你以為你為了不起嗎?你以為你那樣能賺到分嗎?看我的,這一百分我拿定了,只要提問人是有情有義的人.
start:MOV A,#FE (74)(FE)
loop:MOV P1,A (F5)(90)
MOV R1,#10 ;延時
DEL1:MOV R2,#00 (7A)(C8)
DEL2:MOV R3,#126 (7B)(7E)
DEL3:DJNZ R3,DEL3 (DB)(FE)
DJNZ R2,DEL2 (DA)(FA)
DJNZ R1,DEL1 (D9)(F6)
RL A (23)
LJMP LOOP (02)(40)(40)
END

『貳』 8051單片機編程

C語言程序員如下:
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
while(1)
{ if(TF0==1)
{
TF0=0;
P2^0=!P2^0;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
}
}

『叄』 8051單片機數字溫度計單片機的設計

-55~125度,你自己修改:

;***************WAVE-E6000/T**********************
;*MCU: AT892051 *
;*MCU-crystal: 12M *
;*Version: 01 *
;*Last Updata: 2007-5-27 *
;*Author: zhaojun *
;*Description: *
;DS18B20的讀寫程序,數據腳P3.4 *
;溫度感測器18B20匯編程序,採用器件默認的12位轉化 *
;最大轉化時間750微秒,顯示溫度-55到+125度,顯示精度*
;為0.1度,顯示採用4位LED共陽顯示測溫值 *
;*************************************************
;單片機內存分配申明!
;*************************************************
TEMPER_L EQU 40H ;用於保存讀出溫度的低8位
TEMPER_H EQU 41H ;用於保存讀出溫度的高8位
FLAG1 EQU 38H ;是否檢測到DS18B20標志位
SEC EQU 20H ;數碼管個位數存放內存位置
MIN EQU 21H ;數碼管十位數存放內存位置
TEMPL EQU 30H ;用於保存讀出溫度的低8位
TEMPH EQU 31H ;用於保存讀出溫度的高8位
TEMPHC EQU 32H ;溫度轉換寄存器低8位
TEMPLC EQU 33H ;溫度轉換寄存器高8位
BUF1 EQU 34H ;顯示緩沖寄存器小數位
BUF2 EQU 35H ;顯示緩沖寄存器個數位
BUF3 EQU 36H ;顯示緩沖寄存器十數位
BUF4 EQU 37H ;顯示緩沖寄存器百數位
TEMPDIN BIT P3.4 ;數據腳定義
DIN BIT P1.7 ;小數點控制
;**********************************************
ORG 0000H ;主程序入口地址
AJMP MAIN ;轉主程序
ORG 0003H ;外中斷0中斷入口
DB 00H,00H,00H,00H,00H,00H,00H;
RETI ;跳至INTEX0執行中斷服務程序
ORG 000BH ;定時器T0中斷入口地址
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;跳至定時器T0執行中斷服務程序
ORG 0013H ;外中斷1中斷入口
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;跳至INTEX1執行中斷服務程序
ORG 001BH ;定時器T1中斷入口地址
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;中斷返回(不開中斷)
ORG 0023H ;串列口中斷入口地址
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;中斷返回(不開中斷)
;**********************************************
;兩位數碼管來顯示溫度,顯示範圍00到99度,顯示精度為1度
;因為12位轉化時每一位的精度為0.0625度,我們不要求顯示小數所以可以拋棄29H的低4位
;將28H中的低4位移入29H中的高4位,這樣獲得一個新位元組,這個位元組就是實際測量獲得的溫度
;無需乘於0.0625系數
;**********************************************
MAIN:
MOV SP, #50H ;
MOV P1, #0FFH ;

LPTEMP:
LCALL GET_TEMPER ;調用讀溫度子程序
LCALL CONVTEMP ;溫度BCD碼計算處理子程序
LCALL DISPBCD ;顯示區BCD碼溫度值刷新子程序
;*************************************
LCALL DISPLAY ;調用數碼管顯示子程序
;*************************************
;CPL P3.0 ;
AJMP LPTEMP ;
;*************************************
; 這是DS18B20復位初始化子程序
;*************************************
INIT_1820:
SETB TEMPDIN
NOP
CLR TEMPDIN ;主機發出延時537微秒的復位低脈沖
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB TEMPDIN ;然後拉高數據線
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB TEMPDIN,TSR3 ;等待DS18B20回應
DJNZ R0,TSR2
LJMP TSR4 ;延時
TSR3:
SETB FLAG1 ;置標志位,表示DS1820存在
;CLR P3.7 ;檢查到DS18B20就點亮P3.7LED
LJMP TSR5
TSR4:
CLR FLAG1 ;清標志位,表示DS1820不存在
;CLR P3.1
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ;時序要求延時一段時間
TSR7: SETB TEMPDIN ;
RET
;****************************************
; 讀出轉換後的溫度值
;****************************************
GET_TEMPER:
SETB TEMPDIN ;
LCALL INIT_1820 ;先復位DS18B20
JB FLAG1,TSS2
RET ;判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:
;CLR P3.3 ;DS18B20已經被檢測到!!
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_1820
MOV A,#44H ;發出溫度轉換命令
LCALL WRITE_1820
;*****************************************
;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750微秒
;*****************************************
LCALL DISPLAY
;*****************************************
LCALL INIT_1820 ;准備讀溫度前先復位

MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_1820

MOV A,#0BEH ;發出讀溫度命令
LCALL WRITE_1820

LCALL READ_18200 ;將讀出的溫度數據保存到35H/36H
RET
;*******************************************
;寫DS18B20的子程序(有具體的時序要求)
;*******************************************
WRITE_1820:
MOV R2,#8 ;一共8位數據
CLR C ;
WR1:
CLR TEMPDIN ;
MOV R3,#6
DJNZ R3,$
RRC A
MOV TEMPDIN,C ;
MOV R3,#23
DJNZ R3,$
SETB TEMPDIN ;
NOP
DJNZ R2,WR1 ;
SETB TEMPDIN ;
RET
;*************************************
;處理溫度BCD碼子程序
;*************************************
CONVTEMP: MOV A,TEMPH ;
ANL A,#80H ;
JZ TEMPC1 ; 判斷溫度是否在零下?

CLR C ; 溫度值補碼 變成原碼
MOV A,TEMPL ;
CPL A
ADD A,#01H ;
MOV TEMPL,A ;
MOV A, TEMPH ; -
CPL A ;
ADDC A,#00H ;
MOV TEMPH,A ; TEMPHC HI=符號位
MOV TEMPHC,#0BH ; 置"-"標志
SJMP TEMPC11 ;
TEMPC1: MOV TEMPHC,#0AH ; 置"+"標志
;**************************************
TEMPC11: MOV A,TEMPHC ; 計算小數位溫度BCD值
SWAP A
MOV TEMPHC,A ;
MOV A,TEMPL ;
ANL A,#0FH ; 乘0.0625
MOV DPTR,#TEMPDOTTAB ;
MOVC A,@A+DPTR ;
MOV TEMPLC,A ; TEMPLC LOW= 小數部分 BCD
;**************************************
MOV A,TEMPL ; 計算整數位溫度BCD值
ANL A,#0F0H ;
SWAP A ;
MOV TEMPL,A ;
MOV A,TEMPH ;
ANL A,#0FH ;
SWAP A ;
ORL A,TEMPL ;
MOV TEMPER_L ,A ;
LCALL HEX2BCD1 ; 調用單位元組十六進制轉BCD子程序
;************************************
MOV TEMPL,A ;
ANL A,#0F0H ;
SWAP A ;
ORL A,TEMPHC ; TEMPHC LOW = 十位數 BCD
MOV TEMPHC,A ;
MOV A,TEMPL ;
ANL A,#0FH ;
SWAP A ; TEMPLC HI = 個位數 BCD
ORL A,TEMPLC ;
MOV TEMPLC,A ;
MOV A,R7 ;
JZ TEMPOUT ;
ANL A,#0FH ;
SWAP A ;
MOV R7,A ;
MOV A,TEMPHC ; TEMPHC HI = 百位數 BCD
ANL A,#0FH ;
ORL A,R7 ;
MOV TEMPHC,A ;
TEMPOUT: RET ;
;**************************************
;小數部分分碼表
;**************************************
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H ;
;**************************************
;顯示區 BCD 碼溫度值刷新子程序
;**************************************
DISPBCD: MOV A,TEMPLC ; 溫度數據移入顯示寄存器
ANL A,#0FH ;
MOV BUF1,A ; 顯示小數
MOV A,TEMPLC ;
SWAP A ;
ANL A,#0FH ;
MOV BUF2,A ; 顯示個位
MOV A,TEMPHC ;
ANL A,#0FH ;
MOV BUF3,A ; 顯示十位
MOV A,TEMPHC ;
SWAP A ;
ANL A,#0FH ;
MOV BUF4,A ; 顯示百位
MOV A,TEMPHC ;
ANL A,#0F0H ;
CJNE A,#10H,DISPBCD0 ; 百位數=0?
SJMP DISPOUT ;
DISPBCD0:
MOV A, TEMPHC ;
ANL A, #0FH ;
JNZ DISPOUT ; 十位數是0?
MOV A,TEMPHC ;
SWAP A ;
ANL A,#0FH ;
MOV BUF4,0AH ; 符號位不顯示
MOV BUF3,A ; 十位數顯示符號
DISPOUT: RET ;
;*************************************
;單位元組十六進制轉BCD
;*************************************
HEX2BCD1:MOV B,#64H ; 十六進制 ->BCD
DIV AB ; B=A%100
MOV R7,A ; R7=百位數
MOV A,#0AH ;
XCH A,B ;
DIV AB ; B=A%B
SWAP A ;
ORL A,B ;
RET ;
;*************************************
; Calculate CRC-8 Values, Uses The
;CCITT-8 Polynomial,Expressed As
; X^8+X^5+X^4+1
;*************************************
CRC8CAL: PUSH ACC ;
MOV R7,#08H ; Number Bits Byte
CRC8LOOP1:
XRL A,B ; Calculate CRC
RRC A ; Move T0 Carry
MOV A,B ; Get The Last CRC Value
JNC CRC8LOOP2 ; Skip If Data==0
XRL A,#18H ; Update The CRC Value
CRC8LOOP2:
RRC A ; Position The New CRC
MOV B,A ; Store The New CRC
POP ACC ; Get The Remaining Bits
RR A ; Possition The Next Bit
PUSH ACC ; Save The Remaining Bits
DJNZ R7,CRC8LOOP1 ; Repeat For 9 Bits
POP ACC ;
RET ;
;******************************************
;讀DS18B20的程序,從DS18B20中讀出9個位元組數據
;開始的兩個位元組為溫度數據
;******************************************
READ_18200:
MOV R4,#9 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#TEMPER_L ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
MOV B, #00H ;
;************************************
RE00:
MOV R2,#8 ; 數據一共有8位
RE01:
CLR C
SETB TEMPDIN ;
NOP
NOP
CLR TEMPDIN ;
NOP
NOP
NOP
SETB TEMPDIN ;
MOV R3,#9
RE10:
DJNZ R3,RE10 ;
MOV C,TEMPDIN ;
MOV R3,#23
RE20:
DJNZ R3,RE20 ;
RRC A
DJNZ R2,RE01 ;
;************************************
MOV @R1,A ;
INC R1 ;
LCALL CRC8CAL ;
DJNZ R4,RE00 ;
MOV A,B ;
JNZ READ_OUT ;

MOV TEMPL,TEMPER_L ;
MOV TEMPH,TEMPER_H ;
READ_OUT: RET
;*****************************************
;顯示子程序
;*****************************************
DISPLAY:
MOV DPTR,#NUMTAB ; 指定查表啟始地址
MOV R0,#4
DP11: MOV R1,#250 ; 顯示1000次

DPLP: SETB P1.7
MOV A,BUF1 ; 取小位數
MOVC A,@A+DPTR ; 查小位數的7段代碼
MOV P1,A ; 送出小位的7段代碼
CLR P3.0 ; 開小位顯示
ACALL DL1ms ; 顯示1ms
SETB P3.0 ;

MOV A,BUF2 ; 取個位數
MOVC A,@A+DPTR ; 查個位數的7段代碼
MOV P1,A ; 送出個位的7段代碼
CLR P1.7
CLR P3.1 ; 開個位顯示
ACALL DL1ms ; 顯示1ms
SETB P3.1 ;

SETB P1.7
MOV A,BUF3 ; 取十位數
MOVC A,@A+DPTR ; 查十位數的7段代碼
MOV P1,A ; 送出十位的7段代碼

CLR P3.2 ; 開十位顯示
ACALL DL1ms ; 顯示1ms
SETB P3.2 ;

SETB P1.7
MOV A,BUF4 ; 取百位數
MOVC A,@A+DPTR ; 查百位數的7段代碼
MOV P1,A ; 送出百位的7段代碼
CLR P3.3 ; 開百位顯示
ACALL DL1ms ; 顯示1ms
SETB P3.3 ;

DJNZ R1,DPLP ; 250次沒完循環
DJNZ R0,DP11 ; 4個100次沒完循環
RET
;****************************************
;0.2MS延時(按12MHZ算)
;****************************************
DL1MS: MOV R7,#100
DJNZ R7,$
RET
;****************************************
;7段數碼管0~9數字的共陽顯示代碼
;****************************************
NUMTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;
; "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
;****************************************
END

『肆』 簡述8051單片機定時計數器編程的基本步驟

  1. 設置定時計數器的工作方式。

  2. 給定時器賦初始值:THx 和TLx;

  3. 允許定時器中斷;

  4. 允許全局中斷;

  5. 啟動定製器;

  6. 中斷函數編寫(這個是目的,定時計數最終要干什麼?)

『伍』 單片機設計技巧:如何實現8051模塊化編程

最佳答案第一階段:是先瀏覽教科書里的硬體部分,大至了解單片機的硬體結構。如ROM、RAM、地址、I/O口等,以及看一些廠家的MCU資料(Data Sheet),來加強MCU所提供各項資源的印象。呵呵,還是得先看書。看不懂的就問老師,問知道的人。可以理解,我以前在學校也是對單片機一點兒也不理解,其實簡單點的說單片機就是一塊集成晶元,但是不同的地方就是可以通過編程來改變其引腳的電平高低。大二學了數電沒有?學過數點你就會理解高低電平的含義。另外,大一的時候學過計算機基礎了吧。你可以用計算機的原理來理解單片機。比如說 ROM 其實就像計算機的硬碟一樣,是用來裝東西的,裝你運行的程序。

第二階段:就是了解二進位數字、十六進位數和軟體方面的內容。盡管有很多高級語言可用於單片機的編程,但我覺得初學還是以匯編語言為好,更有利於和硬體結合,掌握硬體結構。知道匯編語言、機器語言、指令、 程序等概念後,從MOV指令開始,學習匯編語言和編程,在此如51的MCU匯編語言系統有11條指令,簡單又好理解它們怎樣和硬體聯系,更有助於一般學習單片機的指令整合與運用.因此其方法可先了 解幾條基本的MOV指令和它的機器語言,大致建立起單片機的硬體和軟體概念,來知道單片機的硬體是由指令控制指揮的。

第三階段按照編程環境的使用手冊,熟悉使用編程環境。現在的編程環境一般都和電腦相連,只要具備基本電腦知識的人都可很快掌握操作步驟。

第四階段是依靠實驗板,學習掌握單片機的匯編語言指令系統和簡單編程。同時和前面所學硬體知識結合組裝,起到主學軟體,鞏固硬體的雙重作用。

開始 時可用別人編的簡單程式在實驗板上進行驗證、分析,主要是熟悉該學習方法,在應用方面主要針對單片機I/O各項介面的使用,如A/D,D/A,PWM輸出的應用,LCD與VFD的控制,以及如何規范各項串列輸出入口的通訊協定等,對其所控制的各項元器件須先分析驅動能力,如電流電壓問題等。

匯編語言熟悉後,建議盡快學習C語言的編程,畢竟C語言有功能豐富的庫函數、運算速度快、編譯效率高、有良好的可移植性,而且可以直接實現對系統硬體的控制。C語言是一種結構化程序設計語言,它支持當前程序設計中廣泛採用的由頂向下結構化程序設計技術。此外,C語言程序具有完善的模塊程序結構,從而為軟體開發中採用模塊化 程序設計方法提供了有力的保障。因此,使用C語言進行程序設計已成為軟體 開發的一個主流。用C語言來編寫目標系統軟體,會大大縮短開發周期,且明顯地增加軟體的可讀性,便於改進和擴充,從而研製出規模更大、性能更完備的系統。

另外,我覺得一開始很多的概念可能你都不怎麼理解的,光看書也難理解,還得多問人,還有找一樣好的模擬軟體,一定要會用。在學指令的時候一條一條的驗證,那樣才會理解。
就比如一個非常簡單的 REG 0000H
AJMP 30H
MOV 20H #05H
END
看看模擬軟體的寄存器,內部數據存儲器裡面的數據有什麼改變。當你看到20H單元上的值變成了5,你就知道 MOV 20H #05H 的含義。但是光看書,可能就理解不出來。

『陸』 已知8051單片機的fosc=12MHz,用T1 定時,試編程由P1.2 和P1.3 引腳分別輸出周期為2ms 和500μs 的方波

定時器T1定時250μs,工作方式設置為方式2,用TL1作為8位定時器,產生250μs的定時,定時初值X為:X=2^8-(12* 10^6* 250 * 10^(-6))/12=6

TH1=TL1=6H,TMOD=20H

源代碼如下:

MOV TMOD,#20H

MOVTH1,#06H

MOVTL1,#06H

SETB TR1

DS1_RPTA:

MOVR2,#04H

DS1_RPTB:

JNB TF1,$

CLR TF1

CPL P1.3

DJNZ R2,DS1_RPTB

CPL P1.2

LJMP DS1_RPTA

51單片機中有兩個定時器T0和T1,分別是由兩個8位的專用寄存器組成,即定時/計數器T0由TH0和TL0組成,T1由TH1和TL1組成。單片機中的定時器溢出時申請的中斷,達到計時或計數的目的。並使用定時控制寄存器控制它。其中的:

TF1:定時器1溢出標志。定時/計數器溢出時由硬體置位。中斷處理時由硬體清除。或用軟體清除。

TF0:定時器0溢出標志。定時/計數器溢出時由硬體置位。中斷處理時由硬體清除,或用軟體清除。

(6)8051單片機程序設計擴展閱讀

定時器工作的流程:

以51為例用定時器0方式一產生50毫秒的定時:

1、確定使用哪個定時器,使用哪種方式,通過TMOD設置,TMOD的低四位是設置定時器0的,高四位是用來設置定時器1的,其中的M0,M1是用來設置定時器工作在哪種方式,GATE一般用不要設置,C/T是選擇計數模式還是定時模式的,如:TMOD = 0X01,就說明定時器0工作在方式1。

2、設置定時的時間,用定時器定時,如:50毫秒,可以用這種方式TH0 = (65535 - 50000) / 256,TL0 = (65535 - 50000) % 256;可以這樣理解:因為這是定時器的初值,也就是說計數脈沖就是在這個數的基礎上向上遞增,到達65535後就溢出產生中斷。

3、打開中斷,使用IE寄存器,首先打開總中斷EA = 1,這一步是所有中斷所必須的,然後打開定時器0中斷,ET0 =1。

4、這時准備工作結束,啟動定時器,使用TCON寄存器,TR0 = 1,實現了一個50毫秒的定時。

『柒』 單片機8051基礎編程

51程序庫
http://www.programfan.com/blog/article.asp?id=19116
http://workingon.bokee.com/viewdiary.12218674.html

MCS-51單片機實用子程序庫
http://blog.tom.com/fangqidong/article/416.html

『捌』 8051單片機程序設計求助!在線等。。。。

anykey:
mov r0,a
cjne r0,#00h,next
ret
next : cjne r0,#40h,next1
mov a,th0
add a,#5
mov th0,a
ret
next1: cjne r0,#80h,next2
mov a,th0
subb a,#5
mov th0,a
ret
main: mov tmod ,#02h
mov ie ,#82h
mov th0, #(256-125)
mov tl0, #(256-125)
setb tr0
loop: lcall anykey
ajmp loop

『玖』 8051單片機匯編程序請教

你的第二次修改,還有一處不足:
……
;CLR C
MOV DPTR,#TABLE
LOOP:
CLR A ;這里少了一句,下面每次讀出的,
;就不知道是什麼了
MOVC A,@A+DPTR
JNZ CONT_P
INC R2
SJMP NEXT
……

可以正常計數的程序如下。
;=========================================
ORG 0H
MOV A,#00H
MOV R2,A
MOV R3,A
MOV R4,A
MOV R6,A
MOV R5,#40
;CLR C
MOV DPTR,#TABLE
LOOP:
CLR A
MOVC A,@A+DPTR
JNZ CONT_P
; CJNE A,#00H,CONT_P
INC R2
SJMP NEXT
CONT_P:
JB ACC.7, CONT_N
INC R3
SJMP NEXT
CONT_N:
INC R4
NEXT:
INC DPTR
DJNZ R5, LOOP
MOV P0,R4
SJMP $
; 實際個數 保存單元 統計個數
;零個數 14 R2 21
;正數個數 19 R3 19
;負數個數: 7 R4 0
;其實是零和負數沒有分開統計,請高手指教一下,謝謝!

ORG 400H
TABLE:
DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H
DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H
DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H
DB 02H, 05H, 00H,0FFH, 26H, 34H, 00H, 00H, 00H, 00H
END

閱讀全文

與8051單片機程序設計相關的資料

熱點內容
ascii碼是編譯的時候用嗎 瀏覽:779
壓縮機感應包可以通用嗎 瀏覽:410
方舟伺服器怎麼發布到搜索列表 瀏覽:270
xml防反編譯 瀏覽:239
數據傳輸加密系統技術方案 瀏覽:842
程序員沒有準備去面試 瀏覽:4
51單片機usb滑鼠 瀏覽:879
qq伺服器的ip地址查詢 瀏覽:112
java仿qq聊天 瀏覽:400
解壓的ipa重新打包 瀏覽:142
程序員那麼可愛vip版 瀏覽:239
程序員怎麼升職 瀏覽:243
圖形化命令按鈕vb 瀏覽:987
vcu盤加密怎麼設置 瀏覽:414
如何加密備份微信聊天記錄 瀏覽:528
安卓手機如何模擬鍵盤 瀏覽:930
查看dns地址命令 瀏覽:767
android錄屏工具 瀏覽:840
成都互動直播系統源碼 瀏覽:955
usb藍牙android 瀏覽:409