网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
10月18日
漏签
0
天
单片机吧
关注:
209,472
贴子:
1,039,232
看贴
图片
吧主推荐
视频
游戏
7
回复贴,共
1
页
<<返回单片机吧
>0< 加载中...
基于51单片机电子秤
只看楼主
收藏
回复
路从今夜白月
大尉
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
基本功能有了,还缺一个累计功能,就是价格和重量累计的,有木有大神之前做过这个,能给个代码参考下吗???
电子设计开发
上校
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
用个数组存一下就行了
深圳市汇美创电子有限公司
单片机
首先汇美创-价格优势现货库存
单片机
价格美丽-质量优
2024-10-18 23:01
广告
立即查看
路从今夜白月
大尉
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
#include<reg52.h>//调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#define ulong unsigned long
uint GapValue,GapValue1; //传感器参数
#include "eeprom52.h"
#include<intrins.h>
#include<string.h>
uchar code table_num[]="0123456789abcdefg";//无符号字符型数组
sbit rs=P2^5; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit rw=P2^6; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit e =P2^7; //片选信号 下降沿触发
sbit hx711_dout=P1^2;
sbit hx711_sck=P1^3;
sbit io = P1^4; //数据线
sbit rst = P1^5; //复位线
uchar i;
sbit beep = P1^0; //蜂鸣器
uchar menu_1,menu_2;
long weight;
ulong HX711_Buffer = 0;
ulong Weight_Maopi = 0;
uchar flag = 0;
bit Flag_ERROR = 0;
uint temp,qi_weight;
bit chaozhong_flag;
bit leiji_flag;
uchar flag_200ms ;
ulong price,z_price; //单价 总价
uchar flag_p;
/******1ms延时函数***12M晶振**************/
void delay_1ms(uint q)
{ uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x1000);
GapValue1=GapValue&0x00ff; //低
byte_write(0x2000, GapValue1);
GapValue1=(GapValue&0xff00)>>8;//高
byte_write(0x2001, GapValue1);
byte_write(0x2060, a_a);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
GapValue = byte_read(0x2001);
GapValue = (GapValue<<8)|byte_read(0x2000);
a_a = byte_read(0x2060);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom();//先读
if(a_a != 1)//新的单片机初始单片机内问eeprom
{
GapValue = 3500;
a_a = 1;
write_eeprom(); //保存数据
}
}
/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
while(q--);
}
/*********************蜂鸣器函数************************************************/
void didi()
{
uchar i;
for(i=0;i<10;i++)
{
beep = 0;
delay_1ms(1);
beep = 1;
delay_1ms(1);
}
}
/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
********************************************************************/
void write_com(uchar com)
{ e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
********************************************************************/
void write_data(uchar dat)
{ e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
路从今夜白月
大尉
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
/*****************lcd1602上显示字符函数*******************/
void write_string(uchar hang,uchar add,uchar *p)
{ if(hang==1)
write_com(0x80+add);
else write_com(0xc0+add);
while(1)
{ if(*p == '\0') break; //判断字符串是否结束
write_data(*p); //讲当前内容发送到液晶屏上
p++; //指向下一个字符
}
}
/***********************lcd1602初始化设置************************/
void init_1602() //lcd1602初始化设置
{
write_com(0x38); //设置8位格式,2行,5X7
write_com(0x0c);//整体显示,关光标,不断闪烁
write_com(0x06);//设定输入方式,设置光标移动方向为向右,显示字符时字符不移动
write_com(0x01);//清屏
delay_uint(100);//延时,稳定显示
}
////////////////在指定位置显示指定字符//////////
void write_zifu(uchar hang,uchar add,uchar dat)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(dat);
}
/********************************************************************
* 名称 : write_sfm4_price(uchar hang,uchar add,uchar date)
* 功能 : 显示价格
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_sfm4_price(uchar hang,uchar add,uint date)
{ if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/1000%10);
write_data(0x30+date/100%10);
write_data('.');
write_data(0x30+date/10%10);
write_data(0x30+date%10);
}
void write_sfm4_price1(uchar hang,uchar add,uint date)
{ if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
if(date >= 9999)
{ write_data(0x30+date/10000%10);
write_data(0x30+date/1000%10);
write_data(0x30+date/100%10);
write_data('.');
write_data(0x30+date/10%10);
}
else
{ write_data(0x30+date/1000%10);
write_data(0x30+date/100%10);
write_data('.');
write_data(0x30+date/10%10);
write_data(0x30+date%10);
}
}
/****************开机液晶显示函数 初始化液晶的内容********************************/
void init_1602_dis_csf() //初始化液晶
{ write_string(1,0," WELCOME ! ");
write_string(2,0," smile ");
delay_1ms(1000);
write_string(1,0," W:0.000kg ");
write_string(2,0,"P:00.00 Z:00.00");
write_zifu(2,7,0x5c);
//¥
//
write_zifu(2,15,0x5c); //¥
}
/***********************lcd1602上显示两位十进制数************************/
void write_sfm1(uchar hang,uchar add,uchar date)
{ if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date % 10);
}
/*******************lcd1602上显示两位十进制数**********************/
/*void write_sfm2_ds1302(uchar hang,uchar add,uchar date)
{ uchar shi,ge;
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
shi=date/16; ge=date%16;
write_data(table_num[shi]);
write_data(table_num[ge]); }
*/
/*****************控制光标函数********************/
void write_guanbiao(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
if(date == 1)
write_com(0x0f); //显示光标并且闪烁
else
write_com(0x0c); //关闭光标
}
/*******************压力显示程序***********************/
void write_1602_yl(uchar hang,uchar add,uint date)
{ if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
if(date < 2)
date = 0; //
write_data(0x30+date/10000%10);
write_data(0x30+date/1000%10);
write_data('.');
write_data(0x30+date/100%10);
write_data(0x30+date/10%10);
write_data(0x30+date%10);
}
void Delay__hx711_us(void)
{ _nop_();
_nop_();
}
unsigned long HX711_Read(void) //增益128
{ unsigned long count;
unsigned char i;
hx711_dout=1;
Delay__hx711_us();
hx711_sck=0;
count=0;
// EA = 1;
while(hx711_dout); //判断AD转换是否结束
// EA = 0;
for(i=0;i<24;i++) //24个脉冲读取数据
{
hx711_sck=1; //发送脉冲
count=count<<1;//左移 最高
hx711_sck=0;
if(hx711_dout)
count++;
}
hx711_sck=1;
count=count^0x800000;//第25个脉冲下降沿来时,转换数据
Delay__hx711_us();
hx711_sck=0;
return(count);
}
void get_pizhong() //获取皮重,秤盘重量
{ Weight_Maopi = HX711_Read();
}
void get_weight() //获取被测物体重量
{ weight = HX711_Read();
weight = weight - Weight_Maopi; //获取净重
if(weight > 0)
{ weight = (unsigned int)((float)weight/GapValue); //计算实物的实际重量
}
else
weight=0;
}
路从今夜白月
大尉
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
/*************定时器0初始化程序***************/
void time_init()
{ EA = 1; //开总中断
TMOD = 0X01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1;
//允许定时器0定时
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{ static uchar key_new = 0 ,key_l;
key_can = 20; //按键值还原
P3 = 0x0f; //行
if((P3 & 0x0f) != 0x0f) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
{
//确认是按键按下
key_new = 0;
key_l = (P3 | 0xf0); //矩阵键盘扫描
P3 = key_l; switch(P3)
{ case 0xee: key_can = 1; break; //得到按键值
case 0xde: key_can = 2; break; //得到按键值
case 0xbe: key_can = 3; break; //得到按键值
case 0x7e: key_can = 14; break; //得到按键值
case 0xed: key_can = 4; break; //得到按键值
case 0xdd: key_can = 5; break; //得到按键值
case 0xbd: key_can = 6; break; //得到按键值
case 0x7d: key_can = 12; break; //得到按键值
case 0xeb: key_can = 7; break; //得到按键值
case 0xdb: key_can = 8; break; //得到按键值
case 0xbb: key_can = 9; break; //得到按键值
case 0x7b: key_can = 13; break; //得到按键值
case 0xe7: key_can = 0; break; //得到按键值
case 0xd7: key_can = 10; break; //得到按键值
case 0xb7: key_can = 11; break; //得到按键值
case 0x77: key_can = 15; break; //得到按键值
}
beep = 0; //蜂鸣器叫一声
delay_1ms(70);
beep = 1;
}
}
else
key_new = 1;
}
/************按键控制函数*************/
void key_with()
{
if(key_can <= 9) //数字键
{ if(flag_p >= 4)
{
flag_p = 0;
}
if(flag_p == 0)
price = key_can;
else
{
price = price * 10 + key_can;
}
write_sfm4_price(2,2,price); //显示单价
flag_p ++;
//write_sfm2(1,0,flag_p);
}
if(key_can == 15) //删除键
{ if(price != 0 )
{ flag_p --;
price /= 10; //删除
write_sfm4_price(2,2,price);//显示单价
}
}
if(key_can == 14) //去皮
{ get_pizhong(); //获取皮重,秤盘重量
write_1602_yl(1,5,0); //显示压力
}
if(key_can == 13) //价格清零
{ flag_p = 0;
price = 0;
write_sfm4_price(2,2,price);//显示单价
}
if(key_can == 12)
{ get_pizhong();
flag_p=0;
price = 0;
write_1602_yl(1,5,0);
write_sfm4_price(2,2,price);
}
if(key_can == 10)
{ if(GapValue<1000)
GapValue++;
}
if(key_can == 11)
{ if(GapValue>1)
GapValue--;
}
}
/*****************主函数********************/
void main()
{
beep = 0; //蜂鸣器叫一声
delay_1ms(100);
P0 = P1 = P2 = P3 = 0xff; //单片机IO口初始化为1
init_eeprom();
init_1602(); //lcd1602初始化
init_1602_dis_csf(); //lcd1602初始化显示
get_pizhong(); //获取皮重,秤盘重量
while(1) {
if(weight >= 10000) //超重报警
beep = ~beep;
else
beep = 1;
key(); //独立按键程序
if(key_can < 20)
{ if(menu_1 == 0)
key_with();
}
flag_200ms ++;
if(flag_200ms >= 200)
{ flag_200ms = 0;
/* if(weight >= 10000) //超重报警
beep = ~beep;
else
beep = 1;
*/
if(menu_1 == 0) {
get_weight();
//称重
write_1602_yl(1,5,weight); //显示压力
z_price = weight * price / 1000; //总价等于重量*单价
write_sfm4_price1(2,11,z_price);
//显示总价
}
if(key_can==10||key_can==11)
{
beep=0;
delay_1ms(10);
beep=1;
key();
get_weight();
flag_p=1;
}
key_with();
write_eeprom();
}
delay_1ms(1);
}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{ static uchar value;
//定时2ms中断一次
TH0 = 0xf8;
TL0 = 0x30; //2ms
value++;
if(value >= 100)
{ value = 0;
flag_200ms = 1;
}
}
路从今夜白月
大尉
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
上面是我现在的全部程序,想加一个累计功能,有木有朋友帮忙看看。
u夹QQ948400204
新兵
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
电子称
我来基础问题我知道等心情
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示