Y_G_G 发表于 2022-4-29 10:09 我自己焊了一块板子,用到两片51。用p1口两机传数据,本来想单用p1口不用中断,后来又用上了,急于测试板子是否可行,所以写了单向传数据的程序,没想到显现自己的不足。板子最后一项就是ps2口键盘,已经整了好几天,到现在还没有想到好的方法。 |
lyonkon 发表于 2022-4-28 23:48 我搞了几年的8051汇编,竟然不知道"P3端口第二功能",我这几年白学了? 不是我打击你,不带任何个人感情,只说明一个情况:你汇编基础根本不行,所有基于你这个汇编的折腾,都是白折腾 除非你家有光刻机,你自己造单片机 |
lyonkon 发表于 2022-4-28 23:48 我不知道你从哪里听来的"第二功能"这个说法,IE0的标志位,本来就是硬件上就和 P3.2 的电平挂钩的,由IT0控制IE0的置位条件, 就和 TF0 有 TR0来决定一个道理。所有的都是由TCON自身内部自给自足。 而 IE这个寄存器,控制的全都是 跳转,控制满足条件后跳转到指定的地址,这就是所谓的中断向量了。 既然学会编,你这些基础硬件知识怎么都要知道吧? 再说编成习惯,虽然直接写代码基本也是从 0000 开始,但是,一般ORG 0000H 这个习惯总该有吧? 即便不喜欢用ORG, 用 CSEG 也行啊,你这些都没有,要是一开始不养成习惯,后面越学代码会写得越糟。希望你能看几个人家的 范例,改进一下代码的书写模式。 |
Y_G_G 发表于 2022-4-27 18:26 是看P3口不开第二功能的情况下P3.2引脚低电平 看88H,TCON的值,R0,R2 值是 0x02 ,就是说IE0=1 |
lyonkon 发表于 2022-4-27 01:00 那么几行代码,你竟然要看汇编编译后的汇编代码?意义何在? |
188610329 发表于 2022-4-26 11:44 我一直以为开中断的情况下外部中断信号TCON值是有效的,没想到P3口不开第二功能的情况下外部电平依然可影响TCON。我程序中撤销了中断设置,程序依然可以跑。并且做了仿真测试,结果如是 |
不要气馁,认真看手册。 先了解CPU从上电开始是如果运行的,从何处取指令,如何执行,再取指令,再执行,它会不会结束?会不会在哪里停下来?一共有多少种指令,每种指令的含义是什么? CPU何种情况下不按地址顺序取指令? 中断有何好处?CPU是如何处理中断的? 这样你就大大地进步了。清楚了,渐渐地就成为高手了。 汇编精通后后,C几乎秒会,C中没有任何难倒你的东东了。 要想成为顶尖的高手,汇编是必须的。 |
Y_G_G 发表于 2022-4-25 20:42 面向Bug编程 |
lyonkon 发表于 2022-4-26 02:02 先给你科普一下, 当 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 的回复里说的够多了,我就不再复述了。 |
lyonkon 发表于 2022-4-26 02:02 你单片机是跟体育老师学的吗?(体育老师对不起) SETB EX0 SETB EA 你知道这两个指令是干嘛的吗?这是打开中断的意思,一旦EX0中断补触发,必然就是进入中断向量区执行中断 你怎么就认为没有进入中断子程序呢?你以为一定要写一个中断子程序才算是进入中断吗? 但凡是有这两个指令,而且,EX0是可以被触发的,那么,代码中是一定一定一定要有RETI返回的,不要你觉得,你认为什么什么,这是8051单片机的基础,它不是说这个是我说的它就这样,我不过是把这个东西说出来而已 在你的代码中,中断入口都没有用ORG指定出来,我觉得,你应该是没有了解中断向量地址的 连单片机最基本的中断你都没有学好,你觉得后面的大制作能成功?你先把基础学好吧 ![]() |
Y_G_G 发表于 2022-4-25 20:42 因为听从你和楼上的建议,我把主程序放到30H后面,从机和主机数据就传成功了。只是主机还是从0000H开始的。主机应该是碰巧能跑 |
Y_G_G 发表于 2022-4-25 20:42 是这样的,在开中断没有中断子程序情况下,触发中断,只改变中断标志位。在4到8个状态周期后自动返回。外部中断以电平方式触发需要程序清除标志位。 你说的方法是写中断子程序的返回要写RETI 上面的程序是标志位查询的方法,因为没有进入中断子程序所以不用写RETI 流程是:主机发送中断申请然后发数据 从机判断IE为1后读数据,然后发送应答中断信号给主机表示数据读成功,主机收到信号判断IE为1后 申请从机中断(p3.5引脚)撤销。 就是一次发送数据的流程 |
lyonkon 发表于 2022-4-25 14:01 大哥你就别再折腾这玩意了,我看着都累,但我无聊,也就跟着看看热闹 但凡是有中断的,必须要用到RETI执行中断返回,这是8051单片机基础知识 你已经开了中断了,中断被触发之后,程序必然是要进行中断子程序的,之后是一定要用到RETI执行返回的 你连这都不知道,还玩什么汇编呀 虽然并不是你不用RETI的话,你的程序就一定不能执行,它有一定有概率是可以正常执行的 但你把一个程序成功运行寄托于"有时候是可以的",你觉得这是一个搞电子的人应该有的态度吗? |
如楼上二位所说,是从机程序占用了中断地址。主机没有占用到所以能跑 从机程序开头加上ORG 0000H ORG 0030H LJMP MAIN 从机也跑起来了。谢谢两位老师 因为是中断标志位查询,中断电平是程序撤销的,没有用到中断子程序,所以没有使用RETI |
不是打击你 这个代码简单是乱得像个什么一样,单片机基础差得太多了,你还要多看一下单片机基础,再来玩这种东西吧 1,整个程序没有一个ORG指令,汇编代码直接就在复位的000H开始执行了,接下来就直接进入中断 2,整个程序没有一个RETI指令,进入中断之后没有一个中断返回指令,不知道你是分不清RET和RETI的区别,还是真的就不知道中断是怎么执行的? 3,中断没有一个现场保护,PSW寄存器都没有出现过,8051汇编中,PSW是一个很重要寄存器 要行万里,你得始于足下,走路都还不走不顺,竟然一天到晚研究着在天上怎么飞 |
1、写程序要养成一个好的习惯,画出逻辑框图。你试试看。 2、电平触发中断,有个特点:当有效触发电平成立时,比它低级的中断,是无法得到响应的。 3、RET与RETI是有区别的。 在指令的执行上你看不出来,两者都能返回到程序的断点处。 区别是,RETI会交出中断控制权,进行下一个中断的识别! 而你的程序中没有RETI,所以中断中能响应一次最高级的(低级的会被高级的抢到),然会就被它一直霸占住中断资源。导致不再中断。 4、检查程序、即中断入口是否正确(编译完成后,看一下地址:RESET、INT0、INT1)。 |