|
昨天在创意DIY板块发了一贴:也做了一套净水器废水利用装置:https://www.mydigit.cn/forum.php?mod=viewthread&tid=14685 ,这是带带拉拉弄了很久的制作,不认真做的原因就是因为净水机废水利用很是鸡肋,而最终做成了的原因是因为很闲且手痒难耐,这个系统使用了一片STC15W408AS单片机作为核心控制真的是小题大做,充其量就是一个玩单片机的制作,就单片机等利用率问题在此不作为讨论的话题,单片机的代码的编写属于菜鸟门外的水平,就代码问题欢迎指点、指正。
本系统利用单片机片内ADC编程对储水箱水位进行探测,利用外部中断对水流传感器(水流开关)进行检测,当水流传感器有信号传来时查询储水箱的水位,如果储水箱有水则输出开关量控制继电器启动水泵,否则等待;以下是电路图和C程序,在此声明:本文创意及代码仅供本坛朋友交流使用,不得转帖!不得用于商业用途!使用代码请标明出处!
-------呵呵----学话说话,弄的跟真的似的,其实说与不说-----哈哈:tongue:
电路图:
代码:粘贴复制即可应用
注意:因为水位传感测试时需要获取真实的ADC数据以便确定监控数据,所以需要挂载显示器件,本系统使用了一个595段码+595位码串控的4位LED数码模块,数码管驱动代码就是下列代码中被封闭掉的步分;其他控制功能请详见代码注释。
- /*************************************************************/
- #include <STC15W.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- /***********I/O口位功能定义*****************************/
- //sbit CE=P1^4; //595(引脚12)锁存控制(用于调试时演示参数)
- //sbit CLK=P1^3; //CLK
- //sbit DAT=P1^2; //DATA
- sbit JK=P1^5;
- uint dda;
- bit flag;
- /************应用变量设置(用于调试时演示参数)*******************************/
- //uchar d[4]; //设置显示变量缓存空间
- /***共阴极显示段码+黑屏码********************/
- //高电平有效;硬件接线为595=>Q0Q1Q2Q3Q4Q5Q6Q7=>abcdefgdp(其中dp未接线)
- //uchar SEG7[11]=
- //{0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00};
- /************位选择显示编码*****************************/
- //uchar Wei[4]={0xf7,0xef,0xdf,0xbf};//由另一片595的Q1Q2Q3控制
- /****显示延迟-延时函数**********************************/
- void delay_1ms (uint a)
- {
- uchar i,j;
- while( a-- != 0)
- {
- i = 12;
- j = 169;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- /******************************************************************/
- void Delay(uint x)//用于ADC转换及其它
- {
- uint y;
- while (x--)
- {
- y = 5000;
- while (y--);
- }
- }
- /*****模拟串行1bit数据输出函数(用于调试时演示参数)**************************/
- //仅模拟串行输出数据
- /***********
- void bit_out(uchar dat)
- {
- uchar r;
- for(r=0;r<8;r++)//设置8位计数器
- {
- DAT=dat&0x01;//从bit0起逐位输出数据
- dat>>=1;
- CLK=0;//595时钟脉冲生成
- CLK=1;
- }
- }
- **********/
- /******初始模数转换寄存器函数**************************************/
- void InitADC()
- {
- P1ASF = 0x03; //设置P1.0,P1.1为AD口
- ADC_RES = 0; //清除结果寄存器
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
- Delay(2); //ADC上电并延时
- }
- /****ADC转换执行函数***********************************************/
- uint GetADCResult(uchar ch)
- {
- uint deta=0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
- _nop_(); //等待4个NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG)); //等待ADC转换完成
- ADC_CONTR &= ~ADC_FLAG; //Close ADC
- deta=ADC_RES;
- deta=(deta<<2)+ADC_RESL;
- return deta; //返回10位ADC结果
- }
- /*********************************************/
- float AD_work(uchar ch)
- {
- float AD_val; //转换结果传递变量设为浮点数
- uchar m;
- for(m=0;m<50;m++)
- {AD_val+=GetADCResult(ch);} //转换50次求平均值(提高精度)
- AD_val/=50;
- return AD_val; //仅使用采样的数字量进行比对判断,不需要变换成模拟数据
- }
- /********显示函数(用于调试时演示参数)**********************************/
- /********
- void Display_convert(uint R)
- {
- uchar e;
- d[0]=R/1000;//拆分待显示数据存入显示数据缓存单元
- d[1]=R%1000/100;
- d[2]=R%100/10;
- d[3]=R%10;
- for(e=0;e<4;e++)
- {
- bit_out(SEG7[d[e]]);//先发送显示数据
- bit_out(Wei[e]);//再发送数位控制数据
- CE=0;//595锁存脉冲生成
- CE=1;
- delay_1ms(5);//点亮延迟
- }
- }
- ********/
- /******INT0中断函数**************************/
- //下降沿+下降沿触发模式,用于监测水流开关的状态
- void exint0() interrupt 0 //INT0中断入口
- {
- delay_1ms(20); //等待稳定
- flag=INT0; //上升沿出现时INT0=1;下降沿出现时INT0=0;
- }
- /*********主函数***********************************/
- main()
- {
- //-----------------------------------------------------------
- InitADC();//ADC初始化
- //设置P1.0--ADC0通道;测量储水箱水位
- //-----------------------------------------------------------
- INT0 = 1; //设置外部中断0为最高优先级
- IT0 = 0; //设置INT0的中断模式 (1:仅下降沿 0:上升沿和下降沿)
- EX0 = 1; //使能INT0中断
- EA = 1;
- //-----------------------------------------------------------
- flag=1; //标志初始化
- JK=1; //初始化继电器驱动输出口
- dda=0; //初始化储水箱水位采样变量
- //----------------------------------------------------------
- while(1)
- {
- if(flag==0) //如果水流开关闭合
- {
- dda= AD_work(0); //检测储水箱水位
- delay_1ms(5);
- if(dda>200) //如果水箱有水
- JK=0;//启动水泵
- else
- if(dda<190) //如果水箱没水或水位过低
- {
- JK=1; //关闭水泵
- EX0=0; //关闭外部中断0
- //控制外部中断是为了解决水箱排水到了最低值时恰逢补水而产生的水泵闪动运行的问题。
- delay_1ms(40000); //因为单片机无其他控制项目所以使用长延时函数
- delay_1ms(40000);
- //马桶加满水需要约40S、延时80S可保证水流传感器信号失能确保不会再次启动电机
- EX0=1; //重新开启外部中断0
- }
- }
- else if(flag==1) //如果水流开关断开
- {
- JK=1; //关闭水泵
- dda=0; //变量清空
- }
- }}
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|