自动售水机

  • 格式:doc
  • 大小:95.50 KB
  • 文档页数:4

自动售水机

1.功能简述

通过CT107D硬件平台模拟小区自动售水机的工作流程:通过按键控制售水机水流出和停止;

通过数码管显示费率、出水量及总费用;通过光敏电阻检测环境亮度,在亮度过低的情况下,自动开灯。系统硬件电路主要由单片机控制电路、数码管显示电路、A/D 转换电路及功能按键组成。

2.要求:

1. 按键控制单元

设定按键S7 为出水控制按键,当S7 按下后,售水机持续出水(继电器接通,指示

灯L10 点亮)。设定按键S6 为停水控制按键,当S6 按下后,停止出水(继电器断开,

指示灯L10 熄灭)。

2. 数码管显示单元

通过4 位数码管DS1 显示费率,单位为元/升,保留2 位有效数字;

通过4 位数码管DS2 显示当前出水总量(出水时,单位为升)和总价(停止时,单位为元):按下出水按键S7 后,清除数码管DS2 显示数据,数码管DS2 实时显示出水量(保留两位有效数字),在出水状态下,再次按下S7,不会影响出水状态,直到按下停止按键S6 为止;按下停止出水按键S6 后,数码管DS2 显示总价(保留两位有效数字)。

3. AD 转换单元

通过光敏电阻RD1 和AD 转换芯片PCF8591 组成的亮度检测电路(亮度值转换为PCF8591 光敏电阻通道的电压)检测环境亮度;当PCF8591 光敏电阻通道输入电压小于1.25

V 时,L1 点亮,大于1.25V 时,L1 熄灭。

3. 实验器件

1 51单片机

2 7seg-4

3 PCF8591

4 键盘

5 继电器

4. 实验原理

 硬件设计

 软件设计

#include

#include

#define uchar

unsigned char

#define uint

unsigned int

unsigned char i;

uchar code

seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};

uchar code

seg1[]={0x40,0x92,0xC0}; uchar code

table[]=

{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};

uchar code

table1[]=

{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};

unsigned int

buff[4]={0x00,0x00,0x00,0x00};

unsigned char

temp; unsigned char

dat;

float money;

sbit com8=P2^0;

sbit com7=P2^1;

sbit com6=P2^2;

sbit com5=P2^3;

sbit com4=P2^4;

sbit com3=P2^5;

sbit com2=P2^6;

sbit com1=P2^7;

sbit scl=P1^0;

sbit sda=P1^1;

sbit S1=P3^0;

sbit S2=P3^1;

sbit LAMP=P1^7;

uint num,a; uchar

qian,bai,shi,ge;

void init();

void delay(uint);

void

display(ucharbai,ucharshi,ucharge);

uint fq();

uint fb();

uint fs();

uint fg();

void ds1(void);

void delay2(int

x);

void key(void); void display1();

void delay()

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

void

delays(unsigned

char ms)

{

unsigned char

i;

while(ms--)

{

for(i=0;i<255;i++);

}

}

void delay2(int

x)

{

int i,j;

for(i=0;i

for(j=0;j<120;j++);

}

void start()

{

sda=1;

scl=1;

delay();

sda=0;

delay();

scl=0;

}

void stop()

{

sda=0;

scl=1;

delay();

sda=1;

delay();

scl=0;

}

void ack()

{

sda=0;

scl=1;

delay();

scl=0;

delay();

}

void noack()

{

sda=1; scl=1;

delay();

scl=0;

}

void

iicwrite_byte(unsigned char dat)

{

unsigned char

i,temp;

temp=dat;

for(i=0;i<8;i++)

{

temp=temp<<1;

sda=CY;

scl=1;

delay();

scl=0;

}

}

unsigned char

iicread_byte()

{

unsigned char

i,temp;

for(i=0;i<8;i++) {

sda=1;

scl=1;

temp=(temp<<1) | sda;

delay();

scl=0;

delay();

}

return temp;

}

unsigned char

ADC8591(unsigned

char addr)

{

unsigned char

dat;

start();

iicwrite_byte(0x90);

ack();

iicwrite_byte(addr);

ack();

start();

iicwrite_byte(0x91);

ack();

dat=iicread_byte();

noack();

stop();

return dat;

}

unsigned char

DAC8591(unsigned

char

addr,unsigned

char dat) {

start();

iicwrite_byte(0x90);

ack();

iicwrite_byte(addr);

ack();

iicwrite_byte(dat);

stop();

return dat; }

void key()

{

if(S1==0)

{

TR0=1;

LAMP=0;

}

}

void main() {

sda=1;

scl=1;

init();

while(1)

{

temp=ADC8591(0x00);

DAC8591(0x40,tem

p);

delays(10);

key();

display(fb(),fs(),fg());

}

}

void init()

{

num=0;

a=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=0; }

void

display(ucharbai,ucharshi,ucharge)

{

com1=0;

com2=1;

P0=seg1[0];

delay2(3);

com2=0;

com3=1;

P0=seg1[1];

delay2(3);

com3=0;

com4=1;

P0=seg1[2];

delay2(3);

com4=0;

com5=1;

P0=table[qian]; delay2(3);

com5=0;

com6=1;

P0=table1[bai];

delay2(3);

com6=0;

com7=1;

P0=table[shi];

delay2(3);

com7=0;

com8=1;

P0=table[ge];

delay2(3);

com8=0;

}

void timeoff()

interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65526-50000)%256;

a++;

if(a%10==0)

{num++;

if(num==9999)

{

num=0;

}

}

if(S2==0)

{

money=num;

TR0=0;

num=money*0.5;

display(fb(),fs(),fg())

;

LAMP=1;

}

}

uint fq() {

qian =num%100%10;

return qian;

}

uint fb()

{

bai=num/100;

return bai; }

uint fs()

{

shi=num%100/10;

return shi;

}

uint fg()

{ ge =num%100%10;

return ge;}