蓝桥杯大赛单片机开发与设计第三届省赛试题--自动售水机
功能简述
通过竞赛硬件平台模拟小区自动售水机的工作流程:通过按键控制售水机水流出和停止;通过数码管显示费率、出水量及总费用;通过光敏电阻检测环境亮度,在亮度过低的情况下,自动开灯。系统硬件电路主要由单片机控制电路、数码管显示电路、AD转换电路及功能按键组成。系统框图如图1所示:

下面附上部分程序:
#include <STC15F2K60S2.H>
#include "iic.h"
unsigned char code smgduan[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char yi,er,san,si,wu,liu,qi,ba,duan[8];
unsigned char guangmin;
unsigned int ml,RMB;
unsigned char kai,guan,SMG;
unsigned char P30_S7,P31_S6;
void Delay1ms(unsigned int ms);
void Display1();
void Display2();
void Timer0Init(void);
void Key_Scan();
void GongNeng();
void main()
{
P2=0XA0;P0=0X00;//关闭蜂鸣器和继电器
P2=0X80;P0=0XFF;//关闭LED灯
Timer0Init();
while(1)
{
Display2();
Display1();
guangmin=IIC_Read(0x01);
GongNeng();
Key_Scan();
}
}
void Display1()
{
unsigned char a;
for(a=0;a<8;a++)
{
P2=0XC0;
P0=1<<a; //0000 0001 0000 0100
P2=0XFF;
P0=duan[a];
Delay1ms(1);
}
P2=0XC0; P0=0XFF;//消隐,解决最后一个数码管高亮度
P2=0XFF; P0=0XFF;
}
void Display2()
{
duan[0] = smgduan[yi];
duan[1] = smgduan[er]&0x7f;
duan[2] = smgduan[san];
duan[3] = smgduan[si];
duan[4] = smgduan[wu];
duan[5] = smgduan[liu]&0x7f;
duan[6] = smgduan[qi];
duan[7] = smgduan[ba];
}
void Delay1ms(unsigned int ms) //@11.0592MHz
{
unsigned char i, j;
_nop_(); _nop_(); _nop_();
i = 11*ms;
j = 190;
do { while (--j); } while (--i);
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void Timer0() interrupt 1
{
unsigned char tt;
tt++;
if(tt==10) { ml++; tt=0; }
}
void Key_Scan()
{
if(P30==0) { P30_S7=1; }
if(P31==0) { P31_S6=1; }
if((P30_S7==1)&&(P30==1)) { kai=1; P30_S7=0; }
if((P31_S6==1)&&(P31==1)) { guan=1; P31_S6=0; }
}
void GongNeng()
{
if(kai==1)
{ TR0=1; P2=0XA0; P0=0X10; kai=0; SMG=0; }
if(guan==1)
{ TR0=0; P2=0XA0; P0=0X00; guan=0; SMG=1; RMB=ml*0.5; ml=0; }
if(SMG==0)
{ yi=11;er=0;san=5;si=0;wu=ml/1000;liu=ml%1000/100;qi=ml%100/10;ba=ml%10; }
else if(SMG==1)
{ yi=11;er=0;san=5;si=0;wu=RMB/1000;liu=RMB%1000/100;qi=RMB%100/10;ba=RMB%10; }
if(ml==9999) { guan=1;}
if(guangmin<64) { P2=0X80;P0=0XFE; }
else { P2=0X80;P0=0XFF; }
}完整程序及参赛试题请参考下列文件:
我要赚赏金
