求助,单片机的汇编。

明珠港打螃蟹 2012-12-28 04:42:49
SECOND1 EQU	30H
SECOND2 EQU 31H
DBUF EQU 40H
TEMP EQU 44H
GREEN1 EQU P2.1
YELLOW1 EQU P2.2
RED1 EQU P2.3
GREEN2 EQU P2.4
YELLOW2 EQU P2.5
RED2 EQU P2.6

ORG 0
START: MOV TMOD,#01H;T0方式1
MOV TH0,#3CH;定时50Ms初值
MOV TL0,#0B0H
CLR TF0
SETB TR0
CLR A
MOV P1,A
MAIN: MOV R2,#20 ;设置50Ms计数器,产生1S
MOV R3,#31
MOV SECOND1,#34
MOV SECOND2,#34
LCALL DISPLAY
LCALL STATUS1
WAIT1: JNB TF0,WAIT1
CLR TF0
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R2,WAIT1
MOV R2,#20
DEC SECOND1
DEC SECOND2
LCALL DISPLAY
DJNZ R3,WAIT1

MOV R2,#10
MOV R4,#2
MOV R3,#3
MOV SECOND1,#3
MOV SECOND2,#3
LCALL DISPLAY
WAIT2: LCALL STATUS2
JNB TF0,WAIT2
CLR TF0
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R4,WAIT2
CPL GREEN1
MOV R4,#2
DJNZ R2,WAIT2
MOV R2,#10
DEC SECOND1
DEC SECOND2
LCALL DISPLAY
DJNZ R3,WAIT2

STATUS1:
SETB GREEN1
CLR YELLOW1
CLR RED1
CLR GREEN2
CLR YELLOW2
SETB RED2
RET
STATUS2:
CLR YELLOW1
CLR RED1
CLR GREEN2
CLR YELLOW2
SETB RED2
RET

DISPLAY:MOV A,SECOND1
MOV B,#10
DIV AB
MOV DBUF+3,A
MOV A,B
MOV DBUF+2,A
MOV A,SECOND2
MOV B,#10
DIV AB
MOV DBUF+1,A
MOV A,B
MOV DBUF,A
MOV R0,#DBUF
MOV R1,#TEMP
MOV R2,#4
DP1: MOV DPTR,#SEG_TAB
MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
DJNZ R2,DP1
MOV R0,#TEMP
MOV R1,#4
DP2: MOV R2,#8
MOV A,@R0
DP3: RLC A
MOV P3.2,C
CLR P3.3
SETB P3.3
DJNZ R2,DP3
INC R0
DJNZ R1,DP2
RET
SEG_TAB:DB 3FH,06H,5BH,4FH,66H,6DH
DB 7DH,07H,7FH,6FH
END

这是单片机控制交通灯的程序。我写完后发现运行情况和我写程序的意思不吻合。用的是KEIL编译的,编译无错 我警告,然后我就写了一段去测试,发现还是不对。用的是STC89C52,不晓得怎么回事,程序本意是在第一状态停留31S。结果,单片机运行的时候停留了很久很久,,,数码管变一次数字要等上5,6秒左右。。。郁闷。汇编不太熟悉,求指点。
...全文
168 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
明珠港打螃蟹 2012-12-29
  • 打赏
  • 举报
回复
结贴了,,,问题找出来了,在MAIN段LCALL DISPLAY调用演示,R2被子程序段清零了,导致WAIT1刷新时间从原来需要的1S变成了,50ms*256=12.8S。
明珠港打螃蟹 2012-12-29
  • 打赏
  • 举报
回复
引用 1 楼 lr2131 的回复:
你先确认了你的程序的在逻辑性(流程)上是对的吗? “程序本意是在第一状态停留31S。结果,单片机运行的时候停留了很久很久, 数码管变一次数字要等上5,6秒左右” 是不是时钟没有改对,整体的时钟相对来说变慢了6倍,那31秒就变成了31*6S,全部确认一下是不是这样的现象。 两种方法: 1.要么找到时钟设置,保证演示效果和预想一致。 2.要么把31秒的值在程序中改为31/6 ,其……
同样的硬件结构,我改用C写相同的流程,运行正确的。12MHZ晶振。 程序逻辑上确定是无误的。 程序在MCU上能跑,初始状态正常,数码管显示没乱码,唯一就是在状态刷新时间上远远落后于分析程序得出的时间(31S)。可再检查程序定时那块,没有感觉到错误啊。
lr2131 2012-12-29
  • 打赏
  • 举报
回复
你先确认了你的程序的在逻辑性(流程)上是对的吗? “程序本意是在第一状态停留31S。结果,单片机运行的时候停留了很久很久, 数码管变一次数字要等上5,6秒左右” 是不是时钟没有改对,整体的时钟相对来说变慢了6倍,那31秒就变成了31*6S,全部确认一下是不是这样的现象。 两种方法: 1.要么找到时钟设置,保证演示效果和预想一致。 2.要么把31秒的值在程序中改为31/6 ,其他的也这么干。(总感觉这种方法是不是有点投机取巧的感觉

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧