基于51单片机的蓄水池自动控制系统.docx
《基于51单片机的蓄水池自动控制系统.docx》由会员分享,可在线阅读,更多相关《基于51单片机的蓄水池自动控制系统.docx(29页珍藏版)》请在冰豆网上搜索。
![基于51单片机的蓄水池自动控制系统.docx](https://file1.bdocx.com/fileroot1/2022-11/28/b8ab3438-5ef1-4c65-b6f0-bbddf40c141f/b8ab3438-5ef1-4c65-b6f0-bbddf40c141f1.gif)
基于51单片机的蓄水池自动控制系统
广西民族大学
第二次综合课程设计报告
论文题目:
基于51单片机的蓄水池自动控制系统
学院:
物理与电子工程学院
专业:
自动化
年级:
2007级
学号:
107263010113
学生姓名:
黄毅
指导教师:
廖义奎
设计时间:
2010年3月至2010年6月
基于51单片机的蓄水池自动控制系统
摘要:
本课程主要设计一个基于51单片机的蓄水池自动控制系统,可以测量出蓄水池的温度以及缺水满水。
可以自动控制进水和出水,进出水先用手动倒水进去和手工放水模拟,要求当水满时自动控制停止抽水。
同时,可以通过电脑控制抽水和放水,并把以把测量的数据通过RS232接口传到上位机电脑上并在电脑上显示出来。
1引言
随着人们生活用水的需要,蓄水池的需求也越来越多,特别是农村地区,而如何合理地控制电机抽水以便控制蓄水池的水量,成为了必需解决的问题。
而本课程设计的基于51单片机的蓄水池自动控制系统可以很好地为解决这一突出问题提供了方案。
此设计中主要包括以下几个任务:
一、微控芯片的选择。
二、数据现示的方式。
三、水位的ADC采样和水温的测量。
四、电脑上位机控制。
五、按键和电机开关的控制选择方式。
2系统功能分析
一个完整的51单片机的蓄水池自动控制系统应具有以下功能:
一、为使用户界面友好,则应该用显示器件显示相应的操作信息。
比如在接通电源的情况下应有相应的电源指示灯;电源插座、USB下载线接口、按键等最好分布在电路板的边缘,以方便操作。
二、为保证焊接器件和安装USB下载线时不被误操作,相应的地线应尽量加粗。
三、为更好地显示继电器工作与否,最好在继电器在工作时有指示灯的提示。
3系统硬件实现方框图
本系统以单片机为控制核心,基于51单片机的蓄水池自动控制系统结构如下图所示。
状态提示和数据现示
水温测量
主控芯片
水位测量
控制电机
上位机按制
4系统硬件的方案比较和选择
4.1微控芯片的选择。
STC12C5A32S2单片机具有32个IO口,共4个并行8位IO,P1~P3,其中P1口的第二功能为模拟数字转换输入通道,可以通过特殊功能寄存器选择P1口的具体功能。
该单片机工作电压范围从3.5V到5.5V,其内置资源十分强大,具有32K的Flash的存储空间以及29K的FlashDATA空间,还有1280字节的RAM,以及具有两个外部中断IO口(P3.2、P3.3),两个与普通51单片机兼容的16位定时计数器,它还内置了独立的波特率发生器,在串口通信时,使用独立波特率发生器,可以不占用定时计数器,该发生器类似于定时器的工作方式2,属于自动重载,只要设定初值后,就不需要再次写入计数值,应用方便。
串行通信口为RXD(P3.0)、TXD(P3.1)。
另外,该单片机为1T单片机,速度比普通51快约12倍。
4.2数据现示的方式。
1602LCD是专门用于显示字母、数字、符号的显示模块,具有功耗低、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到很广泛。
表4.2.0LCD1602管脚排列和功能表
引脚
标号
功能说明
备注
1
Vss
逻辑负电源输入引脚,0V
2
Vdd
逻辑正电源输入引脚,+5V
3
Vo
LCD驱动电源输入引脚,调节其对比度
接502粗调电阻
4
RS
数据/指令寄存器选择
5
R/W
读写选择引脚
若只需要读,则接地
6
EN
读写使能引脚
7~14
D0~D7
8位数据引脚线
15
A
背光电源输入引脚,+5V
不带背光的LCD则无此引脚
16
K
背光地
一般接入小电阻限流
显示模块使用了该单片机的P0口,由于P0口采用了漏极开路输出的方式,故作为IO口使用时,P0口必须接上拉电阻。
控制口线接到了P2口,RS接P2.5,EN接P2.7。
在应用中,可以直接将RW短接到地,使用短延时的方法跳过1602的数据处理忙信号,这样单片机就可以不读取1602的忙信号而直接对1602进行写操作。
4.3水位的ADC采样和水温的测量。
4.3.1STC单片机内置ADC的使用方法
STC系列单片机中的STC89LE516AD/X2提供了8路8位精度的高速A/D转换器,位于P1口上,从而省去了片外ADC的麻烦。
这8路ADC为电压输入型,可做按键扫描,电池电压检测,频谱检测等。
ADC转换过程需要17个机器周期。
通过对相关功能寄存器的适当配置,就可以控制其工作。
下面就对相关功能寄存器进行介绍。
A/D转换寄存器总表:
寄存器
地址
名称
7
6
5
4
3
2
1
0
初始初
P1_ADC_EN
97H
允许P1.x
成为A/D口
P17
P16
P15
P14
P13
P12
P11
P10
0000
0000
ADC_
CONTR
C5H
A/D转换
控制寄存器
-
-
-
ADC_FLAG
ADC_START
CHS2
CHS1
CHS0
xxx0
0000
ADC_DATA
C6H
A/D转换
结果寄存器
-
-
-
-
-
-
-
-
0000
0000
(1)P1_ADC_EN:
特殊功能寄存器
P1.x作为A/D转换输入通道来用允许特殊功能寄存器。
相应位为“1”时,对应的P1.x口作为A/D转换使用,内部上拉电阻自动断开。
(2)ADC_CONTR:
特殊功能寄存器
CHS2/CHS1/CHS0是模拟输入通道选择,CHS2/CHS1/CHS0的取值如下表所示:
CHS2
CHS1
CHS0
模拟输入通道选择
0
0
0
选择P1.0为A/D输入
0
0
1
选择P1.1为A/D输入
0
1
0
选择P1.2为A/D输入
0
1
1
选择P1.3为A/D输入
1
0
0
选择P1.4为A/D输入
1
0
1
选择P1.5为A/D输入
1
1
0
选择P1.6为A/D输入
1
1
1
选择P1.7为A/D输入
ADC_START是模拟/数字转换(ADC)启动控制位,设置为1时,开始转换。
ADC_FLAG是模拟/数字转换结束标志位,当A/D转换完成后,ADC_FLAG=1。
(3)ADC_DATA:
A/D转换结果特殊功能寄存器
模拟/数字转换结果计算公式为结果=256×Vin/Vcc
Vin是模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。
4.3.2水温的测量
DS18B20简介是美国美信(Maxim)公司生产的单线数字温度传感器DS1820,可把温度信号直接转换成串行数字信号供微机处理。
DS18B20的主要特性是:
适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
如图4-3-1
图4-3-1
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
如下图4-3-2
图4-3-2
4.4电脑上位机控制。
由于采用的是三星公司的专业下载线,所以只要USB与电脑相连,只要配置好电脑的波特率就可以实现上位机实时获取蓄水池的相关数据信息以便控制远程控制蓄水池。
4.5按键和电机开关的控制选择方式。
用两个按键用于手动控制电机的正反转,而电机的关断则采用继电器来控制。
5设计方案的实施:
5.1微控芯片的选择。
图5-1-1是单片机最小系统。
它必须满足如下四个条件:
1、电源的滤波及供电;2、单片机的复位——上电复位和手动复位。
3、程序下载接口。
4、晶振电路。
如图3-3中所示,两路开关并联使用,增大了开关触点能通过的最大电流,控制单片机的供电电源,另外P0口接了10K的上拉排阻,PIN9复位引脚通过一个电阻下拉到地,接入了一个电容和一个开关,分别为上电复位电容和手动复位开关。
与晶振相接的电容为33PF,起作用是帮助晶振起振。
下载口外接出了单片机的RXD以及TXD,加上了VCC和GND的引脚,方便与下载线相连
图5-1-1
5.2数据现示的方式。
如图5-2-1所示,背光K引脚接入4.7欧姆的电阻限流。
1602数据口D0~D7接到单片机P1口,RS接到P2.7,RW接到P2.5,EN接到P2.6。
图5-2-1
5.3水位的ADC采样和水温的测量。
图5-3-1
水位的AD采样测量采用的是单片机内部携带的AD采样功能。
如下图5-3-1所示,把芯片的P1口上拉,并用排针把该端口引出来;而图5-3-2则是温度传感器DS18B20的电路接线图,其数据线经上拉后与单片机的P0.3口相连。
图5-3-2
5.4、电脑上位机控制。
图5-4-1所示此下载线接口既可为单片机供电也可作为其与电脑的通讯接口。
图5-4-1
5.5按键和电机开关的控制选择方式。
图5-5-1
如右图5-5-1所示用单片机的两个中
断口P3.2和P3.3作为按键的控制输
入口。
而图5-5-2所示的继电器则使
用P0.4和P0.5作为其被控的端口。
图5-5-2
6软件设计实现方案
6.1程序的主要流程图(见于附图1)
6.2程序C语言源代码(见于附页)
7系统硬件制作与软件的调试
设计好整个系统的硬件原理图(见于附图2)并做好电路PCB之后,按如下步骤进行硬件的制作:
1、用Protel2004软件制作原理图,然后生成网络报表,接着生成PCB文件,布线要注意器件的封装和安放合理性等方面多考虑。
2、用热转印纸打印PCB印刷电路图。
3、经热转印后、放到双氧水、盐酸、水为2:
2:
1的溶液中腐蚀。
4、给电路板打孔,并擦除电路的碳化物后,立即涂上一层经天那水溶解的松香,以防止铜氧化。
5、焊接元件后就进行了硬件的调试。
接着是系统硬件的调试,首先检查电路上有否漏焊、开路和短路的现象;然后按如下步骤进行测试:
1、在没有插上芯片之前给电路板供电,观察电路板上的电源指示灯是否正常并用万用表测电路板的电压是+5V的直流电压。
2、如果电压正常,然后电路板安装上主控芯片,此时要注意芯片的电源和地管脚与电路板上的对应。
3、然后检查继电器是否工作,按键是否按下时可以短路,如果一切正常则说明系统板可以工作了,不正常则说明系统硬件有问题,重新仔细检查电路的电气性连接。
8系统测试数据:
经测试系统达到了如期的要求,正常时现示水位处于稳定的状态并相应现示水的温度。
超出最低水位时,系统报警并向蓄水池中加水,直到合适的水位,然后停止加水;水超出最高水位时系统报警并从蓄水池中放水,直到低于水位的警界线为止。
系统的两个按键可以直接的加水和放水,比如按下加水键,电机通电往蓄水池中加水,当再次按下此按键时则停止加水。
也可以通过上位机来控制系统的所有功能,如可直接控制加放水,获取水的温度。
参考文献
1、郭天翔.新概念51单片机C语言教程.北京:
电子工业出版社,2009.
2、电子技术基础:
模拟部分.第四版.北京:
高等教育出版社.1999
3、C语言程序设计.北京:
中国铁道出版社,2007
4、李全利,迟荣强.单片机原理及接口技术.北京:
高等教育出版社,2008
附页
源程序代码
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P2^0;//ds18b20与单片机接口
sbitRS=P1^4;
sbitEN=P2^7;
sbitk1=P3^5;
sbitk2=P3^6;
sbitds1=P2^5;
sbitds2=P2^4;
sbitrelay1=P2^3;
sbitrelay2=P2^2;
sbitbee=P2^1;
bitflag;
ucharget_data;
unsignedcharcodestr1[]={"Tempis:
"};
unsignedcharcodestr2[]={"18b20error"};
unsignedcharcodest1[]={"IN"};
unsignedcharcodest2[]={"OUT"};
unsignedcharcodekeep[]={"KEEPON"};
unsignedcharcodeerr[]={"error"};
uchardatadisdata[5];
ucharshuju[]={'0','1','2','3','4','5','6','7','8','9'};
uchara=0x1e,b=0x15;
uinttvalue;//温度值
uintt;
uchartflag;//温度正负标志
//---------与STC12C5A32S2单片机ADC相关的寄存器声明------------------
sfrP1ASF=0x9d;//P1口模数转换功能控制寄存器
sfrADC_CONTR=0xbc;//AD转换控制寄存器
sfrADC_RES=0xbd;//AD转换结果寄存器高
sfrADC_RESL=0xbe;//AD转换结果寄存器低
sfrAURX1=0xa2;//AD转换结果存储方式控制位
//------------------------------------------------------------------
//P1ASF寄存器:
8位,对应P1口8根口线,用于指定哪根口线用作ADC功能
//哪个口用作ADC就应置相应的位为“1”,注意:
不能位寻址
//------------------------------------------------------------------
#defineADC_POWER0x80//ADC电源开
#defineADC_SPEED0x60//设为90个时钟周期ADC一次
#defineADC_START0x08//ADC启动控制位设为开
#defineADC_FLAG0x10//ADC结束标志位
/*
ADC_CTRL寄存器:
ADC_POWERSPEED1SPEED0ADC_FLAGADC_STARCHS2CHS1CHS0
12345678
第1位:
=1打开ADC电源;=0关闭ADC电源;ADC前要一定要打开
第2-3位:
=1190个时钟周期ADC一次;=10180个时钟周期ADC一次;
=01360个时钟周期ADC一次;=00540个时钟周期ADC一次;
第4位:
ADC结束标志位,每次ADC结束时自动=1,需要用软件清零才可以进行下一次ADC
第5位:
ADC启动控制位,置“1”则ADC转换开始,转换结束后为0
第6-7-8位:
ADC通道选择000-->P1.0........111-->P1.7
*/
//---------串口发送---------
/*voidsend_char_com(unsignedcharch)
{
SBUF=ch;
while(TI==0);
TI=0;
}*/
//--------第n通道ADC初始化函数---------
voidADC_int(ucharn)
{n&=0x07;//确保n=0----7通道
AURX1|=0x04;//转换结果存储格式:
数据的高2位放ADC_RES,低8位放ADC_RESL
P1ASF=1<}
//----------第n通道ADC采样函数-------
uintADC_GET(unsignedcharn)
{unsignedintadc_data;
n&=0x07;//确保n=0----7通道
ADC_RES=0;//清零
ADC_RESL=0;//清零
ADC_CONTR=0;//清零,以便重构
ADC_CONTR|=(ADC_POWER|ADC_SPEED|n|ADC_START);//打开AD转换电源、设定转换速度、设定通道号、AD转换开始
_nop_();_nop_();_nop_();_nop_();_nop_();//延时4个时钟周期左右
while(!
(ADC_CONTR&ADC_FLAG));//等待转换结束=0x10ADC_FLAG位=1
adc_data=(ADC_RES&0x03)*256+ADC_RESL;//转换结果计算,取高位结果存储器的低2位+低位结果存储器
ADC_CONTR&=~ADC_FLAG;//清零转换结束标志位(ADC_FLAG位=0)
returnadc_data;//返回ADC的值(0----1023)
}
/*************************lcd1602程序**************************/
voiddelay1ms(unsignedintms)//延时1毫秒
{unsignedinti,j;
for(i=0;ifor(j=0;j<100;j++);
}
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwr_com(unsignedcharcom)//写指令//
{delay1ms
(1);
RS=0;
//RW=0;
EN=0;
P0=com;//
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidwr_dat(unsignedchardat)//写数据//
{delay1ms
(1);;
RS=1;
//RW=0;
EN=0;
P0=dat;//
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidlcd_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(0x0c);delay1ms(5);
}
voiddisplay(unsignedchar*p)//显示//
{
while(*p!
='\0')
{
wr_dat(*p);
p++;
delay1ms
(1);
}
}
init_play()//初始化显示
{lcd_init();
wr_com(0x80);
display(str1);
}
/**********************ds1820程序******************/
bitds1820rst(void)/*ds1820复位*/
{
bitflg;
DQ=1;//DQ复位
for(t=0;t<16;t++);//延时
DQ=0;//DQ拉低
for(t=0;t<800;t++);//精确延时大于480us
DQ=1;//拉高
for(t=0;t<80;t++);
flg=DQ;
for(t=0;t<1600;t++);
return(flg);
}
uchards1820rd()/*读数据*/
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=1;//先将数据拉高
_nop_();//等待一个机器周期
_nop_();
_nop_();
DQ=0;//启动读时序
_nop_();
_nop_();
_nop_();
DQ=1;//人为拉高
for(t=0;t<16;t++);
dat>>=1;
if(DQ==1)
dat|=0x80;
else
dat|=0x00;
for(t=0;t<16;t++);
}
return(dat);
}
voidds1820wr(ucharwdata)/*写数据*/
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();
_nop_();
_nop_();
DQ=0;
DQ=wdata&0x01;
for(t=0;t<80;t++);
DQ=1;
for(t=0;t<80;t++);
wdata>>=1;
}
for(t=0;t<30;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(tvalue<0x0fff)
tflag=0;
else