找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2584|回復: 9
收起左側(cè)

單片機定時器延時問題請教

[復制鏈接]
ID:718523 發(fā)表于 2021-4-26 20:09 | 顯示全部樓層 |閱讀模式
本帖最后由 forest415 于 2021-4-27 14:20 編輯

下面的程序為什么p11一直是0呢?定時器1感覺沒有作用。
  1. /***********************************************************************************************************/
  2. //HC-SR04 超聲波測距模塊 DEMO 程序
  3. //晶振:11。0592
  4. //接線:模塊TRIG接 P1.2  ECH0 接P1.1
  5. /***********************************************************************************************************/          
  6.         #include<reg52.h>
  7.         #include   <intrins.h>
  8.     #include   <STDIO.H>

  9.     #define uchar unsigned  char
  10.     #define uint  unsigned   int  
  11. sbit RX=P2^1;
  12. sbit TX=P2^0;
  13.   

  14.         unsigned int  time=0;
  15.         unsigned int  timer=0;
  16.         float         S=0;
  17.     bit           flag =0;
  18.         unsigned int  sum=0;
  19. sbit p11=P1^1;       

  20. /********************************************************/
  21.     void Conut(void)
  22.         {
  23.          time=TH0*256+TL0;
  24.          TH0=0;
  25.          TL0=0;
  26.          S=(time*1.87)/100;     //算出來是CM
  27.          if(flag==1)                    //超出測量
  28.          {
  29.           flag=0;
  30.           //p11=0;
  31.          }
  32.          if(S<50){
  33.          p11=0;
  34.          TR1=0;//關(guān)T0
  35.          }
  36.          else{
  37.          TR1=1;//開T0       
  38.          //p11=1;
  39.          //這里用定時器延時一會再關(guān)掉,能重復觸發(fā)的
  40.          }
  41.           
  42.         }
  43. /********************************************************/
  44. void delayms(unsigned int ms)                //@12.000MHz
  45. {
  46.         unsigned char i, j;

  47.         i = 39;
  48.         j = 230;
  49.         do
  50.         {
  51.                 while (--j);
  52.         } while (--i);
  53. }





  54. /********************************************************/
  55.      void zd0() interrupt 1                  //T0中斷用來計數(shù)器溢出,超過測距范圍
  56.   {
  57.     flag=1;                                                         //中斷溢出標志
  58.   }
  59. /********************************************************/

  60. void Timer1(void) interrupt 3  //定時器T1的中斷
  61. {                          //定時100微秒
  62.     TL1=0;              //重新給TL1賦初值
  63.     TH1=0;              //重新給TH1賦初值
  64.         sum++;
  65.         if(sum>300){p11=~p11;}
  66.     //***此處用戶自行添加定時器T1中斷處理程序***

  67.     //******************************************

  68. }
  69.    void  StartModule()                         
  70.   {
  71.           TX=1;                                         
  72.           _nop_();
  73.           _nop_();
  74.           _nop_();
  75.           _nop_();
  76.           _nop_();
  77.           _nop_();
  78.           _nop_();
  79.           _nop_();
  80.           _nop_();
  81.           _nop_();
  82.           _nop_();
  83.           _nop_();
  84.           _nop_();
  85.           _nop_();
  86.           _nop_();
  87.           _nop_();
  88.           _nop_();
  89.           _nop_();
  90.           _nop_();
  91.           _nop_();
  92.           _nop_();
  93.           TX=0;
  94.   }
  95. /********************************************************/



  96. void main(void)
  97. {  
  98.     TMOD=0x21;                   //設T0為方式1,GATE=1;
  99.         SCON=0x50;

  100. //定時器T1(延時用)
  101.         TH1=0;
  102.         TL1=0;
  103.         TR1=1;//開啟定時器
  104.         ET1=1;//允許T1中斷
  105. //定時器T0
  106.         TH0=0;
  107.         TL0=0;
  108.         TR0=1;             //開啟定時器
  109.         ET0=1;         //允許T0中斷
  110.                                   
  111.         TI=1;  //不知道啥東西

  112.         EA=1;                           //開啟總中斷


  113.         while(1)
  114.         {
  115.          StartModule();
  116.          while(!RX);                //當RX為零時等待
  117.          TR0=1;                            //開啟計數(shù)
  118.          while(RX);                        //當RX為1計數(shù)并等待
  119.          TR0=0;                                //關(guān)閉計數(shù)
  120.      Conut();                        //計算
  121.          delayms(30);                //100MS

  122.         }

  123. }              
復制代碼



回復

使用道具 舉報

ID:718523 發(fā)表于 2021-4-26 20:10 | 顯示全部樓層
還有void zd0() interrupt 1中的zd0是啥意思啊
回復

使用道具 舉報

ID:844772 發(fā)表于 2021-4-26 22:41 | 顯示全部樓層
1. 你都寫了延時函數(shù)了:void delayms(unsigned int ms)           delayms(2000);就是延時2S;
2. zd0() 是中斷函數(shù)啊,計數(shù)器溢出才會進入,一旦進入就是距離超范圍了。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:889094 發(fā)表于 2021-4-27 00:38 來自手機 | 顯示全部樓層
定時器中斷每次觸發(fā)之后要重裝初值,好像你的中斷函數(shù)里沒有,比如你50ms一次定時器觸發(fā),弄個計數(shù)變量里面++就可以了,變量到20次1秒,400次就是20秒了,

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:889094 發(fā)表于 2021-4-27 00:39 來自手機 | 顯示全部樓層
記得前幾天看到的,函數(shù)中盡量少用delay,尤其是長時間delay函數(shù),對程序結(jié)構(gòu)不好,我覺得人家說的對
回復

使用道具 舉報

ID:718523 發(fā)表于 2021-4-27 12:45 | 顯示全部樓層
glinfei 發(fā)表于 2021-4-26 22:41
1. 你都寫了延時函數(shù)了:void delayms(unsigned int ms)           delayms(2000);就是延時2S;
2. zd0( ...

zd0()我寫成abc()行不行啊
回復

使用道具 舉報

ID:718523 發(fā)表于 2021-4-27 12:45 | 顯示全部樓層
birdzhyli 發(fā)表于 2021-4-27 00:38
定時器中斷每次觸發(fā)之后要重裝初值,好像你的中斷函數(shù)里沒有,比如你50ms一次定時器觸發(fā),弄個計數(shù)變量里面 ...

程序里有一個定時器了計算距離的那個,我想再弄個定時器做延時用
回復

使用道具 舉報

ID:913264 發(fā)表于 2021-4-27 21:44 | 顯示全部樓層
你的定時器沒裝初值吧

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:844772 發(fā)表于 2021-4-28 11:20 | 顯示全部樓層
forest415 發(fā)表于 2021-4-27 12:45
zd0()我寫成abc()行不行啊

那還不是看你開心,寫啥都行,另外你設定了自動重裝初值,所以中斷函數(shù)中就不用再重裝了。
回復

使用道具 舉報

ID:844772 發(fā)表于 2021-4-28 11:22 | 顯示全部樓層
yu1037764293 發(fā)表于 2021-4-27 21:44
你的定時器沒裝初值吧

他等著66ms溢出,所以不用裝初值
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表