找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1965|回复: 1
打印 上一主题 下一主题
收起左侧

智能宠物投喂器的单片机程序源代码

[复制链接]
跳转到指定楼层
楼主
ID:909469 发表于 2021-4-21 09:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
sbit DS1302CE=P0^0;
sbit DS1302CK=P0^2;
sbit DS1302IO=P0^1;

extern bit DS18B20_Reset(void);
extern void DS18B20_Write(unsigned char command);
extern unsigned char DS18B20_Read(void);
sbit DQ=P1^0;


#define RSCLR P0_5=0//PORTC &=~ BIT(PORTC0)
#define RSSET P0_5=1//PORTC |=  BIT(PORTC0)
#define RWCLR P0_6=0//PORTC &=~ BIT(PORTC1)
#define RWSET P0_6=1//PORTC |=  BIT(PORTC1)
#define ENCLR P0_7=0//PORTC &=~ BIT(PORTC2)
#define ENSET P0_7=1//PORTC |=  BIT(PORTC2)        
extern void lcd_delay(unsigned int delaytime);
extern void write_lcd_command(unsigned char write_command);
extern void write_lcd_data(unsigned char write_data);
extern void initize_lcd(void);
extern void lcd_displaystr(unsigned char x,unsigned char y,const unsigned char *str);
extern void lcd_displaystr_ram(unsigned char x,unsigned char y,unsigned char *str);

带温度测量LCD显示的实时时钟

extern void Init_DS1302_RTC(void);
extern unsigned char Read_DS1302_RTC(unsigned char RTC_Address);
extern void Write_DS1302_RTC(unsigned char RTC_Address,unsigned char RTC_Data);
#include <REGX51.H>
#include "1602LCDDriver.h"
#include "DS18B20Driver.h"
#include "DS1302Driver.h"

//#include "tiaozheng.h"
#include <INTRINS.H>


struct TimerStruct
{
  unsigned char Year;
  unsigned char Month;
  unsigned char Day;
  unsigned char Week;
  unsigned char Hour;
  unsigned char Minute;
  unsigned char Second;
};
//const unsigned char DATECODE1[]={"Tiaosh"};
//const unsigned char DATECODE[]={"Date:"};
//const unsigned char TIMECODE[]={"Time:"};

const unsigned char DATECODE1[]={"TH"};
const unsigned char DATECODE2[]={"DF"};
const unsigned char DATECODE3[]={"DJ"};
//const unsigned char DATECODE4[]={' '};

sbit key1=P1^2;
sbit key2=P1^3;
sbit key3=P1^4;
sbit sound=P1^1;
sbit k1=P0^3;
sbit k2=P0^4;
unsigned char mins,hours,days,months,weeks,years;
unsigned  char a,b,c,k,flag1,flag2,flag3,flag4,flag5;
unsigned  char Minute1,Hour1,Day1,Month1,Week1,Year1;
unsigned  char Minute2,Hour2,Day2,Month2,Week2,Year2;
unsigned char DATECODE22[1]={' '};
unsigned char DATECODE33[1]={' '};

//struct TimerStruct *Real;
struct TimerStruct RealClock;
unsigned char DateBuffer1[]={"2006/08/18/5"};
unsigned char TimeBuffer1[]= {"23:50:00"};
//const unsigned char DATECODE[]={"Date:"};
//const unsigned char TIMECODE[]={"Time:"};



unsigned char DateBuffer[]={"2005/01/01/5"};
unsigned char TimeBuffer[]= {"00:00:00"};
unsigned char LCDDisplayBuffer[]={"       "};
unsigned int SecondCounter;

//蜂鸣器测试

void fmq_fre(unsigned char f)
{
unsigned int i,j;
  for(i=f;i>0;i--)
  for(j=248;j>0;j--);           //延时0.5MS
}
void fmq_delay(unsigned char delaytimef)
{
  unsigned char j,h;
  for(j=delaytimef;j>0;j--)
  //for(k=200;k>0;k--)
  for(h=248;h>0;h--)
   {
   sound=1;
   fmq_fre(1);
   sound=0;
   fmq_fre(1);
   }

}


//jdq的测试
void jdq_delay(unsigned char delaytimej)
{
unsigned char k,i,j;
for (k=delaytimej;k>0;k--)
for(i=200;i>0;i--)
for(j=248;j>0;j--);
}

void jdq(void)
{

  k1=0;
  k2=0;
}   


//时间调整

void tiao_delay(void)
{
unsigned char i,j;
  for(i=10;i>0;i--)
  for(j=248;j>0;j--);
}
unsigned char change( void )
{
  while(flag1)
{
  if(key2==0) tiao_delay();
  if(key2==0) a++;
  if(key3==0) tiao_delay();
  if(key3==0) a--;
  switch(k)
    {
     case 1:
          mins=a%60;
          break;
         case 2:
          hours=a%24;
          break;
         case 3:
          days=a%32;
         break;
         case 4:
          weeks=a%8;
          break;
         case 5:
          months=a%13;
          break;
         case 6:
          years=a;
          break;
        }
    TimeBuffer1[4]=mins%10+0x30; //分个位
    TimeBuffer1[3]=mins/10+0x30;
    TimeBuffer1[1]=hours%10+0x30; //
    TimeBuffer1[0]=hours/10+0x30;
    DateBuffer1[9]=days%10+0x30;  //
    DateBuffer1[8]=days/10+0x30;      
    DateBuffer1[6]=months%10+0x30;//
    DateBuffer1[5]=months/10+0x30;
        DateBuffer1[11]=weeks%10+0x30;//星期   
    DateBuffer1[3]=years%10+0x30; //
    DateBuffer1[2]=years/10+0x30;
        jdq_delay(2);
    if(key1==0) tiao_delay();
    if(key1==0) flag1=0;
        write_lcd_command(12);
        lcd_displaystr_ram(0,1,DateBuffer1);
    lcd_displaystr_ram(1,1,TimeBuffer1);
  }

}

void tiao1(void)
{
  mins=mins-mins/16*6;
  hours=hours-hours/16*6;
  days=days-days/16*6;
  months=months-months/16*6;
  years=years-years/16*6;
  TimeBuffer1[4]=mins%10+0x30; //分个位
  TimeBuffer1[3]=mins/10+0x30;
  TimeBuffer1[1]=hours%10+0x30; //
  TimeBuffer1[0]=hours/10+0x30;
  DateBuffer1[9]=days%10+0x30;  //
  DateBuffer1[8]=days/10+0x30;      
  DateBuffer1[6]=months%10+0x30;//
  DateBuffer1[5]=months/10+0x30;
  DateBuffer1[11]=weeks%10+0x30;//星期   
  DateBuffer1[3]=years%10+0x30; //
  DateBuffer1[2]=years/10+0x30;
  lcd_displaystr_ram(0,1,DateBuffer1);
  lcd_displaystr_ram(1,1,TimeBuffer1);

  write_lcd_command(0x0f);
  write_lcd_command(0x80+0x45);
  jdq_delay(2);
  k=1,a=mins,flag1=1;
  change();          //
  write_lcd_command(0x0f);
  write_lcd_command(0x80+0x42);
  jdq_delay(2);
  k++,a=hours,flag1=1;
  change();          //
  write_lcd_command(0x0f);
  write_lcd_command(0x80+10);
  jdq_delay(2);
  k++,a=days,flag1=1;
  change();          //
}
void  tiao2(void)
{
  write_lcd_command(0x0f);
  write_lcd_command(0x80+12);
  jdq_delay(2);
  k++,a=years,flag1=1;
  change();          //星期
  write_lcd_command(0x0f);
  write_lcd_command(0x80+7);
  jdq_delay(2);
  k++,a=months,flag1=1;
  change();          //
  write_lcd_command(0x0f);
  write_lcd_command(0x80+4);
  jdq_delay(2);
  k++,a=years,flag1=1;
  change();          //
  mins=mins+mins/10*6;
  hours=hours+hours/10*6;
  days=days+days/10*6;
  months=months+months/10*6;
  years=years+years/10*6;
  jdq_delay(5);
}


//调整1302时间
void tiaozheng(struct TimerStruct *Real)
{
  lcd_displaystr(0,14,DATECODE1);
  mins=Real->Minute;
  hours=Real->Hour;
  days=Real->Day;
  months=Real->Month;
  weeks=Real->Week;
  years=Real->Year;
  tiao1();
  tiao2();
  write_lcd_command(0x01);//清屏
  Write_DS1302_RTC(0x8e,0x00); //写控制
  Write_DS1302_RTC(0x80,0x00); //写秒
  Write_DS1302_RTC(0x82,mins); //写分
  Write_DS1302_RTC(0x84,hours); //写时
  Write_DS1302_RTC(0x86,days); //写日
  Write_DS1302_RTC(0x88,months); //写月
  Write_DS1302_RTC(0x8a,weeks); //写星期
  Write_DS1302_RTC(0x8c,years); //写年
  Write_DS1302_RTC(0x8e,0x80); //控制
  initize_lcd();
  Init_DS1302_RTC();


}
//调整蜂鸣器定时
void dingshif(void)
{
  flag3=1;
  lcd_displaystr(0,14,DATECODE2);
  mins=Minute1;
  hours=Hour1;
  days=Day1;
  //months=Month1;
  //weeks=Week1;
  //years=Year1;
  tiao1();
  tiao_delay();
  mins=mins+mins/10*6;
  hours=hours+hours/10*6;
  days=days+days/10*6;
  Minute1=mins;
  Hour1=hours;
  Day1=days;
  //Month1=months;
  //Week1=weeks;
  //Year1=years;
  write_lcd_command(0x01);//清屏
  DATECODE22[0]='&';
  if(flag4==1) DATECODE33[0]='!';
  jdq_delay(5);
  lcd_displaystr(0,14,DATECODE22);
  lcd_displaystr(0,15,DATECODE33);
}
//调整继电器定时
void  dingshij(void)
{
  flag4=1;
  lcd_displaystr(0,14,DATECODE3);
  mins=Minute2;
  hours=Hour2;
  days=Day2;
  //months=Month2;
  //weeks=Week2;
  //years=Year2;
  tiao1();
  mins=mins+mins/10*6;
  hours=hours+hours/10*6;
  days=days+days/10*6;
  Minute2=mins;
  Hour2=hours;
  Day2=days;
// Month2=months;
  //Week2=weeks;
  //Year2=years;
  k1=k2=1;
  write_lcd_command(0x01); //清屏
  DATECODE33[0]='!';
  if(flag3==1) DATECODE22[0]='&';
  jdq_delay(5);
  lcd_displaystr(0,14,DATECODE22);
  lcd_displaystr(0,15,DATECODE33);
}

//蜂鸣器报警
void dingshifmq(void)
{
  flag3=0;flag2=10;

  if(  RealClock.Hour=Hour1)
   if(  RealClock.Day=Day1)
     //if(  RealClock.Month=Month1)
          // if(  RealClock.Year=Year1)
    {
         while(flag2)
      {
       fmq_delay(1);
           flag2--;
           if(key1==0) tiao_delay();
           if(key1==0) flag2=0;
           if(key1==0) tiao_delay();
           if(key1==0) flag2=0;
           if(key1==0) tiao_delay();
           if(key1==0) flag2=0;
           if(key1==0) tiao_delay();
           if(key1==0) flag2=0;
           }
          Minute1=Minute1-2;
          write_lcd_command(0x01);//清屏
        DATECODE22[0]=' ';
    if(flag4==0) DATECODE33[0]=' ';
    jdq_delay(5);
    lcd_displaystr(0,14,DATECODE22);
    lcd_displaystr(0,15,DATECODE33);
          jdq_delay(10);        
     }
}
//继电器取消
void dingshijdq(void)
{
  flag4=0;
   if(  RealClock.Hour=Hour2)
    if(  RealClock.Day=Day2)
     // if(  RealClock.Month=Month2)
           // if(  RealClock.Year=Year2)
                        tiao_delay();
                       k1=0,k2=0;
                write_lcd_command(0x01);//清屏
                DATECODE33[0]=' ';
        if(flag3==0) DATECODE22[0]=' ';
        jdq_delay(5);
        lcd_displaystr(0,14,DATECODE22);
        lcd_displaystr(0,15,DATECODE33);
        Minute2=Minute2-1;
}



//主函数
void main(void)
{
  jdq();
  RealClock.Minute=Minute1=Minute2;
  RealClock.Hour=Hour1=Hour2;
  RealClock.Day=Day1=Day2;
  RealClock.Month=Month1=Month2;
  RealClock.Year=Year1=Year2;
  flag5=1;
  fmq_delay(1);
  initize_lcd();
  Init_DS1302_RTC();
  //Write_DS1302_RTC(0x8e,0x00); //写控制
  Write_DS1302_RTC(0x80,0x00); //写秒
  //Write_DS1302_RTC(0x82,0x30); //写分
  //Write_DS1302_RTC(0x84,0x12); //写时
  //Write_DS1302_RTC(0x86,0x15); //写日
  //Write_DS1302_RTC(0x88,0x08); //写月
  //Write_DS1302_RTC(0x8a,0x3); //写星期
  //Write_DS1302_RTC(0x8c,0x06); //写年
  //Write_DS1302_RTC(0x8e,0x80); //控制
while(1)
  {
  unsigned int Temp,Temperature;
  unsigned char TemperatureH;
  unsigned char TemperatureL;
  //struct TimerStruct RealClock;
      while(DS18B20_Reset());
      DS18B20_Write(0xCC);
      DS18B20_Write(0xBE);                              
          TemperatureL=DS18B20_Read();           //低位
      TemperatureH=DS18B20_Read();           //高位
      while(DS18B20_Reset());
      DS18B20_Write(0xCC);
      DS18B20_Write(0x44);

      Temp=TemperatureH*256+TemperatureL;   //左移8                  
      if(Temp & 0xf800)                                                //去除低7
        {
              LCDDisplayBuffer[0]=' ';
              Temp=(~Temp)+1;
              TemperatureL=Temp%256;
              TemperatureH=Temp/256;
            }
      Temp>>=4;
          Temperature=Temp;                                                                //右移四位
      LCDDisplayBuffer[1]=Temp/10+0x30;
          LCDDisplayBuffer[2]=Temp%10+0x30;
      Temp=TemperatureL;
      Temp&=0x000F;                                                        //保留低四位
      Temp*=625;                                                    //化小数
      Temp/=100;
      LCDDisplayBuffer[3]='.';
      LCDDisplayBuffer[4]=Temp/10+0x30;
      LCDDisplayBuffer[5]=Temp%10+0x30;  
      LCDDisplayBuffer[6]='C';

      Temp=Read_DS1302_RTC(0x81);                 //
      RealClock.Second=Temp;
      TimeBuffer[7]=Temp%16+0x30;
      TimeBuffer[6]=Temp/16+0x30;
      Temp=Read_DS1302_RTC(0x83);                 //
        RealClock.Minute=Temp;
      TimeBuffer[4]=Temp%16+0x30;
      TimeBuffer[3]=Temp/16+0x30;                 //
      Temp=Read_DS1302_RTC(0x85);
      RealClock.Hour=Temp;
      TimeBuffer[1]=Temp%16+0x30;
      TimeBuffer[0]=Temp/16+0x30;

      Temp=Read_DS1302_RTC(0x87);                 //
        RealClock.Day=Temp;
      DateBuffer[9]=Temp%16+0x30;
      DateBuffer[8]=Temp/16+0x30;
      Temp=Read_DS1302_RTC(0x89);                 //
        RealClock.Month=Temp;
      DateBuffer[6]=Temp%16+0x30;
      DateBuffer[5]=Temp/16+0x30;
          Temp=Read_DS1302_RTC(0x8b);                 //星期
        RealClock.Week=Temp;
      DateBuffer[11]=Temp%16+0x30;
      Temp=Read_DS1302_RTC(0x8d);                 //
      RealClock.Year=Temp;
      DateBuffer[3]=Temp%16+0x30;
      DateBuffer[2]=Temp/16+0x30;

          lcd_displaystr_ram(0,1,DateBuffer);
      lcd_displaystr_ram(1,1,TimeBuffer);
      lcd_displaystr_ram(1,sizeof(TimeBuffer),LCDDisplayBuffer);

          if(key1==0) tiao_delay();
          if(key1==0) tiaozheng(&RealClock);
          if(key2==0) tiao_delay();
          if(key2==0) dingshif();
          if(key3==0) dingshij();
          if(key3==0) tiao_delay();

          if(RealClock.Minute==Minute1)   dingshifmq();
          if(RealClock.Minute==Minute2)   dingshijdq();

          if(RealClock.Minute==0x00)         
            if(flag5==1)  
             {
                 fmq_delay(2),flag5=0;
                 }
          if(RealClock.Minute==0x02) flag5=1;        
          //if(Temperature>=0x3500) fmq_delay(1);
          //if(Temperature<=0x3300) fmq_delay(2);
  }
}

1602LCDDriver

#include <REGX51.H>
#include "1602LCDDriver.h"


void lcd_delay(unsigned int delaytime)
{
  while(delaytime)delaytime--;
}

void write_lcd_command(unsigned char write_command)
{
  lcd_delay(25);
  RSCLR;
  RWCLR;
  //LCDPORT=write_command;
  P2_0=(bit)(write_command & 0x80);
  write_command+=write_command;
  P2_1=(bit)(write_command & 0x80);
  write_command+=write_command;
  P2_2=(bit)(write_command & 0x80);
  write_command+=write_command;
  P2_3=(bit)(write_command & 0x80);
  write_command+=write_command;
  P2_4=(bit)(write_command & 0x80);
  write_command+=write_command;
  P2_5=(bit)(write_command & 0x80);
  write_command+=write_command;
  P2_6=(bit)(write_command & 0x80);
  write_command+=write_command;
  P2_7=(bit)(write_command & 0x80);
  ENSET;
  ENCLR;
}

void write_lcd_data(unsigned char write_data)
{
  lcd_delay(25);
  RSSET;
  RWCLR;
  //LCDPORT=write_data;
  P2_0=(bit)(write_data & 0x80);
  write_data += write_data;
  P2_1=(bit)(write_data & 0x80);
  write_data+=write_data;
  P2_2=(bit)(write_data & 0x80);
  write_data+=write_data;
  P2_3=(bit)(write_data & 0x80);
  write_data+=write_data;
  P2_4=(bit)(write_data & 0x80);
  write_data+=write_data;
  P2_5=(bit)(write_data & 0x80);
  write_data+=write_data;
  P2_6=(bit)(write_data & 0x80);
  write_data+=write_data;
  P2_7=(bit)(write_data & 0x80);
  ENSET;
  ENCLR;
}

void initize_lcd(void)
{
  unsigned char i;
  ENCLR;
  for(i=200;i>0;i--)lcd_delay(248);
  write_lcd_command(0x3f);
  for(i=4;i>0;i--)lcd_delay(248);
  write_lcd_command(0x3f);
  write_lcd_command(0x0f);
  write_lcd_command(0x01);
  for(i=4;i>0;i--)lcd_delay(248);
  write_lcd_command(0x06);
}

void lcd_displaystr(unsigned char x,unsigned char y,const unsigned char *str)
{
  switch(x)
    {
      case 0:
            write_lcd_command(0x80+y);
            break;
          case 1:
            write_lcd_command(0xc0+y);
            break;
        }
  while(*str)
    {
          write_lcd_data(*str);
          str++;
        }
}

void lcd_displaystr_ram(unsigned char x,unsigned char y,unsigned char *str)
{
  switch(x)
    {
      case 0:
            write_lcd_command(0x80+y);
            break;
          case 1:
            write_lcd_command(0xc0+y);
            break;
        }
  while(*str)
    {
          write_lcd_data(*str);
          str++;
        }
}

DS18B20Driver

#include <REGX51.H>
#include <INTRINS.h>
#include "DS18B20Driver.h"



bit DS18B20_Reset(void)
{
  unsigned char i;

  DQ=0;
  //for(i=255;i>0;i--);
  for(i=255;i>0;i--);
  DQ=1;
// for(i=60;i>0;i--);
  for(i=60;i>0;i--);
  return(DQ);
  //for(i=200;i>0;i--);
  for(i=200;i>0;i--);
}

void DS18B20_Write(unsigned char command)
{
  unsigned char i;
  unsigned char j;

  for(i=8;i>0;i--)
    {
      if((command & 0x01)==0)
        {
          DQ=0;
          //for(j=35;j>0;j--);
          for(j=35;j>0;j--);
          DQ=1;
        }
        else
          {
            DQ=0;
            //for(j=2;j>0;j--);
            for(j=2;j>0;j--);
            DQ=1;
            //for(j=33;j>0;j--);
            for(j=33;j>0;j--);
          }
      command=_cror_(command,1);      
    }
}

unsigned char DS18B20_Read(void)
{
  unsigned char i;
  unsigned char j;
  unsigned char temp;

  temp=0;
  for(i=8;i>0;i--)
    {
      temp=_cror_(temp,1);
      DQ=0;
      _nop_();
      _nop_();
      DQ=1;
      //for(j=10;j>0;j--);
      for(j=10;j>0;j--);
      if(DQ==1)
        {
          temp=temp | 0x80;
        }
        else
          {
            temp=temp | 0x00;
          }
     // for(j=200;j>0;j--);
      for(j=200;j>0;j--);
    }
  return(temp);
}

DS1302Driver

#include <REGX51.H>
#include "DS1302Driver.h"
#include <INTRINS.H>

void Init_DS1302_RTC(void)
{
  DS1302CE=0;
  DS1302CK=0;
  DS1302IO=1;  
}
unsigned char Read_DS1302_RTC(unsigned char RTC_Address)
{
  unsigned char i;
  unsigned char temp;

  DS1302CK=0;
  DS1302CE=1;
  for(i=8;i>0;i--)
    {      
      if(RTC_Address & 0x01)DS1302IO=1;
      else DS1302IO=0;
      RTC_Address>>=1;      
      DS1302CK=1;
      DS1302CK=0;
    }
  temp=0;
  if(DS1302IO==1)temp+=0x80;
  for(i=7;i>0;i--)
    {
      temp>>=1;
      DS1302CK=1;
      DS1302CK=0;      
      if(DS1302IO==1)temp+=0x80;      
    }
  DS1302CE=0;
  return(temp);
}

void Write_DS1302_RTC(unsigned char RTC_Address,unsigned char RTC_Data)
{
  unsigned char i;

  DS1302CK=0;
  DS1302CE=1;
  for(i=8;i>0;i--)
    {      
      if(RTC_Address & 0x01)DS1302IO=1;
      else DS1302IO=0;
      RTC_Address>>=1;
      DS1302CK=1;
      DS1302CK=0;
    }
  for(i=8;i>0;i--)
    {      
      if(RTC_Data & 0x01)DS1302IO=1;
      else DS1302IO=0;
      RTC_Data>>=1;      
      DS1302CK=1;
      DS1302CK=0;
    }
  DS1302CE=0;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2021-4-21 16:04 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表