仿真设计|基于51单片机的售货机系统仿真

具体实现功能

(1)货物种类共有8种(价格1-8元),通过选择按键选择货物。

(2)通过数量按键确定购买数量。

(3)货物和数量选择好后,按下“OK”按键,自动计算总价,按下“NO”按键重新选择。

(4)计算完总价后进入投币阶段,可投入1元、5元、10元、20元、50元、100元纸币或硬币,可多次投入,投入的金额会自动累加,并退还多余的钱。

仿真视频:

基于51单片机的售货机系统仿真-仿真视频

设计介绍

51单片机简介

51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

51系列单片机具有以下标准功能:

8k字节Flash,512字节RAM,

32位I/O口线,看门狗定时器,

内置4KB EEPROM,

MAX810复位电路,

三个16位定时器/计数器,

一个6向量2级中断结构,

全双工串行口。

另外, 51系列在空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机停止工作,直到下一个中断或硬件复位为止。本设计所使用的芯片可兼容以下所有的51系列单片机(包括AT系列和STC系列)。

设计思路

文献研究法:搜集整理相关研究资料,阅读文献,为研究做准备;

调查研究法:通过调查、分析、具体实验等方法,发现相关存在问题和解决办法;

比较分析法:比较不同设计的具体原理,以及同一类传感器性能的区别,分析系统的研究现状与发展前景;

软硬件设计法:通过软硬件设计实现硬件,最后测试各项功能是否满足要求。

设计内容

程序(Keil5)

本设计利用KEIL5软件实现程序设计,主函数如下:

/*****************main********************************/
void main()
{
 unsigned char ok = 0, water_type = -1,  water_is_choose = 0;
 char water_count = 0;
unsigned int flag = 0, money = 0, need_money;


lcd_1602_init();
again:
ok = 0; water_type = -1; water_count = 0; water_is_choose = 0;
flag = 0; money = 0; need_money = 0;	
lcd1602_info_display(WAIT_SALE, 0, 0);
while(!ok)	//choose the water and count
{
  flag=key();
  if(flag)
  {
    switch(e)         //不同的按键进行不同的操作
     {
        case(0x00):
        water_type++;
        water_is_choose = 1;
        if(water_type == 8) 
       	{
             water_type = 0;
	        } 
P0 = water_change(0xff, water_type); 
break;		
case(0x01):
water_type--;
water_is_choose = 1;
if(water_type == -1 || water_type == -2)
{
  water_type = 7;
}
P0 = water_change(0xff, water_type);
break;
case(0x02):
if(water_is_choose == 1) 
  {
     water_count++;
     if(water_count > water_total[water_type]) 
     {
       water_count = water_total[water_type];
    	}
   }
break;
case(0x03):
if(water_is_choose == 1)
{
  water_count--;
  if(water_count < 0) 
	{
      water_count = 0;
	 }
}				
break;
case(0x0e):	//  返回
goto again;
break;    
case(0x0f): 	//   确认
if(water_is_choose == 1) 
	 {	
      ok=1;
	  }				
	break; 
   default:
   break;				
}
lcd_1602_saling(water_type, water_count);			
	}
}
	
//choose ok: calculate the money        //计算钱的总数
need_money = water_count * water_price[water_type];
lcd_1602_inputing(need_money, money);
ok = 0;	
while(!ok)		//get money
	{
		flag=key();
		if(flag)
		{
			switch(e)
			{
				case(0x04):
					money=money+1;
					break;
				case(0x05):
					money=money+5; 
					break;
				case(0x06):
					money=money+10;
					break;
				case(0x07):
					money=money+20;
					break;
				case(0x08):
					money=money+50;
					break;
				case(0x09):
					money=money+100;
					break;
				case(0x0e):	//back					lcd1602_info_display(CHANGE, money, CANCLE);
	P0 = 0xff;
	delay1(50000);
					
   goto again;
   break;
   default:
   break;
			}
			 		
//show money
lcd_1602_inputing(need_money, money);    //投币系统
if(money >= need_money) 
			{
				ok=0;			//break and show back money
				//show back money
				lcd1602_info_display(CHANGE, money-need_money, NO_DATA);
				out_water();
				goto again;
			}
		}
	}
}

代码运行截图:

仿真实现(protues8.7)

本设计利用protues8.7软件实现仿真设计。

全部资料

全部资料包括程序(KEIL5)、protues仿真(protues8.7)、课设报告(仅供参考)、开发资料等,具体如图,全网最全!!!!

资料获取:

https://docs.qq.com/doc/DT1VlZXNteEVpTGR5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值