您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 电子设计创新与实践1
基于PIC16F747设计的用电池供电的贮水控制系统摘要随着昆断现代化城市迈进的脚步,一栋栋高层居民住宅楼拔地而起。停水是高层住户经常遇到的问题,只要的原因是储层在高层住宅楼顶层的贮水池没有能够及时补充自来水,导致停水现象。针对这一问题,(采用侧水压的方法)应用了以PIC16F747单片机为核心,采用字符液晶显示LCD、定时器及传感器设计了可自动控制进水和出水的控制系统。一设计任务及要求以PIC16F747为核心,采用字符液晶显示LCD,定时器及传感器,实现对贮水池的水量自动测量;根据LCD模块显示的当前水量,测量出当前的用水速度;通过继电器控制抽水机的工作。当水量低于总水量的百分之二十或以过去十分钟的用水速度为基准,当贮水池的用水量不大于一小时时,打开抽水电机给贮水池补充自来水;在此基础之上,可以通过键盘手动设定开始抽水的条件参数。二电路原理通过水的压力作用到传感器上,使其产生一模拟信号。单片机将此信号通过其A/D转换模块,将其转换成数字信号,通过LCD将其显示。通过定时器来测量流出水的时间,通过水的流量与流出这些水所需时间,可以得到水流的速度。当LCD所显示的水量不足总水量的百分之二十时,此时通过继电器控制水电机的抽水工作;或通过当前水流速度,来计算剩余水可利用的时间,当其不大于一小时时,由继电器控制电机的抽水工作。电路原理图如下图1和图2及图3.进水口出水口压力感应器图1图2图3三硬件系统设计以16F747单片机为核心,通过水的压力作用于传感器上进而可得到一个模拟信号,通过A/D转换,进而可在LCD上显示出当前的水量。通过定时器记录产生水位差的整个时间段,通过此水位差和这个时间段进而可以确定水流的速度。然后再通过水流的速度和LCD显示的当前用水量以及程序的控制来对继电器进行控制抽水电机的工作。3.1芯片的选择16F747是采用纳瓦技术,带十位A/D的40/44引脚,八位CMOS闪存单片机。本实验采用40引脚的16F747单片机。3.2结构框图中央控制单元PIC16F747传感器定时器控制电机LCD显示图4传感器部分:接受水对其产生的压力,并且产生一个模拟信号,通过中央控制部分PIC16F747将其转化为数字信号。时钟模块:记录产生水位差的时间。LCD显示部分:显示当前水量。控制电机部分:控制对蓄水池的自动补充自来水。四软件系统设计1初始化程序2主程序#includepic.h#includedelay.h#includelcd.h#defineucharunsignedchar#defineuintunsignedintuchardeep,deep_0,deep_1;uchardeepl=100;//假设的是100深度因为你们那个传感器我没有办法弄得啊voidchang_d(void);voidchang_bcd(unsignedchara);voidini_ad();voidDelay(ucharx);main(){TRISA=01xh;ini_ad();lcd_init();//初始化LCDlcd_puts(deep=);while(1){chang_d();lcd_goto(0x85);lcd_putch(dis_deep1+0x30);lcd_goto(0x86);lcd_putch(dis_deep0+0x30);if(deep=deepl*0.2)PORTD=04xh;elsePORTD=01xh;}}//*******************************深度***************************************voidchang_bcd(unsignedchara){chartemp,b=25;temp=a;dis_deep0=a%10;//取10位a=temp/10;dis_deep1=a;//取个位}//*******************************AD转换*************************************voidini_ad(){TRISA1=1;INTCON=0X00;ADCON0=0X09;//通道1,AN1,fosc/2ADIE=0;//禁止AD中断ADIF=0;ADCON1=0X04;//AN4即RA5为数字脚,RA1为模拟输入,参考电压为电源电压PEIE=1;GIE=1;}//*******************************深度的A/D转换********************************//这部分我没有办法写不知道传感器怎么办voidchang_d(void){uintadcr=0;uchardeep_r=0;ADON=1;//开ADCADGO=1;while(ADIF==0);ADIF=0;//AD转换完成adcr=ADRESH;//读AD结果高位adcr=adcr-0x3A;//转换成温度值deep_r=deep_t[adcr];chang_bcd(deep_r);//转化成BCD}//********************************延时**************************************voidDelay(ucharx)//设置延时{uchari;while(x--)for(i=0;i80;i++);}//********************************SPI口定义***********************************#define-voutRB6//输入#definevoutRB5//输出//********************************初始化寄存器********************************voidConfig905(void){uchari;vout=0;Delay(1);//Spienableforwriteaspicommandfor(i=0;i11;i++)//Writeconfigrationwords写放配置字{SpiReadSpiWrite(RFConf[i]);}vout=1;//DisableSpi}//********************************系统初始化**************************************voidsystem_Init(void)//r{/*TRISB=0x0D;TRISD=0x00;*///TRISB=0x0D;TRISD=0x0D;vout=1;//Spidisable#includepic.h#includedelay.h#includelcd.h#defineucharunsignedchar#defineuintunsignedintuchardeep,deep_0,deep_1;uchardeepl=100;//假设的是100深度因为你们那个传感器我没有办法弄得啊voidchang_d(void);voidchang_bcd(unsignedchara);voidini_ad();voidDelay(ucharx);main(){TRISA=01xh;ini_ad();lcd_init();//初始化LCDlcd_puts(deep=);while(1){chang_d();lcd_goto(0x85);lcd_putch(dis_deep1+0x30);lcd_goto(0x86);lcd_putch(dis_deep0+0x30);if(deep=deepl*0.2)PORTD=04xh;elsePORTD=01xh;}}//*******************************深度***************************************voidchang_bcd(unsignedchara){chartemp,b=25;temp=a;dis_deep0=a%10;//取10位a=temp/10;dis_deep1=a;//取个位}//*******************************AD转换*************************************voidini_ad(){TRISA1=1;INTCON=0X00;ADCON0=0X09;//通道1,AN1,fosc/2ADIE=0;//禁止AD中断ADIF=0;ADCON1=0X04;//AN4即RA5为数字脚,RA1为模拟输入,参考电压为电源电压PEIE=1;GIE=1;}//*******************************深度的A/D转换********************************//这部分我没有办法写不知道传感器怎么办voidchang_d(void){uintadcr=0;uchardeep_r=0;ADON=1;//开ADCADGO=1;while(ADIF==0);ADIF=0;//AD转换完成adcr=ADRESH;//读AD结果高位adcr=adcr-0x3A;//转换成温度值deep_r=deep_t[adcr];chang_bcd(deep_r);//转化成BCD}//********************************延时**************************************voidDelay(ucharx)//设置延时{uchari;while(x--)for(i=0;i80;i++);}//********************************SPI口定义***********************************#define-voutRB6//输入#definevoutRB5//输出//********************************初始化寄存器********************************voidConfig905(void){uchari;vout=0;Delay(1);//Spienableforwriteaspicommandfor(i=0;i11;i++)//Writeconfigrationwords写放配置字{SpiReadSpiWrite(RFConf[i]);}vout=1;//DisableSpi}//********************************系统初始化**************************************voidsystem_Init(void)//r{/*TRISB=0x0D;TRISD=0x00;*///TRISB=0x0D;TRISD=0x0D;vout=1;//Spidisable/**Delayfunctions*Seedelay.hfordetails**Makesurethiscodeiscompiledwithfulloptimization!!!*/#includedelay.hvoidDelayMs(unsignedcharcnt){#ifXTAL_FREQ=2MHZdo{DelayUs(996);}while(--cnt);#endif#ifXTAL_FREQ2MHZunsignedchari;do{i=4;do{DelayUs(250);}while(--i);}while(--cnt);#endif}}}#ifndef_LCD_H_#define_LCD_H_/**LCDinterfaceheaderfile*Seelcd.cformoreinfo*//*lightlcd&dark*/voidlcd_light(void);voidlcd_dark(void);/*writeabytetotheLCDin4bitmode*/externvoidlcd_write(unsignedchar);
本文标题:电子设计创新与实践1
链接地址:https://www.777doc.com/doc-77022 .html