|
本文設(shè)計(jì)了一款以AT89C51單片機(jī)為核心的自動(dòng)售貨機(jī)系統(tǒng),并且著重詳細(xì)地介紹了自動(dòng)售貨機(jī)的整體系統(tǒng)設(shè)計(jì)方案、硬件選擇基礎(chǔ)、軟件使用方法及技巧。以AT89C51作為CPU處理單元連接各個(gè)功能模塊;以4×4矩陣鍵盤作為輸入控制模塊對(duì)貨物進(jìn)行種類和數(shù)量的選擇以及模擬貨幣的投入功能;以LCD1602液晶作為顯示模塊來(lái)顯示當(dāng)前的購(gòu)物狀態(tài)以及貨幣狀態(tài);以LED的顯示來(lái)表示當(dāng)前選擇貨物以及出貨的狀態(tài)。
自助售貨機(jī)原理:
在初始化的界面等待顧客按鍵選擇貨物的種類和數(shù)量顧客投入貨幣,按下確定購(gòu)買鍵后等待售貨機(jī)自動(dòng)計(jì)算所購(gòu)商品的總價(jià),然后提示顧客投入貨幣。所投的貨幣經(jīng)過外部硬件檢測(cè)傳感器檢測(cè)真假后累加計(jì)數(shù)。若顧客確認(rèn)購(gòu)買系統(tǒng)則跳轉(zhuǎn)到下一步驟,反之取消購(gòu)買即退出貨幣返回到主界面,等待顧客下一步操作。自動(dòng)售貨機(jī)通過貨幣的總價(jià)與和所購(gòu)商品的總價(jià)的差值來(lái)進(jìn)行出貨找零。
自動(dòng)售貨機(jī)框圖.jpg (30.6 KB, 下載次數(shù): 36)
下載附件
2019-9-30 13:25 上傳
仿真:
系統(tǒng)仿真圖干凈.jpg (134.15 KB, 下載次數(shù): 30)
下載附件
2019-9-30 13:25 上傳
操作說(shuō)明:
操作說(shuō)明干凈.jpg (151.3 KB, 下載次數(shù): 38)
下載附件
2019-9-30 13:26 上傳
仿真分析為:
(1)加載Sale.hex文件到AT89C51單片機(jī),點(diǎn)擊運(yùn)行,自動(dòng)售貨機(jī)系統(tǒng)進(jìn)入初始化等待狀態(tài),LCD顯示“Welcome Sale”,同時(shí)等待按鍵輸入。
結(jié)果1.png (2.92 KB, 下載次數(shù): 40)
下載附件
2019-9-30 13:26 上傳
(2)通過按鍵“價(jià)格+”和“價(jià)格-”來(lái)選擇貨物的種類,然后通過“數(shù)量+”和“數(shù)量-”來(lái)選擇所購(gòu)買貨物的數(shù)量,同時(shí)代表被選擇貨物的LED指示燈亮。
結(jié)果2.png (3.48 KB, 下載次數(shù): 31)
下載附件
2019-9-30 13:27 上傳
結(jié)果2.1.png (3.96 KB, 下載次數(shù): 28)
下載附件
2019-9-30 13:27 上傳
(3)當(dāng)選擇好貨物后,按下“確認(rèn)OK”鍵進(jìn)入到投幣系統(tǒng),此時(shí)機(jī)器會(huì)自動(dòng)計(jì)算出所購(gòu)貨物總金額。
結(jié)果3.png (7.8 KB, 下載次數(shù): 34)
下載附件
2019-9-30 13:27 上傳
(4)(4)當(dāng)機(jī)器計(jì)算出總價(jià)等待顧客投入貨幣并按下“確認(rèn)OK”鍵后,當(dāng)投入貨幣貨幣值大于或等于總價(jià)時(shí)就出貨并找零,若投入貨幣貨幣值小于總價(jià)則不能出貨只能按下“取消NO”退出所投貨幣或繼續(xù)增加投幣。
結(jié)果4.png (3.59 KB, 下載次數(shù): 32)
下載附件
2019-9-30 13:28 上傳
結(jié)果4.1.png (3.55 KB, 下載次數(shù): 31)
下載附件
2019-9-30 13:28 上傳
(5)當(dāng)完成以上步驟后則完成一次自動(dòng)購(gòu)物過程,機(jī)器自動(dòng)復(fù)位回到初始化界面,同時(shí)在操作過程中的任一環(huán)節(jié),都可通過按下“取消NO”鍵,是售貨機(jī)系統(tǒng)復(fù)位到初始狀態(tài)。
代碼:
- #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) //延時(shí)
- {
- 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(0x0e);
- 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(0x81);
- 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;
復(fù)制代碼
|
|