您好、欢迎来到现金彩票网!
当前位置:秒速牛牛 > 通信控制字符 >

串行口通信 上位机发送字符x单片机返回上位机“I get x“

发布时间:2019-05-20 18:12 来源:未知 编辑:admin

  //若检测到flag为1, 说明程序已经执行过串口中断服务程序, 即收到了数据.

  //检测到flag为1后,即串口中断发生,先将ES清0, 原因是接下来要发送数据, 若不关闭串口中断, 发送完数据后,

  //单片机同样会申请串口中断,再次进入中断服务程序,flag又为1,又再此发送数据,一直重复

  //因此我们在发送数据前把串口中断关闭,等发送完数据再打开串口中断,这样可以安全地发送数据

  //当向SBUF中写入一个数据后,使用while(!TI)等待发送完毕, 因为发送完毕后TI会由

  //设定定时器1为工作方式2: 8位初值自动重装的8位定时器(设定定时器1目的是其溢出率决定串口波特率)

  //定时器1装初值(波特率为9600),注意:TH1,TL1初值必须相同

  这里不需要开启定时器1中断,因为定时器1工作在方式2,为8位自动重装方式,进入中断也无事可做

  //设定串口工作方式1(10位异步收发,波特率可变,且由定时器1的溢出率决定)

  //RI为接收中断标志位, 在方式0时, 当串行接收第8位数据结束时, 或在其他方式, 串行接收停止位的

  //中间时, 由内部硬件使RI置1, 向CPU发出中断申请, 也必须在中断服务程序中, 用软件将其清0,取消

  //此中断申请, 以方便下一次中断申请检测, 即这样才能产生下一次中断.

  //这里RI清0, 因为程序既然产生了串口中断, 肯定是收到或发送了数据, 在开始时没有发送任何数据

  //那必然是收到了数据, 此时RI会被硬件置1, 所以进入串口中断服务程序后必须由软件清0, 这样才能

  //EA = 1时打开全局中断控制,在这样条件下,由各个中断控制位打开或关闭相应的中断

  //EX1 = 1时打开外部中断1中断, EX1 = 0时关闭外部中断1中断

  //EX0 = 1时打开外部中断0中断, EX0 = 0时关闭外部中断0中断

  //这两个寄存器共有一个地址0x99, 但物理上是两个独立的寄存器,有指令操作决定访问哪个寄存器

  //执行写指令时, 访问串行发送寄存器, 执行读指令时, 访问串行接收寄存器

  //接收器具有双缓冲结构, 即在从接收寄存器中读出前一个已收到的字节之前, 便能接受第二个字节

  //如果第二个字节已经接收完毕,第一个字节还没有读出,则丢失其中一个字节

  //SCON用以设定串行口的工作方式, 接收/发送控制以及设置状态标志

  //SM0,SM1为工作方式选择位, 串行口有4中工作方式, 由SM0,SM1设定

  //SM0=0,SM1=1为方式1,即10位异步收发,含8位数据,波特率可变,且由定时器1的溢出率控制

  //SM0=1,SM1=0为方式2,即11位异步收发,含9位数据,波特率固定

  //SM0=1,SM1=1为方式3,即11位异步收发,含9位数据,波特率可变,且由定时器1的溢出率控制

  //当接收机的SM2=1时,可以利用收到的RB8来控制是否激活RI,即RB8=0时不激活RI,收到的信息丢弃

  //RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走

  //当SM0=0时,不论收到的RB8是0还是1,均可以使收到的数据进入SBUF,并激活RI,即此时RB8不具有控制RI激活功能

  //方式2或方式3中,时发送数据的第9位,可以用软件规定其作用,可以用作数据的奇偶校验位

  //方式2或方式3中,是接收数据的第9位,可作为奇偶校验位或地址帧/数据帧的标志位

  //方式0时,当串行发送第8位数据结束时,或在其他方式,串行发送停止位的开始时,

  //由内部硬件使TI置1,向CPU发出中断申请,在中断服务程序中,必须用软件将其清0,取消此中断申请

  //方式0时,当串行接收第8位数据结束时,或在其他方式,串行接收停止位的中间时,

  //由内部邮件使RI置1,向CPU发出中断申请,也必须在中断服务程序中,用软件将其清0,取消此中断申请

  //GATE=0,定时器/计数器启动与停止仅受TCON寄存器中TRX(X=0,1)来控制

  //GATE=1,定时器/计数器启动与停止由TCON寄存器中TRX(X=0,1)和外部中断引脚(INT0或INT1)的电平共同控制

  //M1=1,M1=0为方式3,仅适用于T0,分成两个8位计数器,T1停止计数

  //当计数器1计满溢出时,由硬件使TF1置1,并且申请中断,进入中断服务程序后,由硬件自动清0

  //由软件清0关闭定时器1,当GATE=1,且INT1为高电平时,TR1置1启动定时器1

  //IT1=0时,为电平触发方式,每个机器周期的S5P2采样INT1引脚,

  //IT1=1时,INT1位跳变沿触发方式,当第一个机器周期采样到INT1为低电平时,则IE1置1

  //IE1=1时,表示外部中断1正在向CPU申请中断,当CPU响应中断,转向中断服务程序,该位由硬件清0

  //IT1=1,跳变沿触发方式,引脚INT1上的电平从高到低的负跳变有效

  //若检测到flag为1, 说明程序已经执行过串口中断服务程序, 即收到了数据.

  //检测到flag为1后,即串口中断发生,先将ES清0, 原因是接下来要发送数据, 若不关闭串口中断, 发送完数据后,

  //单片机同样会申请串口中断,再次进入中断服务程序,flag又为1,又再此发送数据,一直重复

  //因此我们在发送数据前把串口中断关闭,等发送完数据再打开串口中断,这样可以安全地发送数据

  //当向SBUF中写入一个数据后,使用while(!TI)等待发送完毕, 因为发送完毕后TI会由

  //设定定时器1为工作方式2: 8位初值自动重装的8位定时器(设定定时器1目的是其溢出率决定串口波特率)

  //定时器1装初值(波特率为9600),注意:TH1,TL1初值必须相同

  //这里不需要开启定时器1中断,因为定时器1工作在方式2,为8位自动重装方式,进入中断也无事可做

  //设定串口工作方式1(10位异步收发,波特率可变,且由定时器1的溢出率决定)

  //RI为接收中断标志位, 在方式0时, 当串行接收第8位数据结束时, 或在其他方式, 串行接收停止位的

  //中间时, 由内部硬件使RI置1, 向CPU发出中断申请, 也必须在中断服务程序中, 用软件将其清0,取消

  //此中断申请, 以方便下一次中断申请检测, 即这样才能产生下一次中断.

  //这里RI清0, 因为程序既然产生了串口中断, 肯定是收到或发送了数据, 在开始时没有发送任何数据

  //那必然是收到了数据, 此时RI会被硬件置1, 所以进入串口中断服务程序后必须由软件清0, 这样才能

  1) 操作串行口之前,需要对单片机的一些与串口有关的特殊功能寄存器进行初始化设置, 主要是设置产生波特率

  e. 串行口工作在中断方式时, 要进行中断设置(变成IE, IP寄存器)

  2) 51单片机可以通过特殊功能寄存器SBUF对串行接收或串行发送寄存器进行访问, 两个寄存器共用一个地址

  99H,但在物理上是两个独立的寄存器, 由指令操作决定访问哪一个寄存器. 执行写指令时, 访问串行发送寄存器, 执行读指令时, 访问串行接收寄存器, 接收器具有双缓冲结构, 即在从接收寄存器中读出前一个已收到

  的字节之前, 便能接收第二个字节, 如果第二个字节已经接收完毕, 第一个字节还没有读出, 则丢失其中

  一个字节. 对于发送器, 因为数据由CPU控制和发送的, 所以不需要考虑.

  SBUF=a;代表单片机将串口发送寄存器中的数据一位位从串口发送出去.

  a. 主函数main中while中ES=0可以换成EA=0,ES=1可以换成EA=1(即将串口中断的临时控制改为全局中断的控制)

  b. 初始化函数init中ET1=1不能打开,即便主函数外有计数器1的子函数(函数为空)

  c. 初始化函数init中TR1=1需要打开(包括TMOD=0x20),因为需要定时器1溢出率决定串口波特率.

  5) 法2中TH1的地址位0x8D, 与TCON中的TF0位地址一样, 这里对TH1赋值时不是会对TF0产生影响吗?

http://upschool.net/tongxinkongzhizifu/32.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有