蓝桥杯第3届省赛(单片机)_自动售水机
题目
这是2012年蓝桥杯的省赛的题目,也是单片机第一次加入蓝桥杯比赛系列,由于是初次加入蓝桥杯,所以这次比赛的自动售水机的题目(自动售水机)也比较简单,主要考察了IIC,独立按键,数码管显示,继电器和AD转化。
题目讲解
刚拿到比赛题目时我们首先要看清楚每次比赛对我们的要求,一般比赛的主要要求都会在设计任务及要求这一部分,所以看懂这一部分尤为重要,在这次的比赛设计比赛要求中,比赛方要求我们实现三大部分
1.按键控制单元
2.数码管显示
3.AD转化
那么我们现在就对这三部分进行讲解吧!
按键控制单元
有题可知,但我们按下S7这按钮时,数码管的DS2部分开始出水(也就是说S7按下时,DS2部分开始数据变化,开始显示出水毫升),当然在系统说明部分也告诉我们最大只可显示9999,并且S7按下时继电器是打开的——L10打开,所以当我们写代码的时候我们些S7按键控制的变量也要与继电器相联系。
同样S6也是,按下S6时,DS2部分显示我们的水价,而且继电器断开——L10熄灭。
数码管显示
数码管显示部分我认为是这道题里最简单的,当按键**S7,S6,**不同时,其数码管显示的也不同,当要记住,DS1部分是不变的,而且数码管在这里的数据变化我认为只要在定时器里加个变量连来改变就行了(可能有点模糊下面的代码我会详细讲解的,其实很简单的)
AD转化
这里主要涉及的是IIC的知识,通过IIC控制PCF89C51来控制光密电阻的电压从而控制led1的亮闪,其实也不难,只要把底层驱动代码修改一下就行了,然后再把相应的函数加到main函数就行。
代码
time.c
#include "time.h"
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=ET0=1; //打开定时器中断
}
(在这里我喜欢用12Mhz,因为比较精确)
time.h
#ifndef _TIME_H_ //格式——.h
#define _TIME_H_ //格式——.h
#include <STC15F2K60S2.H>
void Timer0Init(void);
#endif //格式——.h
smg.c
# include "smg.h"
unsigned char code tab []={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//这里主要是小数部分
unsigned char dspbuf[8]={
10,10,10,10,10,10,10,10};
void smg_display(void)
{
static unsigned char i; //静态变量
P0=0XFF;
P2=(P2&0X1F)|0XE0; //关闭段选
P2&=0X1F;
P0=(1<<i); //自左移i,== (0X01<<i)
P2=(P2&0X1F)|0XC0; //打开位选
P2&=0X1F;
P0=tab[dspbuf[i]]; //打开段选
P2=(P2&0X1F)|0XE0;
P2&=0X1F;
if(