找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2896|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

求教這個(gè)單片機(jī)子程序是如何運(yùn)行的?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:289238 發(fā)表于 2018-3-21 18:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. while (busy);           
  2.     ACC = dat;            
  3.     busy = 1;
  4.     SBUF = ACC;


  5. 整個(gè)文件都沒(méi)有令busy=1的語(yǔ)句,這個(gè)子程序卻又busy=1,求教這個(gè)子程序是如何運(yùn)行的?
  6. /******************************************/
  7. //程序名:串口發(fā)送數(shù)據(jù)
  8. //函數(shù):接收和發(fā)送數(shù)據(jù)。
  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. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:287575 發(fā)表于 2018-3-21 21:17 | 只看該作者
等待發(fā)送完成后,發(fā)送完成中斷里有busy=0; SendData 中busy=1; SBUF=ACC,又啟動(dòng)新的發(fā)送
回復(fù)

使用道具 舉報(bào)

板凳
ID:289238 發(fā)表于 2018-3-21 21:43 | 只看該作者
zhangxiaozi 發(fā)表于 2018-3-21 21:17
等待發(fā)送完成后,發(fā)送完成中斷里有busy=0; SendData 中busy=1; SBUF=ACC,又啟動(dòng)新的發(fā)送

還是不太懂,busy本身就是0,那不是一直停留在while(busy)語(yǔ)句這嗎?你說(shuō)的等待發(fā)送,不是執(zhí)行完這的子程序才會(huì)發(fā)送嗎?
回復(fù)

使用道具 舉報(bào)

地板
ID:289238 發(fā)表于 2018-3-21 21:57 | 只看該作者
zhangxiaozi 發(fā)表于 2018-3-21 21:17
等待發(fā)送完成后,發(fā)送完成中斷里有busy=0; SendData 中busy=1; SBUF=ACC,又啟動(dòng)新的發(fā)送

我不太理解while(busy)這個(gè)語(yǔ)句
回復(fù)

使用道具 舉報(bào)

5#
ID:289238 發(fā)表于 2018-3-21 23:07 | 只看該作者
csq1004 發(fā)表于 2018-3-21 21:57
我不太理解while(busy)這個(gè)語(yǔ)句

改成這樣可以嗎?
while(!busy)
ACC=dat;
busy=1;
SUBF=ACC;
回復(fù)

使用道具 舉報(bào)

6#
ID:289238 發(fā)表于 2018-3-22 00:54 | 只看該作者
csq1004 發(fā)表于 2018-3-21 21:43
還是不太懂,busy本身就是0,那不是一直停留在while(busy)語(yǔ)句這嗎?你說(shuō)的等待發(fā)送,不是執(zhí)行完這的子 ...

謝謝,這個(gè)問(wèn)題我弄明白了,有一個(gè)新問(wèn)題,如果單片機(jī)在處理內(nèi)部的數(shù)據(jù),比如主函數(shù)中有一個(gè)定時(shí)器在不斷地運(yùn)行,那senddata會(huì)不會(huì)運(yùn)行?時(shí)序上是怎樣的?
回復(fù)

使用道具 舉報(bào)

7#
ID:287575 發(fā)表于 2018-3-22 09:08 | 只看該作者
任何時(shí)候單片機(jī)只做一件事情,在處理內(nèi)部數(shù)據(jù)的時(shí)候,senddata不會(huì)執(zhí)行,定時(shí)器是獨(dú)立工作的物理器件,在程序把它設(shè)置好后,它自己運(yùn)行,程序當(dāng)中可以判斷它的定時(shí)時(shí)間到的標(biāo)志,從而做相應(yīng)的事情,在程序當(dāng)中一般不會(huì)用while(busy)這樣的語(yǔ)句,這是個(gè)循環(huán)語(yǔ)句,一直在查busy ,如果busy是1,它一直查直到busy是0,程序才往下執(zhí)行,而發(fā)送電路已經(jīng)啟動(dòng)了發(fā)送工作,發(fā)送需要一段時(shí)間,完成后才把busy清零,在這段時(shí)間內(nèi)單片機(jī)傻傻的就空循環(huán),是個(gè)浪費(fèi)

loop:
  if(!busy)       //如果busy是1 ,表示數(shù)據(jù)還沒(méi)發(fā)完,就跳到下邊do 其他事情1 等,如果是0表示已經(jīng)發(fā)送
   {                //完了,就執(zhí)行下邊的sengdata,啟動(dòng)新的發(fā)送,senddata()執(zhí)行完了,執(zhí)行busy=1,然后
    Senddata();//又可以做其他事情了
    busy=1;
   }
   do 其他事情1
   do 其他事情2
   。。。
  do 其他事情N
  goto loop;
   }
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表