自动售货机仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- sbit key1=P1^0;
- sbit key2=P1^1;
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit key5=P1^4;
- sbit key6=P1^5;
- sbit key7=P1^6;
- sbit key8=P1^7;
- sbit led1=P3^0;
- sbit led2=P3^1;
- sbit led3=P3^2;
- int step=1;
- int price=0;
- int num=1;
- int table1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F}; //数码管显示0-9
- unsigned char dispbuf[8]={0,0,0,0,0,0,0,};
- int table2[]={0xe0,0xc0,0xa0,0x80,0x20};//控制退币
- int total_money=0;//所选商品总价格
- int back_money=0; //应退金额
- int in_money=0;
- /*
- 延时功能
- */
- void delay(int z)
- {
- int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //?调用时重新初始化??复位函数
- void reset()
- {
- step=1;
- price=0;
- num=1;
- total_money=0;
- back_money=0;
- in_money=0;
- }
- /*
- 选择商品函数?每个按键对应不同的物品价格及数量
- */
- void choose()
- {
- if(key1==0)
- {
- delay(80);
- if(key1==0)
- {
- num=1;
- price=4;
- }
- }
- else if(key2==0)
- {
- delay(80);
- if(key2==0)
- {
- price=6;
- num=1;
- }
- }
- else if(key3==0)
- {
- delay(80);
- if( key3==0)
- {
- price=10;
- num=1;
- }
- }
- }
- /*
- 确定及取消
- 确定则执行?step加一?取消则执行step減一
- */
- void apply()
- {
- if(key7==0)
- {
- delay(80);
- if(key7==0)
- {
- step++;
- }
- }
- else if(key8==0)
- {
- delay(80);
- if(key8==0)
- {
- step--;
- }
- }
- }
- /*
- 计算所选商品所需金额
- */
- void totalmoney()
- {
- total_money=price*num;
- }
- /*
- //累加投入币值
- */
- void inmoney()
- {
- if(key4==0)
- {
- delay(80);
- if(key4==0)
- in_money+=1;
- }
- else if(key5==0)
- {
- delay(80);
- if(key5==0)
- in_money+=5;
- }
- else if(key6==0)
- {
- delay(80);
- if(key6==0)
- in_money+=10;
- }
- }
- /*
- 计算所需退还币值
- */
- void backmoney()
- {
- back_money=in_money -total_money;
- }
- /*
- 显示函数?每一步显示不同的内容
- */
- void display ()
- {
- if(step==1)
- {
- P2=0x04;
- totalmoney();
- P0 =table1[total_money%10];
- delay(80);
- P2 = 0x08;
- P0 = table1[total_money/10];
- delay(80);
- }
- else if(step==2)
- {
- P2=0x04;
- inmoney();
- P0=table1[in_money%10];
- delay(80);
- P2=0x08;
- P0=table1[in_money/10];
- delay(80);
- }
- else if(step==3)
- {
- P2=0xf0;
- backmoney();
- if(back_money<0)
- {
- step--;
- P0=table1[in_money];
- }
- if(back_money>=0)
- {
- P2=0x04;
- backmoney();
- P0=table1[back_money%10];
- delay(80);
- P2=0x08;
- P0=table1[back_money/10];
- delay(80);
- reset();
- }
- else
- P0=table1[1];
- }
- }
- /*
- //主函数
- */
- void main()
- {
- while(1)
- {
- choose();
- apply();
- display();
- }
- /*?if(back_money>=10)
- {int?s=back_money/10;
- for(s;s>0;s--?)
- {led2=0;
- delay(1000);
- led2=1;
- back_money-=10;
- }
- }
- if(back_money<10&&back_money>0?)
- {
- led3=0;
- delay(1000);
- led3=1;
- }
- delay(1000);
- {
- led1=0;
- delay(1000);
- led1=1;
- delay(1000);
- led1=0;
- delay(1000);
- led1=1;
- delay(1000);
- led1=0;
- delay(1000);
- led1=1;
- delay(1000);
- }*/
- }
复制代码
所有资料51hei提供下载:
自动售货机.rar
(22.78 KB, 下载次数: 126)
自动售货机控制系统设计.doc
(511.95 KB, 下载次数: 94)
|