硬件设计
链接:https://pan.baidu.com/s/1Yi7LHfzInUBkjVrzMqM_yQ
提取码:it0s
本次设计以STM32单片机为核心,利用压力传感器监测货物的压力并转换成电流输出给AD芯片,HX711转换模块将模拟量转换成数字量并输出给单片机,STM32单片机通过公式计算出具体的货物重量,采用按键矩阵对结果进行加减乘除,得出总价或者其他的结果。LCD1602液晶屏上显示检测到的货物重量、单价和总价。
设计思路
以STM32为中央处理器,通过压力传感器监测货物对其造成的压力,并以电流变化输出给HX711AD模块,hx711AD芯片将模拟量转换成数字量并发送给单片机,经单片机计算后,得到当前的重量。通过安检矩阵设置货物的单价,通过加减乘除操作,算的货物的总价。LCD1602液晶显示屏上显示检测到的货物重量,设置的商品单价以及最后算出的货物总价。
程序设计
#include "hx711.h"
unsigned long ReadCount(void)
{
unsigned long Count;
unsigned char i;
ADSK=0;
Count=0;
while(ADDO);
for (i=0;i<24;i++)
{
ADSK=1;
Count=Count<<1;
ADSK=0;
if(ADDO) Count++;
}
ADSK=1;
Count=Count^0x800000;
ADSK=0;
return(Count);
}#include "keyboard.h"
//按键扫描函数 :
//功能;只扫描一个按键,按键为号小优先
//返回键值:
// 7 8 9 10
// 4 5 6 11
// 1 2 3 12
// 14 0 15 13
unsigned char Getkeyboard(void)
{
unsigned char number = 0;
unsigned char i;
//行输入低电平
ROW1=ROW2=ROW3=ROW4=0;
//如果列输出不全为高,则说明有键按下
if ((COL1!=1)||(COL2!=1)||(COL3!=1)||(COL4!=1))
{
//输入0111
ROW1=0;
ROW2=ROW3=ROW4=1;
for (i=0;i<20;i++);
if (COL1==0) return 1; // 7
else if (COL2==0) return 2; // 8
else if (COL3==0) return 3; // 9
else if (COL4==0) return 10; // 10
//输入1011
ROW2=0;
ROW1=ROW3=ROW4=1;
for (i=0;i<20;i++);
if (COL1==0) return 4; //4
else if (COL2==0) return 5; // 5
else if (COL3==0) return 6; // 6
else if (COL4==0) return 11; // 11
//输入1101
ROW3=0;
ROW1=ROW2=ROW4=1;
for (i=0;i<20;i++);
if (COL1==0) return 7; //1
else if (COL2==0) return 8; // 2
else if (COL3==0) return 9; // 3
else if (COL4==0) return 12; // 12
//输入0111
ROW4=0;
ROW1=ROW2=ROW3=1;
for (i=0;i<20;i++);
if (COL1==0) return 14;
else if (COL2==0) return 0;
else if (COL3==0) return 15;
else if (COL4==0) return 13;
//没有检测到列低电平
return 99;
}
return 99;
}#include "LCD1602.h"
//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void LCD1602_delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
//****************************************************
//写指令
//****************************************************
void LCD1602_write_com(unsigned char com)
{
LCD1602_RS = 0;
LCD1602_delay_ms(1);
LCD1602_EN = 1;
LCD1602_PORT = com;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
//****************************************************
//写数据
//****************************************************
void LCD1602_write_data(unsigned char dat)
{
LCD1602_RS = 1;
LCD1602_delay_ms(1);
LCD1602_PORT = dat;
LCD1602_EN = 1;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
//****************************************************
//连续写字符
//****************************************************
void LCD1602_write_word(unsigned char *s)
{
while(*s>0)
{
LCD1602_write_data(*s);
s++;
}
}
void Init_LCD1602()
{
LCD1602_EN = 0;
LCD1602_RW = 0; //设置为写状态
LCD1602_write_com(0x38); //显示模式设定
LCD1602_write_com(0x0c); //开关显示、光标有无设置、光标闪烁设置
LCD1602_write_com(0x06); //写一个字符后指针加一
LCD1602_write_com(0x01); //清屏指令
}
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include "LCD1602.h"
#include "hx711.h"
#include "keyboard.h"
#include "eeprom52.h"
#define uchar unsigned char
#define uint unsigned int
//定义量程系数
#define RATIO 4000/1000 //1574/1000 //2114/1623
.
.