自动售水机
- 格式: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;}