文章目录

  • 前言
  • 一、任务要求
  • 二、代码部分
    • 1.蜂鸣器控制部分
    • 2.继电器控制部分
    • 3.LED控制部分
    • 4.定时器设置部分
    • 5.数码管动态刷新程序
    • 6.总代码

前言

程序是之前打的,没有进行过优化,希望能互相学习并借鉴


一、任务要求



二、代码部分

1.蜂鸣器控制部分

bit on
bit----------C51扩展的变量类型
bit和int char之类的差不多,只不过char=8位, bit=“1位而已”,都是变量
其数据有两种取值:0和1,在输入0以外的其他值时,系统均把它们当1看待
一般来说我们可以用于表示真、假或是、否等二值选择

on ----------自定义的变量
这里主要是设置两种模式
on为0时关闭继电器,为1时开启蜂鸣器


为什么是0x40开启蜂鸣器

0x40转换成二进制是 100 0000,对应上图,蜂鸣器位置1,其他置0

代码如下:

void buzz(bit on)
{P2=((P2&0x1f)|0xa0);if(on)P0=0x40;elseP0=0x00;P2&=0x1f;
}

2.继电器控制部分

代码如下:

void jdq(bit on)
{P2=((P2&0x1f)|0xa0);if(on)P0=0x1f;elseP0=0x00;P2&=0x1f;
}

3.LED控制部分

int类型:int类型时有符号的整数,即int类型的值可以是正整数或者负整数

i ----------自定义的变量
这里主要是控制那些灯亮

代码如下:

void led(int i)
{P2=((P2&0X1F)|0X80);P0=i;P2&=0X1F;
}

4.定时器设置部分

TMOD=0x10 :
作用:设置定时器1为方式1模式(16位定时器/计数器)。

TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;

作用:设置初始值约为1000,可以简单理解为0.1s 刷新一次

代码如下:

void din()
{TMOD=0X10;TH1=(65536-11059/12)/256;TL1=(65536-11059/12)%256;TR1=1;EA=1;ET1=1;
}


或者也可以用stc直接生成,这是之前打的代码,之后就一般用stc了

5.数码管动态刷新程序

代码如下:

void display()
{P2=((P2&0x1f)|0xe0);P0=0xff;P2&=0x1f;P2=((P2&0x1f)|0xc0);P0=1<<diswela;P2&=0x1f;P2=((P2&0x1f)|0xe0);P0=dula[disdula[diswela]];P2&=0x1f;if(++diswela>=8)diswela=0;
}

· 1.问: 第一个P0=0xff;具体表达什么意思
答:相当于清屏,消隐

  1. 问:第二个P0=1<<diswela;具体表达什么意思
    答:diswela(全局变量)用来选定当前数码管显示位置,例如diswela=0时,点亮选中第一个数码管,diswela=1时,选中第二个数码管,只有当选中的时候才能将位码的值传给他,而这段代码也要和最下面这个一起看
if(++diswela>=8)diswela=0;

而这里的表示的意思,按顺序选择第一到第八个数码管

  1. 问:第三个P0=dula[disdula[diswela]]; 具体表达什么意思
    答:
    dula[ ]放置段码的数组,简单理解就是数码管上显示0-9的数组
    disdula[ ]放置你自己想选择的数字的数组
    dula[disdula[diswela]]在数码管上显示的具体数字
    举个例子:
    前置条件disdula[ ]={5,1,2,3,4,5,6};
    如果我想让数码管的第一位显示一个数字5的话,那这个函数会怎么样
    diswela=0------表示选择第一位数码管
    disdula[diswela] 变成了 disdula[0]-------------表示用你在这里的第一个数字5
    dula[disdula[diswela]]] 变成了 dula[5]-----------在八位数码管显示5

6.总代码

用蓝桥杯官方提供的驱动

#include<stc15f2k.h>
#include<iic.h>
#include<ds1302.h>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
char ds1302_write[]={0X80,0x82,0x84};
char ds1302_read[]={0X81,0x83,0x85};
char time[]={0,30,8};
char dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
char disdula[]={0,0,0,0,0,0,0,0};
int diswela,ms,key,sign,date,shezhi=3;
int date_1;
bit flag;void buzz(bit on)
{P2=((P2&0x1f)|0xa0);if(on)P0=0x40;elseP0=0x00;P2&=0x1f;
}void jdq(bit on)
{P2=((P2&0x1f)|0xa0);if(on)P0=0x1f;elseP0=0x00;P2&=0x1f;
}void led(int on)
{P2=((P2&0x1f)|0x80);P0=on;P2&=0x1f;
}void delay(int x)
{int i;while(x--)for(i=0;i<5*123;i++);
}void din()
{TMOD=0X10;TH1=(65536-11059/12)/256;TL1=(65536-11059/12)%256;TR1=1;EA=1;ET1=1;
}void display()
{P2=((P2&0x1f)|0xe0);P0=0xff;P2&=0x1f;P2=((P2&0x1f)|0xc0);P0=1<<diswela;P2&=0x1f;P2=((P2&0x1f)|0xe0);P0=dula[disdula[diswela]];P2&=0x1f;if(++diswela>=8)diswela=0;
}void display_ds1302()
{disdula[0]=time[2]/16;disdula[1]=time[2]%16;disdula[2]=10;disdula[3]=time[1]/16;disdula[4]=time[1]%16;disdula[5]=11;disdula[6]=date/10;disdula[7]=date%10;
}void bcddce()
{int i;for(i=0;i<3;i++){time[i]=((time[i]/10)<<4)|(time[i]%10);}
}void ds_write()
{int i;bcddce();Write_Ds1302_Byte(0x8e,0x00);for(i=0;i<3;i++){Write_Ds1302_Byte(ds1302_write[i],time[i]);}Write_Ds1302_Byte(0x8e,0x80);
}void ds_read()
{int i;for(i=0;i<3;i++){time[i]=Read_Ds1302_Byte(ds1302_read[i]);}
}char ad()
{int date;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x03);IIC_WaitAck();IIC_Stop();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();date=IIC_RecByte();IIC_WaitAck();IIC_SendAck(1);IIC_Stop();if(date>=255)date=254;date=(date*100)/255;return date;
}char anjian()
{static int key_up=1;int keyscan=0;if(key_up&&(s7==0||s6==0||s5==0||s4==0)){key_up=0;delay(20);if(s4==0)keyscan=4;else if(s5==0)keyscan=5;else if(s6==0)keyscan=6;else if(s7==0)keyscan=7;}else if(s7==1&&s6==1&&s5==1&&s4==1)key_up=1;return keyscan;
}void zawu()          //¼ÌµçÆ÷ºÍledµÄÄÚÈÝ
{if(date>=date_1)jdq(0);else if(date<date_1)jdq(1);
}void display_zidong() //shezhiΪ0µÄʱºòΪ×Ô¶¯£¬1µÄʱºòΪÊÖ¶¯,3µÄʱºòΪ³£¹æ
{disdula[0]=10;disdula[1]=10;disdula[2]=11;disdula[3]=11;disdula[4]=11;disdula[5]=11;disdula[6]=date_1/10;disdula[7]=date_1%10;
}void at24c02_write(int add,int date)
{IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_SendByte(date);IIC_WaitAck();IIC_Stop();
}char at24c02_read(int add)
{int date;IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Start();IIC_SendByte(0xa1);IIC_WaitAck();date=IIC_RecByte();IIC_WaitAck();IIC_SendAck(1);IIC_Stop();    return date;
}void main()
{   buzz(0);jdq(0);led(0xff);date_1=at24c02_read(0x01);if(date_1==0)date_1=50;delay(10);din();led(0xfe);ds_write();while(1){        if(shezhi==1)led(0xfd);   else if(shezhi==0){display_zidong();}     else if(shezhi==3){       zawu(); display_ds1302();ds_read(); }       if(flag==1){date=ad();           flag=0;key=anjian();switch(key){case 4:if(shezhi==0){date_1--;if(date_1==0)date_1=0;}if(shezhi==1){if(sign==0){jdq(1);}                  }break;case 5:if(shezhi==0){date_1++;if(date_1==99)date_1=99;}                   if(shezhi==1){if(sign==0){jdq(0);}}break;case 6:if(shezhi==3){shezhi=0;led(0xfe);}else if(shezhi==0){shezhi=3;at24c02_write(0x01,date_1);}if(shezhi==1){if(sign==0){sign=1;buzz(1);}else if(sign==1){sign=0;buzz(0);}}break;case 7:if(shezhi==3)shezhi=1;else if(shezhi==1){shezhi=3;led(0xfe);}break;}}}
}void qa() interrupt 3
{TH1=(65536-11059/12)/256;TL1=(65536-11059/12)%256;ms++;if(!(ms%100))flag=1;if(ms>=1500)ms=0;display();
}

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

  1. 第四届-模拟智能灌溉系统

    一. 题目概述: 目的: 通过电位器 Rb2 输出电压信号,模拟湿度传感器输出信号,再通过AD 采集完成湿度测量功能: 通过 DS1302 芯片提供时间信息: 通过按键完成灌溉系统控制和湿度阈值调整功 ...

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

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

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

    蓝桥杯单片机省赛--第五届(模拟智能灌溉系统) 一.题目内容 二.程序源代码 1.主函数 2.ds1302驱动函数 3.iic驱动函数 注意:驱动代码需要改动一下,可以将原驱动代码按照下面的代码修改 ...

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

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

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

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

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

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

  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. Linux预备知识(一):进程隔离
  2. mysql子查询缺点_[慢查优化]慎用MySQL子查询,尤其是看到DEPENDENT SUBQUERY标记时
  3. windowsXP下安装Qt4.8
  4. oracle冷备份/恢复
  5. Nhibernate 3.0 cookbook学习笔记 配置与架构
  6. canvas 平滑运动_什么是电视上的运动平滑?人们为什么讨厌它?
  7. windowswps怎么以文件形式发送_手机WPS怎么以文件形式发送
  8. 信息学奥赛一本通(1238:一元三次方程求解)
  9. java实现创建窗口
  10. R语言ETL系列:过滤(filter)
  11. crontab mysql命令_crontab命令使用介绍
  12. hashmap扩容_聊一聊HashMap
  13. 前端布局篇之文字居中显示
  14. STM32LED--基于HAL库(LCD与LED冲突?一文看懂如何精准劝架)
  15. 没想到 Python 中竟然还藏着这些稀奇古怪的东西...
  16. 三脚架代表人生_如何选择和使用三脚架
  17. JFinal极速开发微信公众号
  18. Java给PNG透明图片加水印,亲测可用
  19. CTF之懵懂时期系列---后台登录
  20. 云笔记有哪些好用的功能,这4款云笔记一定要试试

热门文章

  1. 把videos对应标签的.avi文件转为kinetics400的格式,其中所包含的格式有.csv和.json格式
  2. 一秒钟看懂SaaS、CRM、OA、ERP、HR、进销存
  3. 已知四种原子的质量,C/H/O/N分别为12/1/16/14,输入分子式,计算分子量。例如H2O,分子量为1*2+16=18,有如HC11N2,分子量为1+12*11+14*2=161
  4. 自己写的听力训练软件+背单词
  5. 小红书6000浏览量算高吗?笔记浏览量提升技巧看这里
  6. 国仁网络资讯:短视频拍摄如何上热门;掌握这8大拍摄运镜手法即可。
  7. 家常土豆泥饼制作方法步骤图解
  8. 自动化运维平台功能大纲
  9. android 8.0 l2tp问题,Android 8.0 的部分坑及对应解决方法
  10. 7-4 森森旅游 (20 分)