基于51单片机 模拟简易自动自助售货机设计 智能售卖机系统

单片机自动售货系统采用51单片机+按键+蜂鸣器+LCD12864液晶+LED灯设计而成。
一、系统方案
1、本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选),拍的时候要备注,不备注默认发STC89C52RC2、使用单片机设计,设有8个按键,3个硬币模拟按键(5元、1元、5角),5个货物选择按键,一块12864显示屏。3、开机启动显示货物价格列表,自动切换列表。
4、可以选择①—⑤种货物(或更多)。
5、按对应按键可选择该货物,并且货物对应的指示灯点亮。
6、选择后,提示要投进的金额,并显示投币有效时间30秒(可修改)。
7、按键模拟投币,有5元、1元、5角。
8、投币金额等于或大于所选货物的金额则购物成功。
9、若投币不足,则30秒后自动退回。
二、硬件设计
原理图如下:
在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化
TMOD=0x01; //T0 工作在方式1 16位计数器
TH0=(65536-50000)/256; //预先 设定定时器 初值,50毫秒
TL0=(65536-50000)%256;
EA=1; //开启 总中断
ET0=1; //开启定时器 0 中断
TR0=1; //定时器 0 启动计数

init_lcd();
clrram_lcd();

2、液晶显示程序
//***************************************
//液晶显示主程序模块
//***************************************
void show()
{

if(nn<10)
{
    gotoxy(1,0);
	mdelay(10);
    print("按键选择货物:  ");
    mdelay(10);

    gotoxy(2,0);
	mdelay(10);
    print("①软面包(5.5元)");
    mdelay(10);                 //扫描延时

    gotoxy(3,0);
	mdelay(10);
    print("②花生(3元)    ");
    mdelay(10); 	//扫描延时

    gotoxy(4,0);
	mdelay(10);
    print("③雪碧(4元)");
    mdelay(10);                 //扫描延时
}
if(nn==10)clrram_lcd ();
if(nn>=11)
{

    gotoxy(1,0);
	mdelay(10);
    print("④东方树叶(7元)     ");
    mdelay(10);

    gotoxy(2,0);
    print("⑤矿泉水(2元)");
    mdelay(10);                 //扫描延时

    gotoxy(3,0);
	mdelay(10);
    print("选定后投入硬币");
    mdelay(10); 	//扫描延时
}

}
3、按键程序
if(K80)//按键5
{
if(m
6)beep=0;
if(m5)beep=1;
m=20;
clrram_lcd ();
while(1)
{
if(m
0)
{
if(0<money<60)
{
clrram_lcd ();
mdelay(10);
gotoxy(1,0);
mdelay(10);
print(“投币不足购买失败”);
mdelay(10);
gotoxy(2,0);
mdelay(10);
print(“退钱: 元”);
mdelay(10);
Time[0]=money/10+‘0’;
Time[1]=‘.’;
Time[2]=money%10+‘0’;
Time[3]=‘\0’;
gotoxy(2,3);
mdelay(10);
print(Time);
mdelay(6000);
money=0;
}

            clrram_lcd ();
							L5=1;
            break;
        }

        gotoxy(1,0);
		mdelay(10);
        print("已选矿泉水        ");
        mdelay(10);
        L5=0;
        gotoxy(2,0);
		mdelay(10);
        print("货物价格:2元");
        mdelay(10);

        gotoxy(3,0);
		mdelay(10);
        print("投币金额:     元");
        mdelay(10);

        gotoxy(4,0);
		mdelay(10);
        print("规定时间:");
        mdelay(10);


        if(n==0)
        {
            gotoxy(3,5);
            print(Time);
            mdelay(100);
        }

        if(n==1)
        {
            gotoxy(4,7);
            print(Time);
            mdelay(10);
        }

        if(K1==0)
        {
            while(K1==0);
            mdelay(10);
            money=money+100;
        }

        if(K2==0)
        {
            while(K2==0);
            mdelay(10);
            money=money+50;
        }

        if(K3==0)
        {
            while(K3==0);
            mdelay(10);
            money=money+10;
        }
        if(K1==0)
        {
            while(K1==0);
            mdelay(10);
            money=money+100;
        }

        if(K2==0)
        {
            while(K2==0);
            mdelay(10);
            money=money+50;
        }

        if(K3==0)
        {
            while(K3==0);
            mdelay(10);
            money=money+10;
        }
        if(money>=20)
        {
            clrram_lcd ();
			mdelay(10);
            gotoxy(1,0);
			mdelay(10);
            print("矿泉水购买成功      ");
            mdelay(10);
            gotoxy(2,0);
			mdelay(10);
            print("找钱:    元");
            mdelay(10);

            du=money-20;
            Time[0]=du/10+'0';
            Time[1]='.';
            Time[2]=du%10+'0';
            Time[3]='\0';
            gotoxy(2,3);
            print(Time);
            mdelay(6000);
            money=0;
            clrram_lcd ();
							L5=1;
            break;

        }
    }
}

4、核心算法
void time0(void) interrupt 1
{
TH0=(65536-50000)/256; //重新设置定时器 初值,产生50MS定时中断
TL0=(65536-50000)%256;
count++; //50ms太短,闪烁频率太快

if(count==10)
{
    if(n==0)
    {
        Time[0]=m/10+'0';

        Time[1]=m%10+'0';
        Time[2]='\0';
    }
    if(n==1)
    {
        Time[0]=money/10+'0';
        Time[1]='.';
        Time[2]=money%10+'0';

    }

    Time[3]='\0';
    Time[4]='\0';

    count=0;

    //if(m==0)m=30;
    n++;
    if(n==2 && m > 0)
    {
        if(m==6)beep=0;
        if(m==5)beep=1;
        m--;
        n=0;
    }

    nn++;
    if(nn==20)
    {
        nn=0;
    }
}

}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bbxyliyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值