基于单片机的智能电子称重系统设计

该文描述了一个基于单片机的智能电子称重系统设计,系统能够测量物体重量并计算商品价格。当物体重量超出预设范围时,系统会通过灯光闪烁进行报警。硬件设计包括了单片机最小系统、扩展接口和配置,软件部分涉及LCD1602显示和HX711传感器的数据处理。通过Proteus进行了电路仿真。主函数中包含了重量读取、价格计算和按键处理等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会编程的小蔡!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值