日志档案

发表于 2008-1-25 11:53:42

2

标签: 交通灯  

交通灯

XH1 DATA 100H  ;定义循环单元地址data用来定义单元地址
XH2 DATA 105H
 ORG 0000H                ;org说明程序从这里开始写
 AJMP MAIN   ;ajmp是11位的寻址,把程序储存器分成2K的一份份,ajmp要求每在同一2k地址上当程序超过2k时ajmp命令会寻不了址,所以以后要用ljmp代替ajmp
 ORG 0030H                ;其实002bh到0032h这段会用在定时器2的中断进入地址,最好用到0050h或0100h开始
MAIN: MOV P0, #11111110B      ;初始化P0P2的绿灯P1P3红灯亮
 MOV P2, #11111110B
 MOV P1, #11110111B
 MOV P3, #11110111B
 ACALL DEL30S     ;调用延时程序,acall和ajmp存在同一个问题所以用lcall
 CPL P0.0  ;p0p2第一位取反,绿灯灭,第七位取反,红灯灭,cpl可以将累加器a的各位取反,同时是位取反操作符
 CPL P2.0
 CPL P0.6
 CPL P2.6
 ACALL DEL05S
 MOV XH1, #10 ;假如我现在用我会用工作寄存器来完成这操作
YELL0: CPL P0.6
 CPL P2.6
 ACALL DEL05S
 DJNZ XH1, YELL0   ;闪耀11次
 MOV P0, #11110111B    ;换向P0P2黄灯亮P1P3红灯亮
 MOV P2, #11110111B
 MOV P1, #11111110B
 MOV P3, #11111110B
 ACALL DEL30S
 CPL P1.0       ;黄灯闪耀
 CPL P3.0
 CPL P1.6
 CPL P3.6
 ACALL DEL05S ;延时
 MOV XH2, #10
YELL1: CPL P1.6
 CPL P3.6
 ACALL DEL05S
 DJNZ XH2, YELL1          ;闪耀11次
 AJMP MAIN

 

;延时0.5S子程序

DEL05S: MOV R5, #04H  ;时间=R5×R6×R7×机械周期÷2,89s5x系列单片机机械周期=晶振周期÷12,部分51单片机是6周期甚至4周期的djnz是非零减一转跳命令,要两个机械周期
DEL1: MOV R6, #0F0H
DEL2: MOV R7, #0F0H
 DJNZ R7, $;这里$是转跳到本命令,pc指针不变,就是原地转移
 DJNZ R6, DEL2
 DJNZ R5, DEL1
 RET;返回,执行acall会把pc指针压到堆栈,然后转跳到子程序,而执行ret则会包pc指针推出来,就是跳回原程序继续执行,在不同功能的子程序转换工作寄存器组是个

 

;延时30S子程序

DEL30S: MOV R4, #0FH
D1: MOV R5, #10H
D2: MOV R6, #0F0H
D3: MOV R7, #0F0H
 DJNZ R7, $
 DJNZ R6, D3
 DJNZ R5, D2
 DJNZ R4, D1
 RET

 END

系统分类: 单片机   |   用户分类: 无分类   |   来源: 原创   |   【推荐给朋友】

    阅读(641)    回复(2)  

投一票您将和博主都有获奖机会!

  • zhengyanxin86

    2008-1-27 16:36:18

    不错  继续继续    最好把每句都翻译下   这样方便初学者学习哦 

  • 蓝猫

    2008-3-14 16:41:39

    好的,我尽量改了些,尽量方便初学者