找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机计时脉冲信号的间隔时间

[复制链接]
跳转到指定楼层
楼主
大佬们好,我想做一个计算脉冲信号间隔的仿真。用脉冲间隔模拟液滴滴落的间隔,以此来计算液滴滴速。脉冲信号每隔一秒输出一次高电平,我想通过计时器计算两次高电平之间的脉冲间隔(或者计算脉冲周期也是可以的),也就是1秒,计算完第一个间隔,接着计算第二个间隔。(要是实现不了隔一个计算一个也是可以的)然后在lcd1602上显示出来,还有一个温湿度也要显示出来,显示的包括温湿度我已经做出来了,但这个脉冲间隔我死活做不出来。

单片机源程序如下:
#include<reg51.h>
#include<intrins.h>

#include"LCD1602.h"
#define uchar unsigned char
#define uint unsigned int


sbit b=P3^2;
uint sum=0,a=0;//sum是软件计数,a是脉冲间隔时间
uchar disu[2];


void main()   
{
        
        if(b==1)       //高电平计时
        {
        TMOD=0x09;           //TMOD=0000 1001 定时器T0工作模式1,GTEA置1
        TH0=(65536-50000)/256;  //定时50ms
        TL0=(65536-50000)%256;
        TR0=1;
        ET0=0;
        EA=1;                 //总中断
        //EX1=1;                //外部中断
           while(1)
              {
                   while(TF0==1)
                               {
                                     TF0=0;
                                      TH0=(65536-50000)/256;  
                                      TL0=(65536-50000)%256;
                                            sum++;
                               }
              }
  }
        if(b==0)        //低电平结束
        {
                a=(1000/(sum*50))*60;      //显示脉冲间隔
            sum=0;
        }

}


仿真是这样一个结果,lcd也不亮了,大家帮我看看程序,或者说可以帮我提供一个新思路计算这个间隔也可以。(这个做了好几天了,一直没做出来)
谢谢大家。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2022-4-27 03:16 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:213173 发表于 2022-4-27 07:30 | 只看该作者
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. #include"LCD1602.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int


  6. sbit b=P3^2;
  7. uint sum=0,sec=0;//sum是软件计数,sec是脉冲间隔时间
  8. uchar disu[2];
  9. bit flag=0;

  10. void main()   
  11. {
  12.         TMOD=0x01;           //TMOD=0000 0001 定时器T0工作模式1
  13.         TH0=(65536-50000)/256;  //定时50ms
  14.         TL0=(65536-50000)%256;
  15.         TR0=1;
  16.         ET0=0;
  17.         EA=1;                 //总中断
  18.         EX0=1;                //外部中断0
  19.     IT0 = 1;
  20.         while(1)
  21.         {
  22.                 if(flag==1)
  23.                 {
  24.                         flag=0;
  25.                         //刷新显示器
  26.                 }
  27.         }
  28. }


  29. void Timer0Interrupt(void) interrupt 1
  30. {
  31.         TH0=(65536-50000)/256;
  32.         TL0=(65536-50000)%256;
  33.     sum++;
  34. }
  35. void exint0() interrupt 0
  36. {
  37.         sec=sum*0.05;      //显示脉冲间隔
  38.         sum=0;
  39.         flag=1;
  40. }
复制代码
回复

使用道具 举报

地板
ID:123289 发表于 2022-4-27 18:10 | 只看该作者
1、做个定时器,如每1ms中断一次,每次中断将内存NN+1
2、用脉冲做个输入中断,每次中断时,让SS=NN,再NN=0,则SS就是两个脉冲之间的时间。
回复

使用道具 举报

5#
ID:1019158 发表于 2022-4-27 19:35 | 只看该作者

感谢您的指导,但这个程序还是有些问题,我将我全部代码发出来,您看一下。
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include"LCD1602.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit Data=P3^6;   //定义数据线
  7. uchar rec_dat[9];   //用于显示的接收数据数组

  8. bit fg=1;

  9. uint sum=0,sec=0;//sum是软件计数,sec是液滴间隔时间
  10. uchar disu[2];
  11. sbit b=P3^2;
  12. bit flag=0;

  13. //初始化函数
  14. void DHT11_delay_us(uchar n)
  15. {
  16.     while(--n);
  17. }

  18. void DHT11_delay_ms(uint z)
  19. {
  20.    uint i,j;
  21.    for(i=z;i>0;i--)
  22.       for(j=110;j>0;j--);
  23. }

  24. void DHT11_start()
  25. {
  26.    Data=1;
  27.    DHT11_delay_us(2);
  28.    Data=0;
  29.    DHT11_delay_ms(30);   //延时18ms以上
  30.    Data=1;
  31.    DHT11_delay_us(30);
  32. }

  33. uchar DHT11_rec_byte()      //接收一个字节
  34. {
  35.    uchar i,dat=0;
  36.   for(i=0;i<8;i++)    //从高到低依次接收8位数据
  37.    {         
  38.       while(!Data);   ////等待50us低电平过去
  39.       DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0
  40.       dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
  41.       if(Data==1)    //数据为1时,使dat加1来接收数据1
  42.          dat+=1;
  43.       while(Data);  //等待数据线拉低   
  44.     }  
  45.     return dat;
  46. }

  47. void DHT11_receive()      //接收40位的数据
  48. {
  49.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  50.     DHT11_start();
  51.     if(Data==0)
  52.     {
  53.         while(Data==0);   //等待拉高     
  54.         DHT11_delay_us(40);  //拉高后延时80us
  55.         R_H=DHT11_rec_byte();    //接收湿度高八位  
  56.         R_L=DHT11_rec_byte();    //接收湿度低八位  
  57.         T_H=DHT11_rec_byte();    //接收温度高八位  
  58.         T_L=DHT11_rec_byte();    //接收温度低八位
  59.         revise=DHT11_rec_byte(); //接收校正位

  60.         DHT11_delay_us(25);    //结束

  61.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  62.         {
  63.             RH=R_H;
  64.             RL=R_L;
  65.             TH=T_H;
  66.             TL=T_L;
  67.         }
  68.         /*数据处理,方便显示*/
  69.         rec_dat[0]='0'+(TH/10);
  70.         rec_dat[1]='0'+(TH%10);
  71.         rec_dat[2]=0xdf;
  72.         rec_dat[3]=0x43;
  73.         rec_dat[4]=' ';
  74.         rec_dat[5]='0'+(RH/10);
  75.         rec_dat[6]='0'+(RH%10);
  76.         rec_dat[7]='R';
  77.                     rec_dat[8]='H';
  78.     }
  79. }



  80. void main()   
  81. {
  82.        
  83.         TMOD=0x09;           //TMOD=0000 1001 定时器T0工作模式1,GTEA置1
  84.         TH0=(65536-50000)/256;  //定时50ms
  85.         TL0=(65536-50000)%256;
  86.         TR0=1;
  87.         ET0=0;
  88.         EA=1;                 //总中断
  89.         EX0=1;                //外部中断0
  90.         IT0=1;
  91.            while(1)
  92.          {
  93.                  if(flag==1)
  94.                      {
  95.                      flag=0;   //刷新显示器
  96.                
  97.             
  98.                             }
  99.            }
  100.        
  101.         disu[0]='0'+(sec/10);
  102.         disu[1]='0'+(sec%10);
  103.        
  104.         LCD_init();
  105.         LCD_send(1,0,"IV speed:",9);
  106.         LCD_send(1,9,disu,2);
  107.         LCD_send(1,11,"/min",4);
  108.         LCD_send(2,1,"T&H:",4);

  109.   DHT11_delay_ms(100);    //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
  110.       
  111.         while(1)   
  112.         {   
  113.                 DHT11_receive();
  114.                 LCD_send(2,6,rec_dat,9);
  115.           LCD_send(1,9,disu,2);   
  116.           
  117.         }
  118.        
  119. }   
  120. void Timer0Interrupt(void) interrupt 1
  121. {
  122.         TH0=(65536-50000)/256;
  123.         TL0=(65536-50000)%256;
  124.         sum++;
  125. }
  126. void exint0() interrupt 0
  127. {
  128.         sec=sum*0.05*60;      //显示脉冲间隔并换算成每秒多少次
  129.         sum=0;
  130.         flag=1;
  131. }




  132. LCD1602的程序:

  133. #include <LCD1602.h>
  134. #include "reg51.h"
  135.                 sbit RS = P2^0;
  136.     //sbit RW = P2^1;
  137.     sbit EN = P2^1;
  138.        
  139. void LCD_send(unsigned char i,unsigned char j,unsigned char str[],unsigned char n)
  140. {
  141.         //输入:显示行数i,列数j,输出字符,输出字符长度n
  142.         unsigned char x=0;
  143.         if(i==1)
  144.         {write_com(0x80+j);}
  145.         else
  146.         {write_com(0x80+0x40+j);}
  147.     for(x=0;x<n;x++)
  148.     {
  149.          write_date(str[x]);
  150.         delay(150);
  151.     }
  152. }




  153. int LCD_init()//初始化函数体
  154. {
  155.     EN = 0;
  156.     write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口
  157.     write_com(0X0C);//设置开显示,不显示光标
  158.     write_com(0X06);//写一个字符时,整屏右移
  159.     write_com(0X01);//显示清零
  160.     return 0;
  161. }

  162. int write_com(unsigned char com)//写命令的函数体
  163. {
  164.     RS = 0;
  165.     //RW = 0;
  166.     P0 = com;
  167.     delay(5);
  168.     EN = 1;
  169.     delay(5);
  170.     EN = 0;
  171.     return 0;
  172. }

  173. int write_date(unsigned char data1)//写数据的函数体
  174. {
  175.     RS = 1;
  176.     //RW = 0;
  177.     P0 = data1;
  178.     delay(5);
  179.     EN = 1;
  180.     delay(5);
  181.     EN = 0;
  182.     return 0;
  183. }

  184. int delay(unsigned char xms)
  185. {
  186.     unsigned char x,y;
  187.     for(x=xms;x>0;x--)
  188.         for(y=110;y>0;y--);
  189.     return 0;
  190. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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