标题:
基于51单片机的扫码枪显示程序 超市收银系统设计
[打印本页]
作者:
dddddddeeeee
时间:
2020-3-5 20:15
标题:
基于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
要用条件语句来转化一下
制作出来的实物图如下:
img_0856.png
(5.92 MB, 下载次数: 55)
下载附件
这是电路板
2020-3-5 20:07 上传
单片机源程序如下:
#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)
2020-3-5 20:08 上传
点击文件名下载附件
下载积分: 黑币 -5
扫码枪.PDF
(79.18 KB, 下载次数: 55)
2020-3-5 20:09 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
550186049
时间:
2021-8-3 16:22
正在研究单片机和扫描枪通讯,下载学习!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1