注意:獲取全套設(shè)計纵柿,請見文末說明…
概述
本文設(shè)計了一款以AT89C51單片機為核心的自動售貨機系統(tǒng)蜈抓,并且著重詳細地介紹了自動售貨機的整體系統(tǒng)設(shè)計方案、硬件選擇基礎(chǔ)昂儒、軟件使用方法及技巧沟使。以AT89C51作為CPU處理單元連接各個功能模塊;以4×4矩陣鍵盤作為輸入控制模塊對貨物進行種類和數(shù)量的選擇以及模擬貨幣的投入功能荆忍;以LCD1602液晶作為顯示模塊來顯示當前的購物狀態(tài)以及貨幣狀態(tài)格带;以LED的顯示來表示當前選擇貨物以及出貨的狀態(tài)撤缴。
自動售貨機原理
在初始化的界面等待顧客按鍵選擇貨物的種類和數(shù)量顧客投入貨幣刹枉,按下確定購買鍵后等待售貨機自動計算所購商品的總價,然后提示顧客投入貨幣屈呕。所投的貨幣經(jīng)過外部硬件檢測傳感器檢測真假后累加計數(shù)微宝。若顧客確認購買系統(tǒng)則跳轉(zhuǎn)到下一步驟,反之取消購買即退出貨幣返回到主界面虎眨,等待顧客下一步操作蟋软。自動售貨機通過貨幣的總價與和所購商品的總價的差值來進行出貨找零。
自動售貨機的控制子系統(tǒng)由以下幾個部分組成嗽桩,分別是預(yù)設(shè)自動售貨系統(tǒng)岳守、金額累加和找零系統(tǒng)、售完檢測系統(tǒng)碌冶、售出累計及反饋功能系統(tǒng)湿痢。(各子系統(tǒng)詳細介紹,請見論文)
自動售貨機功能概述
系統(tǒng)通過矩陣鍵盤來選擇貨物的種類與數(shù)量過后自動售貨機提示投幣。自動售貨機的貨幣識別器對所投貨幣進行識別譬重,根據(jù)金額大小然后將商品選擇權(quán)通過LCD液晶顯示給客戶拒逮,客戶按鍵選擇后,CPU控制芯片發(fā)出指令將所選擇商品從儲備料道中送達取物口臀规。
貨物種類一共設(shè)有8種滩援,這8種商品通過選擇按鍵進行選擇確認,通過數(shù)量選擇按鍵確定購買數(shù)量塔嬉,價格規(guī)定為1-8元不等玩徊;貨幣識別器能夠識別1元硬幣、1元紙幣谨究、5元紙幣佣赖、10元紙幣、20元紙幣50元紙幣以及100元紙幣记盒。在規(guī)定的時間內(nèi)憎蛤,投了幾次貨幣后,貨幣能夠?qū)崿F(xiàn)自動累加功能纪吮,這樣設(shè)計會把投入的所有貨幣總額數(shù)目數(shù)據(jù)傳遞到中央控制元器件進行處理俩檬;在超過規(guī)定時間后投幣口自動關(guān)閉,數(shù)據(jù)處理單元按照投幣總數(shù)和購買的數(shù)量和價格乘積來進行加減運算碾盟,實現(xiàn)購買和找?guī)殴δ芘锪伞.斖度氲呢泿趴傊敌∮谏唐房偨痤~時,則不能進行購貨冰肴,投入的錢將全部退還屈藐。
本設(shè)計中有一共有16個按鍵選擇,其中有兩個是貨物選擇鍵熙尉,有兩個是數(shù)量選擇鍵联逻,此外還有6個貨幣投入鍵1個確認鍵和1個取消鍵。
系統(tǒng)仿真電路圖
原理圖
仿真結(jié)果分析
(1)加載Sale.hex文件到AT89C51單片機检痰,點擊運行包归,自動售貨機系統(tǒng)進入初始化等待狀態(tài),LCD顯示“Welcome Sale”,同時等待按鍵輸入铅歼。
(2)通過按鍵“價格+”和“價格-”來選擇貨物的種類公壤,然后通過“數(shù)量+”和“數(shù)量-”來選擇所購買貨物的數(shù)量,同時代表被選擇貨物的LED指示燈亮椎椰。
(3)當選擇好貨物后厦幅,按下“確認OK”鍵進入到投幣系統(tǒng),此時機器會自動計算出所購貨物總金額慨飘。
(4)當機器計算出總價等待顧客投入貨幣并按下“確認OK”鍵后确憨,當投入貨幣貨幣值大于或等于總價時就出貨并找零,若投入貨幣貨幣值小于總價則不能出貨只能按下“取消NO”退出所投貨幣或繼續(xù)增加投幣。
5)當完成以上步驟后則完成一次自動購物過程缚态,機器自動復(fù)位回到初始化界面磁椒,同時在操作過程中的任一環(huán)節(jié),都可通過按下“取消NO”鍵玫芦,是售貨機系統(tǒng)復(fù)位到初始狀態(tài)浆熔。
部分C代碼
#include<reg51.h>
#define WAIT_SALE 0
#define NO_WATER 1
#define INPUT_MONEY 2
#define SALING 3
#define CHANGE 4
#define CANCLE 5
#define NO_DATA 0
#define water_change(x, y) ((x) & (~(0x01 << y)))
#define uint unsigned int
#define uchar unsigned char
unsigned char water_total[] = {10, 10, 10, 10, 10, 10, 10, 10};
unsigned char water_price[] = {1, 2, 3, 4, 5, 6, 7, 8};
uchar code wait_sale[]=" Welcome Sale "; //定義所顯示的內(nèi)容
uchar code no_water[] = "No Water!";
uchar code price[] = "Price:";
uchar code number[] = "Num:";
uchar code sum[] = "SUM:";
uchar code input[] = "INPUT:";
uchar code change[] = "Change:";
uchar code put_water[] = "Get Water...";
uchar code cancle[] = "Cancle...";
unsigned char e=0x00;
sbit P2_0=P2^0; //定義接端口
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit lcd_en=P3^4;
sbit rs=P3^2;
sbit rw = P3^3;
void lcd_1602_delay(uint z) //延時
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_1602_write_com(uchar com) //寫命令
{
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) //寫數(shù)據(jù)
{
rs=1;
rw=0;
P2=date;
lcd_1602_delay(5);
lcd_en=1;
lcd_1602_delay(5);
lcd_en=0;
}
void lcd_1602_init() //LCD1602初始化函數(shù)
{
lcd_en=0;
lcd_1602_write_com(0x38);
lcd_1602_write_com(0x06);
lcd_1602_write_com(0x01);
}
void lcd_1602_wait_sure() //顯示'OK'&'NO'界面
{
lcd_1602_write_com(0x80+0x40);
lcd_1602_write_data('O');
lcd_1602_write_data('K');
lcd_1602_write_com(0x80+0x4e);
lcd_1602_write_data('N');
lcd_1602_write_data('O');
}
void lcd_1602_show_num(uint num) // 1602顯示數(shù)字的函數(shù)
{
IF(num <= 9)
{
lcd_1602_write_data('0'+num);
lcd_1602_write_data(' ');
}else if(num >= 10 )
{
lcd_1602_write_data('0'+num/10);
lcd_1602_write_data('0'+num%10);
}
}
void lcd1602_info_display(uint choose, uint num_type, uint num_count)
{
int num;
lcd_1602_write_com(0x01);
switch(choose)
{
case WAIT_SALE:
lcd_1602_write_com(0x80+0x01); //
for(num = 0; num < 13; num++)
{
lcd_1602_write_data(wait_sale[num]);
}
break;
case NO_WATER:
lcd_1602_write_com(0x80+0x03);
for(num = 0; num < 9; num++)
{
lcd_1602_write_data(no_water[num]);
}
break;
case SALING:
lcd_1602_write_com(0x80+0x00);
for(num = 0; num < 6; num++)
{
lcd_1602_write_data(price[num]);
}
lcd_1602_write_data('0'+(num_type+1));
lcd_1602_write_data(' ');
lcd_1602_write_data(' ');
for(num = 0; num < 4; num++)
{
lcd_1602_write_data(number[num]);
}
lcd_1602_show_num(num_count);
break;
case INPUT_MONEY:
lcd_1602_write_com(0x80+0x00);
for(num = 0; num < 4; num++)
{
lcd_1602_write_data(sum[num]);
}
lcd_1602_show_num(num_type);
lcd_1602_write_data(' ');
lcd_1602_write_data(' ');
for(num = 0; num < 6; num++)
{
lcd_1602_write_data(input[num]);
}
lcd_1602_show_num(num_count);
break;
case CHANGE:
if(!num_count)
{
//put water
lcd_1602_write_com(0x80+0x02);
for(num = 0; num < 13; num++)
{
lcd_1602_write_data(put_water[num]);
}
}
else
{
lcd_1602_write_com(0x80+0x02); //取消選擇時寫命令退幣
for(num = 0; num < 9; num++)
{
lcd_1602_write_data(cancle[num]);
}
}
for(num = 0; num < 7; num++)
{
lcd_1602_write_data(change[num]);
}
lcd_1602_show_num(num_type);
break;
default:
break;
}
lcd_1602_write_com(0x0c);
}
void lcd_1602_saling(uint type, uint num)
{
lcd1602_info_display(SALING, type, num);
lcd_1602_wait_sure();
}
void lcd_1602_inputing(uint need, uint input)
{
lcd1602_info_display(INPUT_MONEY, need, input);
lcd_1602_wait_sure();
}
資源分享內(nèi)容有:
(1)【完整終版畢業(yè)論文】基于AT89C51單片機的自動售貨機系統(tǒng)設(shè)計.doc
(2)Proteus仿真;
(3)Keil C程序桥帆;
(4)參考資料医增;
(5)Visio流程圖文件;
(6)原理圖文件老虫;
資源截圖:
資源獲取方法
資源獲取方法
資源獲取方法
重要的事情說三遍R豆恰!F沓住:龉簟!6嵊9虻邸!P┰摹I〗!!
由于本設(shè)計為作者原創(chuàng)設(shè)計市埋,
獲取以上所有資源內(nèi)容黎泣,請搜索關(guān)注我的公眾號:交院小智