家电维修网

 找回密码
 注册
家电维修网 网站首页 维修文章 查看内容

基于单片机的自动浇花系统的设计与制作

2019-4-5 10:15| 发布者: 南召修电视| 查看: 1017| 评论: 0

摘要: 生活中,人工浇灌花木要耗费大量时间,而且土壤湿度不好控制,有时候由于主人长时间外出,家里的花木会因无人浇水而枯死。为了解决上述问题,本文利用单片机,设计了自动和手动浇花系统(如图1所示)。图1 自动浇花 ...
参考程序


}

/***************************************

I2C.h

***************************************/

#ifndef _I2C_H

#define _I2C_H

 

#ifndef _I2C_C

 

#endif

 

void I2CStart(); // 产生总线起始信号

void I2CStop();       // 产生总线停止信号

bit I2CWrite(unsigned char dat); //I2C 总线写操作,待写入字节dat dat,返回值为应答状态

bit I2CWrite(unsigned char dat); //I2C 总线写操作,待写入字节dat dat,返回值为应答状态

unsigned char I2CReadACK(); //I2C 总线读操作,并发送应答信号,返回值为读到的字节

unsigned char I2CReadNAK();

#endif

/***************************************

I2C.c

***************************************/

#define _I2C_C

#include "config.h"

#include "I2C.h"

#define I2CDelay(){_nop_();_nop_();_nop_();_nop_();}

 

/********************************************

函数功能:产生总线起始信号。

入口参数:无。

********************************************/

void I2CStart()

{

I2C_SDA = 1; //首先确保SDASCL 都是高电平

I2C_SCL = 1;

I2CDelay();

I2C_SDA = 0; //先拉低SDA

I2CDelay();

I2C_SCL = 0; //再拉低SCL

}

/********************************************

函数功能:产生总线停止信号。

入口参数:无。

********************************************/

 voidI2CStop()

{

I2C_SCL = 0; //首先确保SDASCL 都是低电平

I2C_SDA = 0;

I2CDelay();

I2C_SCL = 1; //先拉高SCL

I2CDelay();

I2C_SDA = 1; //再拉高SDA

I2CDelay();

}

/********************************************

函数功能:I2C 总线写操作,返回值为应答状态。

入口参数:待写入字节dat

********************************************/

bit I2CWrite(unsigned char dat)

{

bit ack; //用于暂存应答位的值

unsigned char mask; //用于探测字节内某一位值的掩码变量

for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行

{

if ((mask&dat) == 0) //该位的值输出到SDA

I2C_SDA = 0;

else

I2C_SDA = 1;

I2CDelay();

I2C_SCL = 1; //拉高SCL

I2CDelay();

I2C_SCL = 0; //再拉低SCL,完成一个位周期

}

I2C_SDA = 1; //8 位数据发送完后,主机释放SDA,以检测从机应答

I2CDelay();

I2C_SCL = 1; //拉高SCL

ack = I2C_SDA; //读取此时的SDA 值,即为从机的应答值

I2CDelay();

I2C_SCL = 0; //再拉低SCL 完成应答位,并保持住总线

return (~ack); //应答值取反以符合通常的逻辑:0=不存在或忙或写入失败,1=存在且空闲或写入成功

}

/********************************************

函数功能:I2C 总线读操作,并发送非应答信号,

                     返回值为读到的字节。

入口参数:无。

********************************************/

unsigned char I2CReadNAK()

{

unsigned char mask;

unsigned char dat;

I2C_SDA = 1; //首先确保主机释放SDA

for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行

{

I2CDelay();

I2C_SCL = 1; //拉高SCL

if(I2C_SDA == 0) //读取SDA 的值

dat &= ~mask; //0 时,dat 中对应位清零

else

dat |= mask; //1 时,dat 中对应位置1

I2CDelay();

I2C_SCL = 0; //再拉低SCL,以使从机发送出下一位

}

I2C_SDA = 1; //8 位数据发送完后,拉高SDA,发送非应答信号

I2CDelay();

I2C_SCL = 1; //拉高SCL

I2CDelay();

I2C_SCL = 0; //再拉低SCL 完成非应答位,并保持住总线

return dat;

}

/********************************************

函数功能:I2C 总线读操作,并发送应答信号,

                  返回值为读到的字节。

入口参数:无。

********************************************/

unsigned char I2CReadACK()

{

unsigned char mask;

unsigned char dat;

I2C_SDA = 1; //首先确保主机释放SDA

for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行

{


最新评论

  • 消毒柜惊魂夜:一个被忽视的家居安全隐患
  • 写一篇关于饮水机故障维修的文章
  • 家电坏了哪里找人维修
  • 卫星机顶盒有信号收不到台什么原因
  • 用户问的是微信收款提示音延迟的原因
  • 燃气热水器一直闪不加热,这是什么造成的?
  • 万家乐热水器不出热水是什么原因?万家乐电
  • 电热水器有哪些常见故障?电热水器故障维修
  • 热水器怎么安装?热水器详细安装教程分享
  • 电热水器通电不加热是什么原因?电热水器故

QQ|门户地图|网站地图|家电维修|手机版|家电维修技术论坛 ( 蜀ICP备14030498号-16 川公网安备51102502000162号 )

GMT+8, 2025-5-1 09:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部