一、系统方案
 1、设计使用两个按键分别为S1和S2及一个发光二极管LED。S1为出水控制按键,当S1按下,表示售水机持续出水,继电器(库元件relay)接通,指示灯LED亮。S2为停水控制键,当S2按下,继电器断开,停止出水,指示灯LED熄灭。
 2、用两片8LED数码管(库中的器件名为7SEG-MPX8-CA-BLUE或7SEG-MPX8-CC-BLUE)或液晶芯片LM041L或LM041液晶芯片LGM12641BS1R LM3228显示费率、出水总量及总价。
 3、费率单位为元/升,假定费率为0.5元/升。出水总量单位为升,总价单位为元。假定出水速度为100ml/秒。费率、出水量、总价均保留两位有效数字。
 4、用定时器设计一个1秒的定时间隔,当售水机出水键S1按下后同时启动该秒定时器,用于实时显示出水量,每过1秒,出水量加100ml,按下S2停止出水键后,则显示总价。不足1秒按1秒计算。
 
二、硬件设计
 原理图如下:
 
三、单片机软件设计
 1、首先是系统初始化
 //***********************************************************************
 // 显示屏初始化函数
 //***********************************************************************
 void LCD_init(void)
 {
 LCD_write_com(0x38); //显示模式设置
 delay_nms(5);
 LCD_write_com(0x08); //显示关闭
 delay_nms(5);
 LCD_write_com(0x01); //显示清屏
 delay_nms(5);
 LCD_write_com(0x06); //显示光标移动设置
 delay_nms(5);
 LCD_write_com(0x0C); //显示开及光标设置
 delay_nms(5);
 }
 2、液晶显示程序
 //***********************************************************************
 // 显示屏命令写入函数
 //***********************************************************************
 void LCD_write_com(unsigned char com)
 { 
 RS_CLR;
 RW_CLR;
 EN_SET;
 Data_IO = com;
 delay_nms(5);
 EN_CLR;
 }
 //***********************************************************************
 // 显示屏数据写入函数
 //***********************************************************************
 void LCD_write_data(unsigned char data)
 {
 RS_SET;
 RW_CLR;
 EN_SET;
 Data_IO = data;
 delay_nms(5);
 EN_CLR;
 }
 3、按键程序
 //按键扫描函数
 void scan_key()
 {
 if(key1) //如果按键1按下
 { 
 if(enable==0) //如果当前是停止状态,则对出水量进行清0操作,保证每次出水都是从0 开始
 {
 water_cnt = 0 ;
 }
 enable = 1; //置位使能标志位
 }else if(key2) //当按键2按下,停止出水
 {
 enable = 0; //清除标志位
 vision_cost();
 }
 }
 4、核心算法程序
 void main()
 {
 DDRA=0XFF; //设置端口A为输出
 PORTA=0xff;
 DDRB=0XFF; //设置端口B为输出
 PORTB=0x00;
 DDRC=0XFC; //数值按键为输入模式
 PORTC=0xF3;
 DDRD=0XFF; //设置端口D为输出
 PORTD=0XFF;
 DDRE=0XFF; //设置端口E为输出
 PORTE=0XFF;
 DDRF=0XFF; //设置端口F为输出
 PORTF=0XF0;
 //LCD初始化
//定时器1配置
 //TCCR1B按键中配置
 LCD_init();
 vision_init();
 timer1_init(); //定时器初始化
 TIMSK = 0x04; //timer interrupt sources
 SEI();
 while(1)
 {
 scan_key(); //扫描按键,
 vision_count();
 delay_nms(500); //延时,主要控制刷新周期
 }
 }
 四、 proteus仿真设计
 Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
 