找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4609|回复: 1
打印 上一主题 下一主题
收起左侧

基于51单片机的扫码枪显示程序 超市收银系统设计

[复制链接]
跳转到指定楼层
楼主
该设计是基于51单片机的超市收银系统,主要就是将扫码枪扫出的码通过51单片机显示到显示屏中。这里我能够成功的实现将扫码枪扫个码在屏幕中显示出来,但是这里是基于超市收银的,我将它屏蔽了,在主程序中是一个for循环。如果有需要的可以尝试一下。该程序我已经通过测试没有问题。同时它还能够使用eeprom将总价储存,上电后按一下按键就能够恢复。
该板子上有两个按键,一个是单片机复位按键,另一个是控制按键。扫码枪先扫码,然后按一下得出总价钱,再按一下清零,重新输入。扫码枪和单片机之间要用Ttl转Rs 232转换转换。其他的注意事项我总结了一下在下边:
1.扫码枪用九针串口
2.用ttl转串口的转换器
3.二维码共有13位,串口接收会有14位
  第14位是停止位,所以编程显示时要
  留14位,显示13位;
4.一般扫码枪波特率是9600,无校验位
   有一个停止位;
5.串口发送,单片机接收的是ascii码,
  串口发单片机接收     实际数值
       0x30                0
       0x31                1
       0x32                2
       0x33                3
        ...               ...
       0x39                9

要用条件语句来转化一下

制作出来的实物图如下:


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include"n5110.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. //uchar dj=0,zj=0,i=0;                             //商品单价和总价数
  7. uint zj=0,dzj,i=0;                     //总价          dzj掉电后的数据
  8. sbit PIN_RXD = P3^0;                          //串口
  9. sbit PIN_TXD = P3^1;                          //串口
  10. sbit k1=P2^3;
  11. bit RxdEnd = 0;                                          //串口
  12. bit RxdOrTxd = 0;                                  //串口
  13. bit TxdEnd = 0;                                          //串口

  14. unsigned char RxdBuf = 0;                  //串口
  15. unsigned char TxdBuf = 0;                  //串口
  16. //***********iic**********************************
  17. extern void InitLcd1602();
  18. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  19. extern void I2CStart();
  20. extern void I2CStop();
  21. extern unsigned char I2CReadACK();
  22. extern unsigned char I2CReadNAK();
  23. extern bit I2CWrite(unsigned char dat);
  24. extern void E2Read(unsigned char *buf, unsigned char addr, unsigned char len);
  25. extern void E2Write(unsigned char *buf, unsigned char addr, unsigned char len);


  26. //************************************************





  27. void delay(uchar x);
  28. void shuzi(uchar x,uchar y,uchar e ) ;
  29. //void lcdwritechar(uchar x,uchar y,uchar c);
  30. void ConfigUART(unsigned int baud);                        ////串口
  31. void StartRXD();                                                                        //串口
  32. //void StartTXD(unsigned char dat);                                        //串口
  33. void jiaqian(uint unmber);
  34. void jiaqian(uint unmber);

  35. void At24c02Write(unsigned char ,unsigned char );
  36. unsigned char At24c02Read(unsigned char );
  37. void Delay1ms();
  38. //void Timer0Configuration();
  39. uchar huan[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
  40. uchar wenben[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
  41. unsigned char code font6_16[][12]={
  42. 0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,         //0
  43. 0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,          //1
  44. 0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00,         //2
  45. 0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,         //3
  46. 0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00,         //4
  47. 0x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00,         //5
  48. 0xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00,         //6
  49. 0x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,         //7
  50. 0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,         //8
  51. 0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00,         //9
  52. 0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,        //:       
  53. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x00,0x00,        //.
  54. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,        // 空                                                                                                          
  55. };                                                                                                                                                                                                                 
  56. void main()
  57. {
  58.      unsigned char ii=0,ki=0,zi=1;          //gzj=总价的ge位,...         ,gzj,szj,bzj,qzj
  59.         unsigned char buf[4];                                                                 
  60.         unsigned char cbuf[4];
  61.         bit flag=0,flag1=1;
  62.         lcdinit();       
  63.                 jibenxianshi();                         //显示基本格局
  64.                 shuzi(24,0,10 );                 //:
  65.                
  66.              shuzi(36,2,0 );                //0           单价哪一行
  67.                  shuzi(43,2,0 );                //0
  68.                  shuzi(49,2,11 );                //.
  69.                  shuzi(55,2,0 );                 //0
  70.                  shuzi(24,2,10 );                 //:

  71.                  shuzi(36,4,0 );                //0           总价哪一行
  72.                  shuzi(42,4,0 );                //0
  73.                  shuzi(48,4,0 );                //0
  74.                  shuzi(54,4,11);                //.
  75.                  shuzi(60,4,0 );                 //0
  76.                  shuzi(24,4,10 );                 //:           总价前的冒号

  77.                 EA = 1;                                                                //串口
  78.             ConfigUART(9600);                                                //串口
  79.                 k1=1;
  80.     while(1)
  81.         {                           

  82. //********************************************************
  83. if(huan[0]==6&&huan[1]==9&&huan[2]==4&&huan[3]==2&&huan[4]==7)        //商品一  69427
  84. {
  85.                   shuzi(36,2,1 );                //1          
  86.                   shuzi(43,2,2 );                //2
  87.                   shuzi(49,2,11 );                //.
  88.                   shuzi(55,2,0 );                 //3
  89.                     shuzi(65,0,1);         //商品1  
  90.                     zj=zj+120;
  91.                  
  92.                 buf[3]=zj/1000;                 //千
  93.             buf[2]=zj/100%10;         //百
  94.             buf[1]=zj/10%10;         //十
  95.         buf[0]=zj%10;                 //个
  96.            E2Write(buf,0x90,4);        //E2Write(buf, 0x90, sizeof(buf));
  97.                         delay(50);
  98. //                  jiaqian(zj);
  99.                     huan[0]=0;
  100.                         huan[1]=0;
  101.                         huan[2]=0;
  102.                         huan[3]=0;
  103.                



  104. }


  105. if(huan[0]==6&&huan[1]==9&&huan[2]==5&&huan[3]==4&&huan[4]==4)         //商品2    69544
  106. {
  107.                   shuzi(36,2,0 );                //0          
  108.                   shuzi(43,2,4 );                //4
  109.                   shuzi(49,2,11 );                //.
  110.                   shuzi(55,2,0 );                 //0
  111.                   shuzi(65,0,2);                //商品2         
  112.           
  113.                   zj=zj+40;
  114.                 buf[3]=zj/1000;                 //千
  115.             buf[2]=zj/100%10;         //百
  116.             buf[1]=zj/10%10;         //十
  117.         buf[0]=zj%10;                 //个
  118.            E2Write(buf, 0x90,4);         //          E2Write(buf, 0x90, sizeof(buf));
  119.                   
  120.                         delay(50);
  121. //          jiaqian(zj);             
  122.                     huan[0]=0;
  123.                         huan[1]=0;
  124.                         huan[2]=0;
  125.                         huan[3]=0;
  126.                
  127. }


  128.   if(huan[0]==6&&huan[1]==9&&huan[2]==7&&huan[3]==1&&huan[4]==1)  //商品3   69711
  129. {            
  130.                   shuzi(36,2,0 );                //0          
  131.                   shuzi(43,2,8 );                //8
  132.                   shuzi(49,2,11 );                //.
  133.                   shuzi(55,2,0);                 //3
  134.                   shuzi(65,0,3);                //商品3
  135.    
  136.                   zj=zj+80;

  137.                 buf[3]=zj/1000;                 //千
  138.             buf[2]=zj/100%10;         //百
  139.             buf[1]=zj/10%10;         //十
  140.         buf[0]=zj%10;                 //个
  141.            E2Write(buf, 0x90, 4);        //          E2Write(buf, 0x90, sizeof(buf));
  142.                         delay(50);
  143. //           jiaqian(zj);                                                                         
  144.                     huan[0]=0;
  145.                         huan[1]=0;
  146.                         huan[2]=0;
  147.                         huan[3]=0;
  148.                

  149. }

  150. //*******************************************************


  151.   if(huan[0]==0&&huan[1]==0&&huan[2]==0&&huan[3]==0&&huan[4]==0)
  152. {
  153.                 shuzi(65,0,12);                 //商品

  154.                   shuzi(36,2,0 );                //0          
  155.                   shuzi(43,2,0 );                //0
  156.                   shuzi(49,2,11 );                //.
  157.                   shuzi(55,2,0 );                 //0


  158. }                         
  159. ////*****************成功在显示屏上显示二维码对应的数字**************************************
  160. //                           for(ii=0;ii<13;ii++)
  161. //                         {
  162. //                        shuzi(ki,4,huan[ii]);
  163. //                                 ki=ki+6;
  164. //                                 if(ki>=77)
  165. //                                 ki=0;
  166. //                         }
  167. //                         delay(200);
  168. ////********************************************
  169. //                    
  170.          if(k1==0&&flag1==1)        //
  171.                 {
  172.       delay(150);            
  173.         if(k1==0&&flag1==1)//
  174.                  {
  175.                
  176.                
  177.            E2Read(buf, 0x90,4);           //  E2Read(cbuf, 0x90, sizeof(buf));
  178.                  delay(100);
  179.               dzj=buf[3]*1000+buf[2]*100+buf[1]*10+buf[0];
  180.                   zj=dzj;
  181.                   jiaqian(zj);
  182.                                                                                               
  183.                    flag1=0;          
  184.                     shuzi(78,0,1);
  185.                
  186.            }
  187.           
  188.            }
  189. //
  190. //
  191.            if(k1==0&&flag1==0)
  192.                 {
  193.         delay(150);
  194.                         if(k1==0&&flag1==0)
  195.                  {                  
  196.                                                   
  197.                     huan[0]=0;
  198.                         huan[1]=0;
  199.                         huan[2]=0;
  200.                         huan[3]=0;
  201.                         huan[4]=0;  
  202.                         jiaqian(0);
  203.                            zj=0;
  204.                           buf[3]=0;                 //千
  205.                     buf[2]=0;         //百
  206.                     buf[1]=0;         //十
  207.                 buf[0]=0;                 //个
  208.            E2Write( cbuf, 0x90, 4);///         E2Write( buf, 0x90, sizeof(buf));       
  209.                         delay(150);       
  210.                            flag1=1;   
  211.                         shuzi(78,0,2);
  212.            }          
  213.            }
  214.          




  215.         }
  216. }  
  217.    
  218. void delay(uchar x)                                  
  219. {
  220.   uint i,j;
  221.   for(j=x;j>0;j--)
  222.   for(i=110;i>0;i--);
  223. }

  224. /***********************************************************
  225. /*        5110相关程序
  226. /***********************************************************/
  227. void shuzi(uchar x,uchar y,uchar e )    //12*16
  228. {
  229.            uchar j,k;
  230.      lcdsetxy(x,y);               
  231.    for(j=0;j<6;j++)
  232.    {
  233.      lcdwritebyte(font6_16[e][j],1);
  234.          
  235.    }
  236.    lcdsetxy(x,y+1);
  237.       for(k=6;k<12;k++)
  238.    {
  239.      lcdwritebyte(font6_16[e][k],1);
  240.         }

  241. }

  242. void jiaqian(uint unmber)
  243. {
  244.    uchar ge,shi,bai,xs;                  //xs=小数

  245. //   xshu=
  246.    xs= unmber%10;
  247.    ge=unmber/10%10;
  248.    shi=unmber/100%10;
  249.    bai=unmber/1000;

  250.          shuzi(36,4,bai);                //0           总价哪一行
  251.          shuzi(42,4,shi);                //0
  252.          shuzi(48,4,ge);                //0
  253.          shuzi(54,4,11);                //.
  254.          shuzi(60,4,xs);                 //0


  255. }

  256. /********************************************************************
  257. /*串口相关程序
  258. /********************************************************************/
  259. void ConfigUART(unsigned int baud)
  260. {
  261.     SCON  = 0x50;  //配置串口为模式1
  262.     TMOD &= 0x0F;  //清零T1的控制位
  263.     TMOD |= 0x20;  //配置T1为模式2
  264.     TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值
  265.     TL1 = TH1;     //初值等于重载值
  266.     ET1 = 0;       //禁止T1中断
  267.     ES  = 1;       //使能串口中断
  268.     TR1 = 1;       //启动T1
  269. }


  270. void InterruptUART() interrupt 4
  271. {

  272.         if(RI)
  273.         {
  274.                 RI = 0;

  275.         if(SBUF==0x30)
  276.            huan[i]=0;
  277.         else
  278.         if(SBUF==0x31)
  279.            huan[i]=1;
  280.         else
  281.         if(SBUF==0x32)
  282.         {
  283.           huan[i]=2;
  284.         }
  285.                 else
  286.         if(SBUF==0x33)
  287.         {
  288.           huan[i]=3;
  289.         }
  290.             else
  291.         if(SBUF==0x34)
  292.         {
  293.           huan[i]=4;
  294.         }
  295.                 else
  296.         if(SBUF==0x35)
  297.         {
  298.           huan[i]=5;
  299.         }
  300.                 else
  301.         if(SBUF==0x36)
  302.         {
  303.           huan[i]=6;
  304.         }
  305.                 else
  306.         if(SBUF==0x37)
  307.         {
  308.           huan[i]=7;
  309.         }
  310.                 else
  311.         if(SBUF==0x38)
  312.         {
  313.           huan[i]=8;
  314.         }
  315.                 else
  316.         if(SBUF==0x39)
  317.         {
  318.           huan[i]=9;
  319.         }
  320.         i++;               
  321.         if(i>=14)
  322.         i=0;
  323.         }

  324.        


  325.    






  326. }                                                                  
  327. /***************************************************************
  328. /*         eeprom 相关程序
  329. /*****************************************************************/
  330. /*******************************************************************************
  331. * 函数名         : void At24c02Write(unsigned char addr,unsigned char dat)
  332. * 函数功能                   : 往24c02的一个地址写入一个数据
  333. * 输入           : 无
  334. * 输出                  : 无
  335. *******************************************************************************/

  336. //void E2Read(unsigned char *buf, unsigned char addr, unsigned char len)
  337. //{
  338. //        do{
  339. //                I2CStart();
  340. //                if(I2CWrite(0x50 << 1))
  341. //                {
  342. //                        break;
  343. //                }
  344. //                I2CStop();
  345. //          }while(1);
  346. //        I2CWrite(addr);
  347. //        I2CStart();
  348. //        I2CWrite((0x50 << 1) | 0x01);
  349. //        while(len > 1)
  350. //        {
  351. //                *buf++ = I2CReadACK();
  352. //                len--;
  353. ……………………

  354. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
shiyan1.zip (79.79 KB, 下载次数: 53)
扫码枪.PDF (79.18 KB, 下载次数: 51)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:958643 发表于 2021-8-3 16:22 | 只看该作者
正在研究单片机和扫描枪通讯,下载学习!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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