该设计是基于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
要用条件语句来转化一下
制作出来的实物图如下:
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #include"n5110.h"
- #define uchar unsigned char
- #define uint unsigned int
- //uchar dj=0,zj=0,i=0; //商品单价和总价数
- uint zj=0,dzj,i=0; //总价 dzj掉电后的数据
- sbit PIN_RXD = P3^0; //串口
- sbit PIN_TXD = P3^1; //串口
- sbit k1=P2^3;
- bit RxdEnd = 0; //串口
- bit RxdOrTxd = 0; //串口
- bit TxdEnd = 0; //串口
- unsigned char RxdBuf = 0; //串口
- unsigned char TxdBuf = 0; //串口
- //***********iic**********************************
- extern void InitLcd1602();
- extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
- extern void I2CStart();
- extern void I2CStop();
- extern unsigned char I2CReadACK();
- extern unsigned char I2CReadNAK();
- extern bit I2CWrite(unsigned char dat);
- extern void E2Read(unsigned char *buf, unsigned char addr, unsigned char len);
- extern void E2Write(unsigned char *buf, unsigned char addr, unsigned char len);
- //************************************************
- void delay(uchar x);
- void shuzi(uchar x,uchar y,uchar e ) ;
- //void lcdwritechar(uchar x,uchar y,uchar c);
- void ConfigUART(unsigned int baud); ////串口
- void StartRXD(); //串口
- //void StartTXD(unsigned char dat); //串口
- void jiaqian(uint unmber);
- void jiaqian(uint unmber);
- void At24c02Write(unsigned char ,unsigned char );
- unsigned char At24c02Read(unsigned char );
- void Delay1ms();
- //void Timer0Configuration();
- uchar huan[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
- uchar wenben[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
- unsigned char code font6_16[][12]={
- 0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //0
- 0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00, //1
- 0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00, //2
- 0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //3
- 0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00, //4
- 0x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //5
- 0xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //6
- 0x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00, //7
- 0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //8
- 0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00, //9
- 0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00, //:
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x00,0x00, //.
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 空
- };
- void main()
- {
- unsigned char ii=0,ki=0,zi=1; //gzj=总价的ge位,... ,gzj,szj,bzj,qzj
- unsigned char buf[4];
- unsigned char cbuf[4];
- bit flag=0,flag1=1;
- lcdinit();
- jibenxianshi(); //显示基本格局
- shuzi(24,0,10 ); //:
-
- shuzi(36,2,0 ); //0 单价哪一行
- shuzi(43,2,0 ); //0
- shuzi(49,2,11 ); //.
- shuzi(55,2,0 ); //0
- shuzi(24,2,10 ); //:
- shuzi(36,4,0 ); //0 总价哪一行
- shuzi(42,4,0 ); //0
- shuzi(48,4,0 ); //0
- shuzi(54,4,11); //.
- shuzi(60,4,0 ); //0
- shuzi(24,4,10 ); //: 总价前的冒号
- EA = 1; //串口
- ConfigUART(9600); //串口
- k1=1;
- while(1)
- {
- //********************************************************
- if(huan[0]==6&&huan[1]==9&&huan[2]==4&&huan[3]==2&&huan[4]==7) //商品一 69427
- {
- shuzi(36,2,1 ); //1
- shuzi(43,2,2 ); //2
- shuzi(49,2,11 ); //.
- shuzi(55,2,0 ); //3
- shuzi(65,0,1); //商品1
- zj=zj+120;
-
- buf[3]=zj/1000; //千
- buf[2]=zj/100%10; //百
- buf[1]=zj/10%10; //十
- buf[0]=zj%10; //个
- E2Write(buf,0x90,4); //E2Write(buf, 0x90, sizeof(buf));
- delay(50);
- // jiaqian(zj);
- huan[0]=0;
- huan[1]=0;
- huan[2]=0;
- huan[3]=0;
-
- }
- if(huan[0]==6&&huan[1]==9&&huan[2]==5&&huan[3]==4&&huan[4]==4) //商品2 69544
- {
- shuzi(36,2,0 ); //0
- shuzi(43,2,4 ); //4
- shuzi(49,2,11 ); //.
- shuzi(55,2,0 ); //0
- shuzi(65,0,2); //商品2
-
- zj=zj+40;
- buf[3]=zj/1000; //千
- buf[2]=zj/100%10; //百
- buf[1]=zj/10%10; //十
- buf[0]=zj%10; //个
- E2Write(buf, 0x90,4); // E2Write(buf, 0x90, sizeof(buf));
-
- delay(50);
- // jiaqian(zj);
- huan[0]=0;
- huan[1]=0;
- huan[2]=0;
- huan[3]=0;
-
- }
- if(huan[0]==6&&huan[1]==9&&huan[2]==7&&huan[3]==1&&huan[4]==1) //商品3 69711
- {
- shuzi(36,2,0 ); //0
- shuzi(43,2,8 ); //8
- shuzi(49,2,11 ); //.
- shuzi(55,2,0); //3
- shuzi(65,0,3); //商品3
-
- zj=zj+80;
- buf[3]=zj/1000; //千
- buf[2]=zj/100%10; //百
- buf[1]=zj/10%10; //十
- buf[0]=zj%10; //个
- E2Write(buf, 0x90, 4); // E2Write(buf, 0x90, sizeof(buf));
- delay(50);
- // jiaqian(zj);
- huan[0]=0;
- huan[1]=0;
- huan[2]=0;
- huan[3]=0;
-
- }
- //*******************************************************
- if(huan[0]==0&&huan[1]==0&&huan[2]==0&&huan[3]==0&&huan[4]==0)
- {
- shuzi(65,0,12); //商品
- shuzi(36,2,0 ); //0
- shuzi(43,2,0 ); //0
- shuzi(49,2,11 ); //.
- shuzi(55,2,0 ); //0
-
-
- }
- ////*****************成功在显示屏上显示二维码对应的数字**************************************
- // for(ii=0;ii<13;ii++)
- // {
- // shuzi(ki,4,huan[ii]);
- // ki=ki+6;
- // if(ki>=77)
- // ki=0;
- // }
- // delay(200);
- ////********************************************
- //
- if(k1==0&&flag1==1) //
- {
- delay(150);
- if(k1==0&&flag1==1)//
- {
-
-
- E2Read(buf, 0x90,4); // E2Read(cbuf, 0x90, sizeof(buf));
- delay(100);
- dzj=buf[3]*1000+buf[2]*100+buf[1]*10+buf[0];
- zj=dzj;
- jiaqian(zj);
-
- flag1=0;
- shuzi(78,0,1);
-
- }
-
- }
- //
- //
- if(k1==0&&flag1==0)
- {
- delay(150);
- if(k1==0&&flag1==0)
- {
-
- huan[0]=0;
- huan[1]=0;
- huan[2]=0;
- huan[3]=0;
- huan[4]=0;
- jiaqian(0);
- zj=0;
- buf[3]=0; //千
- buf[2]=0; //百
- buf[1]=0; //十
- buf[0]=0; //个
- E2Write( cbuf, 0x90, 4);/// E2Write( buf, 0x90, sizeof(buf));
- delay(150);
- flag1=1;
- shuzi(78,0,2);
- }
- }
-
- }
- }
-
- void delay(uchar x)
- {
- uint i,j;
- for(j=x;j>0;j--)
- for(i=110;i>0;i--);
- }
- /***********************************************************
- /* 5110相关程序
- /***********************************************************/
- void shuzi(uchar x,uchar y,uchar e ) //12*16
- {
- uchar j,k;
- lcdsetxy(x,y);
- for(j=0;j<6;j++)
- {
- lcdwritebyte(font6_16[e][j],1);
-
- }
- lcdsetxy(x,y+1);
- for(k=6;k<12;k++)
- {
- lcdwritebyte(font6_16[e][k],1);
- }
- }
- void jiaqian(uint unmber)
- {
- uchar ge,shi,bai,xs; //xs=小数
- // xshu=
- xs= unmber%10;
- ge=unmber/10%10;
- shi=unmber/100%10;
- bai=unmber/1000;
- shuzi(36,4,bai); //0 总价哪一行
- shuzi(42,4,shi); //0
- shuzi(48,4,ge); //0
- shuzi(54,4,11); //.
- shuzi(60,4,xs); //0
-
- }
- /********************************************************************
- /*串口相关程序
- /********************************************************************/
- void ConfigUART(unsigned int baud)
- {
- SCON = 0x50; //配置串口为模式1
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x20; //配置T1为模式2
- TH1 = 256 - (11059200/12/32)/baud; //计算T1重载值
- TL1 = TH1; //初值等于重载值
- ET1 = 0; //禁止T1中断
- ES = 1; //使能串口中断
- TR1 = 1; //启动T1
- }
- void InterruptUART() interrupt 4
- {
- if(RI)
- {
- RI = 0;
- if(SBUF==0x30)
- huan[i]=0;
- else
- if(SBUF==0x31)
- huan[i]=1;
- else
- if(SBUF==0x32)
- {
- huan[i]=2;
- }
- else
- if(SBUF==0x33)
- {
- huan[i]=3;
- }
- else
- if(SBUF==0x34)
- {
- huan[i]=4;
- }
- else
- if(SBUF==0x35)
- {
- huan[i]=5;
- }
- else
- if(SBUF==0x36)
- {
- huan[i]=6;
- }
- else
- if(SBUF==0x37)
- {
- huan[i]=7;
- }
- else
- if(SBUF==0x38)
- {
- huan[i]=8;
- }
- else
- if(SBUF==0x39)
- {
- huan[i]=9;
- }
- i++;
- if(i>=14)
- i=0;
- }
-
-
- }
- /***************************************************************
- /* eeprom 相关程序
- /*****************************************************************/
- /*******************************************************************************
- * 函数名 : void At24c02Write(unsigned char addr,unsigned char dat)
- * 函数功能 : 往24c02的一个地址写入一个数据
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- //void E2Read(unsigned char *buf, unsigned char addr, unsigned char len)
- //{
- // do{
- // I2CStart();
- // if(I2CWrite(0x50 << 1))
- // {
- // break;
- // }
- // I2CStop();
- // }while(1);
- // I2CWrite(addr);
- // I2CStart();
- // I2CWrite((0x50 << 1) | 0x01);
- // while(len > 1)
- // {
- // *buf++ = I2CReadACK();
- // len--;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
shiyan1.zip
(79.79 KB, 下载次数: 57)
扫码枪.PDF
(79.18 KB, 下载次数: 53)
|