数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1657|回复: 6

[C51] YF-S201水流传感器采样程序有问题请教高手指点

[复制链接]
发表于 2022-6-20 13:18:28 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
本帖最后由 慕名而来 于 2022-6-20 13:18 编辑

玩一个YF-S201水流传感器,就是那种内部带叶轮、霍尔传感器的水量计量的器件,当叶轮旋转时每转一圈会输出一个脉冲,累计450个脉冲等效于流过了1L水量,原本以为挺简单的采样代码竟然没有实现功能,一时之间又想不明白问题所在就发帖请各位帮忙看看问题之所在,先谢了!
一、先描述一下实验目标:
1.系统上电并且不吹气时LED灯不亮。
2.给传感器吹气,当叶轮旋转超过300圈(计数300个)时LED灯亮起并保持点亮。
3.断电并重新上电可以重复上述过程。
二、下述代码实验结果:
1.LED灯上电不亮是正确的。
2.吹气后叶轮旋转无论快满都不能点亮LED。
三、代码测试现象描述:
引入串口输出代码,以便在串口助手窗口中查看中断状态,
1.将串口输出语句加在中断函数中可以在串口助手上看到变量累加正常。
2.将串口输出语句加在主函数中无输出数据变化的显示
代码如下:

  1. /*************************************************************/
  2. #include <STC15W.h>
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define FOSC 11059200L         //系统频率
  7. #define BAUD 9600         //串口波特率
  8. /***********I/O口位功能定义*****************************/
  9. sbit JY=P5^5;  //继电器控制端口
  10. sbit LED=P5^4;
  11. //sbit DT=P3^3;
  12. uint t0=0,flag=0,tmd=0;
  13. /****显示延迟-延时函数**********************************/
  14. void delay_1ms (uint a)
  15. {
  16.     uchar i,j;
  17.     while( a-- != 0)
  18.     {
  19.         _nop_();
  20.         _nop_();
  21.         _nop_();
  22.         i = 11;
  23.         j = 190;
  24.         do
  25.         {
  26.             while (--j);
  27.         }
  28.         while (--i);
  29.     }
  30. }

  31. //====定时器T0与外部中断0初始化函数(函数由stc_isp软件自动生成)=========
  32. //定时器T0的16位自动重装模式

  33. void T0_Init(void)                //50毫秒@12.000MHz
  34. {
  35.     //////
  36.     INT0 = 1;
  37.     IT0 = 0; //设置INT0的中断类型 (1:仅?降沿 0:上升沿和?降沿)
  38.     EX0 = 1;
  39. }
  40. //================================================
  41. void UartInit(void)
  42. {
  43.     SCON = 0x50; //8位可变波特率
  44.     T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
  45.     T2H = (65536 - (FOSC/4/BAUD))>>8;
  46.     AUXR = 0x14; //定时器T2为1T模式, 并启动定时器2
  47.     AUXR |= 0x01; //选择定时器T2为串口1的波特率发生器
  48.     ES = 1; //使能串口1中断
  49.     EA = 1;
  50. }
  51. //================================================
  52. void data_out(uchar dat)
  53. {
  54.     SBUF=dat;
  55.     while(!TI);
  56.     TI=0;
  57. }
  58. //====主函数===================================
  59. main()
  60. {
  61.     T0_Init();        //T0设定初始化
  62.     UartInit();

  63.     P5M1&=0xff;
  64.     P5M0&=0x00;
  65.     P3M1&=0xff;
  66.     P3M0&=0x00;
  67.     JY=0;//初始化继电器控制端口
  68.     LED=1;

  69.     TR0=0;
  70. //----------------------------------------------------------
  71.     while(1)
  72.     {

  73.         if(tmd>300)
  74.         {
  75.             tmd=0;
  76.             flag=1;
  77.         }
  78.         if(flag)
  79.             LED=0;
  80.         else
  81.             LED=1;

  82.     }
  83. }
  84. //=============================================
  85. void exint0() interrupt 0 //INT0中断入口
  86. {
  87.     //TR0=1;
  88.     tmd++; //累计脉冲个数
  89.     //data_out(tmd);

  90. }
复制代码


发表于 2022-6-20 14:02:26 | 显示全部楼层
    while(1)
    {

        if(tmd>300)
        {
//            tmd=0;
            flag=1;
        }
        if(flag)
            LED=0;
        else
            LED=1;

    }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-20 20:28:00 | 显示全部楼层

多谢指点,确实是这里的问题,改成if(tmd==300)*******,而在中断函数中进行变量的超值清零操作就可以实现既定功能了。只是不理解如果程序不修改的话、标志变量flag的变化为什么没有达成目的。
回复 支持 反对

使用道具 举报

发表于 2022-6-22 21:12:03 来自手机浏览器 | 显示全部楼层
看别人玩都是计时算大概抽水多少的…
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-23 12:33:25 | 显示全部楼层
触景情伤 发表于 2022-6-22 21:12
看别人玩都是计时算大概抽水多少的…

其实我想利用水流传感器做为水流开关来用,因为水流开关有时候乌龙,原本感觉这货只要有水流过就总是要有脉冲输出的不像水流开关那样打开与关闭就两个状态,起初想的挺简单的,以为获得输出脉冲后触发单片机中断就启动水泵好了,后来发现行不通的,单靠中断检测能够实现水泵的开但却不知道啥时候需要关,目前正在实验其他的检测思路。
回复 支持 反对

使用道具 举报

发表于 2023-2-3 18:17:03 | 显示全部楼层
可以加个液位传感器来检测水量高度,判断关水。流量传感器是单位时间内流速,要把单位时间内的脉冲数量乘以系数得到流速,按照流速时间积分,累计计算流量
回复 支持 反对

使用道具 举报

发表于 2023-2-4 15:37:08 | 显示全部楼层
这个很早之前做过,12864显示计数、读数,流量、总流量。(净水器——8L桶、水泵抽水到烧茶器)
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-20 21:18 , Processed in 0.187200 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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