找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1765|回复: 17
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主

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


//主机中断初始化           
//INT0接收从机数据中断申请          标志位IE0                   从机P3.4引脚
//INT1接收从机应答                          标志位IE1                        从机P3.5引脚
//主机P3.4发送从机数据中断申请          低电平有效
//主机P3.5发送从机应答                          低电平有效
SETB        EX0                //INT0中断开
SETB        IT0                //INT0低电平方式触发中断
SETB        PX0                //INT0高优先
SETB        EX1                //INT1中断开
SETB        IT1                //INT1低电平方式触发中断
CLR        PX1                        //INT1低优先
SETB        EA                //中断开
LJMP        MAIN
MAIN:

        PUSH        ACC
        MOV        R7,#0X0F           //D1循环16次
        MOV        A,#0X41                   //字符A准备送IO口
D1:        MOV        P1,A                   //字符A送p1口
        CLR        P3.5                   //申请从机中断int1
        JNB        IE1,$                   //从机响应信号
        SETB        P3.5
        CLR        IE1                           //IE标志位是否需要手动清除
        INC        A                           //A加1成字符b
        DJNZ        R7,D1
        POP        ACC
        sjmp        $
end


从机程序如下:
//*从机程序


//从机中断初始化           
//INT0接收主机数据中断申请          标志位IE0                 主机P3.4引脚
//INT1接收主机应答                          标志位IE1                 主机P3.5引脚
//P3.4发送主机数据中断申请          低电平有效
//P3.5发送主机应答                          低电平有效
SETB        EX0                //INT0中断开
SETB        IT0                //INT0低电平方式触发中断
SETB        PX0                //INT0高优先
SETB        EX1                //INT1中断开
SETB        IT1                //INT1低电平方式触发中断
CLR        PX1                        //INT1低优先
SETB        EA                //中断开
LJMP        MAIN


WRCMD:                                                                                   //写指令子程序
push        ACC                    
lcall        READ12864BF
POP        ACC                    
MOV        A,R3
MOV        DPTR,#009000H                  //lcd写指令地址 9000H
MOVX        @DPTR,A
RET
WRDAT:                                        //写数据子程序      
push        ACC         
lcall        READ12864BF
POP        ACC        
MOV        A,R4
MOV        DPTR,#00B000H                  //lcd写写数据地址        B000H
MOVX        @DPTR,A               
RET
INIT:                                                                                  //lcd初始化程序
MOV                R3,#0X38               
LCALL        WRCMD
MOV                R3,#0X38                     
LCALL        WRCMD
MOV                R3,#0X0c                       
LCALL        WRCMD            
MOV                R3,#0X06
LCALL        WRCMD              
MOV                R3,#0X01                       
LCALL        WRCMD
RET
MAIN:                                         //主程序                     
            LCALL  INIT
Q1:                MOV R3,#0x80            //R3是lcd1602显示地址入口
                        MOV        R7,#0X0F             //Q2循环次数
Q2:                        
                        JNB        IE1,$                        //接收主机中断申请
                        MOV        R4,P1                   //R4是lcd1602显示内容数据入口,将主机发送到P1的值传到R4
                          CLR        P3.5                   //发送应答信号
                        CLR        IE1
                        SETB        P3.5
                        LCALL        WRDAT
                        DJNZ        R7,Q2
                        CLR        EA
                        SJMP        $
READ12864BF:                         //lcd判断忙子程序
MOV        DPTR,#0XD000           //lcd读指令地址          D000H
MOVX        A,@DPTR         
JB        ACC.7,READ12864BF
ret
END      
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2022-4-25 09:04 | 只看该作者
1、写程序要养成一个好的习惯,画出逻辑框图。你试试看。
2、电平触发中断,有个特点:当有效触发电平成立时,比它低级的中断,是无法得到响应的。
3、RET与RETI是有区别的。
在指令的执行上你看不出来,两者都能返回到程序的断点处。
区别是,RETI会交出中断控制权,进行下一个中断的识别!
而你的程序中没有RETI,所以中断中能响应一次最高级的(低级的会被高级的抢到),然会就被它一直霸占住中断资源。导致不再中断。
4、检查程序、即中断入口是否正确(编译完成后,看一下地址:RESET、INT0、INT1)。
回复

使用道具 举报

板凳
ID:401564 发表于 2022-4-25 12:11 | 只看该作者
不是打击你
这个代码简单是乱得像个什么一样,单片机基础差得太多了,你还要多看一下单片机基础,再来玩这种东西吧
1,整个程序没有一个ORG指令,汇编代码直接就在复位的000H开始执行了,接下来就直接进入中断
2,整个程序没有一个RETI指令,进入中断之后没有一个中断返回指令,不知道你是分不清RET和RETI的区别,还是真的就不知道中断是怎么执行的?
3,中断没有一个现场保护,PSW寄存器都没有出现过,8051汇编中,PSW是一个很重要寄存器
要行万里,你得始于足下,走路都还不走不顺,竟然一天到晚研究着在天上怎么飞
回复

使用道具 举报

地板
ID:73992 发表于 2022-4-25 14:01 | 只看该作者
如楼上二位所说,是从机程序占用了中断地址。主机没有占用到所以能跑
从机程序开头加上ORG 0000H
                          ORG 0030H
                          LJMP MAIN
从机也跑起来了。谢谢两位老师
因为是中断标志位查询,中断电平是程序撤销的,没有用到中断子程序,所以没有使用RETI
回复

使用道具 举报

5#
ID:401564 发表于 2022-4-25 20:42 | 只看该作者
lyonkon 发表于 2022-4-25 14:01
如楼上二位所说,是从机程序占用了中断地址。主机没有占用到所以能跑
从机程序开头加上ORG 0000H
        ...

大哥你就别再折腾这玩意了,我看着都累,但我无聊,也就跟着看看热闹
但凡是有中断的,必须要用到RETI执行中断返回,这是8051单片机基础知识
你已经开了中断了,中断被触发之后,程序必然是要进行中断子程序的,之后是一定要用到RETI执行返回的
你连这都不知道,还玩什么汇编呀
虽然并不是你不用RETI的话,你的程序就一定不能执行,它有一定有概率是可以正常执行的
但你把一个程序成功运行寄托于"有时候是可以的",你觉得这是一个搞电子的人应该有的态度吗?
回复

使用道具 举报

6#
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引脚)撤销。 就是一次发送数据的流程
回复

使用道具 举报

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

因为听从你和楼上的建议,我把主程序放到30H后面,从机和主机数据就传成功了。只是主机还是从0000H开始的。主机应该是碰巧能跑
回复

使用道具 举报

8#
ID:401564 发表于 2022-4-26 10:47 | 只看该作者
lyonkon 发表于 2022-4-26 02:02
是这样的,在开中断没有中断子程序情况下,触发中断,只改变中断标志位。在4到8个状态周期后自动返回。外 ...

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


回复

使用道具 举报

9#
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 的回复里说的够多了,我就不再复述了。
回复

使用道具 举报

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

面向Bug编程
回复

使用道具 举报

11#
ID:123289 发表于 2022-4-26 13:34 | 只看该作者
不要气馁,认真看手册。
先了解CPU从上电开始是如果运行的,从何处取指令,如何执行,再取指令,再执行,它会不会结束?会不会在哪里停下来?一共有多少种指令,每种指令的含义是什么?
CPU何种情况下不按地址顺序取指令?
中断有何好处?CPU是如何处理中断的?
这样你就大大地进步了。清楚了,渐渐地就成为高手了。
汇编精通后后,C几乎秒会,C中没有任何难倒你的东东了。
要想成为顶尖的高手,汇编是必须的。
回复

使用道具 举报

12#
ID:73992 发表于 2022-4-27 00:45 | 只看该作者
188610329 发表于 2022-4-26 11:44
先给你科普一下, 当
SETB IT0     ;外部中断下降沿触发
CLR   EX0    ;关闭外部中断0

我一直以为开中断的情况下外部中断信号TCON值是有效的,没想到P3口不开第二功能的情况下外部电平依然可影响TCON。我程序中撤销了中断设置,程序依然可以跑。并且做了仿真测试,结果如是
回复

使用道具 举报

13#
ID:73992 发表于 2022-4-27 01:00 | 只看该作者
P3口不开第二功能,INT0引脚接低电平,TCON 中IE0标志位测试 谢谢楼上几位朋友,怕刷屏的原故不一 一感谢了

回复

使用道具 举报

14#
ID:401564 发表于 2022-4-27 18:26 | 只看该作者
lyonkon 发表于 2022-4-27 01:00
P3口不开第二功能,INT0引脚接低电平,TCON 中IE0标志位测试谢谢楼上几位朋友,怕刷屏的原故不一 一感谢了
...

那么几行代码,你竟然要看汇编编译后的汇编代码?意义何在?
回复

使用道具 举报

15#
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
回复

使用道具 举报

16#
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 也行啊,你这些都没有,要是一开始不养成习惯,后面越学代码会写得越糟。希望你能看几个人家的 范例,改进一下代码的书写模式。
回复

使用道具 举报

17#
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端口第二功能",我这几年白学了?
不是我打击你,不带任何个人感情,只说明一个情况:你汇编基础根本不行,所有基于你这个汇编的折腾,都是白折腾
除非你家有光刻机,你自己造单片机
回复

使用道具 举报

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

我自己焊了一块板子,用到两片51。用p1口两机传数据,本来想单用p1口不用中断,后来又用上了,急于测试板子是否可行,所以写了单向传数据的程序,没想到显现自己的不足。板子最后一项就是ps2口键盘,已经整了好几天,到现在还没有想到好的方法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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