大学学士学位论文
实物如图 3-4:
图 3-4 AT89S52 微控制芯片 3.3.3短息模块
短信模块在本系统中只是做为一个信息的传输工具,现在对于它所使用的硬件设施已经很成熟了,本课题我们使用的硬件模块是华为的GTM900-B,对于此硬件就不做过多介绍了,把线路连接上之后拿来使用就可以了。
实物如图 3-5:
图 3-5 GTM900-B模块
- 11 -
第四章 水塔供水远程自动控制系统设计分析
第四章 水塔供水远程自动控制系统设计分析
本次设计使用C语言实现该系统,其功能代码及硬件电路分别介绍如下。 4.1 主板电路图
本课题的硬件电路如下,功能主要分为三个模块,分别是水位检测模块、自动控制模块、以及SMS短消息模块,另外还有个外接电路的继电器。如图 4-1:
(a) (b)
图 4-1 水塔供水远程自动控制系统的电路图
4.2 系统仿真与设计
在protues仿真软件界面上,界面设计的电路如下。如图 4-2:
图 4-2 仿真电路图
- 12 -
大学学士学位论文
以上电路包括了水位检测,和短息模块等。
4.3 水塔供水远程自动控制程序设计 4.3.1水塔控制模块的设计
我们使用的AT89C52芯片,首先要做的就是定义管脚, sbit JQ = P2^0 ; sbit k1=P3^7;
bit biaozhi; //标志 uint getdate; uchar shuiwei;
sbit led1=P1^5; //工作指示 sbit led2=P1^4; //短信指示 sbit shuiwei_1=P1^2; //低水位输入 sbit shuiwei_2=P1^3; //高水位输入 sbit led3=P1^0; sbit led4=P1^1; sbit IGT=P2^1; bit biaozhi2; uint kk;
定义完管脚之后就需要定义通信指令,就好比我说“上水”单片机就会听懂一样,所以我们要给它定义一个标准。就是编译好的像口令一样的东西。我们与单片机对一下口令,他就知道你的意思了。弄完这些以后我们还要给它一个账号,在我们这个系统中也就是手机号,另外再给他一个接收账号,也就是他所发送的手机号,这样单片机就可以执行我们想要的操作了。
uchar code zifu1[]=\定义一个口令 uchar code zifu2[]=%uchar flag_biaozhi[]=\ 接收SC
uchar idata rbuff[128];
//串口接收数据缓存区
uchar numbuff[]=\ //此处修改为需要接收短信的
手机号码,注意要定义为字符串(\\0)
- 13 -
//继电器脚
//水位指示LED //水位指示LED
//接收标志位。01接收BD 23
第四章 水塔供水远程自动控制系统设计分析
uchar rcount; bit bit
//串口接收数据指针 //TC35注册
//收到模块“ok”标志
tc35_init_ok; receive_ok;
成功初始化完成标志 bit new_sms; bit Ring; bit
接下来的是程序的核心,那就是判语语句,一般程序功能的实现都会依赖判断语句的实现,要对水位检测到的电信号进行判断,并且要给短息模块一个反馈信息,而且当短信模块接收到手机发过来的信息时,这时也要对这个“口令”进行判断,不能说凡是单片机收到的信息都会作为下一步的指令,如果经过验证之后,是我们原定的指令,单片机就会执行相应的程序,相反要不是我们原定的指令,单片机则不予理睬。 (1) 短信接收判断语句:
void RECEIVE_DATA(void) interrupt 4 存
{
ES=0; if(RI) {
rbuff[rcount++]=SBUF; RI=0; }
//判断是否接收完毕
if((rbuff[rcount-1]==0x0a)&&(rbuff[rcount-2]==0x0d)&&(rbuff[rcount-3]=='K')&&
(rbuff[rcount-4]=='O'))
{ //换行
//回车 receive_ok=1; }
//判断是否为新短消息指示
//接收tC35发送的数据并缓
//收到新信息标志 //来电标志
//读到来电号码标志
clcc;
- 14 -
大学学士学位论文
if((rbuff[rcount-14]=='C')&&(rbuff[rcount-13]=='M')&&(rbuff[rcount-12]=='T')&&
(rbuff[rcount-11]=='I')&&(rbuff[rcount-1]==0x0A))
{ //换行 new_sms=1; }
else new_sms=0;
if((rbuff[rcount-6]=='R')&&(rbuff[rcount-5]=='I')&&(rbuff[rcount-4]=='N')&&(rbuff
[rcount-3]=='G'))//来电提醒
{ //换行
//回车 Ring=1; rcount=0; } else Ring=0;
if(rcount>128)rcount=0; ES=1; }
(2)判断水位高低判断语句: while(1) {
led3=shuiwei_1; led4=shuiwei_2;
if((shuiwei_1==1)&&(shuiwei_2==1)) //判断水位在哪个位置 {
shuiwei=0; }
if((shuiwei_1==0)&&(shuiwei_2==1)) {
shuiwei=1; }
if((shuiwei_1==0)&&(shuiwei_2==0)) {
- 15 -