自动售水机

  • 功能简述:
  • 设计任务及要求
  • 实现代码

真题内容取自: 无语凝烟

功能简述:

  1. 通过竞赛硬件平台模拟小区自动售水机的工作流程,具体的:通过按键控制售水机水流出和停止;通过数码管显示费率、出水量及总费用;通过光敏电阻检测环境亮度,在亮度过低的情况下,自动开灯。系统硬件电路主要由单片机控制电路、数码管显示电路、A/D 转换电路及功能按 键组成。系统框图如图 1 所示:

设计任务及要求

  1. 按键控制单元
    设定按键 S7 为出水控制按键,当 S7 按下后,售水机持续出水(继电器接通,指示 灯 L10 点亮)。设定按键 S6 为停水控制按键,当 S6 按下后,停止出水(继电器断开, 指示灯 L10 熄灭)。

  2. 数码管显示单元
    通过 4 位数码管 DS1 显示费率,单位为元/升,保留 2 位有效数字;通过 4 位数码管 DS2 显示当前出水总量(出水时,单位为升)和总价(停止时,单 位为元):按下出水按键 S7 后,清除数码管 DS2 显示数据,数码管 DS2 实时显示出水 量(保留两位有效数字),在出水状态下,再次按下 S7,不会影响出水状态,直到按下停 止按键 S6 为止;按下停止出水按键 S6 后,数码管 DS2 显示总价(保留两位有效数字)。
    例:当 S7 按下后,数码管示意图如图 2 所示:

    售水机出水状态数码管显示 当按键 S6 按下后,数码管示意图如图 3 所示:

  3. AD 转换单元
    通过光敏电阻 RD1 和 AD 转换芯片 PCF8591 组成的亮度检测电路(亮度值转换为 PCF8591 光敏电阻通道的电压)检测环境亮度;当 PCF8591 光敏电阻通道输入电压小 于 1.25 V 时,L1 点亮,大于 1.25V 时,L1 熄灭。

  4. 系统说明
    (1)假定水价为 0.5 元/升,出水速度为 100 毫升/秒;
    (2)一次出水总量达到 99.99L 时,继电器自动断开,数码管显示 DS2 显示价格。

实现代码

注意点:记得添加资源数据包中的两个iic的底层代码到考生文件夹中,同时需查看发送非应答中的实参是0还是1(即结束读pcf8591,最后要给数据总线SDA一个高电平,下图给了大概的位置,自己实现代码时,要留意一下!)

//config.h--用于声明头文件,声明函数,声明一些经常使用的变量或难书写的语句
#ifndef _CONFIG_H
#define _CONFIG_H
#include <STC15F2K60S2.H>//对应芯片函数头文件,定义了一些特殊功能寄存器
#include<intrins.h>
#include "iic.h"
//typedef unsigned char uchar;
#define uchar unsigned char
#define uint unsigned int
void Delay10us();       //@12.000MHz#endif
#include "config.h"
uchar n1 = 0, ad_val = 0;
uint cnt = 0, cnt1 = 0, v_val = 0;
uchar key_val = 0, key_cnt = 0;
bit key_flag = 0, flag_s6 = 0, flag_20ms = 0;
uchar dspcom = 0;
uchar dspbuf[8] = { 16, 0, 5, 0,  0, 0, 0, 0};
//共阴数码管段选表
uchar tab[] = {                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1void close_peripheral()
{//初始化led为全灭P2 = (P2 & 0x1f) | 0x80;P0 = 0xff;//初始化继电器,蜂鸣器不吸附,不发声P2 = (P2 & 0x1f) | 0xa0;P0 = 0xaf;P2 &= 0x1f;}void Timer0Init(void)     //2毫秒@12.000MHz
{AUXR &= 0x7F;     //定时器时钟12T模式TMOD &= 0xF0;      //设置定时器模式TMOD |= 0x01;     //设置定时器模式TL0 = 0x30;       //设置定时初值TH0 = 0xF8;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时ET0 = 1;EA = 1;
}void Timer1Init(void)      //50毫秒@12.000MHz
{AUXR &= 0xBF;     //定时器时钟12T模式TMOD &= 0x0F;      //设置定时器模式TL1 = 0xB0;       //设置定时初值TH1 = 0x3C;        //设置定时初值TF1 = 0;       //清除TF1标志TR1 = 0;      //定时器1根据S7是否按下来判断是否计时//这边注释就对了??具体为啥还不知道
//  ET1 = 1;
//  EA = 1;
}void display()
{//消隐P2 = (P2 & 0x1f) | 0xe0;P0 = 0xff;//位选P2 = (P2 & 0x1f) | 0xc0;P0 = 1 << dspcom;//段选P2 = (P2 & 0x1f) | 0xe0;P0 = ~tab[dspbuf[dspcom]];if (dspcom == 1 || dspcom == 5)P0 = (~tab[dspbuf[dspcom]]) & 0x7f;//小数点P2 &= 0x1f;if (++dspcom == 8){dspcom = 0;}
}void key_scanf()
{static char key_st = 0;switch(key_st){case 0:{P3 = 0x0f;if (P3 != 0x0f)key_st++;break;}case 1://由case0到case1需要20ms其实相当于消抖{P3 = 0x0f;if (P3 != 0x0f){key_st = 2;if (P30 == 0) key_val = 1;//s7if (P31 == 0) key_val = 2;//s6if (P32 == 0) key_val = 3;//s5if (P33 == 0) key_val = 4;//s4}else //按键抖动key_st = 0;break;}case 2:{P3 = 0x0f;if (P3 == 0x0f){key_st = 0;}break;}}}void init_pcf8591(unsigned char channel)
{IIC_Start();IIC_SendByte(0x90);//写IIC_WaitAck();IIC_SendByte(channel);  //ADC通道1IIC_WaitAck();IIC_Stop();Delay10us();
}unsigned char read_pcf8591(void)
{unsigned char temp;IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();temp = IIC_RecByte();IIC_SendAck(1);//发送非应答信号 !!!注意这个地方的改变,要跟资源数据包中的内容对照一下IIC_Stop();return temp;
}void main()
{close_peripheral();Timer0Init();//按键扫描和数码管显示Timer1Init();//用于出水总量和出水费用计算while(1){if (key_flag)//20ms一次按键扫描{key_scanf();key_flag = 0;}if (key_val == 1 && !flag_s6)//出水键S7按下并且停水控制按键S6未按下,此时即将持续出水{TR1 = 1;//S7按下开始计时if (TF1)//50ms自动溢出标志{TF1 = 0;n1++;}if (n1 == 2)//100ms增加0.01升总出水量{n1 = 0;cnt++;//100ms增加0.01升总出水量if (cnt > 9999)//一次出水总量达到 99.99L 时,继电器自动断开,停止出水{    TR1 = 0;cnt = 0;P2 = (P2 & 0x1f) | 0xa0;P0 = 0xaf;P2 &= 0x1f;}dspbuf[4] = cnt / 1000;dspbuf[5] = cnt / 100 % 10;dspbuf[6] = cnt / 10 % 10;dspbuf[7] = cnt % 10;}//按下S7键时,继电器吸附,蜂鸣器发声P2 = (P2 & 0x1f) | 0xa0;P0 |= 0x10;P2 &= 0x1f;P0=0xff;}//按下S6键if (key_val == 2){TR1 = 0;flag_s6 = 1;cnt1 = cnt / 2;     dspbuf[4] = cnt1 / 1000;dspbuf[5] = cnt1 / 100 % 10;dspbuf[6] = cnt1 / 10 % 10;dspbuf[7] = cnt1 % 10;//S6 按下后,停止出水(继电器断开,蜂鸣器不发声 指示灯 L10 熄灭)。P2 = (P2 & 0x1f) | 0xa0;P0 &= 0xaf;P2 &= 0x1f;P0=0xff;}//按下S6后我们就,清除数码管 DS2 显示数据,使得数码管 DS2 实时显示出水量if (key_val == 1 && flag_s6){cnt = 0;flag_s6 = 0;}//AD 转换单元每20ms采集数据    if (flag_20ms){flag_20ms = 0;init_pcf8591(0x01);ad_val = read_pcf8591();//ad_value:0--255v_val = ad_val * 100 / 51;// v_value:0--500 }//PCF8591 结合光敏电阻通道输入电压小于 1.25 V 时,L1 点亮,大于 1.25V 时,L1 熄灭。if (v_val < 125){P2 = (P2 & 0x1f) | 0x80;P0 = 0xfe;P2 &= 0x1f;}else {P2 = (P2 & 0x1f) | 0x80;P0 = 0xff;P2 &= 0x1f;}}}void timer0() interrupt 1
{TL0 = 0x30;       //设置定时初值,2msTH0 = 0xF8;        //设置定时初值display();if (++key_cnt == 10){ flag_20ms = 1;key_cnt = 0;key_flag = 1;//扫描按键的标志}
}void Delay10us()       //@12.000MHz
{unsigned char i;_nop_();_nop_();i = 27;while (--i);
}

《蓝桥杯真题》:1.自动售水机相关推荐

  1. 蓝桥杯真题2017-2021

    刷完近几年真题,感觉理解完之后,拿奖问题不大,本人这次获得2022年蓝桥杯javaB组省一,以下是历年javaB组省赛题目. 文章目录 2017年真题 一.购物单 二.纸牌三角形 三.承压计算 四.魔 ...

  2. 第八届蓝桥杯真题解析javaC组

    第八届蓝桥杯真题解析javaC组 文章目录 ***第八届蓝桥杯真题解析javaC组*** 前言 A.外星日历 B.兴趣小组 C.纸牌三角形 D.承压计算 E.杨辉三角 F.最大公共子串 G.Excel ...

  3. python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在19351936年应邀来中国清华大学讲学。。。

    python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学... 问题描述 全排列模板: 美国数学家维纳(N. ...

  4. 第五届蓝桥杯真题解析【JavaC组】

    第五届蓝桥杯真题解析[JavaC组] 业精于勤,荒于嬉:行成于思,毁于随.--韩愈 文章目录 ***第五届蓝桥杯真题解析[JavaC组]*** 前言 A:猜年龄 B:等额本金 C:猜字母 D:大衍数列 ...

  5. 【蓝桥杯真题】16天冲刺 Python

    距离比赛很快了,希望和我一起准备的PY党能更加熟练的掌握Python! 1.距离和(模拟赛填空题) 问题描述: 两个字母之间的距离定义为它们在字母表中位置的距离.例如 A和 C 的距离为 2,L 和  ...

  6. 蓝桥杯真题:三羊献瑞

    蓝桥杯真题:三羊献瑞 观查下面的加法算式: 其中相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写"三羊献瑞"所代表的4位数字(答案唯一),不要填写任何多余内容. 分析 ...

  7. # 2014年蓝桥杯真题CC++B组

    2014年蓝桥杯真题C/C++B组 1.啤酒和饮料 题目描述 啤酒每罐2.3元,饮料每罐1.9元,小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道她买的啤酒比饮料的数量多,请你计算他买了几罐啤 ...

  8. 蓝桥杯python省赛冲刺篇2——常用算法的详细解析及对应蓝桥杯真题:打表模拟法、递推递归法、枚举法、贪心算法、差分与前缀和

    注意:加了题目链接 目录 注意:加了题目链接 一.打表模拟法 介绍 1. 算式问题 题目描述 解析与代码演示 2. 求值 题目描述 解析与代码演示 3. 既约分数 题目描述 解析与代码演示 4. 天干 ...

  9. 第十届蓝桥杯c语言试题,第十届蓝桥杯真题编程题1-7解析(高级组).pdf

    scratch 少儿编程第十届蓝桥杯真题 7 大家好 ~今天我们来讲解 scratch 蓝桥杯第十届编程大题的第七道题. 同样,这道题也是非常有难度的一道题.一起来看一下吧 解析: 女孩的程序 1.在 ...

  10. 第九届蓝桥杯真题解析JavaC组

    第九届蓝桥杯真题解析JavaC组 文章目录 ***第九届蓝桥杯真题解析JavaC组*** 前言 A.哪天回家 B.猴子分香蕉 C.字母阵列 D.第几个幸运数 E.书号验证 F.打印大X G.缩位求和 ...

最新文章

  1. __cplusplus的用处
  2. linux为3种人准备了权限,linux的3种特殊权限
  3. Intellij IDEA 2019 自动生成 serialVersionUID
  4. 世上最“贵”的河:河里石头比黄金还值钱?甚至还有士兵驻守!
  5. 开发人员不可不知的六大JavaScript框架 传统网站网页转移动端方式
  6. LinQ To Object 基本用法
  7. 请拆招:将两个已排序集合分解成两个独立部分的集合和一个共有部分的集合?...
  8. 记一次mysql中文字符乱码的问题排查
  9. 【PostgreSQL-9.6.3】extract函数
  10. UIImageView的animationImages动画
  11. P5459 [BJOI2016]回转寿司
  12. bitmap存入mysql,[MySQL] mysql中bitmap的简单运用
  13. SQL Server自动备份存储过程和视图的方法
  14. Splunk 模式的中国践行者——日志易让日志分析更容易
  15. 移动硬盘 RAW修复
  16. 多台服务器集群部署方案
  17. 他下班时间写出4本书,2年引导几十万人踏入网络安全行业
  18. 聚苯硫醚的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. 系统重构的原则代码重构的原则
  20. 目标检测算法横向比较,包括backbone、特征融合、loss、proposal/anchor/heatmap、NMS、正负样本设置等

热门文章

  1. 音乐背景声提取 matlab,喜欢视频中的背景音乐,教你怎么提取里面的音频
  2. Nancy Web框架
  3. TortoiseGit(小乌龟)记住登录的账户
  4. 在线作图|如何绘制一张雷达图
  5. onvif server端集成到BOA服务器后不定时出现closewait问题
  6. 黄连解毒汤治疗月经过多
  7. Codeforces722E Research Rover dp+逆元+前缀和
  8. python爬虫-14-python获取数据之BeautifulSoup4库(下)
  9. 【ISO14229_UDS_0x86服务详解】
  10. 谈一谈|如何理解NP问题