蓝桥杯单片机第4届省赛_模拟智能灌溉系统

题目

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码

timer.c

#include <timer.h>

void Timer0Init(void)  //1毫秒@12.000MHz
{
 AUXR |= 0x80;  //定时器时钟1T模式
 TMOD &= 0xF0;  //设置定时器模式
 TL0 = 0x20;  //设置定时初值
 TH0 = 0xD1;  //设置定时初值
 TF0 = 0;  //清除TF0标志
 TR0 = 1;  //定时器0开始计时
 EA=ET0=1;
}

timer.h

#ifndef _TIMER_H_
#define _TIMER_H_

#include <STC15F2K60S2.H>

void Timer0Init(void);  

#endif

smg.c

#include <smg.h>

unsigned char code smgduan[12]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,
0X80,0X90,0XBF,0XFF};

unsigned char dspbuf[8];

void smg_display(void)
{
 static unsigned char i=0;
 
  P2=(P2&=0X1F)|0XE0;
 P0=0XFF;
 P2&=0X1F;
 
 P2=(P2&=0X1F)|0XC0;
 P0=0x01<<i;
 P2&=0X1F;
 
 P2=(P2&=0X1F)|0XE0;
 P0=smgduan[dspbuf[i]];
 P2&=0X1F;
 
 if(++i==8)
  i=0;
}

smg.h

#ifndef _SMG_H_
#define _SMG_H_

#include <STC15F2K60S2.H>

void smg_display(void);
extern unsigned char dspbuf[8];

#endif

key.c

#include <key.h>

unsigned char key_sum=0;
unsigned char k4_press,k5_press,k6_press,k7_press;

void key_read(void)
{
  static unsigned char k4_time=0,k5_time=0,k6_time=0,k7_time=0;
 key_sum=0;
 
 if(k4==0)
 {
   k4_time++;
  if(k4_time==1)
    key_sum=4;
  else if(k4_time==20)
  {
    key_sum=0;
   k4_time=1;
  }
 }
 else
  k4_time=0; 
  
  if(k5==0)
 {
   k5_time++;
  if(k5_time==1)
    key_sum=5;
  else if(k5_time==20)
  {
    key_sum=0;
   k5_time=1;
  }
 }
 else
  k5_time=0;
  
  if(k6==0)
 {
   k6_time++;
  if(k6_time==1)
    key_sum=6;
   else if(k6_time==20)
  {
    key_sum=0;
   k6_time=1;
  }
 }
 else
  k6_time=0;
  
  if(k7==0)
 {
   k7_time++;
  if(k7_time==1)
    key_sum=7;
  else if(k7_time==20)
  {
    key_sum=0;
   k7_time=1;
  }
 }
 else
  k7_time=0;
}
void key_control(void)
{
  if(key_sum==4)
   k4_press=1;
 else if(key_sum==5)
   k5_press=1;
 else if(key_sum==6)
   k6_press=1;
 else if(key_sum==7)
   k7_press=1;
}
 

key.h

#ifndef __KEY_H_
#define __KEY_H_

#include <STC15F2K60S2.H>

sbit k7=P3^0;
sbit k6=P3^1;
sbit k5=P3^2;
sbit k4=P3^3;

extern unsigned char k4_press;
extern unsigned char k5_press;
extern unsigned char k6_press;
extern unsigned char k7_press;

void key_read(void);
void key_control(void);

#endif

iic.c

#include <iic.h>
#include "intrins.h"

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

//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */

//总线启动条件
void IIC_Start(void)
{
 SDA = 1;
 SCL = 1;
 somenop;
 SDA = 0;
 somenop;
 SCL = 0; 
}

//总线停止条件
void IIC_Stop(void)
{
 SDA = 0;
 SCL = 1;
 somenop;
 SDA = 1;
}

//等待应答
bit IIC_WaitAck(void)
{
 SDA = 1;
 somenop;
 SCL = 1;
 somenop;
 if(SDA)    
 {   
  SCL = 0;
  IIC_Stop();
  return 0;
 }
 else  
 { 
  SCL = 0;
  return 1;
 }
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
 unsigned char i;
 for(i=0;i<8;i++)
 {   
  if(byt&0x80) 
  { 
   SDA = 1;
  }
  else 
  {
   SDA = 0;
  }
  somenop;
  SCL = 1;
  byt <<= 1;
  somenop;
  SCL = 0;
 }
}

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
 unsigned char da;
 unsigned char i;
 for(i=0;i<8;i++)
 {   
  SCL = 1;
  somenop;
  da <<= 1;
  if(SDA) 
  da |= 0x01;
  SCL = 0;
  somenop;
 }
 return da;
}

unsigned char adc_read(void)
{
  unsigned char dat=0;
 IIC_Start();
 IIC_SendByte(0X90);
 IIC_WaitAck();
 IIC_SendByte(0X03);
 IIC_WaitAck();
 IIC_Start();
 IIC_SendByte(0X91);
 IIC_WaitAck();
 dat=IIC_RecByte();
 IIC_Stop();
 return dat;
}
void eeprom_write(unsigned char addr,unsigned char dat)
{
  IIC_Start();
  
 IIC_SendByte(0XA0);
 IIC_WaitAck();
 IIC_SendByte(addr);
 IIC_WaitAck();
 IIC_SendByte(dat);
 IIC_WaitAck();
 
 IIC_Stop();
}
unsigned char eeprom_read(unsigned char addr)
{
 unsigned char dat=0;
 
  IIC_Start();
 IIC_SendByte(0XA0);
 IIC_WaitAck();
 IIC_SendByte(addr);
 IIC_WaitAck();

 IIC_Start();
 IIC_SendByte(0XA1);
 IIC_WaitAck();
  dat=IIC_RecByte();
 IIC_WaitAck();
 IIC_Stop();
 return dat;
}

iic.h

#ifndef _IIC_H
#define _IIC_H

#include <STC15F2K60S2.H>

unsigned char adc_read_dat(unsigned char addr);
void eeprom_write(unsigned char addr,unsigned char dat);
unsigned char eeprom_read(unsigned char addr);

#endif

ds1302.c

#include <ds1302.h>
#include <intrins.h>

sbit SCK=P1^7;  
sbit SDA=P2^3;  
sbit RST = P1^3;   // DS1302复位            

unsigned char code addr_write[3]={0X80,0X82,0X84};
unsigned char code addr_read[3]={0X81,0X83,0X85};
unsigned char time[3]={0X00,0X30,0X08};

void Write_Ds1302_Byte(unsigned  char temp) 
{
 unsigned char i;
 for (i=0;i<8;i++)      
 { 
  SCK=0;
  SDA=temp&0x01;
  temp>>=1; 
  SCK=1;
 }
}   
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; 
}

unsigned char Read_Ds1302 ( unsigned char address )
{
  unsigned char i,temp=0x00;
  RST=0;
 _nop_();
  SCK=0;
 _nop_();
  RST=1;
 _nop_();
  Write_Ds1302_Byte(address);
  for (i=0;i<8;i++)  
  {  
  SCK=0;
  temp>>=1; 
   if(SDA)
   temp|=0x80; 
   SCK=1;
 } 
  RST=0;
 _nop_();
  RST=0;
 SCK=0;
 _nop_();
 SCK=1;
 _nop_();
 SDA=0;
 _nop_();
 SDA=1;
 _nop_();
 return (temp);   
}

void ds1302_init(void)
{
 unsigned char i=0;
  EA=0;
 Write_Ds1302( 0X8E,0X00 );
 for(i=0;i<3;i++)
 {
   Write_Ds1302( addr_write[i], time[i]);
 }
 Write_Ds1302( 0X8E,0X80 );
  EA=1;  
}
void ds1302_read_time(void)
{
 unsigned char i=0;
  EA=0;
 for(i=0;i<3;i++)
 {
   time[i]=Read_Ds1302 ( addr_read[i] );
 }
  EA=1;  
}

ds1302.h

#ifndef __DS1302_H_
#define __DS1302_H_

#include <STC15F2K60S2.H>

void ds1302_init(void);
void ds1302_read_time(void);

extern unsigned char time[3];

#endif

other.c

#include <other.h>

void bee_on(void)
{
  P2=(P2&=0X1F)|0XA0;
  P0|=0X40;
  P2&=0X1F;
}

void bee_off(void)
{
  P2=(P2&=0X1F)|0XA0;
  P0&=0XBF;
  P2&=0X1F;
}

void relay_on(void)
{
  P2=(P2&=0X1F)|0XA0;
  P0|=0X10;
  P2&=0X1F;
}

void relay_off(void)
{
  P2=(P2&=0X1F)|0XA0;
  P0&=0XEF;
  P2&=0X1F;
}

void led1_on(void)
{
  P2=(P2&=0X1F)|0X80;
  P0=0XFE;
  P2&=0X1F;
}

void led2_on(void)
{
  P2=(P2&=0X1F)|0X80;
  P0=0XFD;
  P2&=0X1F;
}

other.h

#ifndef _OTHER_H_
#define _OTHER_H_

#include <STC15F2K60S2.H>

void bee_on(void);
void bee_off(void);
void relay_on(void);
void relay_off(void);
void led1_on(void);
void led2_on(void);

#endif

main.c

#include <STC15F2K60S2.H>
#include <timer.h>
#include <key.h>
#include <other.h>
#include <smg.h>
#include <ds1302.h>
#include <iic.h>

unsigned char flag_key;
unsigned char flag_k4,flag_k5;
unsigned char flag_ds1302;
unsigned char flag_adc;
unsigned char flag_relay;
unsigned char flag_bee;
unsigned char flag_mode=1;
unsigned char k6_count1,k6_count2;
unsigned char k7_count;
unsigned char flag_20ms;
unsigned char flag_alarm=1;
unsigned char flag_smg=1;

unsigned char humidity=50;
unsigned char humidity_max=50;
long adc_dat;
unsigned int addr=0X01;

void eeprom_init(void)
{
 if(eeprom_read(0x10)==0x10)
  humidity_max=eeprom_read(0x01);
 else
 {
  eeprom_write(0x10,0x10);
  humidity_max=50;
 }
}
void main()
{
 Timer0Init();
 bee_off();
 relay_off();
  ds1302_init();
 adc_init(0X03);
 eeprom_init();
  while(1)
 {
  /***********key***********/
  if(flag_key)
  {
    flag_key=0;
    key_read();
    key_control();
  }
  
  else if(k4_press)
  {
    k4_press=0;
    flag_k4=1;
  }
  
  else if(k5_press)
  {
    k5_press=0;
    flag_k5=1;
  }
  
  else if(k6_press)
  {
   k6_press=0;
   if(flag_mode==1)
   {
    k6_count1++;
    if(k6_count1%2)
     flag_smg=2;
   else
   {
     flag_smg=1;
     eeprom_write(addr,humidity_max);
   }
   }
    else if(flag_mode==2)
   {
     k6_count2++;
     
    if(k6_count2%2)
     flag_alarm=2;
     
    else
     flag_alarm=1;
   }
  }
  
  else if(k7_press)
  {
    k7_press=0;
    k7_count++;
   if(k7_count%2)
     flag_mode=2;
   else
    flag_mode=1;
  }
  /***********ds1302***********/
   ds1302_read_time();
   
  /***********adc***********/
  if(flag_adc)
  {
    flag_adc=0;
    adc_dat=adc_read();
  }
    humidity=(unsigned int)(adc_dat*100/257);
    
  /***********auto***********/
  if(flag_mode==1)
  {
   if(flag_20ms)
   {
    flag_20ms=0;
    led1_on();
   }
   
   if(humidity<humidity_max)
     flag_relay=1;
   else
    flag_relay=0;
    
   if(flag_smg==2)
   {
     if(flag_k5)
    {
     flag_k5=0;
     if(++humidity_max>99)
      humidity_max=99;
    }
    else if(flag_k4)
    {
     flag_k4=0;
     if(--humidity_max<1)
       humidity_max=1;      
    }
    }
   else
   {
    if(flag_k5)flag_k5=0;
    else if(flag_k4)flag_k4=0;
   }
  }
  /***********manual***********/
  if(flag_mode==2)
  {
   flag_smg=1;
   if(flag_20ms)
   {
     flag_20ms=0;
      led2_on();
   }
   if(flag_k5)
   {
    flag_k5=0;
     flag_relay=1;
   }
   else if(flag_k4)
   {
    flag_k4=0;
     flag_relay=0;
   }
   if(flag_alarm==1)
   {
    if(humidity<humidity_max)
     flag_bee=1;
     
   else
    flag_bee=0;
   }
   else
    flag_bee=0;
  }
  /***********relay***********/
  if(flag_relay)
    relay_on();
  else
   relay_off();
  /***********bee***********/
   if(flag_bee)
    bee_on();
  else
   bee_off();
  /***********smg***********/
  if(flag_smg==1)
  {
    dspbuf[0]=time[2]/16;
    dspbuf[1]=time[2]%16;
    dspbuf[2]=10;
    dspbuf[3]=time[1]/16;
    dspbuf[4]=time[1]%16;
    dspbuf[5]=11;
    dspbuf[6]=humidity/10;
    dspbuf[7]=humidity%10;
   }
  if(flag_smg==2)
  {
    dspbuf[0]=10;
    dspbuf[1]=10;
    dspbuf[2]=11;
    dspbuf[3]=11;
    dspbuf[4]=11;
    dspbuf[5]=11;
    dspbuf[6]=humidity_max/10;
    dspbuf[7]=humidity_max%10;
  }
 }
}

void timer0_isr(void) interrupt 1
{
 static unsigned char flag_key_time=0;
 static unsigned char flag_adc_time=0;
 static unsigned char flag_20ms_time=0;
 
 if(++flag_key_time==30)
 {
   flag_key_time=0;
   flag_key=1;
 }
(++flag_adc_time==100)
 {
   flag_adc_time=0;
  flag_adc=1;
 }
  if(++flag_20ms_time==20)
 {
   flag_20ms_time=0;
   flag_20ms=1;
 }
 smg_display();
}
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值