該設(shè)計(jì)是基于51單片機(jī)的超市收銀系統(tǒng),主要就是將掃碼槍掃出的碼通過51單片機(jī)顯示到顯示屏中。這里我能夠成功的實(shí)現(xiàn)將掃碼槍掃個(gè)碼在屏幕中顯示出來,但是這里是基于超市收銀的,我將它屏蔽了,在主程序中是一個(gè)for循環(huán)。如果有需要的可以嘗試一下。該程序我已經(jīng)通過測試沒有問題。同時(shí)它還能夠使用eeprom將總價(jià)儲(chǔ)存,上電后按一下按鍵就能夠恢復(fù)。
該板子上有兩個(gè)按鍵,一個(gè)是單片機(jī)復(fù)位按鍵,另一個(gè)是控制按鍵。掃碼槍先掃碼,然后按一下得出總價(jià)錢,再按一下清零,重新輸入。掃碼槍和單片機(jī)之間要用Ttl轉(zhuǎn)Rs 232轉(zhuǎn)換轉(zhuǎn)換。其他的注意事項(xiàng)我總結(jié)了一下在下邊:
1.掃碼槍用九針串口
2.用ttl轉(zhuǎn)串口的轉(zhuǎn)換器
3.二維碼共有13位,串口接收會(huì)有14位
第14位是停止位,所以編程顯示時(shí)要
留14位,顯示13位;
4.一般掃碼槍波特率是9600,無校驗(yàn)位
有一個(gè)停止位;
5.串口發(fā)送,單片機(jī)接收的是ascii碼,
串口發(fā)單片機(jī)接收 實(shí)際數(shù)值
0x30 0
0x31 1
0x32 2
0x33 3
... ...
0x39 9
要用條件語句來轉(zhuǎn)化一下
制作出來的實(shí)物圖如下:
img_0856.png (5.92 MB, 下載次數(shù): 55)
下載附件
這是電路板
2020-3-5 20:07 上傳
單片機(jī)源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #include"n5110.h"
- #define uchar unsigned char
- #define uint unsigned int
- //uchar dj=0,zj=0,i=0; //商品單價(jià)和總價(jià)數(shù)
- uint zj=0,dzj,i=0; //總價(jià) dzj掉電后的數(shù)據(jù)
- 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=總價(jià)的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 單價(jià)哪一行
- shuzi(43,2,0 ); //0
- shuzi(49,2,11 ); //.
- shuzi(55,2,0 ); //0
- shuzi(24,2,10 ); //:
- shuzi(36,4,0 ); //0 總價(jià)哪一行
- shuzi(42,4,0 ); //0
- shuzi(48,4,0 ); //0
- shuzi(54,4,11); //.
- shuzi(60,4,0 ); //0
- shuzi(24,4,10 ); //: 總價(jià)前的冒號(hào)
- 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; //個(gè)
- 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; //個(gè)
- 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; //個(gè)
- 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
-
-
- }
- ////*****************成功在顯示屏上顯示二維碼對(duì)應(yīng)的數(shù)字**************************************
- // 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; //個(gè)
- 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相關(guān)程序
- /***********************************************************/
- 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=小數(shù)
- // xshu=
- xs= unmber%10;
- ge=unmber/10%10;
- shi=unmber/100%10;
- bai=unmber/1000;
- shuzi(36,4,bai); //0 總價(jià)哪一行
- shuzi(42,4,shi); //0
- shuzi(48,4,ge); //0
- shuzi(54,4,11); //.
- shuzi(60,4,xs); //0
-
- }
- /********************************************************************
- /*串口相關(guān)程序
- /********************************************************************/
- void ConfigUART(unsigned int baud)
- {
- SCON = 0x50; //配置串口為模式1
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x20; //配置T1為模式2
- TH1 = 256 - (11059200/12/32)/baud; //計(jì)算T1重載值
- TL1 = TH1; //初值等于重載值
- ET1 = 0; //禁止T1中斷
- ES = 1; //使能串口中斷
- TR1 = 1; //啟動(dòng)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 相關(guān)程序
- /*****************************************************************/
- /*******************************************************************************
- * 函數(shù)名 : void At24c02Write(unsigned char addr,unsigned char dat)
- * 函數(shù)功能 : 往24c02的一個(gè)地址寫入一個(gè)數(shù)據(jù)
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- //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--;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
shiyan1.zip
(79.79 KB, 下載次數(shù): 57)
2020-3-5 20:08 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
掃碼槍.PDF
(79.18 KB, 下載次數(shù): 55)
2020-3-5 20:09 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|