智能超市是融合射频识别技术、计算机通信网络、数据库管理技术于一体的现代化超市,采用高性能HRFID 技术以及防碰撞算法,使商品结算速度很快,只要几秒钟,而准确率却很高,几乎没有差错。而货架的智能信息采集同样方便快捷,实现价格的实时更新和商品补给的提醒,低功耗设计使得功耗更低更低碳环保。
智能货架使用80C52控制,智能结账柜台使用STM32进行控制。
STM32F103xC增强型系列使用高性能的ARM Cortex-M3 32位的RISC内核,工作频率为72MHz,内置高速存储器(高达512K字节的闪存和64K字节的SRAM),丰富的增强I/O端口和连接到两条APB总线的外设。包含3个12位的ADC、4个通用16位定时器和2个PWM定时器,还包含标准和先进的通信接口:多大2个I2C、3个SPI、2个I2S、1个SDIO、5个USART、1个USB和1个CAN。STM32F103xC增强型系列工作于-40℃至+105℃的温度范围,供电电压2.0V至3.6V,一系列的省电模式保证低功耗应用的要求。
主要由智能货架和智能结账柜台两部分构成。
智能货架:
智能结账柜台:
防碰撞算法研究是智能超市RFID 系统研究的最关键问题,也是难点,是制约RFID 系统在超市应用的重要因素。防碰撞问题的研究主要解决两个问题:一是如何避免或减少阅读器与标签之问的冲突问题。二是避免或减少阅读器之间的干扰碰撞问题。
二进制搜索算法是最常用的RFID 系统防冲突算法,其算法非常灵活,不会发生防冲突失败的情况。这种算法的基本思想就是读写器判断出标签的序列号发送时产生的数据冲突位置,然后强制地命令那些在冲突位置发送信息为“0”或者为“1”的标签退出冲突。当N-1个应答器退出冲突后信道就会被剩下的一个标签完全占有并被读来。对于N 个标签发生冲突的情况,只需要一定次数的防碰撞循环就能将适合的标签准确的识别出来。
这里只粘贴几个简单的函数。
/*******************************************************************************
*函数名: dis_price
*功能: 在OLED上显示商品价格
*参数: (unsigned char)x,y--显示数字的起始坐标;
* double price --要显示的数字
*******************************************************************************/
void dis_price(unsigned char x,unsigned char y,double price)
{
unsigned int price_int=price;
unsigned int price_decimal=(price-price_int)*10;
unsigned char pricearray[5];
unsigned char count=0,i=0;
if(price==0)
LCD_8x16(x,y,"0");
while(price_int)
{
pricearray[count]=price_int%10;
price_int/=10;
++count;
}
//判断是否需要显示小数
if(price_decimal)
{
LCD_8x16(x+8*count,y,".");//显示小数点
dis_int_8x16(x+8+8*count,y,price_decimal);
}
for(i=0;i
/*******************************************************************************
*函数名: ReadCard
*功能: 读射频卡号
*返回值: 返回所读射频卡的序号
*******************************************************************************/
int ReadCard(void)
{
int i;
int cardnumber=0x00000000,temp;
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET){}
USART_ReceiveData(USART3);//卡类型及状态
for(i=3;i>=0;i--)
{
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET){}
temp=(u8)USART_ReceiveData(USART3);
cardnumber+=temp<
/*******************************************************************************
*函数名:CheckOut
*功能: 计算消费者所取商品的总价格
*******************************************************************************/
void CheckOut(void)
{
char KEY;
u8 cardflag=0;
u32 CardNumber;
u8 i;
u8 KEY_count=0;
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET){}
KEY=USART_ReceiveData(USART3);
if( KEY == 0xFF )
{
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET){}
while(USART_ReceiveData(USART3) == 0xFF )
{
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET){}
++KEY_count;
}
}
if(KEY_count == 4)
{
cardflag=1;
CardNumber=ReadCard(); //读取商品序列号
}
///
if(cardflag)
{
for(i=0;i
/*******************************************************************************
*函数名:DeductMoney (刷卡付账模块)
*功能: 结算所买东西价钱,核对无误后刷卡付账。
*******************************************************************************/
void DeductMoney(void)
{
u8 data[8]={0x40,0x07,0x00,0x01,0x00,0x00,0x00,0x0D};
int a=0;
char KEY;
u32 CardNumber,CardNumber_array[CardNumMax+1]={0};
u8 i;
for(a=0;a<8;a++)
{
USART_SendData(UART4,data[a]);
while(USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET){} //等待发送完毕
}
while(USART_GetFlagStatus(UART4, USART_FLAG_RXNE) == RESET){}
KEY=USART_ReceiveData(UART4);
if( KEY == 0x40 )
{
for(i=0;i<=6;i++)
{
while(USART_GetFlagStatus(UART4, USART_FLAG_RXNE) == RESET){}
KEY=USART_ReceiveData(UART4);
}
if(KEY==0x08)
{
while(USART_GetFlagStatus(UART4, USART_FLAG_RXNE) == RESET){}
USART_ReceiveData(UART4);
CardNumber=ReadCard();
}
if(CardNumber==0)
{
Dis_Cardnumber(20,2,CardID[CardNumber]);
LCD_P8x16Str(20,4,"Successful");
LCD_FullFill(0x00);
}
else
{
LCD_P8x16Str(20,3,"No Card");
LCD_FullFill(0x00);
}
}
}