1. 单片机最小系统
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV R0,#0FFH
MOV R1,#00H
LOOP: MOV P2,R1
LCALL DELAY
INC R1
DJNZ R0,LOOP
SJMP MAIN
DELAY:
MOV R3,#04H
LOOP2: MOV R4,#0FFH
LOOP1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,LOOP1
DJNZ R3,LOOP2
RET
END
单片机最小系统
2、255计数:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV TMOD,#50H ;设置T1工作于工作方式1
SETB TR1
MOV A,TL1
LCALL LOOP ;调用除法程序
MOV R1,#60H
MOV R6,#00H
;显示子程序
PALY: MOV A,R6
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
MOV P0,#0FFH ;消除残影
INC R1
INC R6
CJNE R6,#03H,PALY
LJMP MAIN
DELAY: MOV R2,#02H ;延时子程序
LOOP2:MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,LOOP2
RET
LOOP: MOV B,#64H
DIV AB
MOV 60H,A
XCH A,B
MOV B,#0AH
DIV AB
MOV 61H,A
MOV 62H,B
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
255计数
3、50000计数:
FIRST EQU 71H ;定义个位
SECOND EQU 72H ;定义十位
THIRD EQU 73H ;定义百位
FOURTH EQU 74H ;定义千位
FIFTH EQU 75H ;定义万位
ORG 0000H ;程序从0地址开始
LJMP START ;跳到STRAT处执行
ORG 0013H ;INT1中断向量
LJMP INT_1 ;跳至INT_1处执行
ORG 0030H
START:
SETB EA ;开中断
SETB IT1 ;负跳变触发
SETB EX1 ;外部中断1允许中断
CLEAR: ;初始化显示0000
MOV FIRST,#00H
MOV SECOND,#00H
MOV THIRD,#00H
MOV FOURTH,#00H
MOV FIFTH,#00H
SHOW: ;显示子程序
;万位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,FIFTH ;将FIFTH的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
MOV A,#00H ;选择第一个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
;千位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,FOURTH ;将FOURTH的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
MOV A,#01H ;选择第二个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
;百位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,THIRD ;将THIRD的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
MOV A,#02H ;选择第三个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
;十位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,SECOND ;将SECOND的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
MOV A,#03H ;选择第四个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
;个位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,FIRST ;将FIRST的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
MOV A,#04H ;选择第五个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
LJMP SHOW ;调用显示子程序
INT_1: ;中断子程序
INC FIRST ;FIRST的内容加1
MOV A,FIRST ;将FIRST的内容复制到ACC
CJNE A,#0AH,EXIT ;如果A不等于10,则跳至EXIT处执行
MOV FIRST,#00H ;将0复制到FIRST
INC SECOND ;将SECOND的内容加1
MOV A,SECOND ;将SECOND的内容复制到ACC
CJNE A,#0AH,EXIT ;如果A不等于10,则跳至EXIT处执行
MOV SECOND,#00H ;将0复制到SECOND
INC THIRD ;将THIRD的内容加1
MOV A,THIRD ;将THIRD的内容复制到ACC
CJNE A,#0AH,EXIT ;如果A不等于10,则跳至EXIT处执行
MOV THIRD,#00H ;将0复制到THIRD
INC FOURTH ;将FOURTH的内容加1
MOV A,FOURTH ;将FOURTH的内容复制到ACC
CJNE A,#0AH,EXIT ;如果A不等于10,则跳至EXIT处执行
MOV FOURTH,#00H ;将0复制到FOURTH
INC FIFTH
MOV A,FIFTH ;将FIFTH的内容复制到ACC
CJNE A,#05H,EXIT ;如果A不等于10,则跳至EXIT处执行
MOV FIFTH,#00H ;将0复制到FIFTH
EXIT: ;跳出中断子程序
RETI ;返回主程序
DELAY: ;延时子程序
MOV R2,#02H
LOOP2: MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,LOOP2
RET
TAB: ;编码表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;编码
50000计数.
4、出租车收费系统:
FIRST EQU 71H ;定义个位
SECOND EQU 72H ;定义十位
THIRD EQU 73H ;定义百位
FOURTH EQU 74H ;定义千位
FIFTH EQU 75H ;定义万位
SIXTH EQU 76H ;定义十万位
ORG 0000H ;程序从0地址开始
LJMP START ;跳到STRAT处执行
ORG 0013H ;INT1中断向量
LJMP INT_1 ;跳至INT_1处执行
ORG 0030H
START:
SETB EA ;开中断
SETB IT1 ;负跳变触发
SETB EX1 ;外部中断1允许中断
CLEAR: ;初始化显示0000
MOV R0,#05H ;给R0赋值
MOV FIRST,#00H
MOV SECOND,#00H
MOV THIRD,#00H
MOV FOURTH,#00H
MOV FIFTH,#05H
MOV SIXTH,#00H
SHOW: ;显示子程序
;十万位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,SIXTH ;将SIXTH的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
MOV A,#00H ;选择第一个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
;万位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,FIFTH ;将FIFTH的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
CLR P0.7 ;使P0.7位为零,让小数点位显示
MOV A,#01H ;选择第二个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
;千位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,FOURTH ;将FOURTH的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
MOV A,#02H ;选择第三个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
;百位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,THIRD ;将THIRD的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
MOV A,#03H ;选择第四个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
;十位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,SECOND ;将SECOND的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
CLR P0.7 ;使P0.7位为零,让小数点位显示
MOV A,#04H ;选择第五个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
;个位显示
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,FIRST ;将FIRST的内容复制到ACC
MOVC A,@A+DPTR ;根据ACC的值取出编码表中的编码
MOV P0,A ;由P0口输出ACC的内容
MOV A,#05H ;选择第六个数码管显示
MOV P2,A ;置位P2
LCALL DELAY ;调用延时子程序
MOV P0,#0FFH ;消除残影
LJMP SHOW ;调用显示子程序
INT_1: ;中断子程序
DEC R0
MOV A,R0
JZ LOOP ;判断中断次数是否达到4次
LOOP1: MOV A,FIRST ;将FIRST的内容复制到ACC
ADD A,#05H ;将ACC的内容FIRST和5相加
MOV FIRST,A ;将ACC的内容复制到FIRST
CJNE A,#0AH,EXIT ;如果A不等于10,则跳至EXIT处执行
MOV FIRST,#00H ;将0复制到FIRST
INC SECOND ;将SECOND的内容加1
MOV A,SECOND ;将SECOND的内容复制到ACC
CJNE A,#0AH,EXIT ;如果A不等于10,则跳至EXIT处执行
MOV SECOND,#00H ;将0复制到SECOND
INC THIRD ;将THIRD的内容加1
MOV A,THIRD ;将THIRD的内容复制到ACC
CJNE A,#0AH,EXIT ;如果A不等于10,则跳至EXIT处执行
MOV THIRD,#00H ;将0复制到THIRD
LOOP: MOV R0,#01H
MOV A,FOURTH ;将FOURTH的内容复制到ACC
ADD A,#08H ;将ACC中的FOURTH和8相加
MOV B,#0AH
DIV AB
MOV FOURTH,B ;将除法后的余数B赋给FOURTH
CJNE A,#01H,LOOP1 ;如果A不等于1,则跳至LOOP1处执行
INC FIFTH ;将FIFTH的内容加1
MOV A,FIFTH ;将FOURTH的内容复制到ACC
CJNE A,#0AH,LOOP1 ;如果A不等于10,则跳至LOOP1处执行
MOV FIFTH,#00H ;将0复制到FIFTH
INC SIXTH ;将SIXTH的内容加1
MOV A,SIXTH ;将FOURTH的内容复制到ACC
CJNE A,#0AH,LOOP1 ;如果A不等于10,则跳至LOOP1处执行
MOV SIXTH,#00H ;将0复制到SIXTH
EXIT: ;跳出中断子程序
RETI ;返回主程序
DELAY: ;延时子程序
MOV R2,#02H
LOOP2: MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,LOOP2
RET
TAB: ;编码表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;编码
出租车收费系统
设计心得
我们的课程设计有四个内容:设计一个单片机最小系统、外部脉冲自动计数、设计一个出租车计费系统、单片机最小系统实训板的设计。
在设计一个单片机最小系统时,因为平常做实验都做过所以很容易就搞定了,但是在做外部脉冲自动计数时候遇到了很多的问题,尤其是开始都没有什么经验的时候,根本就不知道问题的原因所在,有时候想破脑袋也想不出,后来在同学的帮助下把255计数的设计做出来了,所以在做50000计数设计时就变得相对简单了些,不过还是因为对某些概念理解不清导致了致命的错误。和别人的程序对比了下终于找到了错误的原因,看来团队合作还是挺重要的。
有了前面255计数和50000计数的经验积累,做出租车收费系统设计就有些太过顺利了,几乎是写完程序调试下就可以在仿真上面正确显示了,这说明了基础还是挺重要的。
通过对这程序的制作,使我对汇编语言的基本知识的使用更加熟练,同时也增加了我对汇编语言的一些认识,在作业完成过程中通过和同学的交流,也增加了合作的技巧。通过查阅以下资料也学到了一些课本上没有的东西,拓宽了自己的知识面,增加了学好汇编语言的信心。
这不是第一次用汇编语言来设计一个小程序,平时做了很多实验,写了很多小程序。但这次是一个综合的程序,平时的很多程序都用到了。很多子程序的设计是固定的,因此可以直接从指导资料中调用,大多只需要修改几个参数就可以,这大大方便了我们的设计,为我们节省了很多的时间。
这次实习让我受益匪浅,无论从知识上还是其他的各个方面。上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。但在实习中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。在这次课程设计中又让我体会到了合作与团结的力量,当遇到不会或是设计不出来的地方,我们就会在QQ群里讨论或者是同学之间相互帮助。团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。
单片机是很重要的一门课程,老师和一些工作的朋友都曾说过,如果学好一门单片机,就凭这个技术这门手艺找一个好工作也不成问题。尽管我们在课堂学到的内容很有限,但在以后的学习中单片机还需要好好的深入研究和学习,学好了单片机也就多了一项生存的本钱。最后感谢老师对我们的精心指导和帮助,感谢同学们对我的帮助。