基于51单片机的商用电子计价秤设计

1、设计需求及目的

具体实现功能:
(1)通电源时,数字电子秤进入欢迎界面“欢迎使用电子秤 设计••••••”;
(2)当载物台上放有物体时,ADC0832立即将数据转换发送给单片机处理,并由LCD液晶显示屏显示;
(3)当用按键输入对应商品的代码编号,在LCD上可以看到相应商品的名称,单价,总重,总价格等信息。
(4)在称量的过程中,一旦物体自身的重量超出电子秤的称量范围,蜂鸣器立即会发出“滴滴••••”警报声告诉工作人员,所称量物品超重(测量范围0—9.99KG)。

2、设计思路及方案

数字电子秤采用AT89C51单片机作为微处理器,接口电路由晶振、LM4229显示电路、4*4按键电路、ADC0832电路、报警电路、存储器等组成。控制器系统的硬件电路原理图如图4.1所示。
控制器系统硬件电路的工作过程是:打开电源时,MCU及各个部分电路开始工作,MCU调用内部存储数据对各部分接口电路初始化。200msLM4229进入欢迎界面,ADC0832不断对外部数据进行采样交给MCU进行处理,一旦有物品放入载物台,ADC0832立即发送中断请求,并将本次采集数据交给MCU处理,之后LM4229显示相应数据量。在此过程中,键盘也在不断进行扫描,一旦有键按下,单片机也会对其数据进行相应处理,然后将对LM4229进行写操作。

基于51单片机的商用电子计价秤设计_第1张图片

3、硬件电路

基于51单片机的商用电子计价秤设计_第2张图片

4、部分代码

#include
#include
#include 
#include 
#include
#define uchar unsigned char
#define uint   unsigned int
sbit ADCS =P3^5; 
sbit ADDI =P3^7;  
sbit ADDO =P3^7;  
sbit ADCLK =P3^6;  
uint x1,y1,z1=0,w1;
uchar ad_data,k,n,m,e,num,s;                              //采样值存储
uint temp1;
sbit beep =P3^0;                                           
char press_data;                                  //标度变换存储单元
float  press;
unsigned char ad_alarm,temp;                           //报警值存储单元
unsigned char abc[5]={48,46,48,48,48};
unsigned char price_all[6]={48,48,46,48,48,48};
float price_unit[10]={5.5,2.8,3.6,4.5,5.8,6.8,7.9,8.0,9.5,0};       //商品初始单价
uchar price_danjia[5]={48,46,48,48,48};
float price;
uint price_temp1,price_temp2;                             //商品总价       
uchar Adc0832(unsigned char channel);															
void alarm(void);
void data_pro(void);
void delay(uint k);
void keyscan();
void disp_init();
void  price_jisuan();
/************
主函数
************/
void main(void)
{ 
   delay(500);                        //系统延时500ms启动
   //ad_data=0;                       //采样值存储单元初始化为0
   lcd_init();                        //显示初始化
   disp_init();        				  //开始进入欢迎界面
   delay(1000);						  //延时进入称量画面
   clear_lcd(0,4,40);
   clear_lcd(16,0,100);
   clear_lcd(28,0,40);
   clear_lcd(44,0,100);
   clear_lcd(56,0,40);
   clear_lcd(72,0,100);
   clear_lcd(84,0,40);
   clear_lcd(100,0,100);
   clear_lcd(112,0,40);
   write_lcd(0,8,"实用电子秤");              
	while(1)
    {
	   ad_data =Adc0832(0);	   //采样值存储单元初始化为0
	   alarm();
	   data_pro(); //读取重量
	   keyscan();  //查询商品种类
	   write_lcd(40,0,"------------------------------");
	   write_lcd(56,0,"单  价:");
	   write_lcd(56,11,price_danjia);
	   write_lcd(56,20,"元/千克");
	   write_lcd(72,0,"总重量:");
	   write_lcd(72,11,abc);
	   write_lcd(72,20,"千克");
	   write_lcd(88,0,"总  价:");
	   price_jisuan();           //计算出价格
	   write_lcd(88,10,price_all);
	   write_lcd(88,20,"元");
	   write_lcd(112,0,"设计学生: XXX");
	}
}
/************
读ADC0832函数
************/

//采集并返回
uchar Adc0832(unsigned char channel)     //AD转换,返回结果
{
     uchar i=0;
    uchar j;
    uint dat=0;
    uchar ndat=0;

    if(channel==0)channel=2;
    if(channel==1)channel=3;
    ADDI=1;
    _nop_();
    _nop_();
    ADCS=0;//拉低CS端
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿1
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    ADDI=channel&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿2
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    ADDI=(channel>>1)&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿3
    ADDI=1;//控制命令结束 
    _nop_();
    _nop_();
    dat=0;
    for(i=0;i<8;i++)
    {
        dat|=ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        dat<<=1;
        if(i==7)dat|=ADDO;
    }  
    for(i=0;i<8;i++)
    {
        j=0;
        j=j|ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        j=j<<7;
        ndat=ndat|j;
        if(i<7)ndat>>=1;
    }
    ADCS=1;//拉搞CS端
    ADCLK=0;//拉低CLK端
    ADDO=1;//拉高数据端,回到初始状态
    dat<<=8;
    dat|=ndat;
    return(dat);            //return ad k         
}


void data_pro(void)
{
      unsigned int;	   		  
	  if(0=256)                        

           beep=0;          //则启动报警
        
	  else
	       beep=1; 		  
}

void delay(uint k)
{
   uint i,j;
   for(i=0;i

 

你可能感兴趣的:(51单片机实例)