简单问题,“制作移动的广告灯”,请高手指教。

wcling 2004-11-22 01:24:09

利用外部中断和定时器中断,实现的功能为使P1的8个LED每隔1s左移一次;按INTO时,使与p1相连的8个LED闪烁5次;现在的程序不能达到预期的这两个效果,请大家帮忙修改一下。谢谢了!
ORG 0000H
LJMP MAIN
ORG 0003H ;外中断0其始地址
LJMP EINT0
ORG 000BH ;T0中断其实地址
LJMP TT0 ;设置T0中断子程序TT0
MAIN: MOV SP,#60H ;设堆栈
MOV TMOD,#00000001B ; 设定T0工作在MOED1
MOV TH0,#3CH ;100ms
MOV TL0,#B0H
MOV P1,#11H ;将p1初始化
SETB TR0 ;启动T0
MOV IE,#10000011B ;T0中断使能INTO外部中断
MOV IP,#00000001B
MOV R5,#10 ;设定中断10次既1秒
MOV R1,#0FEH ;左移初值
SJMP $ ;等待
TT0: PUSH ACC ;将A的值暂存于堆栈
PUSH PSW
MOV TH0,#3CH ;重设计数器次数
MOV TL0,#0EFH
DJNZ R5,LOOP ;中断10次?不是则跳转到LOOP
MOV R5,#10 ;是则重设初值R5=10
MOV A,P1 ;读入p1的数据至A

MOV P1,A
RL A ;将A左移一位

MOV R1,A ;存入左移初值
LOOP: POP PSW ;从堆栈中取出PSW的值及A的值
POP ACC
RETI
EINT0:PUSH ACC ;将累加器、PSW的值压入堆栈
PUSH PSW
MOV A, #00 ;使P1全亮
MOV R2,#10 ;闪烁5次
LOOP3: MOV P1,A ;将A的值输入至P1
LCALL DELAY ;延时0.2s
CPL A ;将A的值取反
DJNZ R2,LOOP3 ;闪烁5次
POP PSW ;从堆栈中取回PSW、A的值
POP ACC
RETI
DELAY:MOV R5,#20 ;0.2s
D1: MOV R6,#20 ;10ms
D2: MOV R7,248 ;0.5s
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
...全文
211 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcling 2004-11-23
  • 打赏
  • 举报
回复
参考大家的意见,我今天又试着把程序做了一些改动。但是,很遗憾:还是不可以,只有四个LED会发光,还不会移动。我想可能是电路焊接有问题或者是89c51有问题吧。
我自己再摸索一下,也希望更多的高手参与并给予更多的指导。
icesnows 2004-11-23
  • 打赏
  • 举报
回复
对,楼上说得对
xwdd129 2004-11-23
  • 打赏
  • 举报
回复
你搞反了,是在外部中断中停止计数器T0,也就是在进入EINT0时用一条

CLR TR0

就可以了!!



EINT0:PUSH ACC ;将累加器、PSW的值压入堆栈
PUSH PSW

CLR T0 ; 在此处即可!!
icesnows 2004-11-23
  • 打赏
  • 举报
回复
先把硬件调通了吧!编个简单的测试程序,将8个LED一个一个亮一下试试
wcling 2004-11-22
  • 打赏
  • 举报
回复
TO: stdll(★洒脱★)
我用的是6MHZ的晶振,一个机器周期是2us。你所提到的程序是通过执行这几个循环来实现延时1s钟的。


TO: icesnows(逝去日子)
那我是不是可以在DJNZ R2,LOOP3 ;闪烁5次 后面添加:
MOV IE,#00000000B ;T0中断不使能INTO外部中断
MOV IP,#00000000B


icesnows 2004-11-22
  • 打赏
  • 举报
回复
我觉得你在外部中断时是不是把T0停止一下更好?
icesnows 2004-11-22
  • 打赏
  • 举报
回复
我觉得有这么几个问题:
首先,共阴极接法,显然设定p1的初始值应为:MOV P1,#FEH ;这样才是一开始p1.0的LED发光,其余的不发光;
2 建议将
MOV P1,#FEH ;将p1初始化
SETB TR0 ;启动T0
放在
SJMP $ ;等待 前面来,计数更精确
3 正如自己发现的,重设计数器次数错误
4 MOV A,P1 ;读入p1的数据至A
MOV P1,A
RL A ;将A左移一位
MOV R1,A ;存入左移初值
按照你的做法,你想从P1读出状态,但是你闪烁的子程序会与你的移位程序打架,也就说闪烁的程序会破坏只有一个灯亮的状态,使移位进入一个错误状态.而且移位程序没有MOV P1,A,LED不会移位啊
也就是说应该这样
MOV A,R1 ;读入r1的数据至A
RL A ;将A左移一位
MOV P1,A
MOV R1,A
stdll 2004-11-22
  • 打赏
  • 举报
回复

路过,特来学习。

请问楼主和高手们:

DELAY:MOV R5,#20 ;0.2s 为什么是0.2s?
D1: MOV R6,#20 ;10ms 又怎么是10ms
D2: MOV R7,248 ;0.5s 应该是D2: MOV R7,#248吧?这#248为什么又是0.5s呢?

请指教!
xwdd129 2004-11-22
  • 打赏
  • 举报
回复
MOV A,P1 ;读入p1的数据至A
------------------------------

此处应读入R1值,不然不能实现移位!
saliors 2004-11-22
  • 打赏
  • 举报
回复
还用汇编啊,看起来太辛苦了,早点用c吧
flingpig 2004-11-22
  • 打赏
  • 举报
回复

MOV TH0,#3CH MOV TL0,#0EFH ;重设计数器次数
应该是:MOV TH0,#3CH MOV TL0,#B0H

MOV P1,#11H ;将p1初始化
设定p1的初始值应为:MOV P1,#7FH ;这样一开始是p1.0的LED发光,其余的不发光


27,510

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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