『壹』 單片機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單片機定時計數器編程的基本步驟
設置定時計數器的工作方式。
給定時器賦初始值:THx 和TLx;
允許定時器中斷;
允許全局中斷;
啟動定製器;
中斷函數編寫(這個是目的,定時計數最終要干什麼?)
『伍』 單片機設計技巧:如何實現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