51单片机:蓝桥杯省赛自动售水机分析与完整设计


1、写在前面的话

整理下之前蓝桥杯比赛的代码吧,里面其实很多设计的思路,难能可贵,有机会把STM32的也整理下,可以的话把这些比赛其中的几个题目使用ARM-A的S5PV210来实现。


2、问题解决思路


01 整体分析

开发51单片机的时候,使用之前的那个模板(IAP15芯片),提高开发的效率,这个模板之前有,就不说了,以后直接使用,这次用的是矩阵键盘来写的,实现的功能是一样的,有时间会把独立按键的也弄好。


02 独立按键单元

问题:
S7为出水控制按键,按下后,售水机持续出水(继电器接通,指示灯L10点亮)。
S6为停水控制按键,按下后,停止出水(继电器断开,指示灯L10熄灭)。

设计:整个题目只用到了两个按键,S7和S6,这两个独立按键就可以实现了,但还是用矩阵键盘先用下,因为比赛一般考的是矩阵键盘。模板中也实现了矩阵键盘的状态机检测,大概就是通过定时器和按键状态变量来进行判断。我们只需要在相应的while内的case下写某个按键按下后的处理程序。

备注:
01 继电器的断开和接通如何理解?题目说继电器接通的时候L10是点亮的,既然点亮,那么m2就会和K1进行接通,这个接通导致L10两端有电位差,会亮。因此,我们得出一个结论,当继电器接通的时候,m2和K1是接通的。此时继续分析,N_RELAY应该是0,对应P04应该是1。
02
出水:P2=0xa0;relay=1;buzzer=0;P2=0x00;
停水:P2=0xa0;relay=0;buzzer=0;P2=0x00;


03 数码管显示单元

问题:
01 通过4位数码管DS1显示费率,单位为元/升,保留2位有效数字;
02 通过4位数码管DS2显示当前出水总量(出水时,单位为升)和总价(停止时,单位为元):
按下出水按键S7后,清除数码管DS2显示数据,数码管DS2实时显示出水量(保留两位有效数字),在出水状态下,再次按下S7,不会影响出水状态,直到按下停止按键 S6 为止;
按下停止出水按键S6后,数码管DS2显示总价(保留两位有效数字)。
03 假定水价为0.5 元/升,出水速度为100毫升/秒。
04 一次出水总量达到99.99L时,继电器自动断开,数码管显示DS2显示价格。

示例:
在这里插入图片描述
分析:
01 数码管显示一半在定时器里面使用扫描的方式,按键是10ms一次判断,数码管是3ms一次扫描。

// 扫描的标准代码
P2=0xc0;P0=0;P2=0;    // 消除数码管残影
P2=0xe0;P0=~smg_du[i];P2=0;  
P2=0xc0;P0=smg_wei[i];P2=0;  // 位选择循环,全部显示出来
i++;
if(i==8) i=0;

02 数码管DS1显示费率,单位为元/升,保留2位有效数字,因为费率是固定的,这个部分是没有任何改动的。因此,只需要给对应的显示数组附上相应的变量就好了,这里我们定义一个显示的数组on_display就是用来显示,出水的时候的数码管数据的,同理,关闭的时候,也定义一个数码管显示数组off_display。

03 后面的四位DS2是用来显示出水量的,故需要定义一个出水量变量water_v,这个变量需要使用unsigned int的类型,一开始初始化为0就好了,分析每一秒增加0.1L,这样0.1s就只增加0.01L。所以,我们可以使用0.1s来进行定时,这种定时可以显示到数码管DS2的最后一位。增长的时候比较有动感,在定时器中使用每100ms进行判断,到时之后清零,并给water_v进行加0.01的操作。

04 比较糟糕的是,我们变量一般都会用正数,小数显示的时候会比较麻烦,因此,可以做个灵活的变化,原先1秒对应0.1L,我们就可以使用,相当于定义一个四位数,然后每一秒+10即可,直到最大的99.99,但是这样第四位不会变化,为此,可以转化为0.1秒对应0.01L,也就是每一秒+1就行了。

05 价格方面,直接乘以0.5就好了,因为这个四位数,实际是以ml为单位的,显示的时候是用L为单位。相对应的关系,乘以0.5的时候,是以ml为单位的,显示的时候还是用L为单位。


04 AD转换单元

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

分析:按照0~255对应0~5V,我们只需要将0~1.25V的对应值算出来,之后对读取的数据进行IF判断,就可以控制等来作显示信息了。


3、备注

01 其实难度不是很大,可能是因为前几届的原因了。
02 注意变量的声明,出水开关的控制变量,不同显示下的显示数组等。
03 源代码的注释版本和原题会一起上传上来。
04 之后有什么更新的,在继续补充到这里面来。


  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学不懂啊阿田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值