找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2522|回复: 9
收起左侧

单片机定时器延时问题请教

[复制链接]
ID:718523 发表于 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;//关T0
  35.          }
  36.          else{
  37.          TR1=1;//开T0       
  38.          //p11=1;
  39.          //这里用定时器延时一会再关掉,能重复触发的
  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中断用来计数器溢出,超过测距范围
  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;                            //开启计数
  118.          while(RX);                        //当RX为1计数并等待
  119.          TR0=0;                                //关闭计数
  120.      Conut();                        //计算
  121.          delayms(30);                //100MS

  122.         }

  123. }              
复制代码



回复

使用道具 举报

ID:718523 发表于 2021-4-26 20:10 | 显示全部楼层
还有void zd0() interrupt 1中的zd0是啥意思啊
回复

使用道具 举报

ID:844772 发表于 2021-4-26 22:41 | 显示全部楼层
1. 你都写了延时函数了:void delayms(unsigned int ms)           delayms(2000);就是延时2S;
2. zd0() 是中断函数啊,计数器溢出才会进入,一旦进入就是距离超范围了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:889094 发表于 2021-4-27 00:38 来自手机 | 显示全部楼层
定时器中断每次触发之后要重装初值,好像你的中断函数里没有,比如你50ms一次定时器触发,弄个计数变量里面++就可以了,变量到20次1秒,400次就是20秒了,

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:889094 发表于 2021-4-27 00:39 来自手机 | 显示全部楼层
记得前几天看到的,函数中尽量少用delay,尤其是长时间delay函数,对程序结构不好,我觉得人家说的对
回复

使用道具 举报

ID:718523 发表于 2021-4-27 12:45 | 显示全部楼层
glinfei 发表于 2021-4-26 22:41
1. 你都写了延时函数了:void delayms(unsigned int ms)           delayms(2000);就是延时2S;
2. zd0( ...

zd0()我写成abc()行不行啊
回复

使用道具 举报

ID:718523 发表于 2021-4-27 12:45 | 显示全部楼层
birdzhyli 发表于 2021-4-27 00:38
定时器中断每次触发之后要重装初值,好像你的中断函数里没有,比如你50ms一次定时器触发,弄个计数变量里面 ...

程序里有一个定时器了计算距离的那个,我想再弄个定时器做延时用
回复

使用道具 举报

ID:913264 发表于 2021-4-27 21:44 | 显示全部楼层
你的定时器没装初值吧

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:844772 发表于 2021-4-28 11:20 | 显示全部楼层
forest415 发表于 2021-4-27 12:45
zd0()我写成abc()行不行啊

那还不是看你开心,写啥都行,另外你设定了自动重装初值,所以中断函数中就不用再重装了。
回复

使用道具 举报

ID:844772 发表于 2021-4-28 11:22 | 显示全部楼层
yu1037764293 发表于 2021-4-27 21:44
你的定时器没装初值吧

他等着66ms溢出,所以不用装初值
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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