老师发了个题目《基于单片机的远程控制系统的设计》 我在网上找了篇 好像是毕业论文很完整(原文地址——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语言来编译。。 谢谢啦 |