找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

51单片机P1并口通讯,中断问题,汇编程序问题请教

查看数: 2294 | 评论数: 17 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-4-25 08:30

正文摘要:

现象是从机不开中断,发送应答信号给主机就能显示。从机开中断情况下不知道是不 显示还是乱码 单片机主机程序如下: //*主机程序 //主机中断初始化            ...

回复

ID:73992 发表于 2022-4-30 22:44
Y_G_G 发表于 2022-4-29 10:09
我搞了几年的8051汇编,竟然不知道"P3端口第二功能",我这几年白学了?
不是我打击你,不带任何个人感情,只 ...

我自己焊了一块板子,用到两片51。用p1口两机传数据,本来想单用p1口不用中断,后来又用上了,急于测试板子是否可行,所以写了单向传数据的程序,没想到显现自己的不足。板子最后一项就是ps2口键盘,已经整了好几天,到现在还没有想到好的方法。
ID:401564 发表于 2022-4-29 10:09
lyonkon 发表于 2022-4-28 23:48
是看P3口不开第二功能的情况下P3.2引脚低电平    看88H,TCON的值,R0,R2 值是 0x02 ,就是说IE0=1

我搞了几年的8051汇编,竟然不知道"P3端口第二功能",我这几年白学了?
不是我打击你,不带任何个人感情,只说明一个情况:你汇编基础根本不行,所有基于你这个汇编的折腾,都是白折腾
除非你家有光刻机,你自己造单片机
ID:624769 发表于 2022-4-29 00:12
lyonkon 发表于 2022-4-28 23:48
是看P3口不开第二功能的情况下P3.2引脚低电平    看88H,TCON的值,R0,R2 值是 0x02 ,就是说IE0=1

我不知道你从哪里听来的"第二功能"这个说法,IE0的标志位,本来就是硬件上就和 P3.2 的电平挂钩的,由IT0控制IE0的置位条件, 就和 TF0 有 TR0来决定一个道理。所有的都是由TCON自身内部自给自足。
而 IE这个寄存器,控制的全都是 跳转,控制满足条件后跳转到指定的地址,这就是所谓的中断向量了。

既然学会编,你这些基础硬件知识怎么都要知道吧?
再说编成习惯,虽然直接写代码基本也是从 0000 开始,但是,一般ORG 0000H 这个习惯总该有吧?
即便不喜欢用ORG,  用 CSEG 也行啊,你这些都没有,要是一开始不养成习惯,后面越学代码会写得越糟。希望你能看几个人家的 范例,改进一下代码的书写模式。
ID:73992 发表于 2022-4-28 23:48
Y_G_G 发表于 2022-4-27 18:26
那么几行代码,你竟然要看汇编编译后的汇编代码?意义何在?

是看P3口不开第二功能的情况下P3.2引脚低电平    看88H,TCON的值,R0,R2 值是 0x02 ,就是说IE0=1
ID:401564 发表于 2022-4-27 18:26
lyonkon 发表于 2022-4-27 01:00
P3口不开第二功能,INT0引脚接低电平,TCON 中IE0标志位测试谢谢楼上几位朋友,怕刷屏的原故不一 一感谢了
...

那么几行代码,你竟然要看汇编编译后的汇编代码?意义何在?
ID:73992 发表于 2022-4-27 00:45
188610329 发表于 2022-4-26 11:44
先给你科普一下, 当
SETB IT0     ;外部中断下降沿触发
CLR   EX0    ;关闭外部中断0

我一直以为开中断的情况下外部中断信号TCON值是有效的,没想到P3口不开第二功能的情况下外部电平依然可影响TCON。我程序中撤销了中断设置,程序依然可以跑。并且做了仿真测试,结果如是
ID:123289 发表于 2022-4-26 13:34
不要气馁,认真看手册。
先了解CPU从上电开始是如果运行的,从何处取指令,如何执行,再取指令,再执行,它会不会结束?会不会在哪里停下来?一共有多少种指令,每种指令的含义是什么?
CPU何种情况下不按地址顺序取指令?
中断有何好处?CPU是如何处理中断的?
这样你就大大地进步了。清楚了,渐渐地就成为高手了。
汇编精通后后,C几乎秒会,C中没有任何难倒你的东东了。
要想成为顶尖的高手,汇编是必须的。
ID:828160 发表于 2022-4-26 13:20
Y_G_G 发表于 2022-4-25 20:42
大哥你就别再折腾这玩意了,我看着都累,但我无聊,也就跟着看看热闹
但凡是有中断的,必须要用到RETI执行中 ...

面向Bug编程
ID:624769 发表于 2022-4-26 11:44
lyonkon 发表于 2022-4-26 02:02
是这样的,在开中断没有中断子程序情况下,触发中断,只改变中断标志位。在4到8个状态周期后自动返回。外 ...

先给你科普一下, 当
SETB IT0     ;外部中断下降沿触发
CLR   EX0    ;关闭外部中断0
的情况下, P3.2产生下降沿 后 ,  IE0 是会被置1的, 换言之是否可以读取 IE0状态, 和是否 SETB  EX0 无关。所以,你为了读IE0标志, SETB EX0 毫无道理。
但是,当你SETB   EX0 之后,一旦IE0 被置1,PC指针一定会跳转到: 0003H,并且,隐藏标志“低级中断被触发,禁止被同等级中断打断”  被置位,在没有执行 RETI 之前,此标志不会请除,
这也是为什么你程序,表面上看起来,能正常运行的原因,因为,你程序,后来一直在MCU以为的“低级中断”触发状态下运行。你现在程序简单,恰好又查询标志位,貌似可以达到你的目的,但是,实际是错误的。

其他的,Y_G_G 的回复里说的够多了,我就不再复述了。
ID:401564 发表于 2022-4-26 10:47
lyonkon 发表于 2022-4-26 02:02
是这样的,在开中断没有中断子程序情况下,触发中断,只改变中断标志位。在4到8个状态周期后自动返回。外 ...

你单片机是跟体育老师学的吗?(体育老师对不起)
SETB EX0
SETB EA
你知道这两个指令是干嘛的吗?这是打开中断的意思,一旦EX0中断补触发,必然就是进入中断向量区执行中断
你怎么就认为没有进入中断子程序呢?你以为一定要写一个中断子程序才算是进入中断吗?
但凡是有这两个指令,而且,EX0是可以被触发的,那么,代码中是一定一定一定要有RETI返回的,不要你觉得,你认为什么什么,这是8051单片机的基础,它不是说这个是我说的它就这样,我不过是把这个东西说出来而已
在你的代码中,中断入口都没有用ORG指定出来,我觉得,你应该是没有了解中断向量地址的
连单片机最基本的中断你都没有学好,你觉得后面的大制作能成功?你先把基础学好吧


ID:73992 发表于 2022-4-26 02:12
Y_G_G 发表于 2022-4-25 20:42
大哥你就别再折腾这玩意了,我看着都累,但我无聊,也就跟着看看热闹
但凡是有中断的,必须要用到RETI执行中 ...

因为听从你和楼上的建议,我把主程序放到30H后面,从机和主机数据就传成功了。只是主机还是从0000H开始的。主机应该是碰巧能跑
ID:73992 发表于 2022-4-26 02:02
Y_G_G 发表于 2022-4-25 20:42
大哥你就别再折腾这玩意了,我看着都累,但我无聊,也就跟着看看热闹
但凡是有中断的,必须要用到RETI执行中 ...

是这样的,在开中断没有中断子程序情况下,触发中断,只改变中断标志位。在4到8个状态周期后自动返回。外部中断以电平方式触发需要程序清除标志位。
你说的方法是写中断子程序的返回要写RETI
上面的程序是标志位查询的方法,因为没有进入中断子程序所以不用写RETI
流程是:主机发送中断申请然后发数据  从机判断IE为1后读数据,然后发送应答中断信号给主机表示数据读成功,主机收到信号判断IE为1后 申请从机中断(p3.5引脚)撤销。 就是一次发送数据的流程
ID:401564 发表于 2022-4-25 20:42
lyonkon 发表于 2022-4-25 14:01
如楼上二位所说,是从机程序占用了中断地址。主机没有占用到所以能跑
从机程序开头加上ORG 0000H
        ...

大哥你就别再折腾这玩意了,我看着都累,但我无聊,也就跟着看看热闹
但凡是有中断的,必须要用到RETI执行中断返回,这是8051单片机基础知识
你已经开了中断了,中断被触发之后,程序必然是要进行中断子程序的,之后是一定要用到RETI执行返回的
你连这都不知道,还玩什么汇编呀
虽然并不是你不用RETI的话,你的程序就一定不能执行,它有一定有概率是可以正常执行的
但你把一个程序成功运行寄托于"有时候是可以的",你觉得这是一个搞电子的人应该有的态度吗?
ID:73992 发表于 2022-4-25 14:01
如楼上二位所说,是从机程序占用了中断地址。主机没有占用到所以能跑
从机程序开头加上ORG 0000H
                          ORG 0030H
                          LJMP MAIN
从机也跑起来了。谢谢两位老师
因为是中断标志位查询,中断电平是程序撤销的,没有用到中断子程序,所以没有使用RETI
ID:401564 发表于 2022-4-25 12:11
不是打击你
这个代码简单是乱得像个什么一样,单片机基础差得太多了,你还要多看一下单片机基础,再来玩这种东西吧
1,整个程序没有一个ORG指令,汇编代码直接就在复位的000H开始执行了,接下来就直接进入中断
2,整个程序没有一个RETI指令,进入中断之后没有一个中断返回指令,不知道你是分不清RET和RETI的区别,还是真的就不知道中断是怎么执行的?
3,中断没有一个现场保护,PSW寄存器都没有出现过,8051汇编中,PSW是一个很重要寄存器
要行万里,你得始于足下,走路都还不走不顺,竟然一天到晚研究着在天上怎么飞
ID:123289 发表于 2022-4-25 09:04
1、写程序要养成一个好的习惯,画出逻辑框图。你试试看。
2、电平触发中断,有个特点:当有效触发电平成立时,比它低级的中断,是无法得到响应的。
3、RET与RETI是有区别的。
在指令的执行上你看不出来,两者都能返回到程序的断点处。
区别是,RETI会交出中断控制权,进行下一个中断的识别!
而你的程序中没有RETI,所以中断中能响应一次最高级的(低级的会被高级的抢到),然会就被它一直霸占住中断资源。导致不再中断。
4、检查程序、即中断入口是否正确(编译完成后,看一下地址:RESET、INT0、INT1)。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表