电气控制优秀实践成果申报书 本文关键词:申报,成果,实践,优秀,电气控制
电气控制优秀实践成果申报书 本文简介:表8牡丹江师范学院社会实践学期优秀实践成果申报书选题方向:电气控制指导教师:白龙单位:工学院联系电话:15845304801牡丹江师范学院教务处一、项目组基本情况教师情况姓名白龙专业电气工程及其自动化职称讲师学历硕士研究生联系电话15845304801电子邮箱[email protected]学生成
电气控制优秀实践成果申报书 本文内容:
表8
牡丹江师范学院社会实践学期
优秀实践成果申报书
选题方向:
电气控制
指导教师:
白
龙
单
位:
工学院
联系电话:
15845304801
牡丹江师范学院教务处
一、项目组基本情况
教师情况
姓
名
白龙
专
业
电气工程及其自动化
职
称
讲师
学
历
硕士研究生
联系电话
15845304801
电子邮箱
[email protected]
学生成员情况
序号
姓
名
专业
年级
序号
姓名
专业
年级
1
肖川
10工业电气
10级
9
冉泽亮
10工业电气
10级
2
吴柳俊
10工业电气
10级
10
杜艳伟
10工业电气
10级
3
胡超
10工业电气
10级
11
沈柱添
10工业电气
10级
4
刘爱阳
10工业电气
10级
12
梁浩
10工业电气
10级
5
田万里
10工业电气
10级
13
王颖
10工业电气
10级
6
李航
10工业电气
10级
14
王敏
10工业电气
10级
7
董强
10工业电气
10级
15
吴勇锋
10工业电气
10级
8
高鹤铭
10工业电气
10级
16
陈志成
10工业电气
10级
注:序号第1位的学生为该项目组学生负责人。
二、实践内容
实践的目的和意义:
目的:作一个以单片机为控制核心,以超声波做水位测量的一个自动上水控制系统,以解决农村上水系统的控制问题。
意义:进一步掌握单片机运用技能,巩固学习数电模电知识,提高动手操作能力为以后工作设计打下一定实践基础。
实践方法及创新之处:
实践方法:本设计主要是完成硬件电路设计,以及软件编程工作,并完成整个控制系统的模拟调试。使系统按设计类容正确运行,完成水位检查与自动控制上水过程。
创新之处:水位控制在日常生活中应用也相当广泛,比如水塔、地下水、水电站等情况下的水位控制。而水位检测可以有多种实现方法,如机械控制、逻辑电路控制、机电控制等。本设计主要基于单片机的水塔自动上水系统的控制,其主要包括了系统电路的设计,控制电路的设计。而目前,国内外用于水塔自动上水控制装置主要有浮球升降式,程开关式,弹簧管开关磁浮式,水压仪表电接点式,电极传导式等。本设计是基于超声波测距的水深测量,并且通过单片机对水塔的水位进行智能的实时的控制。其中主要包括以下几大主要部分。微机控制供水部分,电驱动部分液晶显示部分。
本文主要对单片机的水塔自动上水控制系统进行了硬件的电路设计和软件的设计本设计也可以当作水位报警电路,用在与防患自然灾害水灾,本设计制造成本低,容易使用。安装该电路,水泵就会在水塔没水的时候自动给水塔灌水,当灌满之后又会自动切断水泵电源停止灌水,取代了人类的复杂劳动。
三、实践成果
1.实践过程:
在小组成员讨论后对整个系统一些功能进行了选定,于2013
年1月3日正式开始了设计的工作。
(1).首先是对真个程序的大概流程在草纸上进行设计。具体工作便是将各功能模块需要设计的函数以空函数形式嵌在在程序流程中,并将各功能模块资料发给小组成员,并分配程序编写任务,在后续更具电路完成后再整体完成程序编写。
(2).电路设计。本设计调试电路使用一块锐志学习板已有电路,只是在次电路板基础上,自画了protel原理图,并设计了一块印刷电路板PCB图,可做为成品电路板。由于成本原因,未做成品。仅以学习板做了模拟演示。
(3).整体程序的完成和部分电路的焊接。这段时间是在一家电子设备维修部完成,在这里能够获焊接得所需工具,并且可以学习一些基本硬件知识。
(4).对真个系统的调试,当然刚开始时并没有成功,于是对程序反复的修改和硬件的检查,发现超声测距模块极不稳定。各种软件滤波后能正确测量距离,但是实时性变得极差。于是重购一款差距模块后问题解决。在经过一系列优化调试后是效果趋于最佳。
2.实践成果:
设计于2013年1月20日基本功能与附加功能便全面完成,并测试运行成功。下面列出功能项。
基本功能:
超声测水位并控制继电器自动上水。
附加功能:
(1).显示水位高度百分比。
(2).环境温度测量显示(为测距提供温度补偿)。
(3).时钟显示(提供夜间省电时间参照)。
(4).显示器背光定时关闭。
(5).提供按键操作设定各种参数。
(6).使用E2PROM对设定参数断电保护。
本次设计完成制作过程中学习了很多知识,其中学习了很多的焊接知识,以前终觉得焊接就是简单的将元件焊在电路板上,在观看专业人士焊接过程后,发现其中有很多技巧。比如阻焊剂和助焊剂的使用,焊接点的好坏分辨,还用热缩管的使用等等。这些都是在学校理论学习中无法学到的经验。
在设计过程送也遇见了很多困难问题,比如第一次程序完成编译后,下载到单片机运行时毫无反应。进过一步步修改后一些功能实现,但还有一些功能没有实现,多次修改程序也不能实现。例如在超声测距功能上,始终不能得到稳定的测量数据。于是查了很多资料并做了各种软件滤波,最终得出了较为正确的数据,但由此导致了测量时间的加长,灵敏度极度下降。于是有对超声测距模块,做了一些改变测试。结果是模块抗干扰太差,重买了一块超声测距模块后调试成功。当然在整个过程中还有很多问题,在一个个问题解决的同时,查阅了很多相关资料,丰富了自己的知识储存。
总的来说,本次设计实践活动无论对现在的学习还是以后的工作都有极大的帮助作用。最后,感谢学校提供了这次实践活动机会,感谢白龙老师的精心指导。
4.其他佐证材料目录:
佐证材料均见
附录一:系统原理图
附录二:PCB图
附录三:材料清单
附录四:系统源程序
附录五:系统实物图及设计过程照片
附录六:系统运行录像(刻录光盘)
(不足部分可附页)
附录一原理图
附录二
PCB图
附录三
数量
参数
元件编号
封装
2
1K
R1R10
RES-200
3
4.7K
R2
R3
R4
RES-200
1
10
R25
RES-200
6
10K
R5
R6
R7
R8
R9
R20
RES-200
1
10UF/16V
EC2
EC-100
1
10k
PR1
SIP9
1
12MHZ
X1
XTAL-200
1
24C08
U4
DIP8
4
30PF
C1
C2
C3
C4
CAP-100
1
32.768MHZ
X2
XTAL-200
1
100UF/16V
EC1
EC-100
6
104
C6
C7
C8
C9
C10
C11
CAP-100
1
CAOSHENG
J1
SIP4
2
CAP
C5
C12
CAP-100
1
CON2
S2
BT2
1
CON6
S1
USB
1
CON11
S3
DB9
1
DS18B20
U1
TO-92EBC
1
DS1302
U3
DIP8
2
IN4007
D1
D2
DIODE-300
1
K-6
SW1
SW-6
5
KEY-4
KEY1
KEY2
KEY3
KEY4
KEY6
KEY-4
1
LCD1602
J2
SIP16
1
LED
LED1
LED-100
1
MAX232
U5
DIP16
1
NPN
Q2
TO-92EBC
1
PNP
Q1
TO-92EBC
1
RELAY-SPDT-5
KEY5
JDQ5
1
STC89S52
U2
DIP40
附录四
#include
#include
#define
uint
unsigned
int
#define
uchar
unsigned
char
uint
TT0=0,Tt1=6000,distance[6];
bit
Nightmode=0,succeed_flag=0,Nightfuzhu=0;
uchar
timeH,timeL,key=0,TD=0,TN=0;
//自定义寄存器
sbit
Jdq=
P3^7;
sbit
Tx
=
P3^1;
//产生脉冲引脚
sbit
Rx
=
P3^2;
//回波引脚
/****************************显示字符串定义******************************/
char
code
Welc_1[]=“welcome
to
use“;//启动第一排显示字符串
char
code
Welc_2[]=“x
water
raising“;//
启动第二排显示字符串
char
code
Use_auto[]=“use
automesure
?“;//字符串显示
char
code
YN[]=“Y/N
?
“;
char
code
B_deep[]=“Barrel
Deep“;
char
code
Chang_T[]=“cheange
time“;
char
code
Water[]=“W:“;
char
code
Usse_night[]=“use
Night
mode
?“;
char
code
Time[]=“TIME:“;
char
code
Set_t[]=“*set
time
“;
char
code
Set_m[]=“*Nightmode“;
char
code
On[]=“(on)
“;
char
code
Off[]=“(off)
“;
char
code
Rais_water[]=“*raising
water
“;
char
code
Temper[]=“T:“;
//温度
unsigned
char
Temper_c[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//
自定义字符℃
/*************************LCD1602专区************************/
sbit
Bg
=
P1^3;
//背光控制位
sbit
RS=P2^0;
//寄存器选择位,将RS位定义为P2.0引脚
sbit
RW=P2^1;
//读写选择位,将RW位定义为P2.1引脚
sbit
E0=P2^2;
//使能信号位,将E位定义为P2.2引脚
sbit
BF=P0^7;
void
INIT_1602();
bit
busyTest();//测忙
。。。
void
writeData(uchar);//写数据
。。
void
write_com(uchar
);
//写指令。。
void
addrset(uchar,uchar);
//坐标设置。。
void
Print(uchar
p[]);
//输出流
void
display_2(uchar);
//
显示两位整数
void
display_time_temper();//
工作状态时间、温度显示
void
display_d(uchar);
//
设置时桶深显示
void
clear_p();
//
清屏
void
biao_on();
//
关光标
void
biao_off();
//
开光标
void
splash_p();
void
move_pr();
void
move_pl();
/**********************************DS1302专区*****************************/
void
INIT_1302();//
sbit
SCLK=P1^0;
//位定义1302芯片的接口,时钟输出端口定义在P1.0引脚
sbit
DATA=P1^1;
//位定义1302芯片的接口,数据输出端定义在P1.1引脚
sbit
RST=P1^2;
//位定义1302芯片的接口,复位端口定义在P1.2引脚
unsigned
char
ReadSet1302(unsigned
char
Cmd);//
根据命令字,从1302读取一个字节数据
unsigned
char
Read1302(void);//
从1302读一个字节数据
void
WriteSet1302(unsigned
char
Cmd,unsigned
char
dat);//向1302写一个字节数据
void
Write1302(unsigned
char
dat);//向1302写一个字节数据
void
delaynus(unsigned
char
n);//
延时若干微秒
void
set_time();//设置时间
/**********************************AT24c08专区*************************/
sbit
SCL=P3^4;
//将串行时钟总线SCL位定义在为P3.4引脚
sbit
SDA=P3^5;
//将串行数据总线SDA位定义在为P3.5引脚
#defineOP_READ0xa1//
器件地址以及读取操作,0xa1即为1010
0001B
#defineOP_WRITE
0xa0//
器件地址以及写入操作,0xa1即为1010
0000B
void
start();
void
stop();
void
Ask();
unsigned
char
ReadData24c08();
void
WriteCurrent24c08(unsigned
char
y);
void
WriteSet(unsigned
char
add,unsigned
char
dat);
unsigned
char
ReadCurrent();
unsigned
char
ReadSet(unsigned
char
set_addr);
void
INIT_24c08();//初始化24c08
void
push24c08_d(uchar);
//桶深数据写入24c08
uchar
pop24c08_d();
//读出24c08桶深数据
void
push24c08_N(bit);
//模式数据写入24c08
uchar
pop24c08_N();
//读出24c08模式数据
/*************************18b20专区**********************************/
sbit
DQ=P3^3;
void
ReadyReadTemp();
void
WriteOneChar(unsigned
char
dat);
unsigned
char
ReadOneChar();
bit
Init_DS18B20();
/*************************************************************************/
void
getkey();
//
扫描键盘
uint
test_deep();//
超声测桶深
void
set_deep(uchar
temp);//
手动设置桶深
void
menu_mode();
//菜单模式
void
delay_30us();
//延时120微秒
void
delay_ms(uint);//
延时若干毫秒
void
INIT_test();
/********************************主函数*****************************/
void
main()
{
uchar
deep=0,temp=0,j=0,i=0;
uint
temp_test;
INIT_1602();
INIT_24c08();
INIT_1302();
INIT_test();
addrset(16,0);
Print(Welc_1);//
addrset(16,1);
Print(Welc_2);//
move_pl();
splash_p();
//闪屏调用
delay_ms(1500);
move_pr();
while(1)
{
addrset(16,0);
Print(Use_auto);
addrset(16,1);
Print(YN);
move_pl();
TT0=0;
key=0;
while(key==0)//等待选择按键
{
getkey();
if(TT0==4000)//一分钟无操作默认按下按键一
key=1;
}
move_pr();
if(key==2)
//如按果按下按键二自动测量桶深
{
key=0;
//clear_p();
move_pl();
addrset(0,0);
Print(B_deep);
move_pr();
while((temp/2)!=((uchar)test_deep()/2))
//连续两次测量相等表示测量准确
temp=(uchar)test_deep()+2;
display_d(temp);//显示测得桶深
TT0=0;
while((key!=1)
if(TT0==6000)//一分钟后默认按一键
key=1;
}
if(key==1)
push24c08_d(temp);
}
if(key==3)
//如果按下按键三则手动设置桶深
{
key=0;
//clear_p();
move_pl();
addrset(0,0);
Print(B_deep);
move_pr();
temp=pop24c08_d();
//从E2PROM中取出上次存入的桶深
display_d(temp);
set_deep(temp);//设置桶深函数调用。。
}//
if(key==4)//如按下按键四键值清零视为无操作
{
key=0;
clear_p();
}
if(key==1)
//当按下按键一则进入工状态。。
{
key=0;
deep=pop24c08_d();
//从E2PROM中取出上次存入的桶深给deep以作比较
delay_ms(5);
Nightmode=(bit)pop24c08_N();
clear_p();
addrset(0,0);
Print(Time);
//在0,0处显示
Time
addrset(0,1);
Print(Water);
//在0,1处显示。。。
addrset(5,1);
writeData(
%
);
//在5,1处显示。。。
addrset(8,1);
Print(Temper);
//在8,1处显示。。。
addrset(3,1);
//在3,1处显示百分比整数值
temp_test=test_deep();
temp=100-temp_test*100/deep;
display_2(temp);
while(1)
{
display_time_temper();
getkey();
if(key==1)
{
key=0;
menu_mode();
addrset(3,1);
//在3,1处显示百分比整数值
temp_test=test_deep();
temp=100-temp_test*100/deep;
display_2(temp);
}
temp_test=test_deep();
temp_test=100-temp_test*100/deep;
//得出现在水深与桶深百分比
if(temp==temp_test)
i=0;
if(temp!=temp_test)
i++;
if(i==2)
{
i=0;
temp=temp_test;
addrset(3,1);
//在3,1处显示百分比整数值
display_2(temp);
}
getkey();
if(temp90)
{
Jdq=1;
Jdq=1;
if(Nightfuzhu==1)
{Nightmode=1;
Nightfuzhu=0;}
}
}
}
}
}
/********************
延时毫秒函数*************************/
void
delay_ms(uint
t)
{
uint
i,j;
for(i=0;i>4)*10
+
(ReadValue
//将读出数据转化
hour=ReadValue;
display_2(ReadValue);
writeData(
:
);
ReadValue
=
ReadSet1302(0x83);
//从分寄存器读
ReadValue
=((ReadValue
//将读出数据转化
display_2(ReadValue);
getkey();
/**********************温度显示**************************/
addrset(10,1);
ReadyReadTemp();
//读温度准备
getkey();
TL=ReadOneChar();
//先读的是温度值低位
TH=ReadOneChar();
//接着读的是温度值高位
getkey();
if((TH
TL=~TL;
//取反
TH=~TH;
//取反
TL=TL+1;
//低位加1
if(TL>255)
TH++;
//如果低8位大于255,向高8位进1
TN=TH*16+TL/16;
//实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
//这样得出的是温度的整数部分,小数部分被丢弃了
TD=(TL%16)*10/16;
//计算温度的小数部分,将余数乘以10再除以16取整,
}
//这样得到的是温度小数部分的第一位数字(保留1位小数)
else
{
writeData(
);
TN=TH*16+TL/16;
//实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
//这样得出的是温度的整数部分,小数部分被丢弃了
TD=(TL%16)*10/16;
//计算温度的小数部分,将余数乘以10再除以16取整,
//这样得到的是温度小数部分的第一位数字(保留1位小数)
}
temp_T=TN;
display_2(TN);
writeData(
.
);
TD=TD+
0
;
writeData(TD);
delay_ms(1);
writeData(0);
//显示字符℃
}while((key!=1)
//将dat的各数据位右移1位,准备写入下一个数据位
}
}
/*************函数功能:根据命令字,向1302写一个字节数据************************/
void
WriteSet1302(unsigned
char
Cmd,unsigned