蓝桥杯大赛单片机开发与设计第三届省赛试题--自动售水机
功能简述
通过竞赛硬件平台模拟小区自动售水机的工作流程:通过按键控制售水机水流出和停止;通过数码管显示费率、出水量及总费用;通过光敏电阻检测环境亮度,在亮度过低的情况下,自动开灯。系统硬件电路主要由单片机控制电路、数码管显示电路、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; } }
完整程序及参赛试题请参考下列文件: