循序渐进51study之实例1-5
实例1
; !!!注意,分号后面为注释内容
;最简单的程序:让int0腿发光二极管(led)亮和灭。
;将led插在VCC和INT0上,当INT0腿为低电平时led亮,当INT0腿高电平时led灭
;INT0腿对应的端口为p3.2
org 0000h ;定位语句,使应用程序从0000h开始
clr p3.2 ;清除p3.2,即使int0腿为低电平,led亮
sjmp $ ;此语句是让程序暂停
end ;程序结束,不要忘记了写end !
;如果要led灭,将clr p3.2 改为 setb p3.2即可。
实例2
;让蜂鸣器发声
;蜂鸣器对应端口为p1.3
org
0000h ;程序从0000h开始
speaker:
cpl p1.3 ;对p1.3求反,这样可以得到方波
mov
r7,#2 ;晶振12mhz,延时1ms,得到500hz的音频
loop:
mov r6,#250
djnz r6,$ ;假如 r6-1不等于0,则继续本指令
djnz r7,loop
sjmp speaker
end ;程序结束
实例3
;此程序在数码管的第一位显示数字或字符
;数码管的写地址为2000h
;数码管的片选由p1.0,p1,1,p1,2决定,p1高为可以取全1
;如当p1=11111111时,选中第一个数码管,p1=11111000时,选中第8个数码管
org 0000h ;程序从0000h开始
mov p1,#11111111b ;在第一个数码管显示
;#11111111b为二进制表示法
mov a,#79h ;显示E符号
mov dptr,#2000h ;送数码管写地址
movx @dptr,a
;送"E"到数码管显示
sjmp $ ;程序暂停
;以下为数字0-9和字符a-f的显示代码
;3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,67h
;77h,7ch,39h,5eh,79h,71h
end ;结束
实例4
;此程序让数码管移动显示
;数码管的写地址为2000h
;数码管的片选由p1.0,p1,1,p1,2决定,p1高位可以取全1
;如当p1=11111111时,选中第一个数码管,p1=11111000时,选中第8个数码管
org 0000h ;程序从0000h开始
again: mov p1,#11111111b ;在第一个数码管开始显示
;#11111111b为二进制表示法
next: mov a,#79h ;显示E符号
mov dptr,#2000h ;送数码管写地址
movx @dptr,a
;送"E"到数码管显示
mov r7,#5 ;延时500ms后移位
loopr6: mov r6,#200
loopr5: mov r5,#250
djnz r5,$
djnz r6,loopr5
djnz r7,loopr6
dec p1 ;移动到下一个数码管
mov a,p1
cjne a,#111110111b,next
sjmp again
;以下为数字0-9和字符a-f的显示代码
;3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,67h
;77h,7ch,39h,5eh,79h,71h
end ;结束
实例5
;此程序演示单个按键的查询方法
;键盘输出控制为p1.5,p1.6,p1,7 输入为p1.4
;原理是 p1,5,p1,6,p1,7经74LS138译码为8线,选中线为低电平
;当某个键按下后,其对应的低电平将连通输入线p1,4,使p1.4为低电平
;无键按下时,p1.4为高电平
;用int0口的led指示第一个键是否按下,若按下,则led亮
org 0000h ;程序从0000h开始
wait: mov p1,#11111111b ;查询第一个按键是否按下
jb p1.4,black ;若没有按下,则led灭
clr p3.2 ;若按下,则led亮
sjmp wait ;继续查询
black: setb p3.2 ;led灭
sjmp wait ;继续查询
end
;注意,因为p1.4作为输入线,所以上面“mov p1,#11111111b”中,p1,4一定要为1