找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7235|回复: 6
收起左侧

单片机自动售货机源代码

  [复制链接]
ID:225486 发表于 2017-8-7 15:32 | 显示全部楼层 |阅读模式
  1. /******************************************************
  2. ******************************************************/
  3. #include <REG51.H>
  4. #include <intrins.h>
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. //延时子程序模块
  8. //**********************************************
  9. void mdelay(uint delay)
  10. {
  11.     uint i;
  12.     for(; delay>0; delay--)
  13.     {
  14.         for(i=0; i<80; i++) //1ms延时.
  15.         {
  16.             ;
  17.         }
  18.     }
  19. }
  20. //************************************************
  21. void show();   //液晶显示程序
  22. //****************************************
  23. //12864液晶显示部分子程序模块
  24. //****************************************
  25. sbit K1  = P0^4;
  26. sbit K2   = P0^3;
  27. sbit K3  = P0^2;
  28. sbit K4   = P0^1;
  29. sbit K5  = P0^0;
  30. sbit K6   = P1^0;
  31. sbit K7  = P1^1;
  32. sbit K8   = P1^2;
  33. sbit rs  = P0^5;
  34. sbit rw  = P0^6;
  35. sbit e   = P0^7;
  36. sbit beep = P1^5;
  37. #define lcddata P2
  38. unsigned char count=0,m=30,n,nn,money=0,du;   //定义计数变量
  39. uchar Time[6];
  40. sbit busy=P0^7;   //lcd busy bit
  41. void wr_d_lcd(uchar content);
  42. void wr_i_lcd(uchar content);
  43. void clrram_lcd (void);
  44. void init_lcd(void);
  45. void busy_lcd(void);
  46. void rev_row_lcd(uchar row);
  47. void rev_co_lcd(uchar row,uchar col,uchar mode);
  48. void clr_lcd(void);
  49. void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2);
  50. void wr_row_lcd(uchar row,char *p);
  51. //*******************************************************************                                                                */
  52. //因为引脚的定义DB0..DB7是从P1.7...P1.0排列的                                                    */
  53. //所以顺序需要调换一下
  54. //*******************************************************************
  55. uchar swapbit(uchar udata)
  56. {
  57.     uchar ii,tmp=0;
  58.     for(ii=0; ii<8; ii++)
  59.     {
  60.         tmp<<=1;
  61.         if(udata&0x01)
  62.         {
  63.             tmp|=0x01;
  64.         }
  65.         udata>>=1;
  66.     }
  67.     return tmp;
  68. }
  69. //**********************************
  70. //液晶初始化
  71. //**********************************
  72. void init_lcd(void)
  73. {
  74.     wr_i_lcd(0x06);  /*光标的移动方向*/
  75.     wr_i_lcd(0x0c);  /*开显示,关游标*/
  76. }
  77. //***********************************
  78. //填充液晶DDRAM全为空格
  79. //**********************************
  80. void clrram_lcd (void)
  81. {
  82.     wr_i_lcd(0x30);
  83.     wr_i_lcd(0x01);
  84. }
  85. //***********************************
  86. //对液晶写数据
  87. //content为要写入的数据
  88. //***********************************
  89. void wr_d_lcd(uchar content)
  90. {
  91. // busy_lcd();
  92.     rs=1;
  93.     rw=0;
  94.     lcddata=swapbit(content);
  95.     e=1;
  96.     ;
  97.     e=0;
  98. }
  99. //********************************
  100. //对液晶写指令
  101. //content为要写入的指令代码
  102. //*****************************
  103. void wr_i_lcd(uchar content)
  104. {
  105. // busy_lcd();
  106.     rs=0;
  107.     rw=0;
  108.     lcddata=swapbit(content);
  109.     e=1;
  110.     ;
  111.     e=0;
  112. }
  113. //********************************
  114. //液晶检测忙状态
  115. //在写入之前必须执行
  116. //********************************
  117. void busy_lcd(void)
  118. {
  119.     lcddata=0xff;
  120.     rs=0;
  121.     rw=1;
  122.     e =1;
  123.     while(busy==1);
  124.     e =0;
  125. }
  126. //********************************
  127. //指定要显示字符的坐标
  128. //*******************************
  129. void gotoxy(unsigned char y, unsigned char x)
  130. {
  131.     if(y==1)
  132.         wr_i_lcd(0x80|x);
  133.     if(y==2)
  134.         wr_i_lcd(0x90|x);
  135.     if(y==3)
  136.         wr_i_lcd((0x80|x)+8);
  137.     if(y==4)
  138.         wr_i_lcd((0x90|x)+8);
  139. }
  140. //**********************************
  141. //液晶显示字符串程序
  142. //**********************************
  143. void print(uchar *str)
  144. {
  145.     while(*str!='\0')
  146.     {
  147.         wr_d_lcd(*str);
  148.         str++;
  149.     }
  150. }
  151. //***************************************
  152. //液晶显示主程序模块
  153. //***************************************
  154. void show()
  155. {
  156.     if(nn<10)
  157.     {
  158.         gotoxy(1,0);
  159.         print("按键选择货物:");
  160.         mdelay(10);
  161.         gotoxy(2,0);
  162.         print("①矿泉水(1.5元)");
  163.         mdelay(10);                 //扫描延时
  164.         gotoxy(3,0);
  165.         print("②红茶(3元)    ");
  166.         mdelay(10);  //扫描延时
  167.         gotoxy(4,0);
  168.         print("③绿茶(4元)");
  169.         mdelay(10);                 //扫描延时
  170.     }
  171.     clrram_lcd ();
  172.     if(nn>11)
  173.     {
  174.         gotoxy(1,0);
  175.         print("④啤酒(5元)");
  176.         mdelay(10);
  177.         gotoxy(2,0);
  178.         print("⑤红牛(6元)");
  179.         mdelay(10);                 //扫描延时
  180.         gotoxy(3,0);
  181.         print("选定后投入硬币");
  182.         mdelay(10);  //扫描延时
  183.     }
  184. }
  185. //***************************************
  186. //按键选择货物
  187. //***************************************
  188. void key()
  189. {
  190.     if(K4==0)//按键1
  191.     {
  192.         clrram_lcd ();
  193.         while(1)
  194.         {
  195.             if(m==6)beep=0;
  196.             if(m==5)beep=1;
  197.             if(m==0)
  198.             {
  199.                 if(0<money)
  200.                 {
  201.                     clrram_lcd ();
  202.                     gotoxy(1,0);
  203.                     print("投币不足购买失败");
  204.                     mdelay(10);
  205.                     gotoxy(2,0);
  206.                     print("退钱:    元");
  207.                     mdelay(10);
  208.                     Time[0]=money/10+'0';
  209.                     Time[1]='.';
  210.                     Time[2]=money%10+'0';
  211.                     Time[3]='\0';
  212.                     gotoxy(2,3);
  213.                     print(Time);
  214.                     mdelay(6000);
  215.                     money=0;
  216.                 }
  217.                 clrram_lcd ();
  218.                 break;
  219.             }
  220.             gotoxy(1,0);
  221.             print("已选矿泉水");
  222.             mdelay(10);
  223.             gotoxy(2,0);
  224.             print("货物价格:1.5元");
  225.             mdelay(10);
  226.             gotoxy(3,0);
  227.             print("投币金额:     元");
  228.             mdelay(10);
  229.             gotoxy(4,0);
  230.             print("规定时间:");
  231.             mdelay(10);

  232.             if(n==0)
  233.             {
  234.                 gotoxy(3,5);
  235.                 print(Time);
  236.                 mdelay(100);
  237.             }
  238.             if(n==1)
  239.             {
  240.                 gotoxy(4,7);
  241.                 print(Time);
  242.                 mdelay(10);
  243.             }
  244.             if(K1==0)
  245.             {
  246.                 while(K1==0);
  247.                 mdelay(10);
  248.                 money=money+100;
  249.             }
  250.             if(K2==0)
  251.             {
  252.                 while(K2==0);
  253.                 mdelay(10);
  254.                 money=money+50;
  255.             }
  256.             if(K3==0)
  257.             {
  258.                 while(K3==0);
  259.                 mdelay(10);
  260.                 money=money+10;
  261.             }
  262.             if(money>=15)
  263.             {
  264.                 clrram_lcd ();
  265.                 gotoxy(1,0);
  266.                 print("矿泉水购买成功");
  267.                 mdelay(10);
  268.                 gotoxy(2,0);
  269.                 print("找钱:    元");
  270.                 mdelay(10);
  271.                 du=money-15;
  272.                 Time[0]=du/10+'0';
  273.                 Time[1]='.';
  274.                 Time[2]=du%10+'0';
  275.                 Time[3]='\0';
  276.                 gotoxy(2,3);
  277.                 print(Time);
  278.                 mdelay(6000);
  279.                 money=0;
  280.                 clrram_lcd ();
  281.                 break;
  282.             }
  283.         }
  284.     }

  285.     if(K5==0)//按键2
  286.     {
  287.         clrram_lcd ();
  288.         while(1)
  289.         {
  290.             if(m==6)beep=0;
  291.             if(m==5)beep=1;
  292.             if(m==0)
  293.             {
  294.                 if(0<money<30)
  295.                 {
  296.                     clrram_lcd ();
  297.                     gotoxy(1,0);
  298.                     print("投币不足购买失败");
  299.                     mdelay(10);
  300.                     gotoxy(2,0);
  301.                     print("退钱:    元");
  302.                     mdelay(10);
  303.                     Time[0]=money/10+'0';
  304.                     Time[1]='.';
  305.                     Time[2]=money%10+'0';
  306.                     Time[3]='\0';
  307.                     gotoxy(2,3);
  308.                     print(Time);
  309.                     mdelay(6000);
  310.                     money=0;
  311.                 }
  312.                 clrram_lcd ();
  313.                 break;
  314.             }
  315.             gotoxy(1,0);
  316.             print("已选红茶");
  317.             mdelay(10);
  318.             gotoxy(2,0);
  319.             print("货物价格:3元");
  320.             mdelay(10);
  321.             gotoxy(3,0);
  322.             print("投币金额:     元");
  323.             mdelay(10);
  324.             gotoxy(4,0);
  325.             print("规定时间:");
  326.             mdelay(10);

  327.             if(n==0)
  328.             {
  329.                 gotoxy(3,5);
  330.                 print(Time);
  331.                 mdelay(100);
  332.             }
  333.             if(n==1)
  334.             {
  335.                 gotoxy(4,7);
  336.                 print(Time);
  337.                 mdelay(10);
  338.             }
  339.             if(K1==0)
  340.             {
  341.                 while(K1==0);
  342.                 mdelay(10);
  343.                 money=money+100;
  344.             }
  345.             if(K2==0)
  346.             {
  347.                 while(K2==0);
  348.                 mdelay(10);
  349.                 money=money+50;
  350.             }
  351.             if(K3==0)
  352.             {
  353.                 while(K3==0);
  354.                 mdelay(10);
  355.                 money=money+10;
  356.             }
  357.             if(money>=30)
  358.             {
  359.                 clrram_lcd ();
  360.                 gotoxy(1,0);
  361.                 print("红茶购买成功");
  362.                 mdelay(10);
  363.                 gotoxy(2,0);
  364.                 print("找钱:    元");
  365.                 mdelay(10);
  366.                 du=money-30;
  367.                 Time[0]=du/10+'0';
  368.                 Time[1]='.';
  369.                 Time[2]=du%10+'0';
  370.                 Time[3]='\0';
  371.                 gotoxy(2,3);
  372.                 print(Time);
  373.                 mdelay(6000);
  374.                 money=0;
  375.                 clrram_lcd ();
  376.                 break;
  377.             }
  378.         }
  379.     }

  380.     if(K6==0)//按键3
  381.     {
  382.         if(m==6)beep=0;
  383.         if(m==5)beep=1;
  384.         clrram_lcd ();
  385.   while(1)
  386.         {
  387.             if(m==0)
  388.             {
  389.                 if(0<money<40)
  390.                 {
  391.                     clrram_lcd ();
  392.                     gotoxy(1,0);
  393.                     print("投币不足购买失败");
  394.                     mdelay(10);
  395.                     gotoxy(2,0);
  396.                     print("退钱:    元");
  397.                     mdelay(10);
  398.                     Time[0]=money/10+'0';
  399.                     Time[1]='.';
  400.                     Time[2]=money%10+'0';
  401.                     Time[3]='\0';
  402.                     gotoxy(2,3);
  403.                     print(Time);
  404.                     mdelay(6000);
  405.                     money=0;
  406.                 }
  407.                 clrram_lcd ();
  408.                 break;
  409.             }
  410.             gotoxy(1,0);
  411.             print("已选绿茶");
  412.             mdelay(10);
  413.             gotoxy(2,0);
  414.             print("货物价格:4元");
  415.             mdelay(10);
  416.             gotoxy(3,0);
  417.             print("投币金额:     元");
  418.             mdelay(10);
  419.             gotoxy(4,0);
  420.             print("规定时间:");
  421.             mdelay(10);

  422.             if(n==0)
  423.             {
  424.                 gotoxy(3,5);
  425.                 print(Time);
  426.                 mdelay(100);
  427.             }
  428.             if(n==1)
  429.             {
  430.                 gotoxy(4,7);
  431.                 print(Time);
  432.                 mdelay(10);
  433.             }
  434.             if(K1==0)
  435.             {
  436.                 while(K1==0);
  437.                 mdelay(10);
  438.                 money=money+100;
  439.             }
  440.             if(K2==0)
  441.             {
  442.                 while(K2==0);
  443.                 mdelay(10);
  444.                 money=money+50;
  445.             }
  446.             if(K3==0)
  447.             {
  448.                 while(K3==0);
  449.                 mdelay(10);
  450.                 money=money+10;
  451.             }
  452.             if(money>=40)
  453.             {
  454.                 clrram_lcd ();
  455.                 gotoxy(1,0);
  456.                 print("绿茶购买成功");
  457.                 mdelay(10);
  458.                 gotoxy(2,0);
  459.                 print("找钱:    元");
  460.                 mdelay(10);
  461.                 du=money-40;
  462.                 Time[0]=du/10+'0';
  463.                 Time[1]='.';
  464.                 Time[2]=du%10+'0';
  465.                 Time[3]='\0';
  466.                 gotoxy(2,3);
  467.                 print(Time);
  468.                 mdelay(6000);
  469.                 money=0;
  470.                 clrram_lcd ();
  471.                 break;
  472.             }
  473.         }
  474.     }

  475.     if(K7==0)//按键4
  476.     {
  477.         if(m==6)beep=0;
  478.         if(m==5)beep=1;
  479.         m=30;
  480.         clrram_lcd ();
  481.         while(1)
  482.         {
  483.             if(m==0)
  484.             {
  485.                 if(0<money<50)
  486.                 {
  487.                     clrram_lcd ();
  488.                     gotoxy(1,0);
  489.                     print("投币不足购买失败");
  490.                     mdelay(10);
  491.                     gotoxy(2,0);
  492.                     print("退钱:    元");
  493.                     mdelay(10);
  494.                     Time[0]=money/10+'0';
  495.                     Time[1]='.';
  496.                     Time[2]=money%10+'0';
  497.                     Time[3]='\0';
  498.                     gotoxy(2,3);
  499.                     print(Time);
  500.                     mdelay(6000);
  501.                     money=0;
  502.                 }
  503.                 clrram_lcd ();
  504.                 break;
  505.             }
  506.             gotoxy(1,0);
  507.             print("已选啤酒");
  508.             mdelay(10);
  509.             gotoxy(2,0);
  510.             print("货物价格:5元");
  511.             mdelay(10);
  512.             gotoxy(3,0);
  513.             print("投币金额:     元");
  514.             mdelay(10);
  515.             gotoxy(4,0);
  516.             print("规定时间:");
  517.             mdelay(10);

  518.             if(n==0)
  519.             {
  520.                 gotoxy(3,5);
  521.                 print(Time);
  522.                 mdelay(100);
  523.             }
  524.             if(n==1)
  525.             {
  526.                 gotoxy(4,7);
  527.                 print(Time);
  528.                 mdelay(10);
  529.             }
  530.             if(K1==0)
  531.             {
  532.                 while(K1==0);
  533.                 mdelay(10);
  534.                 money=money+100;
  535.             }
  536.             if(K2==0)
  537.             {
  538.                 while(K2==0);
  539.                 mdelay(10);
  540.                 money=money+50;
  541.             }
  542.             if(K3==0)
  543.             {
  544.                 while(K3==0);
  545.                 mdelay(10);
  546.                 money=money+10;
  547.             }
  548.             if(money>=50)
  549.             {
  550.                 clrram_lcd ();
  551.                 gotoxy(1,0);
  552.                 print("啤酒买成功");
  553.                 mdelay(10);
  554.                 gotoxy(2,0);
  555.                 print("找钱:    元");
  556.                 mdelay(10);
  557.                 du=money-50;
  558.                 Time[0]=du/10+'0';
  559.                 Time[1]='.';
  560.                 Time[2]=du%10+'0';
  561.                 Time[3]='\0';
  562.                 gotoxy(2,3);
  563.                 print(Time);
  564.                 money=0;
  565.                 clrram_lcd ();
  566.                 break;
  567.             }
  568.         }
  569.     }
  570.     if(K8==0)//按键5
  571.     {
  572.         if(m==6)beep=0;
  573.         if(m==5)beep=1;
  574.         m=30;
  575.         clrram_lcd ();
  576.         while(1)
  577.         {
  578.             if(m==0)
  579.             {
  580.                 if(0<money<60)
  581.                 {
  582.                     clrram_lcd ();
  583.                     gotoxy(1,0);
  584.                     print("投币不足购买失败");
  585.                     mdelay(10);
  586.                     gotoxy(2,0);
  587.                     print("退钱:    元");
  588.                     mdelay(10);
  589.                     Time[0]=money/10+'0';
  590.                     Time[1]='.';
  591.                     Time[2]=money%10+'0';
  592.                     Time[3]='\0';
  593.                     gotoxy(2,3);
  594.                     print(Time);
  595.                     money=0;
  596.                 }
  597.                 clrram_lcd ();
  598.                 break;
  599.             }
  600.             gotoxy(1,0);
  601.             print("已选红牛");
  602.             mdelay(10);
  603.             gotoxy(2,0);
  604.             print("货物价格:6元");
  605.             mdelay(10);
  606.             gotoxy(3,0);
  607.             print("投币金额:     元");
  608.             mdelay(10);
  609.             gotoxy(4,0);
  610.             print("规定时间:");
  611.             mdelay(10);

  612.             if(n==0)
  613.             {
  614.                 gotoxy(3,5);
  615.                 print(Time);
  616.                 mdelay(100);
  617.             }
  618.             if(n==1)
  619.             {
  620.                 gotoxy(4,7);
  621.                 print(Time);
  622.                 mdelay(10);
  623.             }
  624.             if(K1==0)
  625.             {
  626.                 while(K1==0);
  627.                 mdelay(10);
  628.                 money=money+100;
  629.             }
  630.             if(K2==0)
  631.             {
  632.                 while(K2==0);
  633.                 mdelay(10);
  634.                 money=money+50;
  635.             }
  636.             if(K3==0)
  637.             {
  638.                 while(K3==0);
  639.                 mdelay(10);
  640.                 money=money+10;
  641.             }
  642.             if(K1==0)
  643.             {
  644.                 while(K1==0);
  645.                 mdelay(10);
  646.                 money=money+100;
  647.             }
  648.             if(K2==0)
  649.             {
  650.                 while(K2==0);
  651.                 mdelay(10);
  652.                 money=money+50;
  653.             }
  654.             if(K3==0)
  655.             {
  656.                 while(K3==0);
  657.                 mdelay(10);
  658.                 money=money+10;
  659.             }
  660.             if(money>=60)
  661.             {
  662.                 clrram_lcd ();
  663.                 gotoxy(1,0);
  664.                 print("红牛买成功");
  665.                 mdelay(10);
  666.                 gotoxy(2,0);
  667.                 print("找钱:    元");
  668.                 mdelay(10);
  669.                 du=money-60;
  670.                 Time[0]=du/10+'0';
  671.                 Time[1]='.';
  672.                 Time[2]=du%10+'0';
  673.                 Time[3]='\0';
  674.                 gotoxy(2,3);
  675.                 print(Time);
  676.                 money=0;
  677.                 clrram_lcd ();
  678.                 break;
  679.             }
  680.         }
  681.     }


  682. }
  683. //************************************
  684. //主程序
  685. //*************************************
  686. main()
  687. {
  688.     TMOD=0x01;     //T0 工作在方式1 16位计数器
  689.     TH0=(65536-5000)/256;  //预先 设定定时器 初值,50毫秒
  690.     TL0=(65536-5000)%256;
  691.     EA=1;      //开启 总中断
  692.     ET0=1;      //开启定时器 0 中断
  693.     TR0=1;      //定时器 0 启动计数
  694.     init_lcd();
  695.     clrram_lcd();
  696.     while(1)
  697.     {
  698.         show();
  699.         key();
  700.     }


  701. }

  702. void time0(void)  interrupt 1
  703. {
  704.     TH0=(65536-50000)/256;  //重新设置定时器 初值,产生50MS定时中断
  705.     TL0=(65536-50000)%256;
  706.     count++;     //50ms太短,闪烁频率太快
  707.     if(count==10)
  708.     {
  709.         if(n==0)
  710.         {
  711.             Time[0]=m/10+'0';
  712.             Time[1]=m%10+'0';
  713.             Time[2]='\0';
  714.         }
  715.         if(n==1)
  716.         {
  717.             Time[0]=money/10+'0';
  718.             Time[1]='.';
  719.             Time[2]=money%10+'0';
  720.         }
  721.         Time[3]='\0';
  722.         Time[4]='\0';
  723.         count=0;
  724.         if(m==0)m=30;
  725.         n++;
  726.         if(n==2)
  727.         {
  728.             m--;
  729.             n=0;
  730.         }
  731.         nn++;
  732.         if(nn==20)
  733.         {
  734.             nn=0;
  735.         }
  736.     }
  737. }
复制代码
回复

使用道具 举报

ID:236084 发表于 2017-9-27 16:28 | 显示全部楼层
在吗,大神
回复

使用道具 举报

ID:89286 发表于 2017-9-28 05:33 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:315558 发表于 2018-4-24 18:05 | 显示全部楼层
你好,可以把这源代码剖析一下吗,可以分为几部分,每部分作用是什么
回复

使用道具 举报

ID:335162 发表于 2018-5-21 19:58 | 显示全部楼层
大神。。。
回复

使用道具 举报

ID:120672 发表于 2018-11-19 19:33 | 显示全部楼层
好东西,谢谢分享!!
回复

使用道具 举报

ID:352301 发表于 2020-5-22 08:46 | 显示全部楼层
整套售货机软件源码:https://www.cnblogs.com/chen1880/p/12928730.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表