psb单片机(pos机单片机程序)
POS收款系统

iviolent 你好:
目前市场上的适用于服装管理设备有2种:
1.PC类收款设备:
PC类收款设备我所指的是 电脑和POS机,这两种设备都需要 后台软件支持,也就是说,你买了设备还需要再购买软件,总体价格在4000~几万不等(主要是看你选择什么东西来定价格!)。其中涉及到的设备,你可以参照我下面给出的连接或是看我以前回答的问题,其中有设备的详细说明和品牌介绍。
2.单片机类收款设备:
单片机类收款设备熟称收款机,其能设计主要以单片机技术为依托,收款机的价格在1000~2000。而这种机器单独使用就可实现管理,不需要再购买其他软件,也可完全脱离PC机使用,因为销售过程中 销售记录是储存在收款机里,你可以通过收款机来打印 当天的销售报表,也可使用收款机 将 收款销售储存在PC里。
收款机与POS机都可实现 服装店的管理功能,但设备也有一定的区别,可根据实际情况选择机型。
PC类收款设备与单片机类收款设备的区别:
PC类收款设备简称为POS机,单片机类收款设备简称为收款机
1.POS机比收款机管理灵活,能针对进 销 存进行完整的管理。
2.收款机储存信息有容量的限制,一般储存1000~8000个商品信息不等。POS机无完全意义上的限制(使用硬盘存储)
3.收款机价格比POS机价格低。
跪求 单片机 用C语言写一个程序 用LCD显示welcome 急急急急十万火急 在线等
#include reg51.h //51寄存器文件
#include intrins.h
typedef unsigned char BYTE; //用BYTE代替unsigned char
typedef unsigned int WORD;//WORD代替unsigned int
typedef bit BOOL ;//用BOOL代替bit
sbit rs = P2^6; //复位端
sbit rw = P2^5; //写数据端
sbit ep = P2^7; //使能端
BYTE code dis1[] = {“welcome!,I’m Tom”};
//LCD侧忙函数
BOOL lcd_bz()
{
BOOL result;
rs = 0;
rw = 1;
ep = 1;
nop();
nop();
nop();
nop();
result = (BOOL)(P0 0x80); //检测P0最高位是否为1
ep = 0;
return result;//返回侧忙结果
}
// 写入指令数据到LCD
lcd_wcmd(BYTE cmd)
{
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
nop();
nop();
P0 = cmd; //将8位指令通过P0口传给1602
nop();
nop();//用于产生一个脉冲宽度
nop();
nop();
ep = 1;
nop();
nop();
nop();
nop();
ep = 0;
}
//设定显示位置
lcd_pos(BYTE pos)
{
lcd_wcmd(pos | 0x80);
}
//写入字符显示数据到LCD
lcd_wdat(BYTE dat)
{
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;//将8位数据通过P0口传给1602
nop();
nop();
nop(); //用于产生一个脉冲宽度
nop();
ep = 1;
nop();
nop();
nop();
nop();
ep = 0;
}
//LCD初始化设定
lcd_init()
{
lcd_wcmd(0x38); ////16*2显示,5*7点阵,8位数据
lcd_wcmd(0x0c); //显示开,关光标
lcd_wcmd(0x06); //移动光标
lcd_wcmd(0x01); //清除LCD的显示内容
}
main()
{
BYTE i;
lcd_init(); //初始化LCD
lcd_pos(4); //设置显示位置为第一行的第5个字符
i = 0;
while(dis1[i] != ‘\0’)
{ //显示字符”welcome!”
lcd_wdat(dis1[i]);
i++;
}
while(1);
}
单片机数字时钟程序及电路图
#include reg51.h
#include intrins.h
#define uint unsigned int
#define uchar unsigned char
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit SPK=P3^0;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
uchar Display_Buffer[16]=” “;
uchar Count,hour=12,min=12,sec=12;
bit flag,H_or_M;
uchar display[]=“This is colck”;
void _delay_ms(uint x)
{
uchar i;
while(x–)
{
for(i=0;i120;i++);
}
}
/**********************************************************************
*函数名称:LCD_Write_Command
*输 入:uchar cmd
*输 出:无
*功 能:向LCD1602写指令
*******************************************************************/
void LCD_Write_Command(uchar cmd)
{
LCD_RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
LCD_RW=0;
LCD_EN=0;//EN置低电平
P0=cmd;//将数据送入P2口,即写入指令或地址
LCD_EN=1;//EN置高电平
_delay_ms(1);//稍延时,给硬件反应时间
LCD_EN=0;//当EN由高电平跳变成低电平时,液晶模块开始执行命令
}
/*******************************************************************
*函数名称:LCD_Write_Data
*输 入:uchar dat
*输 出:无
*功 能:向LCD1602写数据
*******************************************************************/
void LCD_Write_Data(uchar dat)
{
LCD_RS=1;//RS为高电平,RW为低电平时,可以写入数据
LCD_RW=0;
LCD_EN=0;//EN置低电平
P0=dat;//将数据送入P0口,即将数据写入液晶模块
LCD_EN=1;//EN置高电平
_delay_ms(1);//稍延时,给硬件反应时间
LCD_EN=0;//当EN由高电平跳变成低电平时,液晶模块开始执行命令
}
/*******************************************************************
*函数名称:Init_LCD
*输 入:无
*输 出:无
*功 能:初始化LCD1602
*******************************************************************/
void Init_LCD(void)
{
LCD_Write_Command(0x38);//显示模式设置:16×2显示,5×7点阵,8位数据接口
_delay_ms(1);
LCD_Write_Command(0x06);//显示模式设置:光标右移,字符不移
_delay_ms(1);
LCD_Write_Command(0x0c);//显示模式设置:显示开,无光标,光标不闪烁
_delay_ms(1);
LCD_Write_Command(0x01);//清屏幕指令,将以前的显示内容清除
_delay_ms(1);
}
/*******************************************************************
*函数名称:LCD_POS
*输 入:uchar pos
*输 出:无
*功 能:字符显示位置
*******************************************************************/
void LCD_POS(uchar pos)
{
LCD_Write_Command(0x80|pos);//显示位置的确定方法规定为”80H+地址码x”
}
/*******************************************************************
*函数名称:Show_String
*输 入:uchar *str
*输 出:无
*功 能:LCD1602显示字符串处理函数
**********************************************************************/
void Show_String(uchar *str)
{
while(*str!=‘\0’)//只要没有写到结束标志,就继续写
LCD_Write_Data(*str++);//将字符常量写入LCD,并指向下一个字符
}
void song(void)
{
uchar i,j,k;
for(i=0;i200;i++)
{
SPK=~SPK;
for(k=0;k50;k++);
for(j=0;j50;j++);
}
}
/////lcd1602液晶显示//////
void Display_Time(uchar Hour,uchar Min,uchar Sec)
{
Display_Buffer[0]=Hour/10+‘0’;//小时十位
Display_Buffer[1]=Hour%10+‘0’;//小时个位
Display_Buffer[2]=‘:’;//显示:号
Display_Buffer[3]=Min/10+‘0’;//显示分钟十位
Display_Buffer[4]=Min%10+‘0’;//显示分钟个位
Display_Buffer[5]=‘:’;//显示:号
Display_Buffer[6]=Sec/10+‘0’;//显示秒十位
Display_Buffer[7]=Sec%10+‘0’;//显示秒个位
LCD_POS(0x40);//显示在液晶第1行第0列
Show_String(Display_Buffer);
}
/////按键处理//////
void Set_time(void)
{
flag=0;
if(key1==0||key2==0||key3==0)//若key1,key2,key3其中有键按下,则为真
{
TR0=0;//定时器0停止
flag=1;//按键标志位为真
}
while(flag)//判断那一个按键按下
{
if(key1==0)//判断key1是否按下
{
while(!key1);//等待释放
H_or_M=!H_or_M;//选择是修改时还是分钟
}
else if(key2==0)//判断key2是否被按下
{
while(!key2);//等待释放
if(H_or_M)//若H_OR_M为真,则修改小时
{
if(++hour==24)//若小时=24,则小时=0
hour=0;//小时加1
}
else//否则修改分钟
{
if(++min==60)//若分钟等于60,则分钟等于0
min=0;//分钟加1
}
}
else if(key3==0)//判断key3是否被按下
{
while(!key3);//等待释放
if(H_or_M)//若H_OR_M为真,则修改小时
{
if(–hour==0xff) //小时减1,若小时等于-1,则小时等于23
hour=23;
}
else//否则修改分钟
{
if(–min==0xff)//分钟减1,若分钟等于-1,则分钟等于59
min=59;
}
}
else if(key4==0)//判断key4是否被按下
{
while(!key4);//等待释放
flag=0;//按键标志清零
TR0=1;//定时器0启动
}
Display_Time(hour,min,sec);//传H,M,S值显示到液晶
}
}
void timer0_init(void)//定时器0初始化
{
TMOD=0x01;//定时器0,方式1
ET0=1;//
EA=1;//总中断允许
TR0=1;//启动定时器0
TH0=(65535-50000)/256;//装高8位初值
TL0=(65535-50000)%256;//装低8位初值
}
void main(void)//主函数
{
//P0=0xff;
P1=0xff;//端口初始化
P3=0xff;
Init_LCD();//液晶初始化
timer0_init();//定时器0初始化
LCD_POS(0);//显示在液晶第1行第0列
Show_String(display);
while(1)//无限循环
{
Display_Time(hour,min,sec);//液晶显示时间
//_delay_ms(500);//延时
Set_time();//时间调整
}
}
void timer0() interrupt 1//定时器0中断
{
TH0=(65535-50000)/256;//重装定时器0高8位
TL0=(65535-50000)%256;//重装定时器0低8位
Count++;//计数加1
if(Count==20)//如果COUNT等于20
{
Count=0;//计数清零
sec++;//秒加1
if(sec==60)//判断秒是否等于60
{
sec=0;//秒清零
min++;//分钟加1
if(min==60)//判断分钟是否等于60
{
min=0;//若等于60,则清零分钟
hour++;//小时加1
if(hour==24)//判断小时是否等于24
{
hour=0;//若小时等于24,则清零小时,分钟,秒
min=0;
sec=0;
}
song();
}
}
}
}
pos怎么写程序
很多朋友都还不是很清楚pos机怎么写程序,pos机怎么使用流程,今天小编就和大家来详细的说说这个,大家可以阅读一下,希望文章能给你带来参考价值。
poslabel怎么设置连续打印?
连续打印设置方法如下:
1.点击桌面左下角的:开始,在出现的菜单栏找到并进入:控制面板
2.来到控制面板界面,选择:硬件和声音下面的:查看设备和打印机
3.在设备和打印机界面,左键选中您要使用的打印机,选中后,顶部菜单栏下方会出现一条新的菜单栏,选中:打印服务器属性
4.在打印服务器属性界面上,勾选上:创建新表单,并在其下方填写好新表的尺寸信息(所填信息要与您使用的打印纸张相一致)
5.继续在此界面上部分为表单命名,确认后,点击:保存表单
6.回到:设备和打印机界面,右键打印机图标,选择:打印机属性
7.来到属性界面,在顶部菜单栏选择:设备设置
8.在设备设置界面点开:按送纸器格式指派,其下方有三种送纸器,别是“导轨”、“手动进纸”、“进纸器”,
将“导轨”通过其后方的下拉框选择:第五步设置的表单名,“手动进纸”和“进纸器”设置为:不可用,确认后,点击下方的确认
9.回到:设备和打印机界面,右键打印机图标,选择:打印首选项
10.来到打印首选项界面,在顶部菜单栏选择:纸张/质量
11.打印机控制面板中的打印纸来源设置与打印机驱动程序中要一致,所以需要将此处的纸张来源设置为:自动选择
12.设置完毕,当您打印时,打印机会根据页面设置,直接选择走纸通道完成连续打印纸。
高分求51单片机串口通信的程序
#include reg52.h
#include intrins.h
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
#define delayNOP(); {nop();nop();nop();nop();};
uchar data RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 };
uchar temp,buf,m,count;
bit playflag=0;
uchar code cdis1[ ] = {” SERILA TRANFER “};
uchar code cdis2[ ] = {” “};
/*******************************************************
延时子程序
****************************************************/
char code SST516[3] at 0x003b;
void delay1(uint ms)
{
uchar k;
while(ms–)
{
for(k = 0; k 120; k++);
}
}
/*************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 /
/ */
/*************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P00x80);
LCD_EN = 0;
return(result);
}
/**************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 /
/ */
/**************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
nop();
nop();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/**************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 /
/ */
/**************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/* /
/ LCD初始化设定 /
/ */
/***************************************************************/
void lcd_init()
{
delay1(15);
lcd_wcmd(0x01); //清除LCD的显示内容
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c); //开显示,显示光标,光标闪烁
delay1(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay1(5);
}
/***************************************************************/
/* /
/ 设定显示位置 /
/ */
/**************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/***************************************************
发送数据函数
***************************************************/
void senddata(uchar dat)
{
SBUF =dat;
while(!TI);
TI = 0;
}
/***************************************************
串行中断服务函数
***************************************************/
void serial() interrupt 4
{
ES = 0; //关闭串行中断
RI = 0; //清除串行接受标志位
buf = SBUF; //从串口缓冲区取得数据
playflag=1;
switch(buf)
{
case 0x31: senddata(‘X’);break; //接受到1,发送字符’W’给计算机
case 0x32: senddata(‘L’);break; //接受到2,发送字符’I’给计算机
case 0x33: senddata(‘1’);break; //接受到3,发送字符’L’给计算机
case 0x34: senddata(‘0’);break; //接受到4,发送字符’L’给计算机
case 0x35: senddata(‘0’);break; //接受到5,发送字符’A’给计算机
case 0x36: senddata(‘0’);break; //接受到5,发送字符’R’给计算机
default: senddata(buf);break; //接受到其它数据,将其发送给计算机
}
if(buf!=0x0D)
{
if(buf!=0x0A)
{
temp =buf;
if(count16)
{
RXDdata[count]=temp;
count++;
}
}
}
ES = 1; //允许串口中断
}
/***************************************************
数据显示函数
***************************************************/
void play()
{
if(playflag)
{
lcd_pos(0x40); //设置位置为第二行
for(m=0;m16;m++)
lcd_wdat(cdis2[m]); //清LCD1602第二行
for(m=0;m16;m++)
{
lcd_pos(0x40+m); //设置显示位置为第二行
lcd_wdat(RXDdata[m]); //显示字符
}
playflag=0;
count=0x00;
for(m=0;m16;m++)
RXDdata[m]=0x20; //清显存单元
}
}
/***************************************************
主函数
******************************************************/
void main(void)
{
P0 = 0xff;
P2 = 0xff;
SCON=0x50; //设定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
EA=1;
ES = 1; //允许串口中断
TL1=0xf3;
TH1=0xf3; //波特率2400
TR1=1;
lcd_init();
lcd_pos(0x00); //设置显示位置为第一行
for(m=0;m16;m++)
lcd_wdat(cdis1[m]); //显示字符
lcd_pos(0x40); //设置显示位置为第二行
for(m=0;m16;m++)
lcd_wdat(cdis2[m]); //显示字符
while(1)
{
play();
}
}
这个串口通信程序在我的开发版上已经全部验证通过,你可以根据实际,攸 改里面某些参数,满足你自己的需要就行。
比如你你点亮小灯,这部分你只可在相应位置添加代码即可。单片机都是51的。
其中1602的显示程序是用来验证是否通信成功,这部分你可作为参考。这部分你大可用小灯显示程序来替代。
想装一个开关,每天只能开三次,我设想刷卡机每张卡存3元,刷一次扣一元,控制一次通电物理开关,谁会?
这个设想有点悬:卡内的3元是谁负责存、扣?银行代办,那还要银行给你个扣款成功的恢复并“控制一次通电物理开关”;若是自己写到专用的卡,自己专用的POS机,那同样还得一套管理程序实现。实际上,找一台单片机,计数输入次数,只在1-3次输入时输出控制开关的信号(使继电器动作),其余无输出,但是计数器24小时清零一次,这样就等于每24小时内最多只有3次输出,何必刷卡?当然也可以设定每次输入密码,输对一次,有效输出一次,计数到3为止。