找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1871|回復(fù): 2
收起左側(cè)

基于單片機(jī)自動(dòng)售貨機(jī)仿真及源程序

[復(fù)制鏈接]
ID:190577 發(fā)表于 2023-11-15 20:32 | 顯示全部樓層 |閱讀模式
一、系統(tǒng)方案
1、本設(shè)計(jì)采用51單片機(jī)作為主控器。
2、商品選擇,購(gòu)買(mǎi)數(shù)量選擇,投幣,液晶1602顯示。
3、電機(jī)模擬出貨。
1.jpg

二、硬件設(shè)計(jì)
原理圖如下:
2.jpg
三、單片機(jī)軟件設(shè)計(jì)
1、首先是系統(tǒng)初始化
void lcd_1602_init()               //LCD1602初始化函數(shù)
{
lcd_en=0;
lcd_1602_write_com(0x38);
lcd_1602_write_com(0x0e);
lcd_1602_write_com(0x06);
lcd_1602_write_com(0x01);
}

2、液晶顯示程序
void lcd_1602_write_com(uchar com)   //寫(xiě)命令
{
rs=0;
rw=0;
P2=com;
lcd_1602_delay(5);
lcd_en=1;
lcd_1602_delay(5);
lcd_en=0;
}

void lcd_1602_write_data(uchar date) //寫(xiě)數(shù)據(jù)
{
rs=1;
rw=0;
P2=date;
lcd_1602_delay(5);
lcd_en=1;
lcd_1602_delay(5);
lcd_en=0;
}
3、按鍵程序
unsigned char key(void)       //按鍵響應(yīng)函數(shù)
{
unsigned char key,key1,key2;
P1=0XF0;
if((P1&0XF0)!=0XF0)           //ked down
    {
       delay1(10);                         //延時(shí)去抖動(dòng)
       if((P1&0XF0)!=0XF0)                  //仍然有鍵按下
      {
        key1=P1&0XF0;                          //讀入列線值
        P1=0X0F;
        key2=P1&0X0F;
        key=key1|key2;
switch(key)                  //按鍵映射
{
case 0xee: e=0x00;break;
case 0xde: e=0x01;break;
case 0xbe: e=0x02;break;
case 0x7e: e=0x03; break;
case 0xed: e=0x04;break;
case 0xdd: e=0x05;break;
case 0xbd: e=0x06;break;
case 0x7d: e=0x07; break;
case 0xeb: e=0x08;break;
case 0xdb: e=0x09;break;
case 0xbb: e=0x0a;break;
case 0x7b: e=0x0b; break;
case 0xe7: e=0x0c;break;
case 0xd7: e=0x0d;break;
case 0xb7: e=0x0e;break;
case 0x77: e=0x0f; break;
}
while((P1&0X0F)!=0X0F);
delay1(10);
return 1;
}
  }
return 0;
}

4、核心算法程序
/*********************************************************************/
/*****************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)         //不同的按鍵進(jìn)行不同的操作
     {
        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):         //   確認(rèn)
if(water_is_choose == 1)
         {        
      ok=1;
          }                                
        break;
   default:
   break;                                
}
lcd_1602_saling(water_type, water_count);                        
        }
}

//choose ok: calculate the money        //計(jì)算錢(qián)的總數(shù)
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(10000);

   goto again;
   break;
   default:
   break;
                        }

//show money
lcd_1602_inputing(need_money, money);    //投幣系統(tǒng)

if(money>0)

{if(money >= need_money)
                        {
                                P3=0x7f;
                                ok=0;                        //break and show back money
                                //show back money
                                lcd1602_info_display(CHANGE, money-need_money, NO_DATA);
                        //        out_water();
                                delay1(10000);
                                P0 = 0xff;
                                P3=0xff;
                                goto again;

                        }
                }
        }
}
}
四、 proteus仿真設(shè)計(jì)
Proteus軟件是一款應(yīng)用比較廣泛的工具,它可以在沒(méi)有硬件平臺(tái)的基礎(chǔ)上通過(guò)自身的軟件仿真出硬件平臺(tái)的運(yùn)行情況,這樣就可以通過(guò)軟件仿真來(lái)驗(yàn)證我們?cè)O(shè)計(jì)的方案有沒(méi)有問(wèn)題,如果有問(wèn)題,可以重新選擇器件,連接器件,直到達(dá)到我們?cè)O(shè)定的目的,避免我們搭建實(shí)物的時(shí)候,如果當(dāng)初選擇的方案有問(wèn)題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測(cè)試,這樣會(huì)浪費(fèi)人力和物力,也給開(kāi)發(fā)者帶來(lái)一定困惑,Proteus仿真軟件就很好的解決這個(gè)問(wèn)題,我們?cè)谠O(shè)計(jì)之初,就使用該軟件進(jìn)行模擬仿真,測(cè)試,選擇滿足我們?cè)O(shè)計(jì)的最優(yōu)方案。最后根據(jù)測(cè)試沒(méi)問(wèn)題的仿真圖紙,焊接實(shí)物,調(diào)試,最終完成本設(shè)計(jì)的作品。


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:884711 發(fā)表于 2024-5-6 21:38 | 顯示全部樓層
路過(guò)學(xué)習(xí),謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:961114 發(fā)表于 2024-5-7 15:52 | 顯示全部樓層
入門(mén)51,還的是 自帶硬件USB直接仿真,自帶硬件USB直接下載的 RMB1.4的 STC8H8K64U
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表