求助,单片机的汇编。

明珠港打螃蟹 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秒左右。。。郁闷。汇编不太熟悉,求指点。
...全文
191 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 ,其他的也这么干。(总感觉这种方法是不是有点投机取巧的感觉
相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚, 更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机 (Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想 学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已! 首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机,具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候,我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出,或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看我的单片机书和资料。 当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久。具体选择C51还是A51呢?汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似,编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲的全是C方面的,完全在浪费你的时间! 呵呵 ^_^ 第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使你每天捧着本书,把那本书翻烂,也永远学不会单片机的!刚接触单片机的朋友,看了资料,一定会对以下几个词见的比较多,但是具体的概念还是比较模糊,现作如下说明:

21,499

社区成员

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

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