老師發了個題目《基于單片機的遠程控制系統的設計》 我在網上找了篇 好像是畢業論文很完整(原文地址——http://blog.sina.com.cn/s/blog_4cc9241a0100ba00.html)
單片機的存儲系統的分配利用在其工作過程中起非常大的作用,所以就必須對其進行必要的初始化。
程序代碼:
(1)片內RAM初始化子程序
IBCLR: MOV A,R0
MOV R1,A
CLR A
IBC1 : MOV @R1,A
INC R1
DJNZ R7,IBC1
RET
(2)片外RAM初始化子程序
EBCLR1: MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
CLR C
EBC11: MOVX @DPTR,A
INC DPTR
DJNZ R7,EBC11
RET
(3)片外RAM初始化子程序(雙字節單元)
EBCLR2: MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
MOV A,R7
JZ EBC21
INC R6
EBC21: CLR A
MOVX @DPTR,A
INC DPTR
DJNZ R7,EBC21
DJNZ R6,EBC21
RET
本單元是通過計數器T0的外部中斷方式來計數的。
程序代碼:
ORG 0090H
TT0: SETB 7DH
RETI
本功能模塊主要是產生信號提示音,方便不同的使用者。根據普通人耳的反應頻率為20Hz至20KHz的范圍,而CCITT規定的電話話音信號的頻率范圍是300Hz至3400Hz,所以在本功能單元的發聲頻率定為500Hz和1000Hz兩種。
主要分為五種提示音:
1、一聲低音,表示裝置已經摘機,請輸入密碼,其參數:頻率f=500Hz,延時t=0.5秒/聲;
2、兩聲低音,表示密碼已經通過,請選擇電器,其參數:頻率f=500Hz,延時t=0.5秒/聲;
3、三聲低音,表示電器已經選定,請控制(開/關),其參數:頻率f=500Hz,延時t=0.5秒/聲;
4、三聲高音,表示密碼輸入錯誤,其參數:頻率f=1000Hz,延時t=0.3秒/聲;
5、一聲高音,表示控制已經完成,其參數:頻率f=1000Hz,延時t=0.3秒/聲;
提示音發生是使用有限循環,反復使單片機的RXD口的電平反轉,從而形成方波信號 。
子程序代碼:
ORG 1100H
RING10:MOV R6,#20 ;請輸入密碼,
RING11:MOV R7,#20 ;500Hz,
RING12:LCALL DL10 ;發出提示音,1
CPL P3.0 ;延時0.5s
DJNZ R7,RING12
DJNZ R6,RING11
CLR P3.0
RET
ORG 1150H
RING20:MOV R3,#03
RING21:MOV R6,#20 ;選擇電器,
RING22:MOV R7,#20 ;500Hz,
RING23:LCALL DL20 ;發出提示音2,
CPL P3.0 ;延時0.3s
DJNZ R7,RING23
DJNZ R6,RING22
CLR P3.0
MOV R7,#200
RING24:LCALL DL10
DJNZ R7,RING24
DJNZ R3,RING21
CLR P3.0
RET
ORG 1200H
RING30:MOV R3,#02
RING31:MOV R6,#20 ;電器控制,
RING32:MOV R7,#20 ;500Hz,
RING33:LCALL DL10 ;發出提示音3,
CPL P3.0 ;延時0.3s
DJNZ R7,RING33
DJNZ R6,RING32
CLR P3.0
MOV R7,#200
RING34:LCALL DL10
DJNZ R7,RING34
DJNZ R3,RING31
CLR P3.0
RET
ORG 1250H
RING40:MOV R3,#03
RING41:MOV R6,#20 ;輸入的密碼錯誤,
RING42:MOV R7,#20 ;1000Hz,
RING43:LCALL DL10 ;發出提示音4,
CPL P3.0 ;延時0.3s
DJNZ R7,RING43
DJNZ R6,RING42
CLR P3.0
MOV R7,#100
RING44:LCALL DL10
DJNZ R7,RING44
DJNZ R3,RING41
CLR P3.0
RET
ORG 1300H
RING50:MOV R6,#40 ;操作完成,
RING51:MOV R7,#20 ;1000Hz,
RING52:LCALL DL20 ;發出提示音5,
CPL P3.0 ;延時0.3s
DJNZ R7,RING52
DJNZ R6,RING51
CLR P3.0
RET
ORG 1500H
DL10: MOV R5,#25;delay=1.25ms,f=500HZ,fosc=12MHz
DL12: MOV R4,#2
DL11: DJNZ R4,DL11
DJNZ R5,DL12
RET
ORG 1600H
DL20: MOV R5,#12;delay=0.625ms,f=1000HZ,fosc=12MHz
DL22: MOV R4,#25
DL21: DJNZ R4,DL21
DJNZ R5,DL22
RET
ORG 1650H
DL30:MOV R5,#50 ;delay=20ms
DL32:MOV R4,#200
DL31:DJNZ R4,DL31
DJNZ R5,DL32
RET
本系統密碼校驗的基本原理是:在系統初始化的時候把原始密碼寫入地址為30H開始的存儲空間內,密碼的位數“5”賦給R7。當系統摘機時,要求輸入密碼,單片機把解碼后的數據(使用者輸入的密碼)存儲在38H開始的存儲空間內。然后單片機對兩個存儲地址的內容逐位進行比較,直到完全相等才能轉到下一進程,有一位不同,程序就跳轉到出錯提示的子程序。
子程序代碼:
ORG 0150H
HOKE:CLR 7DH
SETB P3.1 ;自動摘機
CLR TR0 ;啟動中斷T0
MOV R2,#03H ;輸入密碼三次錯誤
LCALL RING10 ;請輸入密碼
IN: CLR 7EH ;7EH置零
DTMF:MOV R7,#5H ;輸入密碼位數5到R7
MOV R1,#38H ;信號音
SETB P1.4
SETB P1.5
SETB P1.6
SETB P1.7
WAIT:JBC 7EH,CC ;等待中斷INT0
LJMP WAIT
CC: MOV R7,#5H ;輸入的5位密碼*****
MOV R0,#30H ;調出原始密碼
MOV R1,#38H ;信號音
CMP:MOV A,@R1
MOV R4,A
CLR C
MOV A,@R1
SUBB A,@R0 ;比較密碼
INC R0
INC R1
JZ AAA ;OK,一位密碼通過
LJMP QQ
AAA:DJNZ R7,CMP ;R7-1!=0
LJMP LL ;密碼通過
QQ: DJNZ R2,IN1 ;密碼錯誤&R2!=0
LCALL RING20
LJMP STOP
IN1: LCALL RING20 ;密碼錯誤,請重試!
LJMP IN
本系統是通過在線輸入密碼而改變特定存儲器中的密碼值的。
程序代碼:
ORG 1700H
KEYIN:SETB RS1 ;當前工作寄存器第二工作區
CLR RS0
ANL A,#00H ;清零A寄存器
MOV B,#05H
LCALL RING10 ;發提示音:輸入密碼***
MOV R7,#5H
MOV R1,#38H
WPIN: JBC 7EH,READ ;等待INT0中斷
LJMP WPIN
READ: MOV R1,#38H
MOV R0,#40H
MOV R7,#05H
READ1:MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,READ1 ;判斷輸入密碼是否為5位,否
;跳轉READ1
LCALL RING10 ;滿5位,發提示音:再輸入
;新密碼
MOV R7,#5H
MOV R1,#38H
WRE: JBC 7EH,KEYCMP ;等待中斷INT1
LJMP WRE
KEYCMP:MOV R6,#05H
MOV R0,#40H
MOV R1,#38H
KEYCP:MOV A,@R0
CLR C
SUBB A,@R1 ;A減((R1))
INC R1
INC R0
JZ BBB ;A的內容如果為0,則跳轉BBB
LJMP LL
BBB: DJNZ R6,KEYCP ;R6減1不為0,則跳轉KEYCP,
;即循環比較密碼的五位
MOV R1,#38H
MOV R0,#30H
MOV R6,#5H
KEYREIN:MOV A,@R1
MOV @R0,A
INC R1
INC R0
DJNZ:R6,KEYREIN ;R6減1不為0,則跳轉,即循
;環比較密碼的五位
LCALL RING50 ;發提示音:新密碼已經設置
LJMP STOP
RET
匯編還沒學過。就學了點C++麻煩高手們給看看 怎么用c語言來編譯。。 謝謝啦 |