1、广西民族大学第二次综合课程设计报告论文题目: 基于51单片机的蓄水池自动控制系统学院: 物理与电子工程学院 专 业:自动化年级: 2007级 学 号: 107263010113学生姓名: 黄毅指导教师: 廖义奎设计时间:2010年3月至2010年6月基于51单片机的蓄水池自动控制系统摘 要:本课程主要设计一个基于51单片机的蓄水池自动控制系统,可以测量出蓄水池的温度以及缺水满水.可以自动控制进水和出水,进出水先用手动倒水进去和手工放水模拟,要求当水满时自动控制停止抽水。同时,可以通过电脑控制抽水和放水,并把以把测量的数据通过RS232接口传到上位机电脑上并在电脑上显示出来.1 引言随着人们生活
2、用水的需要,蓄水池的需求也越来越多,特别是农村地区,而如何合理地控制电机抽水以便控制蓄水池的水量,成为了必需解决的问题。而本课程设计的基于51单片机的蓄水池自动控制系统可以很好地为解决这一突出问题提供了方案。此设计中主要包括以下几个任务:一、微控芯片的选择。二、数据现示的方式。三、水位的ADC采样和水温的测量.四、电脑上位机控制。五、按键和电机开关的控制选择方式.2 系统功能分析一个完整的51单片机的蓄水池自动控制系统应具有以下功能: 一、为使用户界面友好,则应该用显示器件显示相应的操作信息。比如在接通电源的情况下应有相应的电源指示灯;电源插座、USB下载线接口、按键等最好分布在电路板的边缘,
3、以方便操作.二、为保证焊接器件和安装USB下载线时不被误操作,相应的地线应尽量加粗。三、为更好地显示继电器工作与否,最好在继电器在工作时有指示灯的提示。3 系统硬件实现方框图本系统以单片机为控制核心,基于51单片机的蓄水池自动控制系统结构如下图所示。状态提示和数据现示水温测量主控芯片水位测量控制电机上位机按制4系统硬件的方案比较和选择4.1微控芯片的选择.STC12C5A32S2单片机具有32个IO口,共4个并行8位IO,P1P3,其中P1口的第二功能为模拟数字转换输入通道,可以通过特殊功能寄存器选择P1口的具体功能.图4-1-1 STC12C5A32S2引脚排列及功能图该单片机工作电压范围从
4、3.5V到5。5V,其内置资源十分强大,具有32K的Flash的存储空间以及29K的Flash DATA空间,还有1280字节的RAM,以及具有两个外部中断IO口(P3.2、P3。3),两个与普通51单片机兼容的16位定时计数器,它还内置了独立的波特率发生器,在串口通信时,使用独立波特率发生器,可以不占用定时计数器,该发生器类似于定时器的工作方式2,属于自动重载,只要设定初值后,就不需要再次写入计数值,应用方便.串行通信口为RXD(P3。0)、TXD(P3.1)。 另外,该单片机为1T单片机,速度比普通51快约12倍.4.2 数据现示的方式。1602LCD是专门用于显示字母、数字、符号的显示模
5、块,具有功耗低、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到很广泛。表4.2。0 LCD1602管脚排列和功能表引脚标号功能说明备注1Vss逻辑负电源输入引脚,0V2Vdd逻辑正电源输入引脚,5V3VoLCD驱动电源输入引脚,调节其对比度接502粗调电阻4RS数据/指令寄存器选择5R/W读写选择引脚若只需要读,则接地6EN读写使能引脚714D0D78位数据引脚线15A背光电源输入引脚,5V不带背光的LCD则无此引脚16K背光地一般接入小电阻限流显示模块使用了该单片机的P0口,由于P0口采用了漏极开路输出的方式,故作为IO口使用时,P0口必须接上拉电阻。控制口线接
6、到了P2口,RS接P2.5,EN接P2.7。在应用中,可以直接将RW短接到地,使用短延时的方法跳过1602的数据处理忙信号,这样单片机就可以不读取1602的忙信号而直接对1602进行写操作。4.3 水位的ADC采样和水温的测量。4。3。1 STC单片机内置ADC的使用方法 STC系列单片机中的STC89LE516AD/X2提供了8路8位精度的高速A/D转换器,位于P1口上,从而省去了片外ADC的麻烦。这8路ADC为电压输入型,可做按键扫描,电池电压检测,频谱检测等。ADC转换过程需要17个机器周期。通过对相关功能寄存器的适当配置,就可以控制其工作.下面就对相关功能寄存器进行介绍。A/D转换寄存
7、器总表:寄存器地址名称76543210初始初P1_ADC_EN97H允许P1。x成为A/D口P17P16P15P14P13P12P11P1000000000ADC_CONTRC5HA/D转换控制寄存器ADC_FLAGADC_STARTCHS2CHS1CHS0xxx00000ADC_DATAC6HA/D转换结果寄存器00000000(1)P1_ADC_EN:特殊功能寄存器P1.x作为A/D转换输入通道来用允许特殊功能寄存器。相应位为“1”时,对应的P1。x口作为A/D转换使用,内部上拉电阻自动断开。(2)ADC_CONTR:特殊功能寄存器CHS2/CHS1/CHS0是模拟输入通道选择,CHS2/
8、CHS1/CHS0的取值如下表所示:CHS2CHS1CHS0模拟输入通道选择000选择P1。0为A/D输入001选择P1.1为A/D输入010选择P1.2为A/D输入011选择P1.3为A/D输入100选择P1。4为A/D输入101选择P1。5为A/D输入110选择P1。6为A/D输入111选择P1。7为A/D输入ADC_START是模拟数字转换(ADC)启动控制位,设置为1时,开始转换。 ADC_FLAG是模拟数字转换结束标志位,当A/D转换完成后,ADC_FLAG=1。(3)ADC_DATA: A/D转换结果特殊功能寄存器模拟数字转换结果计算公式为 结果=256Vin/VccVin是模拟输
9、入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压.4。3。2 水温的测量DS18B20简介是美国美信(Maxim)公司生产的单线数字温度传感器DS1820,可把温度信号直接转换成串行数字信号供微机处理.DS18B20的主要特性是:适应电压范围更宽,电压范围:3.05。5V,在寄生电源方式下可由数据线供电独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内温
10、范围55125,在10+85时精度为0。5可编程的分辨率为912位,对应的可分辨温度分别为0。5、0。25、0.125和0。0625,可实现高精度测温在9位分辨率时最多在93。75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快测量结果直接输出数字温度信号,以”一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作.DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。 如图43-1 图4-31DS18B20内部结
11、构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器. 如下图43-2图4-3-24。4 电脑上位机控制。由于采用的是三星公司的专业下载线,所以只要USB与电脑相连,只要配置好电脑的波特率就可以实现上位机实时获取蓄水池的相关数据信息以便控制远程控制蓄水池。 4.5 按键和电机开关的控制选择方式。用两个按键用于手动控制电机的正反转,而电机的关断则采用继电器来控制.5 设计方案的实施:5.1 微控芯片的选择.图5-11是单片机最小系统。它必须满足如下四个条件:1、电源的滤波及供电;2、单片机的复位-上电复位和手动复位。3、程序下载接口。4、晶振电路。如图3
12、3中所示,两路开关并联使用,增大了开关触点能通过的最大电流,控制单片机的供电电源,另外P0口接了10K的上拉排阻,PIN9复位引脚通过一个电阻下拉到地,接入了一个电容和一个开关,分别为上电复位电容和手动复位开关。与晶振相接的电容为33PF,起作用是帮助晶振起振。下载口外接出了单片机的RXD以及TXD,加上了VCC和GND的引脚,方便与下载线相连图5-115。2数据现示的方式。如图5-2-1所示,背光K引脚接入4。7欧姆的电阻限流。1602数据口D0D7接到单片机P1口,RS接到P2。7,RW接到P2。5,EN接到P2.6。图5215。3水位的ADC采样和水温的测量。图5-3-1水位的AD采样测
13、量采用的是单片机内部携带的AD采样功能。如下图53-1所示,把芯片的P1口上拉,并用排针把该端口引出来;而图532则是温度传感器DS18B20的电路接线图,其数据线经上拉后与单片机的P0。3口相连。图5-3-25。4、电脑上位机控制.图5-4-1所示此下载线接口既可为单片机供电也可作为其与电脑的通讯接口. 图5-4-15。5按键和电机开关的控制选择方式。图5-5-1如右图5-5-1所示用单片机的两个中断口P3。2和P3。3作为按键的控制输入口。而图552所示的继电器则使用P0.4和P0.5作为其被控的端口。图5526 软件设计实现方案6。1程序的主要流程图(见于附图1)6.2程序C语言源代码(
14、见于附页)7系统硬件制作与软件的调试设计好整个系统的硬件原理图(见于附图2)并做好电路PCB之后,按如下步骤进行硬件的制作:一、 用Protel2004软件制作原理图,然后生成网络报表,接着生成PCB文件,布线要注意器件的封装和安放合理性等方面多考虑。二、 用热转印纸打印PCB印刷电路图。三、 经热转印后、放到双氧水、盐酸、水为2:2:1的溶液中腐蚀。四、 给电路板打孔,并擦除电路的碳化物后,立即涂上一层经天那水溶解的松香,以防止铜氧化。五、 焊接元件后就进行了硬件的调试。接着是系统硬件的调试,首先检查电路上有否漏焊、开路和短路的现象;然后按如下步骤进行测试:一、 在没有插上芯片之前给电路板供
15、电,观察电路板上的电源指示灯是否正常并用万用表测电路板的电压是5V的直流电压。二、 如果电压正常,然后电路板安装上主控芯片,此时要注意芯片的电源和地管脚与电路板上的对应。三、 然后检查继电器是否工作,按键是否按下时可以短路,如果一切正常则说明系统板可以工作了,不正常则说明系统硬件有问题,重新仔细检查电路的电气性连接。8系统测试数据:经测试系统达到了如期的要求,正常时现示水位处于稳定的状态并相应现示水的温度.超出最低水位时,系统报警并向蓄水池中加水,直到合适的水位,然后停止加水;水超出最高水位时系统报警并从蓄水池中放水,直到低于水位的警界线为止.系统的两个按键可以直接的加水和放水,比如按下加水键
16、,电机通电往蓄水池中加水,当再次按下此按键时则停止加水。也可以通过上位机来控制系统的所有功能,如可直接控制加放水,获取水的温度。参考文献1、郭天翔。新概念51单片机C语言教程.北京:电子工业出版社,2009.2、电子技术基础:模拟部分。第四版。北京:高等教育出版社.19993、C语言程序设计。北京:中国铁道出版社,20074、李全利,迟荣强。单片机原理及接口技术.北京:高等教育出版社,2008附页源程序代码includereg51.hincludestdio。h#includeintrins。hincludeP1.0 .。111-P1。7*/ /-串口发送-/void send_char_co
17、m( unsigned char ch) SBUF=ch; while (TI= 0); TI= 0 ;/-第n通道ADC初始化函数-void ADC_int(uchar n) n=0x07; /确保n=0-7通道 AURX1=0x04; /转换结果存储格式:数据的高2位放ADC_RES,低8位放ADC_RESL P1ASF=1n; /将P1。n设为ADC采样功能/-第n通道ADC采样函数-uint ADC_GET(unsigned char n) unsigned int adc_data; n&=0x07; /确保n=0-7通道 ADC_RES=0; /清零 ADC_RESL=0; /清零
18、 ADC_CONTR=0; /清零,以便重构 ADC_CONTR=(ADC_POWERADC_SPEED|nADC_START); /打开AD转换电源、设定转换速度、设定通道号、AD转换开始 _nop_();_nop_();_nop_();_nop_();_nop_(); /延时4个时钟周期左右 while(!(ADC_CONTRADC_FLAG)); /等待转换结束 =0x10 ADC_FLAG位=1 adc_data=(ADC_RES0x03)256+ADC_RESL; /转换结果计算,取高位结果存储器的低2位 + 低位结果存储器 ADC_CONTR&=ADC_FLAG; /清零转换结束标
19、志位(ADC_FLAG位=0) return adc_data; /返回ADC的值(0-1023)/*lcd1602程序*/void delay1ms(unsigned int ms)/延时1毫秒unsigned int i,j; for(i=0;ims;i+) for(j=0;j100;j+);void delay(uint z)/延时函数uint x,y;for(x=z;x0;x-)for(y=110;y0;y);void wr_com(unsigned char com)/写指令/ delay1ms(1); RS=0; / RW=0; EN=0; P0=com; / delay1ms(1
20、); EN=1; delay1ms(1); EN=0;void wr_dat(unsigned char dat)/写数据/ delay1ms(1); RS=1; / RW=0; EN=0; P0=dat; / delay1ms(1); EN=1; delay1ms(1); EN=0;void lcd_init()/初始化设置/ / RW=0;delay1ms(15);wr_com(0x38);delay1ms(5); wr_com(0x08);delay1ms(5); wr_com(0x01);delay1ms(5); wr_com(0x06);delay1ms(5); wr_com(0x0
21、c);delay1ms(5);void display(unsigned char p)/显示/while(p!=0)wr_dat(*p);p+;delay1ms(1);init_play()/初始化显示 lcd_init(); wr_com(0x80);display(str1); /*ds1820程序*/bit ds1820rst(void)/*ds1820复位/ bit flg;DQ = 1; /DQ复位for(t=0;t16;t+); /延时DQ = 0; /DQ拉低for(t=0;t800;t+); /精确延时大于480usDQ = 1; /拉高for(t=0;t80;t+);flg
22、=DQ;for(t=0;t0;i) DQ = 1; /先将数据拉高_nop_();/等待一个机器周期_nop_();_nop_();DQ=0;/启动读时序_nop_();_nop_();_nop_();DQ = 1; /人为拉高for(t=0;t16;t+);dat=1;if(DQ=1)dat=0x80;else dat|=0x00; for(t=0;t0; i-) DQ = 1;_nop_();_nop_();_nop_();DQ=0; DQ = wdata0x01; for(t=0;t80;t+); DQ = 1; for(t=0;t80;t+); wdata=1; for(t=0;t30
23、;t+);read_temp()/*读取温度值并转换/ds1820rst(); ds1820wr(0xcc);/跳过读序列号*/ds1820wr(0x44);/*启动温度转换*/delay1ms(200);ds1820rst(); ds1820wr(0xcc);/跳过读序列号/ds1820wr(0xbe);/读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue=8;tvalue=tvalue|a; if(tvalue0x0fff) tflag=0; else tvalue=tvalue+1;tflag=1; tvalue=tvalue*(0。625);
24、/温度值扩大10倍,精确到1位小数return(tvalue);/*/void ds1820disp()/温度值显示uchar flagdat; disdata0=tvalue/1000+0x30;/百位数 disdata1=tvalue1000/100+0x30;/十位数 disdata2=tvalue%100/10+0x30;/个位数 disdata3=tvalue%10+0x30;/小数位 if(tflag=0) flagdat=0x20;/正温度不显示符号 else flagdat=0x2d;/负温度显示负号: if(disdata0=0x30) disdata0=0x20;/如果百位
25、为0,不显示 if(disdata1=0x30) disdata1=0x20;/如果十位为0,也不显示 wr_com(0x80+0x08); wr_dat(flagdat);/显示符号位 wr_dat(disdata0);/显示百位 wr_dat(disdata1);/显示十位 wr_dat(disdata2);/显示个位 wr_dat(0x2e);/显示小数点 wr_dat(disdata3);/显示小数位wr_dat(C);void alarm()/报警函数bee=0;delay(2000);bee=1;delay(2000);void jianceshuiwei()/水位监测函数unsi
26、gned long ad1,ad2,ad3,ad0;float num1,num2,num3,num0;ADC_int(0);ADC_int(1);ADC_int(2);ADC_int(3);ad0=ADC_GET(0);num0=ad0*4.940/1023; ad1=ADC_GET(1);num1=ad1*4.940/1023; ad2=ADC_GET(2);num2=ad24.940/1023; ad3=ADC_GET(3);num3=ad3*4.940/1023;if(num2=4.940)alarm();if(num2=4。940num3=4.940)relay1=0;relay2=
27、1;ds1=0;ds2=1;if(num14.8)alarm();if(num04.8)relay1=1;relay2=0;ds1=1;ds2=0;void ser() interrupt 4 /串行中断接收子函数 RI=0; /串行中断收到数据后,RI被置1,需要清零以便能响应下次串行中断 get_data=SBUF; /取出数据 flag=1; /置标志位=1,告诉主函数有新数据到wr_com void send( ) ES=0; /关串口中断 TI=1; printf(黄毅 107263010113n”); printf(NOW temperture is:”); printf(。1f%
28、cn”,tvalue/10。0,C); while(!TI); /等待发送完成(TI=1) TI=0; ES=1; delay1ms(2);void display_zhuangtai()if(relay1=1&relay2=1)display(keep);else if(relay2=0relay1=1) display(st2);else if(relay1=0&relay2=1) display(st1);else if(relay1=0&relay2=0)display(err);/*主程序*/void main()TMOD=0x20; /设置定时器1工作方式为:方式2、8位初始值自动
29、重装 TH1=0xfd;TL1=0xfd; /设置初始值,以设波特率为9600 TR1=1; /启动定时器1 SM0=0;SM1=1; /SCON寄存器设置串行口工作方式1:一帧10位、1起始位8数据位1停止位 EA=1; /允许总中断 ES=1; /串行中断允许 EX0=1; /外部中断0允许 REN=1; /允许串口接收 get_data=0x0f; /初始值flag=0; /标志位初始=0,表示尚无新数据到 init_play();/初始化显示 delay1ms(5); while(1)if(ds1820rst()=1)wr_com(0x80); display(str2);elseif
30、 (flag=1) /如果有新的数据传到 flag=0;/先清标志位if(get_data=0+0x30)ds1=ds1;relay1=relay1;relay2=1;ds2=1;wr_com(0xc0);display_zhuangtai();delay1ms(10000);else if(get_data=1+0x30)ds2=ds2;relay2=relay2;relay1=1;ds1=1;wr_com(0xc0);display_zhuangtai();delay1ms(10000);else if(get_data=2+0x30)send(); elsejianceshuiwei();read_temp();/读取温度 ds1820disp();/显示wr_com(0xc0);display_zhuangtai();void fangshui() interrupt 0if(k1=0)delay(50);if(k1=0) delay1ms(1000); ds2=1;ds1=ds1; relay2=1;relay1=relay1; if(k2=0)delay(50);if(k2=0&k1=1) delay1ms(1000); ds1=1;ds2=ds2; relay1=1;relay2=relay2;流程图:附图1原理图:附图229