澄渊 2022-03-30 13:01 采纳率: 100%
浏览 340
已结题

C51串口通信中断与SBUF

学习微机原理这门课,在张毅刚的书中有一段关于串口通信的程序,逻辑上觉得SBUF=nSendByte这句不用写两次,而且对中断进入不太理解

题目是这样的:
[例8-1]如图8-6所示,编写程序控制8个发光极管流水点亮。 图中 74LS164的8脚(CLK端)为同步脉冲输入端,9脚为控制端,9脚的电平由单片机的P1.0控制,当9脚为0时,允许串行数据由RXD端(P3.0) 向74LS164 的串行数据输入端A和B(1脚和2脚)输入,但是74LS164的8位并行输出端关闭:当9脚为1时,A和B输入端关闭,但是允许74LS164中的8位数据并行输出。当串行口将8位串行数据发送完毕后,申请中断,在中断服务程序中,单片机向串行口输出下一个8位数据。

img

#include <reg51.h>
#include <stdio.h>
sbit P1_0=0x90;
unsigned char nSendByte;
void delay(unsigned int i)
{
unsigned char j;
for(;i>0;i--)
for(j=0;j<125;j++)
;
}
void main()
{
SCON=0x00;
EA=1;
ES=1;
nSendByte=1;
SBUF=nSendByte;
P1_0=0;
while(1)
{;}
}
void Serial_Port() interrupt 4 using 0
{
//if(TI)
//{
P1_0=1;
SBUF=nSendByte;//不明白这句为什么要写,逻辑上感觉可以没有这句,但进到Proteus仿真后这句必须要有才能顺利实现流水点灯
delay(500);
P1_0=0;
nSendByte=nSendByte<<1;
if(nSendByte==0)
nSendByte=1;
SBUF=nSendByte;//感觉有这句足矣
//}
TI=0;
RI=0;
}

任课教师课上解释说可能是74LS164芯片的问题

个人感觉思路上:SBUF在第一次从主函数中引脚获得了1值,P1_0=0 74LS164去接收1值,进入中断,P1_0=1 74LS164不再接收,把内部的1值送去点亮第一个小灯,SBUF=nSendByte这个时候又把1值送入到引脚,延时500,把P1_0打开,这时又开始接收数据,刚才引脚上的1传进了74LS164,不过没什么用,因为数据储备的1值马上变成2值,SBUF=nSendByte这个时候又把2值送入到引脚,这时74LS164又是可以接收数据的状态,2传进了74LS164覆盖了刚才的1,然后再进中断,P1_0=1 74LS164不再接收,把内部的2值送去点亮第二个小灯,SBUF=nSendByte这个时候又把2值送入到引脚,延时500,把P1_0打开,这时又开始接收数据,刚才引脚上的2传进了74LS164,不过没什么用,因为数据储备的2值马上变成3值,SBUF=nSendByte这个时候又把3值送入到引脚,这时74LS164又是可以接收数据的状态,3传进了74LS164覆盖了刚才的2。
如此往复。

既然会有覆盖那为什么一开始要多余一句SBUF=nSendByte呢。
还有就是到底什么时候进中断?

如果是SBUF一旦有了值就不停的朝引脚送值,只不过是74LS164打开之后送的值才到了74LS164里吗,那这样就是每一次中断函数TI刚置0,又因为SBUF一直在送值,TI又迅速置成了1,所以刚一出中断函数,就发现又满足中断条件就再进入中断了。是这样吗?

希望能解释一下为什么这里必须要再写一遍SBUF=nSendByte以及进入中断的条件到底是什么
  • 写回答

3条回答 默认 最新

  • 老皮芽子 2022-03-30 14:57
    关注

    你理解有问题
    74LS164 的控制端是复位。
    P1_0 = 0 74LS164输出复位,全输出 0
    P1_0 = 1 74LS164正常输出
    将中断程序修改了下,你试试结果。

    void Serial_Port() interrupt 4 using 0
    {
    TI=0;
    RI=0;
    //if(TI)
    //{
    P1_0=1;
    SBUF=nSendByte;//不明白这句为什么要写,逻辑上感觉可以没有这句,但进到Proteus仿真后这句必须要有才能顺利实现流水点灯
    delay(500);
    P1_0=0;
    nSendByte=nSendByte<<1;
    if(nSendByte==0)
    nSendByte=1;
    //SBUF=nSendByte;//将这行去掉
    //}
    //TI=0;
    //RI=0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 创建了问题 3月30日

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图