微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机的模拟智能灌溉系统

单片机的模拟智能灌溉系统

时间:11-20 来源:互联网 点击:

ar i,num;TH0=0xf5;TL0=0xe0;if(flag==1){//在设置模式P0=table[delay1[i]];}else{//P0=table[l_tmpdisplay[i]]; //查表法得到要显示数字的数码段}switch(i) { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}i++;if(i==8){i=0;num++;if(10==num) //隔段时间读取1302的数据。时间间隔可以调整{ReadRTC_Flag=1; //使用标志位判断num=0;}}}(2)I2C总线函数#include#include #include #define NOP() _nop_() /* 定义空指令 */#define _Nop() _nop_() /*定义空指令*/sbit SCL=P2^1; //I2C 时钟 sbit SDA=P2^0; //I2C 数据 bit ack; /*应答标志位*//*******************************************************************起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/void Start_I2c(){SDA=1; /*发送起始条件的数据信号*/_Nop();SCL=1;_Nop(); /*起始条件建立时间大于4.7us,延时*/_Nop();_Nop();_Nop();_Nop(); SDA=0; /*发送起始信号*/_Nop(); /* 起始条件锁定时间大于4μs*/_Nop();_Nop();_Nop();_Nop(); SCL=0; /*钳住I2C总线,准备发送或接收数据 */_Nop();_Nop();}/*******************************************************************结束总线函数 函数原型: void Stop_I2c(); 功能: 结束I2C总线,即发送I2C结束条件. ********************************************************************/void Stop_I2c(){SDA=0; /*发送结束条件的数据信号*/_Nop(); /*发送结束条件的时钟信号*/SCL=1; /*结束条件建立时间大于4μs*/_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1; /*发送I2C总线结束信号*/_Nop();_Nop();_Nop();_Nop();}/*******************************************************************字节数据发送函数 函数原型: void SendByte(UCHAR c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。********************************************************************/void SendByte(unsigned char c){unsigned char BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/{if((c0; b--){for(a=2; a>0; a--);}}/******************************************************************************** 函 数 名 : I2C_Start()* 函数功能 : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿* 输 入 : 无* 输 出 : 无* 备 注 : 起始之后I2C_SDA和I2C_SCL都为0****************************************************************************/void I2C_Start(){SDA = 1;I2C_Delay10us();SCL = 1;I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7usSDA = 0;I2C_Delay10us();//保持时间是>4usSCL = 0; I2C_Delay10us(); }/******************************************************************************* 函 数 名 : I2C_Stop()* 函数功能 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿* 输 入 : 无* 输 出 : 无* 备 注 : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲******************************************************************************/void I2C_Stop(){SDA = 0;I2C_Delay10us();SCL = 1;I2C_Delay10us();//建立时间大于4.7usSDA = 1;I2C_Delay10us(); }/******************************************************************************** 函 数 名 : I2cSendByte(uchar num)* 函数功能 : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,* * 保持发送信号I2C_SDA保持稳定* 输 入 : num ,ack* 输 出 : 0或1。发送成功返回1,发送失败返回0* 备 注 : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0******************************************************************************/unsigned char I2C_SendByte(unsigned char dat, unsigned char ack){unsigned char a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。for(a=0; a<8; a++)//要发送8位,从最高位开始{SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号dat = dat < 1;I2C_Delay10us();SCL = 1;I2C_Delay10us();//建立时间>4.7usSCL = 0;I2C_Delay10us();//时间大于4us }SDA = 1;I2C_Delay10us();SCL = 1;while(SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低{b++;if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束{SCL = 0;I2C_Delay10us();return 0;}}SCL = 0;I2C_Delay10us();return 1; }/******************************************************************************** 函 数 名 : I2cReadByte()* 函数功能 : 使用I2c读取一个字节* 输 入 : 无* 输 出 : dat* 备 注 : 接收完一个字节I2C_SCL=0*****************************************************************************/unsigned char I2C_ReadByte(){unsigned char a = 0,dat = 0;SDA = 1; //起始和发送一个字节之后I2C_SCL都是0I2C_Delay10us();for(a=0; a<8; a++)//接收8个字节{SCL = 1;I2C_Delay10us();dat <= 1;dat = SDA;I2C_Delay10us();SCL = 0;I2C_Delay10us();}return dat; }其H文件:extern bit ack;//起动总线函数extern void Start_I2c();//结束总线函数 extern void Stop_I2c();//应答子函数extern void Ack_I2c(bit a);//字节数据发送函数extern void SendByte(unsigned char c);//有子地址发送多字节数据函数 extern bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) ;//无子地址发送多字节数据函数 extern bit ISendStrExt(unsigned char sla,unsigned char *s,unsigned char no);//无子地址读字节数据函数 extern unsigned char RcvByte();extern void I2C_Start();extern void I2C_Stop();extern unsigned char I2C_SendByte(unsigned char dat, unsigned char ack);extern unsigned char I2C_ReadByte();(3)DS1302时钟函数:#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include sbit SCK=P3^6; //时钟 sbit SDA=P3^4; //数据 sbit RST = P3^5;// DS1302复位bit ReadRTC_Flag;//定义读DS1302标志unsigned char l_tmpdate[7]={0,30,8,15,5,3,8};//秒分时日月周年08-05-15 12:00:00unsigned char l_tmpdisplay[8];code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管 0-9 - 熄灭‘表/******************************************************************//* 写一个字节 *//******************************************************************/void Write_Ds1302_Byte(unsigned char temp) {unsigned char i;for (i=0;i<8;i++) //循环8次 写入数据{ SCK=0;SDA=temp&0x01; //每次传输低字节 temp>>=1; //右移一位SCK=1;}} /******************************************************************//* 写入DS1302 *//******************************************************************/void Write_Ds1302( unsigned char address,unsigned char dat ) {RST=0;_nop_();SCK=0;_nop_();RST=1; _nop_(); //启动Write_Ds1302_Byte(address); //发送地址Write_Ds1302_Byte(dat); //发送数据RST=0; //恢复}/******************************************************************//* 读出DS1302数据 *//******************************************************************/unsigned char Read_Ds1302 ( unsigned char address ){unsigned char i,temp=0x00;RST=0;_nop_();_nop_();SCK=0;_nop_();_nop_();RST=1;_nop_();_nop_();Write_Ds1302_Byte(address);for (i=0;i<8;i++) //循环8次 读取数据{ if(SDA)temp=0x80; //每次传输低字节SCK=0;temp>>=1; //右移一位_nop_();_nop_();_nop_();SCK=1;} RST=0;_nop_(); //以下为DS1302复位的稳定时间_nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return (temp); //返回}/******************************************************************//* 读时钟数据 *//******************************************************************/void Read_RTC(void) //读取 日历{unsigned char i,*p;p=read_rtc_address; //地址传递for(i=0;i<7;i++) //分7次读取 秒分时日月周年{l_tmpdate[i]=Read_Ds1302(*p);p++;}}/******************************************************************//* 设定时钟数据 *//******************************************************************/void Set_RTC(void) //设定 日历{unsigned char i,*p,tmp;for(i=0;i<7;i++){ //BCD处理tmp=l_tmpdate[i]/10;l_tmpdate[i]=l_tmpdate[i]%10;l_tmpdate[i]=l_tmpdate[i]+tmp*16;} Write_Ds1302(0x8E,0X00);p=write_rtc_address; //传地址 for(i=0;i<7;i++) //7次写入 秒分时日月周年{Write_Ds1302(*p,l_tmpdate[i]);p++; }Write_Ds1302(0x8E,0x80);}其H文件:extern void Write_Ds1302_byte(unsigned char temp); extern void Write_Ds1302( unsigned char address,unsigned char dat );extern unsigned char Read_Ds1302 ( unsigned char address );extern void Read_RTC(void);//read RTC extern void Set_RTC(void); //set RTC extern void InitTIMER0(void);//inital timer0extern bit ReadRTC_Flag;//定义读DS1302标志extern unsigned char l_tmpdisplay[8];extern unsigned char l_tmpdate[7];extern bit ReadRTC_Flag;//定义读DS1302标志

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top