蓝桥杯单片机省赛——第五届(模拟智能灌溉系统)
蓝桥杯单片机省赛——第五届(模拟智能灌溉系统)
- 一、题目内容
- 二、程序源代码
- 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.蜂鸣器控制部分 2.继电器控制部分 3.LED控制部分 4.定时器设置部分 5.数码管动态刷新程序 6.总代码 前言 程序是之前打的,没有进行过优化,希 ...
- 蓝桥杯单片机省赛第五届简易温度采集与控制装置(第六届模拟赛)
如果有用请点赞,还会继续更新的 题目: 思路: 用两个定时器来分别完成LED闪烁和读取温度 源代码: main.c #include"reg52.h" #include" ...
- 蓝桥杯单片机第四届省赛题详细讲解(模拟智能灌溉系统)
看之前强烈建议先自己做一遍!!! 整个工程文件(有注释讲解) 网盘链接 先上演示效果 蓝桥杯单片机第五届模拟智能灌溉系统 首先依旧从赛题的系统框图开始讲起 首先需要做的是将系统框图里的各部分模块提前调 ...
- 蓝桥杯第五届省赛模拟试题--“模拟智能灌溉系统”
题目要求 功能简述 要求"模拟智能灌溉系统" 能够实现土壤湿度测量. 土壤湿度和时间显示. 湿度阈值设定及存储等基本功能. 通过电位器 Rb2 输出电压信号,模拟湿度传感器输出信号 ...
- 【第十三届蓝桥杯单片机省赛模拟冲刺01】
第十三届蓝桥杯单片机省赛模拟冲刺 赛前一两周一定要多练习,把之前写过的程序在好好看看,把每个模块的代码都多敲几遍,把常考的每个模块部分都吃透,如果理解不了的趁时间还比较充足该背的背牢.同时在准备编程题 ...
- 第四届蓝桥杯单片机省赛 自动灌溉系统
第四届蓝桥杯单片机省赛 自动灌溉系统 新手.所用驱动为大赛提供驱动 #include<stc15f2k60s2.h> #include "intrins.h"#defi ...
- 【蓝桥杯】第十三届蓝桥杯单片机国赛 代码程序
第十三届蓝桥杯单片机国赛 程序 题目 hex文件 代码 工程文件 B站视频 更多资料 题目 历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这 ...
- 第八届蓝桥杯单片机省赛----程序题
main.c程序 #include<stc15f2k60s2.h> #include "ds18b20.h" #include <ds1302.h>#def ...
- 第十三届“蓝桥杯”单片机省赛——程序设计题
第十三届"蓝桥杯"单片机省赛--程序设计题 在比赛时候编写,代码仅供参考 如有不足,多多指教 1.题目 2.代码 main.c程序 #include "reg52.h&q ...
最新文章
- 全国大学生智能汽车竞赛-讯飞赛道开始报名啦!
- Hikari连接池配多大合适
- 不拥抱算法的张小龙,还能带着微信继续避免失败?
- 监控Squid运行脚本
- Image(支持 XML 序列化),注意C#中原生的Image类是无法进行Xml序列化的
- python语言程序设计实验教程答案实验三_20194220 实验三《Python程序设计》实验报告...
- 怪兽充电启动招股:2020年业绩下滑五成,小米、高瓴参与认购
- wireshark win7无响应
- 微信公众号通知和服务通知
- react-native 创建新的项目
- 没有网线接口的MacBook电脑怎么连接有线网络?USB外置网卡来帮忙
- 极限中0除以常数_考研数学极限重难点讲解003期【无穷小量和无穷大量】
- [安卓开发] 快递物流信息布局
- python百分比堆积条形图_绘制比例数据python(堆积条形图)
- MySQL 高可用之MMM
- SHT-31温湿度传感器资料整理
- 从粗放式到精益化编程
- Before you can run VMware, several modules must be compiled and loaded into the running kernel.
- 定位教程6---上下相机
- 事业单位计算机岗位职业职责,事业单位有哪些职业分类,都有哪些岗位?