基于51单片机的智能热水器控制系统 联系客服

发布时间 : 星期三 文章基于51单片机的智能热水器控制系统更新完毕开始阅读

void write_com(uchar com) { }

rw=0; delay1(5); rs=0; delay1(5); e=1; delay1(5); P0=com; delay1(5); e=0; delay1(5);

//写指令函数

其中delay1为编写的延时函数,如下所示: void delay1(uint z) { }

3.2.2 写数据子函数

对命令进行写入之后,紧接着就要进行所要显示的字符数据的输入,通过写数据子函数来完成。

void write_dat(uchar dat) {

rs=1;//选择写数据 rw=0; P0=dat; e=1;

delay(5);//无延时不能正常工作 e=0; }

根据以上两个基本函数,来编写1602的初始化函数、显示字符串函数、显示两位十进制数字函数,完成在时间设定、温度设定的过程中进行的各种显示,如以下为时间显示部分的程序代码。

void Time_Display(void) {

uint x,y; for(x=z;x>0;x--)

for(y=10;y>0;y--);

//延时函数

}

read_rtc();

Date_dispaly(0x80+0x40+12,time_data[6]); //显示秒 Date_dispaly(0x80+0x40+9,time_data[5]); //显示分 Date_dispaly(0x80+0x40+6,time_data[4]); //显示时 Date_dispaly(0x80+14,time_data[3]); Date_dispaly(0x80+11,time_data[2]);

//显示日 //显示月

Week_dispaly(0x80+0x40+15,time_data[1]); //显示周 Date_dispaly(0x80+8,time_data[0]);

//显示年 //

Year/10*16+Year

Hour=time_data[4]/16*10+time_data[4];; Minute=time_data[5]/16*10+time_data[5];; Second=time_data[6]/16*10+time_data[6];;

除此之外,还要编写在进行时间设定过程中和在温度设定过程中要显示的内容,结合用户的输入,设置合适的光标显示处理。

3.3 温度传感器模块程序设计

温度传感器的端口定义在P2.1端口。 sbit DQ = P2^1;

在温度传感器的基础函数设计里边,主要是进行温度获取和处理,读取温度的函数包括读整数部分和读小数部分,通过对DS18B20的数据格式进行解析,编写合适的读取温度子函数。

主要基础函数设计包括模块初始化函数、单线串行传输协议延时函数、总线协议配置、字节数据发送、字节数据接收等多个部分。在主程序中对这些函数进行调用,配合LCD显示函数,来完成对温度显示、判断等多种功能。

3.4 时钟芯片相关程序设计

时钟芯片的数据传输定义在单片机的P3.5、P3.6和P3.7这三个端口。 sbit sck=P3^5; sbit io=P3^6;

//时钟端口 //时钟端口 //时钟端口

sbit rst=P3^7;

在DS1302相关的程序设计中,主要就是对芯片的写入数据和读取数据的函数进行编写,然后再编写相应的日期设定函数。使用write_ds1302_byt函数进行数据准备工作,使用write_ds1302函数对数据进行写入,使用read_ds1302函数对时间数据进行读出,使用set_rtc函数对时间进行设置。

3.5 按键设置程序设计

按键设置程序主要是按键扫描策略,因为按键扫描和定义逻辑比较复杂,不仅要识别按下按键的次数、哪个按键,还要配合LCD显示函数,对不同的键值和状态进行显示,并通过控制LCD1602的光标位置与开闭,提示用户进行设置。按键扫描和设置程序单独做成一个子函数,在主程序中循环调用。

在进行按键编程操作中,因为使用的是机械按键,会存在抖动的现象,造成检测不准确或按下次数误判,一般采用软件去抖的方式,即通过延时的方式,保证单片机读取到的键值的准确性。

按键定义为4个,分别是设置键、确认键、键值增加和键值减小。使用变量SELT表示设置键状态,同时设定一个全局变量Select_num记录设置键被按下的次数,不同的次数就对应着不同的设置功能,根据按键功能设定,设置键按下的次数为1时,光标指向设置时间功能,同时标记进入调节模式;当按下次数为2时,光标指向设置定时功能;当按下次数为3时,光标指向设置温度功能;当按下次数为4时,取消标记调节模式,并回到正常模式。

使用变量ENTER表示确认键的状态,同时使用Enter_num记录该键被按下的次数。对于Enter_num的每一个取值,都要首先检查变量Select_num的值,来判断处于哪有功能设定的模式下,进而显示不同的内容,并控制光标的移动。并根据不同功能模式下按下确认键的次数,判断系统当前要修改的数据是哪一个,该不该结束调试,返回正常状态。

通过设置键和确认键按下次数的排列组合,构建了系统在调试模式下的每一个具体的调试状态,也就是说Select_num和Enter_num值的组合就确定了当前调整的数据。

对于键值增加和键值减小的按键,当这两个按键按下时,使用if条件判断Select_num和Enter_num值的组合情况,执行相应的数据增加1或者是数据减小1的操作。由于键盘检测循环进行,连续按增加或减小按键可以起到连续调节的效果。同时,注意每一个数据的范围,防止设置超出范围。

3.6 主程序和中断服务程序设计

主程序中主要包含各个功能函数的调用。在程序运行开始,对各个模块、端口和定时器初始化操作,然后进入循环结构。循环结构中通过标志位判断系统处

于调节模式还是正常模式,并不断执行键盘扫描函数。正常模式下执行温度显示和时间显示,调用报警模块的子函数,进行温度、水位状态的检测和判断。在程序中设置了相应的判断标志位,通过这些变量值的判断来确定是否达到报警条件。水温低于设定温度则开启加热指示灯,高于设定温度则报警,如果缺水的话,也进行报警。

中断服务程序主要使用了定时器中断,使用定时器T0定时50ms,并在其中断服务程序中进行计数,为系统的正常模式下的显示数据更新提供时间基准。

3.7 本章小结

本章主要对系统的软件系统和算法进行了设计,对各个模块的基础函数进行了编写,保证模块的正常工作和数据传输。尤其对按键扫描模块进行了详细的逻辑分析和操作设计,保证按键操作的准确性。

4 测试、总结与评价

4.1 软件平台仿真测试

本系统使用了Proteus软件进行仿真和测试,该平台能够完全模拟单片机的实际电路连接原理和程序设置,同时需要完整的程序代码才能最终完成仿真测试,看到系统的运行效果。该仿真平台能够及早发现硬件电路连接和程序的问题,如下图4.1和4.2为仿真截图。

图4.1 仿真平台搭建和正常模式