蓝桥杯省赛笔记之2012省赛试题

蓝桥杯省赛笔记之2012省赛试题

自动售水机

2012年的试题可谓新手入门级别,可以将此试题进行循序渐进的学习的起点
= {   I I C 线     考点=\left\{ \begin{aligned} && \ IIC总线驱动 \\ && \ 独立键盘 \\ && \ 定时器 \end{aligned} \right.
在这里插入图片描述

设计任务及要求

1. 按键控制单元
设定按键 S7 为出水控制按键,当 S7 按下后,售水机持续出水(继电器接通,指示灯 L10 点亮)。设定按键 S6 为停水控制按键,当 S6 按下后,停止出水(继电器断开,指示灯 L10 熄灭)。
2. 数码管显示单元
通过 4 位数码管 DS1 显示费率,单位为元/升,保留 2 位有效数字;
通过 4 位数码管 DS2 显示当前出水总量(出水时,单位为升)和总价(停止时,单位为元):按下出水按键 S7 后,清除数码管 DS2 显示数据,数码管 DS2 实时显示出水量(保留两位有效数字),在出水状态下,再次按下 S7,不会影响出水状态,直到按下停止按键 S6 为止;按下停止出水按键 S6 后,数码管 DS2 显示总价(保留两位有效数字)。
3. AD转换单元
通过光敏电阻和PCF8591组成的亮度转换电路检测环境亮度,当PCF8591输入通道电压小于1.25V时,L1点亮,否则熄灭。
4. 系统说明
假设水价0.5元/升,出水速度100ml/s
一次出水量到99.99L,继电器断开,数码管显示DS2价格
5. 设计部分
假定自动售水机中存在一出水量检测传感器,输出信号为 4mA 到 20mA 直流信号,使用运算放大器设计接口电路,使得输入 4mA,输出 0V;输入20mA,输出 5V。输入与输出满足线性关系。

笔记内容

1.IIC.h官方提供,只需调用。
2.光敏电阻 0X01
滑动电阻器 0X03
3.显示数码管如何加"."
//3.1 另建一个数组,将原数组的第一位减8(0X80变成0X00)
//3.2 P0=tab[yi] || 0x7F;
4. 继电器程序:P2=0XA0;P0=0X10//开
5. 定时器初始化程序可以先不写EA=1;ET0=1,当按键决定定时器是否开启的时候可以在独立按键里写EA=1;ET0=1
6. 需要注意的是,IIC.Read()程序官方不提供,得需要自己写。

代码块

呈上代码:(代码非原创,大家可以品一品)
本届实在没啥值得注释的地方

在这里插入代码片
#include<STC15F2K60S2.H>
#include "intrins.h"
#include "IIC.h" 

#define uchar unsigned char
#define uint unsigned int
sbit SDA=P2^1;
sbit SCL=P2^0;
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar yi,er,san,si,wu,liu,qi,ba;
bit S4,S5,S6,S7;
uchar num[8];
uchar AD;

void Allinit(void);
void Delayms(int ms);
void Display1(uchar yi,uchar er);
void Display2(uchar san,uchar si);
void Display3(uchar wu,uchar liu);
void Display4(uchar qi,uchar ba);
unsigned char AD_Read(unsigned char add);
void main(void)
{
 Allinit();
 si=1;wu=2;liu=3;qi=4;ba=5;
 while(1)
 {
  AD=AD_Read(0x03);
  yi=AD/100;er=AD%100/10;san=AD%10;
  Display1(yi,er);
  Display2(san,si);
  Display3(wu,liu);
  Display4(qi,ba);
 }
}
unsigned char AD_Read(unsigned char add)
{
 unsigned char temp;
 IIC_Start();
 IIC_SendByte(0x90);
 IIC_WaitAck();
 IIC_SendByte(add);
 IIC_WaitAck();
 IIC_Stop();
 
 IIC_Start();
 IIC_SendByte(0x91);
 IIC_WaitAck();
 temp=IIC_RecByte();
 IIC_Stop(); 
 
 return temp;
}
void Delay6us()  //@11.0592MHz
{
 unsigned char i;
 i = 14;
 while (--i);
}
void Display1(uchar yi,uchar er)
{
 P2=0XC0;
 P0=0X01;
 P2=0XE0;
 P0=tab[yi];
 Delayms(1);
 
 P2=0XC0;
 P0=0X02;
 P2=0XE0;
 P0=tab[er];
 Delayms(1);
}
void Display2(uchar san,uchar si)
{
 P2=0XC0;
 P0=0X04;
 P2=0XE0;
 P0=tab[san];
 Delayms(1);
 
 P2=0XC0;
 P0=0X08;
 P2=0XE0;
 P0=tab[si];
 Delayms(1);
}
void Display3(uchar wu,uchar liu)
{
 P2=0XC0;
 P0=0X10;
 P2=0XE0;
 P0=tab[wu];
 Delayms(1);
 
 P2=0XC0;
 P0=0X20;
 P2=0XE0;
 P0=tab[liu];
 Delayms(1);
}
void Display4(uchar qi,uchar ba)
{
 P2=0XC0;
 P0=0X40;
 P2=0XE0;
 P0=tab[qi];
 Delayms(1);
 
 P2=0XC0;
 P0=0X80;
 P2=0XE0;
 P0=tab[ba];
 Delayms(1);
}
void Allinit(void)
{
 P2=0XA0;//打开控制蜂鸣器的573
 P0=0X00;//关闭蜂鸣器继电器
 
 P2=0XC0;//打开控制数码管位选的573
 P0=0XFF;//选中所有数码管
 P2=0XE0;//打开控制数码管段选的573
 P0=0XFF;//关闭所有的数码管
 
 P2=0X80;//打开控制LED的573
 P0=0XFF;//关闭所有的LED
 }
 void Delayms(int ms)
{
 int i,j;
 for(i=0;i<ms;i++)
  for(j=845;j>0;j--);
}

都看到这里了,点个赞呗!

猜你喜欢

转载自blog.csdn.net/bimox/article/details/107896401