共2条
1/1 1 跳转至页
,VXWORKS,NUCLEUS,keil,for,arm,01a,ccd,13581980230, 请各位指点:一个比较简单的汇报程序
问
功能是超声波测距:先让其不断的发送声波,同时计时;接收到超声波后进入中断,停止计时,假如计时的时间大于1000us(12M的晶振,计时器加一就是一us没错吧)LED显示.
请问各位 时间大于1000us的算法对不对。另一个问题就是中断一次之后就不能再中断了,是什么原因呢?
程序如下:
初始化
PUZEL : SETB P1.0 ;1us
MOV 14H , #02H ;2us
SETB ET0 ;1us
SETB EX0 ;1us
SETB EA ;1us
SETB P3.2 ;1us
MOV R0 , #02H ;1us
DH : DJNZ R0 , DH ;2us*2=4us
CPL P1.0 ;1us
NOP ;1us
MOV R0 , #04H ;1us
DL : DJNZ R0 , DL ;2us*4=8us
DJNZ 14H , PUZEL ;2us
;声波发生程序段
INIT0 : CLR TR0
SETB P1.7
MOV R2 , TH0
MOV R3 , TL0
MOV R6 , #03H
MOV R7 , #0E8H
SUB1 : CLR C
MOV A , R3
SUBB A , R7
MOV A , R2
SUBB A , R6 ;计时时间若小于1000us,则跳LED显示
JC LED
MOV TH0 , #00H ;若计时时间大于1000us则重新计时,等待下一次中断
MOV TL0 , #00H
SETB TR0
RETI 答 1: 打错,汇编程序以上是声波发生程序和中断程序段,各位看看问题出在哪里,谢啦 答 2: JC LED?跳出去后没有了中断返回?硬件已经被锁!怎么可以再进中断呀!不知后面的程序如何!不好发表了! 答 3: LED的程序段如下LED : CLR P1.7
MOV 20H , #64H
LOOP4 : MOV 21H , #64H
LOOP5 : MOV 22H , #64H
LOOP6 : DJNZ 22H , LOOP6
DJNZ 21H , LOOP5
DJNZ 20H , LOOP4
SETB P1.7
RET 答 4: RE:把RET去掉改成跳到上面的RETI吧!这样就OK了~~~因为跳出去后没有中断返回!RET只是子程序返回,问题应该就出在这里吧! 答 5: 帮你改了一下!INIT0 : CLR TR0
SETB P1.7
MOV R2 , TH0
MOV R3 , TL0
MOV R6 , #03H
MOV R7 , #0E8H
SUB1 : CLR C
MOV A , R3
SUBB A , R7
MOV A , R2
SUBB A , R6 ;计时时间若小于1000us,则跳LED显示
JNC SUB2
CALL LED
AJMP SUB3
SUB2: MOV TH0 , #00H ;若计时时间大于1000us则重新计时,等待下一次中断
MOV TL0 , #00H
SETB TR0
SUB3: RETI
答 6: ACALL LED
ACALL LED 答 7: 吓我一跳……怎么搞出来一个‘汇报程序’…… 答 8: 严重反对这样使用时间常数,好好的一个东西糟蹋成这个样子了 答 9: TIMER0中断是在加一过程中产生了溢出,这时候才符合中断的条件你在程序这样用中断,只能为2^16uS产生一次中断。并且不能调用LED段(因为没有符合条件的),只有TH0 and TL0=0是才产生中断,你在这里永远不会得到TH0=03H and TL0=0E8H的。
请问各位 时间大于1000us的算法对不对。另一个问题就是中断一次之后就不能再中断了,是什么原因呢?
程序如下:
初始化
PUZEL : SETB P1.0 ;1us
MOV 14H , #02H ;2us
SETB ET0 ;1us
SETB EX0 ;1us
SETB EA ;1us
SETB P3.2 ;1us
MOV R0 , #02H ;1us
DH : DJNZ R0 , DH ;2us*2=4us
CPL P1.0 ;1us
NOP ;1us
MOV R0 , #04H ;1us
DL : DJNZ R0 , DL ;2us*4=8us
DJNZ 14H , PUZEL ;2us
;声波发生程序段
INIT0 : CLR TR0
SETB P1.7
MOV R2 , TH0
MOV R3 , TL0
MOV R6 , #03H
MOV R7 , #0E8H
SUB1 : CLR C
MOV A , R3
SUBB A , R7
MOV A , R2
SUBB A , R6 ;计时时间若小于1000us,则跳LED显示
JC LED
MOV TH0 , #00H ;若计时时间大于1000us则重新计时,等待下一次中断
MOV TL0 , #00H
SETB TR0
RETI 答 1: 打错,汇编程序以上是声波发生程序和中断程序段,各位看看问题出在哪里,谢啦 答 2: JC LED?跳出去后没有了中断返回?硬件已经被锁!怎么可以再进中断呀!不知后面的程序如何!不好发表了! 答 3: LED的程序段如下LED : CLR P1.7
MOV 20H , #64H
LOOP4 : MOV 21H , #64H
LOOP5 : MOV 22H , #64H
LOOP6 : DJNZ 22H , LOOP6
DJNZ 21H , LOOP5
DJNZ 20H , LOOP4
SETB P1.7
RET 答 4: RE:把RET去掉改成跳到上面的RETI吧!这样就OK了~~~因为跳出去后没有中断返回!RET只是子程序返回,问题应该就出在这里吧! 答 5: 帮你改了一下!INIT0 : CLR TR0
SETB P1.7
MOV R2 , TH0
MOV R3 , TL0
MOV R6 , #03H
MOV R7 , #0E8H
SUB1 : CLR C
MOV A , R3
SUBB A , R7
MOV A , R2
SUBB A , R6 ;计时时间若小于1000us,则跳LED显示
JNC SUB2
CALL LED
AJMP SUB3
SUB2: MOV TH0 , #00H ;若计时时间大于1000us则重新计时,等待下一次中断
MOV TL0 , #00H
SETB TR0
SUB3: RETI
答 6: ACALL LED
ACALL LED 答 7: 吓我一跳……怎么搞出来一个‘汇报程序’…… 答 8: 严重反对这样使用时间常数,好好的一个东西糟蹋成这个样子了 答 9: TIMER0中断是在加一过程中产生了溢出,这时候才符合中断的条件你在程序这样用中断,只能为2^16uS产生一次中断。并且不能调用LED段(因为没有符合条件的),只有TH0 and TL0=0是才产生中断,你在这里永远不会得到TH0=03H and TL0=0E8H的。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |