蓝桥杯单片机省赛——第五届(模拟智能灌溉系统)

  • 一、题目内容
  • 二、程序源代码
    • 1.主函数
    • 2.ds1302驱动函数
    • 3.iic驱动函数

注意:驱动代码需要改动一下,可以将原驱动代码按照下面的代码修改


一、题目内容

二、程序源代码

1.主函数

#include "stc15f2k60s2.h"
#include "intrins.h"
#include "ds1302.h"
#include "iic.h"
#define  control(x,y)  P0=x;P2=y;P2=0;typedef unsigned char uchar;
typedef unsigned int uint;uchar code dsp_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
uchar dsp_Time[]={10,10,11,10,10,10,10,10};
uchar dsp_Set[]={11,11,10,10,10,10,10,10};uchar L1,L2;
uchar buzzer,relay;                     //继电器 开   灌溉uchar cnt,trg;
uchar count_key;                      //按键刷新率uchar h,m,s;                             //8时30分uchar shidu;
uchar count_adc;uchar shidu_th=50;uchar f_mode=0;                         //工作模式切换
bit flag_set;           //阈值调整界面标志
bit flag_beep=1;        //蜂鸣器功能标志void Delay300ms()     //@11.0592MHz
{unsigned char i, j, k;_nop_();_nop_();i = 13;j = 156;k = 83;do{do{while (--k);} while (--j);} while (--i);
}void Timer0Init(void)      //1毫秒@11.0592MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0xCD;       //设置定时初值TH0 = 0xD4;        //设置定时初值TF0 = 0;       //清除TF0标志ET0=1;EA=1;TR0 = 1;     //定时器0开始计时
}
void Timer0_Service()  interrupt 1
{static uchar pos=0;uchar P0_Keeper=0,P2_Keeper=0;P0_Keeper=P0;P2_Keeper=P2;P2=0;control(0x00,0xc0);if(flag_set){control(dsp_code[dsp_Set[pos]],0xe0);}else{control(dsp_code[dsp_Time[pos]],0xe0);}control(1 << pos ,0xc0);if(++pos == 8)pos=0;control(~(L1+L2*2),0x80);control(buzzer*64+relay*16,0xa0);++count_key;++count_adc;P0=P0_Keeper;P2=P2_Keeper;
}
/*==================================按键扫描函数==============================*/
void Scan_key()
{uchar readdat=P3^0xff;trg=readdat&(readdat^cnt);cnt=readdat;if(trg & 0x01)               //S7{if(!flag_set){if(++f_mode == 2){f_mode=0;}}flag_beep=1;}else if(trg & 0x02)              //S6{if(f_mode == 1){flag_beep=~flag_beep;}else{flag_set=~flag_set;if(!flag_set){EA=0;write_24c02(0x00,shidu_th);EA=1;}}}else if(trg & 0x04)              //S5{if(f_mode == 1){relay=1;}else{if(flag_set){++shidu_th;}}}else if(trg & 0x08)              //S4{if(f_mode == 1){relay=0;}else{if(flag_set){--shidu_th;}}}
}
void Display()
{dsp_Time[0]=h / 16;dsp_Time[1]=h % 16;dsp_Time[3]=m / 16;dsp_Time[4]=m % 16;dsp_Time[6]=shidu / 10;dsp_Time[7]=shidu % 10;dsp_Set[6]=shidu_th / 10;dsp_Set[7]=shidu_th % 10;if(f_mode == 1){L2=1;L1=0;if(shidu < shidu_th){if(flag_beep){buzzer=1;}else{buzzer=0;}}else{buzzer=0;}}else{L1=1;L2=0;buzzer=0;if(shidu < shidu_th){relay=1;}else{relay=0;}}
}
void Init_System()
{uchar i=0;control(0x00,0xa0);control(0xff,0x80);shidu_th=read_24c02(0x00);if(shidu_th > 99){shidu_th=50;}for(i=0;i<5;i++){shidu=(uchar)(read_adc(0x03)/2.57);}Set_Time(8,30,55);Timer0Init();
}void main()
{Init_System();Delay300ms();while(1){if(TH0 < 0xf0){h=Read_Ds1302_Byte(0x85);m=Read_Ds1302_Byte(0x83);s=Read_Ds1302_Byte(0x81);}if(count_adc > 199){count_adc=0;EA=0;shidu=(uchar)(read_adc(0x03)/2.57);EA=1;}         Display();if(count_key > 9){count_key=0;Scan_key();}}
}

2.ds1302驱动函数

ds1302.c驱动函数:

#include <reg52.h>
#include <ds1302.h>
#include <intrins.h>sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3;   // DS1302复位                                             void Write_Ds1302(unsigned  char temp)
{unsigned char i;for (i=0;i<8;i++)        { SCK=0;SDA=temp&0x01;temp>>=1; SCK=1;}
}   void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{RST=0;    _nop_();SCK=0; _nop_();RST=1;     _nop_();  Write_Ds1302(address);    Write_Ds1302(dat);      RST=0;
}unsigned char Read_Ds1302_Byte ( unsigned char address )
{unsigned char i,temp=0x00;RST=0; _nop_();SCK=0; _nop_();RST=1; _nop_();Write_Ds1302(address);for (i=0;i<8;i++)   {       SCK=0;temp>>=1; if(SDA)temp|=0x80; SCK=1;} RST=0;    _nop_();SCK=0; _nop_();SCK=1; _nop_();SDA=0; _nop_();SDA=1; _nop_();return (temp);
}/*=========================================================================*/
void Set_Time(char h, char m,char s)
{Write_Ds1302_Byte(0x8e,0x00);Write_Ds1302_Byte(0x84,(h/10)*16+h%10);Write_Ds1302_Byte(0x82,(m/10)*16+m%10);Write_Ds1302_Byte(0x80,(s/10)*16+m%10);Write_Ds1302_Byte(0x8e,0x80);
}

ds1302.h驱动函数:

#ifndef __DS1302_H
#define __DS1302_Hvoid Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );void Set_Time(char h, char m,char s);#endif

3.iic驱动函数

ii.c驱动函数:

#include "reg52.h"
#include "iic.h"
#include "intrins.h"#define DELAY_TIME 5#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */void IIC_Delay(unsigned char i)
{do{_nop_();}while(i--);
}
//总线启动条件
void IIC_Start(void)
{SDA = 1;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 0;IIC_Delay(DELAY_TIME);SCL = 0;
}//总线停止条件
void IIC_Stop(void)
{SDA = 0;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 1;IIC_Delay(DELAY_TIME);
}//发送应答
//void IIC_SendAck(bit ackbit)
//{//    SCL = 0;
//    SDA = ackbit;                    // 0:应答,1:非应答
//    IIC_Delay(DELAY_TIME);
//    SCL = 1;
//    IIC_Delay(DELAY_TIME);
//    SCL = 0;
//    SDA = 1;
//    IIC_Delay(DELAY_TIME);
//}//等待应答
bit IIC_WaitAck(void)
{bit ackbit;SCL  = 1;IIC_Delay(DELAY_TIME);ackbit = SDA;SCL = 0;IIC_Delay(DELAY_TIME);return ackbit;
}//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){SCL  = 0;IIC_Delay(DELAY_TIME);if(byt & 0x80) SDA  = 1;else SDA  = 0;IIC_Delay(DELAY_TIME);SCL = 1;byt <<= 1;IIC_Delay(DELAY_TIME);}SCL  = 0;  IIC_WaitAck();}//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{unsigned char i, da;for(i=0; i<8; i++){   SCL = 1;IIC_Delay(DELAY_TIME);da <<= 1;if(SDA) da |= 1;SCL = 0;IIC_Delay(DELAY_TIME);}IIC_WaitAck();return da;
}/*===================================24c02==============================*/
void write_24c02(unsigned char add,unsigned char dat)
{IIC_Start();IIC_SendByte(0xa0);IIC_SendByte(add);IIC_SendByte(dat);IIC_Stop();
}
unsigned char read_24c02(unsigned char add)
{unsigned char dat;IIC_Start();IIC_SendByte(0xa0);IIC_SendByte(add);IIC_Start();IIC_SendByte(0xa1);dat=IIC_RecByte();IIC_Stop();return dat;}
/*=============================PCF8591读取rb2的值================================*/
unsigned char read_adc(unsigned char add)
{unsigned char dat;IIC_Start();IIC_SendByte(0x90);IIC_SendByte(add);IIC_Start();IIC_SendByte(0x91);dat=IIC_RecByte();IIC_Stop();return dat;
}

iic.h驱动函数:

#ifndef _IIC_H
#define _IIC_Hvoid IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
//void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);unsigned char read_adc(unsigned char add);void write_24c02(unsigned char add,unsigned char dat);
unsigned char read_24c02(unsigned char add);#endif

感谢阅读,如有不足之处,欢迎来指正。谢谢!

蓝桥杯单片机省赛——第五届(模拟智能灌溉系统)相关推荐

  1. 蓝桥杯单片机省赛——第四届“模拟智能灌溉系统”程序

    文章目录 前言 一.任务要求 二.代码部分 1.蜂鸣器控制部分 2.继电器控制部分 3.LED控制部分 4.定时器设置部分 5.数码管动态刷新程序 6.总代码 前言 程序是之前打的,没有进行过优化,希 ...

  2. 蓝桥杯单片机省赛第五届简易温度采集与控制装置(第六届模拟赛)

    如果有用请点赞,还会继续更新的 题目: 思路: 用两个定时器来分别完成LED闪烁和读取温度 源代码: main.c #include"reg52.h" #include" ...

  3. 蓝桥杯单片机第四届省赛题详细讲解(模拟智能灌溉系统)

    看之前强烈建议先自己做一遍!!! 整个工程文件(有注释讲解) 网盘链接 先上演示效果 蓝桥杯单片机第五届模拟智能灌溉系统 首先依旧从赛题的系统框图开始讲起 首先需要做的是将系统框图里的各部分模块提前调 ...

  4. 蓝桥杯第五届省赛模拟试题--“模拟智能灌溉系统”

    题目要求 功能简述 要求"模拟智能灌溉系统" 能够实现土壤湿度测量. 土壤湿度和时间显示. 湿度阈值设定及存储等基本功能. 通过电位器 Rb2 输出电压信号,模拟湿度传感器输出信号 ...

  5. 【第十三届蓝桥杯单片机省赛模拟冲刺01】

    第十三届蓝桥杯单片机省赛模拟冲刺 赛前一两周一定要多练习,把之前写过的程序在好好看看,把每个模块的代码都多敲几遍,把常考的每个模块部分都吃透,如果理解不了的趁时间还比较充足该背的背牢.同时在准备编程题 ...

  6. 第四届蓝桥杯单片机省赛 自动灌溉系统

    第四届蓝桥杯单片机省赛 自动灌溉系统 新手.所用驱动为大赛提供驱动 #include<stc15f2k60s2.h> #include "intrins.h"#defi ...

  7. 【蓝桥杯】第十三届蓝桥杯单片机国赛 代码程序

    第十三届蓝桥杯单片机国赛 程序 题目 hex文件 代码 工程文件 B站视频 更多资料 题目 历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这 ...

  8. 第八届蓝桥杯单片机省赛----程序题

    main.c程序 #include<stc15f2k60s2.h> #include "ds18b20.h" #include <ds1302.h>#def ...

  9. 第十三届“蓝桥杯”单片机省赛——程序设计题

    第十三届"蓝桥杯"单片机省赛--程序设计题 在比赛时候编写,代码仅供参考 如有不足,多多指教 1.题目 2.代码 main.c程序 #include "reg52.h&q ...

最新文章

  1. 全国大学生智能汽车竞赛-讯飞赛道开始报名啦!
  2. Hikari连接池配多大合适
  3. 不拥抱算法的张小龙,还能带着微信继续避免失败?
  4. 监控Squid运行脚本
  5. Image(支持 XML 序列化),注意C#中原生的Image类是无法进行Xml序列化的
  6. python语言程序设计实验教程答案实验三_20194220 实验三《Python程序设计》实验报告...
  7. 怪兽充电启动招股:2020年业绩下滑五成,小米、高瓴参与认购
  8. wireshark win7无响应
  9. 微信公众号通知和服务通知
  10. react-native 创建新的项目
  11. 没有网线接口的MacBook电脑怎么连接有线网络?USB外置网卡来帮忙
  12. 极限中0除以常数_考研数学极限重难点讲解003期【无穷小量和无穷大量】
  13. [安卓开发] 快递物流信息布局
  14. python百分比堆积条形图_绘制比例数据python(堆积条形图)
  15. MySQL 高可用之MMM
  16. SHT-31温湿度传感器资料整理
  17. 从粗放式到精益化编程
  18. Before you can run VMware, several modules must be compiled and loaded into the running kernel.
  19. 定位教程6---上下相机
  20. 事业单位计算机岗位职业职责,事业单位有哪些职业分类,都有哪些岗位?

热门文章

  1. 基于ATX的app自动化
  2. 慕课网—前端开发工具SublimeTex实用技巧{黑客教父部落}
  3. 什么是ROC曲线?为什么要使用ROC?以及 AUC的计算
  4. 美陆军正在开展人工智能实战演练
  5. 机器学习实战:K-近邻(KNN)算法识别26个大写英文字母(A到Z)(含拍照检验步骤详解)
  6. 世界历史上10位征服过最广大土地的人
  7. Jquery文本域(textarea)改变事件
  8. 微信通讯录java实现_原生JS实现微信通讯录
  9. html+css 实现红绿灯效果
  10. 转---蓝海战略之父重谈“蓝海”