一、系統(tǒng)方案 1、本設(shè)計采用51單片機作為主控器。 2、商品選擇,購買數(shù)量選擇,投幣,液晶1602顯示。 3、電機模擬出貨。
1.jpg (4.58 KB, 下載次數(shù): 45)
下載附件
2023-11-15 20:31 上傳
二、硬件設(shè)計 原理圖如下:
2.jpg (96.69 KB, 下載次數(shù): 67)
下載附件
2023-11-15 20:31 上傳
三、單片機軟件設(shè)計 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) //寫命令 { 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; } 3、按鍵程序 unsigned char key(void) //按鍵響應(yīng)函數(shù) { unsigned char key,key1,key2; P1=0XF0; if((P1&0XF0)!=0XF0) //ked down { delay1(10); //延時去抖動 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) //不同的按鍵進行不同的操作 { 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 //計算錢的總數(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è)計 Proteus軟件是一款應(yīng)用比較廣泛的工具,它可以在沒有硬件平臺的基礎(chǔ)上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設(shè)計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設(shè)定的目的,避免我們搭建實物的時候,如果當(dāng)初選擇的方案有問題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發(fā)者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設(shè)計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設(shè)計的最優(yōu)方案。最后根據(jù)測試沒問題的仿真圖紙,焊接實物,調(diào)試,最終完成本設(shè)計的作品。
|