1.设计任务
基于单片机的智能电子称重系统设计
基本要求:能称量物体重量,在输入单价的情况下能够显示商品价格。
创新:物体超过称量范围时自动报警。
任务区分:B——通过灯光闪烁报警。
2. 设计要求
2.1系统方案论证
根据设计任务,分析设计系统的组成,给出实现设计任务的几种方案,分析比较几种设计方案的优略,本着尽量以软件代替硬件,同时力求电路简单,工作可靠的原则,确定总体设计方案。
2.2系统硬件电路设计
根据系统设计方案进行软、硬件的分配,软、硬件设计分别进行。硬件设计包括单片机最小系统和扩展接口及配置,硬件结构在设计时要选择合适的元器件,硬件电路要简洁、工作可靠,需用Proteus绘制整个系统的电路仿真原理图。
主函数
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char //ÎÞ·ûºÅ×Ö·ûÐÍ ºê¶¨Òå ±äÁ¿·¶Î§0~255
#define uint unsigned int //ÎÞ·ûºÅÕûÐÍ ºê¶¨Òå ±äÁ¿·¶Î§0~65535
#define ulong unsigned long
uchar code table_num[]="0123456789abcdefg";
sbit rs = P2^7; //
sbit rw = P2^6;
sbit e = P2^5; //
sbit hx711_dout = P1^0;
sbit hx711_sck = P1^1;
sbit led = P1^2;
sbit beep = P1^3;
long weight;
uint temp,qi_weight;
ulong price,z_price;
uchar flag_p;
uchar key_can;
bit chaozhong_flag;
bit leiji_flag;
bit flag_300ms ;
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
void delay_uint(uint q)
{
while(q--);
}
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '\0') break;
write_data(*p);
p++;
}
}
//lcd1602
void init_1602()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
delay_uint(1000);
}
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);
}
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 init_1602_dis_csf() //³õʼ»¯Òº¾§
{
write_string(1,0,"WEIGHT: 0.000 KG");
write_string(2,0,"UP:00.00 :00.00");
write_zifu(2,9,0x5c); //£¤
}
void write_1602_yl(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('.');
write_data(0x30+date/100%10);
write_data(0x30+date/10%10);
write_data(0x30+date%10);
}
void Delay__hx711_us(void)
{
_nop_();
_nop_();
}
ulong ReadCount(void)
{
ulong count,value = 0;
uchar i;
hx711_dout=1;
Delay__hx711_us();
hx711_sck=0;
count=0;
while(hx711_dout);
for(i=0;i<24;i++)
{
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()
{
ulong hx711_dat;
hx711_dat=ReadCount();
temp=(uint)(hx711_dat/100);
}
void get_weight()
{
ulong hx711_data,a;
uint get,aa;
hx711_data=ReadCount();
get=(uint)(hx711_data/100);
if(get>temp)
{
a=ReadCount();
aa=(uint)(a/100)-temp;
weight=(uint)((float)aa*0.65703+0.05);
}
}
//¶¨Ê±Æ÷0³õʼ»¯³ÌÐò---------------------------------------------
void time_init()
{
EA = 1;
TMOD = 0X01;
ET0 = 1;
TR0 = 1;
}
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 = 12; break;
case 0xed: key_can = 4; break;
case 0xdd: key_can = 5; break;
case 0xbd: key_can = 6; break;
case 0x7d: key_can = 13; break;
case 0xeb: key_can = 7; break;
case 0xdb: key_can = 8; break;
case 0xbb: key_can = 9; break;
case 0x7b: key_can = 14; break;
case 0xe7: key_can = 10; break;
case 0xd7: key_can = 0; break;
case 0xb7: key_can = 11; break;
case 0x77: key_can = 15; break;
}
beep = 0; //·äÃùÆ÷½ÐÒ»Éù
led = 0;
delay_1ms(100);
led = 1;
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,3,price);
flag_p++;
}
if(key_can == 13) //
{
if(price != 0)
{
flag_p--;
price /= 10;
write_sfm4_price(2,3,price);
}
}
if(key_can == 12) //
{
get_pizhong();
}
if(key_can == 14) //
{
flag_p = 0;
price = 0;
write_sfm4_price(2,3,price);
}
}
//Ö÷º¯Êý--------------------------------------------------------
void main()
{
delay_1ms(300);
beep = 0; //
led = 0;
delay_1ms(100);
P0 = P1 = P2 = P3 = 0xff; //
time_init(); //
init_1602(); //
init_1602_dis_csf(); //
get_pizhong(); //
while(1)
{
key();
if(key_can < 20)
key_with();
if(flag_300ms == 1)
{
flag_300ms = 0;
get_weight();
weight /= 2; //
if(weight >= 0 )
write_1602_yl(1,8,weight);
z_price = weight * price / 1000;
write_sfm4_price(2,11,z_price);
if(weight >= 5000)
{
beep = ~beep;
led = ~led;
}
else
{
beep = 1;
led = 1;
}
}
delay_1ms(1);
}
}
//¶¨Ê±Æ÷0ÖжϷþÎñ³ÌÐò-----------------------------------------------
void time0_int() interrupt 1
{
static uchar value;
TH0 = 0xf8;
TL0 = 0x30; //2ms
value++;
if(value >= 150)
{
value = 0;
flag_300ms = 1;
}
}
仿真图纸:
完整代码点开链接私信 免费 获取。
【iBot机器人工作室的个人空间-哔哩哔哩】 https://b23.tv/ryUWVKa