|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 慕名而来 于 2022-6-20 13:18 编辑
玩一个YF-S201水流传感器,就是那种内部带叶轮、霍尔传感器的水量计量的器件,当叶轮旋转时每转一圈会输出一个脉冲,累计450个脉冲等效于流过了1L水量,原本以为挺简单的采样代码竟然没有实现功能,一时之间又想不明白问题所在就发帖请各位帮忙看看问题之所在,先谢了!
一、先描述一下实验目标:
1.系统上电并且不吹气时LED灯不亮。
2.给传感器吹气,当叶轮旋转超过300圈(计数300个)时LED灯亮起并保持点亮。
3.断电并重新上电可以重复上述过程。
二、下述代码实验结果:
1.LED灯上电不亮是正确的。
2.吹气后叶轮旋转无论快满都不能点亮LED。
三、代码测试现象描述:
引入串口输出代码,以便在串口助手窗口中查看中断状态,
1.将串口输出语句加在中断函数中可以在串口助手上看到变量累加正常。
2.将串口输出语句加在主函数中无输出数据变化的显示
代码如下:
- /*************************************************************/
- #include <STC15W.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define FOSC 11059200L //系统频率
- #define BAUD 9600 //串口波特率
- /***********I/O口位功能定义*****************************/
- sbit JY=P5^5; //继电器控制端口
- sbit LED=P5^4;
- //sbit DT=P3^3;
- uint t0=0,flag=0,tmd=0;
- /****显示延迟-延时函数**********************************/
- void delay_1ms (uint a)
- {
- uchar i,j;
- while( a-- != 0)
- {
- _nop_();
- _nop_();
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- }
- while (--i);
- }
- }
- //====定时器T0与外部中断0初始化函数(函数由stc_isp软件自动生成)=========
- //定时器T0的16位自动重装模式
- void T0_Init(void) //50毫秒@12.000MHz
- {
- //////
- INT0 = 1;
- IT0 = 0; //设置INT0的中断类型 (1:仅?降沿 0:上升沿和?降沿)
- EX0 = 1;
- }
- //================================================
- void UartInit(void)
- {
- SCON = 0x50; //8位可变波特率
- T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
- T2H = (65536 - (FOSC/4/BAUD))>>8;
- AUXR = 0x14; //定时器T2为1T模式, 并启动定时器2
- AUXR |= 0x01; //选择定时器T2为串口1的波特率发生器
- ES = 1; //使能串口1中断
- EA = 1;
- }
- //================================================
- void data_out(uchar dat)
- {
- SBUF=dat;
- while(!TI);
- TI=0;
- }
- //====主函数===================================
- main()
- {
- T0_Init(); //T0设定初始化
- UartInit();
- P5M1&=0xff;
- P5M0&=0x00;
- P3M1&=0xff;
- P3M0&=0x00;
- JY=0;//初始化继电器控制端口
- LED=1;
- TR0=0;
- //----------------------------------------------------------
- while(1)
- {
- if(tmd>300)
- {
- tmd=0;
- flag=1;
- }
- if(flag)
- LED=0;
- else
- LED=1;
- }
- }
- //=============================================
- void exint0() interrupt 0 //INT0中断入口
- {
- //TR0=1;
- tmd++; //累计脉冲个数
- //data_out(tmd);
- }
复制代码
|
|