找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求教这个单片机子程序是如何运行的?

[复制链接]
跳转到指定楼层
楼主
ID:289238 发表于 2018-3-21 18:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. while (busy);           
  2.     ACC = dat;            
  3.     busy = 1;
  4.     SBUF = ACC;


  5. 整个文件都没有令busy=1的语句,这个子程序却又busy=1,求教这个子程序是如何运行的?
  6. /******************************************/
  7. //程序名:串口发送数据
  8. //函数:接收和发送数据。
  9. //版本:1.2
  10. //出处:ANC  2017.8.10
  11. /******************************************/
  12. #include <STC89C5xRC.H>
  13. #include"intrins.h"
  14. #include "kv.h"
  15. #include "se1.h"

  16. #define FOSC 11059200L      //System frequency
  17. #define BAUD 9600           //UART baudrate
  18. bit busy;
  19. bit reok;
  20. extern BYTE ReceiveKvData[18];
  21. BYTE i;

  22. void se1_init()
  23. {
  24.     SCON = 0x50;            //8-bit variable UART
  25.     TMOD = 0x20;            //Set Timer1 as 8-bit auto reload mode
  26.     TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
  27.     TR1 = 1;                //Timer1 start run
  28.     ES = 1;                 //Enable UART interrupt
  29.     EA = 1;                 //Open master interrupt switch
  30. }
  31. void Uart_Isr() interrupt 4 using 1
  32. {
  33.     if (RI)
  34.     {
  35.         RI = 0;             //Clear receive interrupt flag
  36.         ReceiveKvData[i] = SBUF;          //P0 show UART data
  37.                   i++;
  38.                   if(SBUF==0x0d)
  39.                   {
  40.                                   i=0;
  41.                                 reok=1;
  42.                   }
  43.                   if(i==16)
  44.                           i=0;
  45.     }
  46.     if (TI)
  47.     {                                                                                                                                
  48.         TI = 0;             //Clear transmit interrupt flag
  49.         busy = 0;           //Clear transmit busy flag               
  50.     }
  51. }                                                                                                               

  52. void SendData(BYTE dat)
  53. {
  54.     while (busy);           
  55.     ACC = dat;            
  56.     busy = 1;
  57.     SBUF = ACC;            
  58. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:287575 发表于 2018-3-21 21:17 | 只看该作者
等待发送完成后,发送完成中断里有busy=0; SendData 中busy=1; SBUF=ACC,又启动新的发送
回复

使用道具 举报

板凳
ID:289238 发表于 2018-3-21 21:43 | 只看该作者
zhangxiaozi 发表于 2018-3-21 21:17
等待发送完成后,发送完成中断里有busy=0; SendData 中busy=1; SBUF=ACC,又启动新的发送

还是不太懂,busy本身就是0,那不是一直停留在while(busy)语句这吗?你说的等待发送,不是执行完这的子程序才会发送吗?
回复

使用道具 举报

地板
ID:289238 发表于 2018-3-21 21:57 | 只看该作者
zhangxiaozi 发表于 2018-3-21 21:17
等待发送完成后,发送完成中断里有busy=0; SendData 中busy=1; SBUF=ACC,又启动新的发送

我不太理解while(busy)这个语句
回复

使用道具 举报

5#
ID:289238 发表于 2018-3-21 23:07 | 只看该作者
csq1004 发表于 2018-3-21 21:57
我不太理解while(busy)这个语句

改成这样可以吗?
while(!busy)
ACC=dat;
busy=1;
SUBF=ACC;
回复

使用道具 举报

6#
ID:289238 发表于 2018-3-22 00:54 | 只看该作者
csq1004 发表于 2018-3-21 21:43
还是不太懂,busy本身就是0,那不是一直停留在while(busy)语句这吗?你说的等待发送,不是执行完这的子 ...

谢谢,这个问题我弄明白了,有一个新问题,如果单片机在处理内部的数据,比如主函数中有一个定时器在不断地运行,那senddata会不会运行?时序上是怎样的?
回复

使用道具 举报

7#
ID:287575 发表于 2018-3-22 09:08 | 只看该作者
任何时候单片机只做一件事情,在处理内部数据的时候,senddata不会执行,定时器是独立工作的物理器件,在程序把它设置好后,它自己运行,程序当中可以判断它的定时时间到的标志,从而做相应的事情,在程序当中一般不会用while(busy)这样的语句,这是个循环语句,一直在查busy ,如果busy是1,它一直查直到busy是0,程序才往下执行,而发送电路已经启动了发送工作,发送需要一段时间,完成后才把busy清零,在这段时间内单片机傻傻的就空循环,是个浪费

loop:
  if(!busy)       //如果busy是1 ,表示数据还没发完,就跳到下边do 其他事情1 等,如果是0表示已经发送
   {                //完了,就执行下边的sengdata,启动新的发送,senddata()执行完了,执行busy=1,然后
    Senddata();//又可以做其他事情了
    busy=1;
   }
   do 其他事情1
   do 其他事情2
   。。。
  do 其他事情N
  goto loop;
   }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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