找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16177|回复: 18
打印 上一主题 下一主题
收起左侧

基于51单片机的简易电子秤设计

  [复制链接]
跳转到指定楼层
楼主

#include<reg52.h>
#include<intrins.h>
#include <absacc.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
extern void ADC();
extern uchar Adc0832(unsigned char channel);     //AD转换,返回结果
extern uchar bai,shi,ge;
uchar  table[]="P:000.0";
char press_data;
uint  ya;
uchar ad_data;
void data_pro1();
void qupi();
void leijia();   ///
uint t;      ////
//unsigned long temp1;  ///
uchar a1,a2,a3,a4,a5,a6;   ///
uint c,d,e;
uchar num ,s1num,s2num,s3num,s5num,s6num;
uchar code table1[]="Y:000000.00";
uchar code table2[]="M:     g";
sbit lcden=P0^5;
sbit lcdrw=P0^6;
sbit lcdrs=P0^7;
sbit cs=P0^0;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;
sbit s5=P3^4;
sbit s6=P3^5;
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void write_com(uchar com)
{
    lcdrs=0;//写指令
    P2=com;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;
}
void write_data(uchar date)
{
    lcdrs=1;
    P2=date;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;
}
void init()
{  lcdrw=0;
    lcden=0;
    write_com(0x38);//显示模式设置
    write_com(0x0c); //开显示,不显示光标,光标不闪烁
    write_com(0x06);//当读或写一个字符后地址指针加1,且光标加1,整屏显示不移动
write_com(0x01); //清屏
}
void display(unsigned long a,unsigned long b)
{   
   unsigned long temp;
   // uchar a1,a2,a3,a4,a5,a6;
    temp=a;
    temp=b*a;       //a*b
    a1=temp/100000;
    a2=temp%100000/10000;
    a3=temp%100000%10000/1000;
    a4=temp%100000%10000%1000/100;
    a5=temp%100000%10000%1000%100/10;
a6=temp%100000%10000%1000%100%10;
    write_com(0xc3);
    write_data('0'+a1);
     write_com(0xc4);
    write_data('0'+a2);
     write_com(0xc5);
    write_data('0'+a3);
     write_com(0xc6);
    write_data('0'+a4);
     write_com(0xc7);
    write_data('0'+a5);
write_com(0xc9);
    write_data('0'+a6);
}  
void keyscan()
{
    if(s1==0)//s1按下
    {
        delay(10);
        if(s1==0)//检测确实按下
        {      
         {  s1num++;   //小数十分位
            while(!s1);
   if(s1num==1)
            {
                    write_com(0x86);
                    write_com(0x0c);
     write_data(0x30+s1num);
                    write_com(0x86);
            }
            else if(s1num<10)
                 {
                    write_com(0x86);
                    write_com(0x0c);
                    write_data(0x30+s1num);
                    write_com(0x86);
                 }
            else if(s1num>=10)  //个位
            {      
       s1num=0;
                   s1num=s1num%10;
       write_data(0x30+s1num);
                   write_com(0x84);
                   write_com(0x0c);
                   write_com(0x84);
            }
            }
          }  
        }
    if(s2==0)//s1按下
    {
        delay(10);
        if(s2==0)//检测确实按下
        {   
         {  s2num++;
           while(!s2);
           if(s2num<=10)
            {
                    write_com(0x84);
                    write_com(0x0c);
                    write_data(0x30+s2num);
                    write_com(0x84);
            }
            else if(s2num>10)
            {      
       s2num=-1;
          write_data(0x30+s2num);
       s2num=s2num++;
                   write_com(0x84);
                   write_com(0x0c);
                   write_com(0x84);
            }
          }  
        }
    }
    if(s3==0)//s1按下
    {
        delay(10);
        if(s3==0)//检测确实按下
        {   
         {  s3num++;
            while(s3==0);
   if(s3num<10)
            {
                    write_com(0x83);
                    write_com(0x0c);
                    write_data(0x30+s3num);
                    write_com(0x83);
            }
          else if(s3num>=10)
          {      
                s3num=0;
       write_data(0x30+s3num);
                write_com(0x83);
       s3num=s3num++;
                write_com(0x0c);
                write_com(0x83);
           }
          }
        }
}
/*   if(s5==0)//s1按下
    {
        delay(10);
        if(s5==0)//检测确实按下     
         {  s5num++;
            while(s5==0);
            if(s5num==1)   
          {
      bai1=bai;
      shi1=shi;
      ge1=ge;
          }
         }
   if(s5num==2) s5num=0;

    }
    }*/
    if(s4==0)    ////
    {  delay(10);    ////////
       if(s4==0)//检测确实按下
       { write_com(0x86);
        write_com(0x84);
        write_com(0x83);
        write_com(0x0c);
  }
     while(1)
        {
          ADC();
          write_com(0x80+10);
          write_data('0'+bai);
          write_com(0x80+11);
          write_data('0'+shi);
          write_com(0x80+12);
          write_data('0'+ge);
          //keyscan();
           display(s3num*100+s2num*10+s1num,bai*100+shi*10+ge);//显示
          if(s4!=0)
          break;
        }
   
    }
  
}
///    // /////////去皮程序
void qupi()
{
    if(s5==0)//s1按下
    {
        delay(10);
        if(s5==0)//检测确实按下     
         {  s5num++;
            while(s5==0);
            if(s5num==1)   
          {
      t=bai*100+shi*10+ge;
    while(!s5);
          }
      if(s5num==2)
   {   uint p;
       p=bai*100+shi*10+ge-t;
       bai=p/100;
                shi=(p%100)/10;
                ge=(p%100)%10;
    write_com(0x80+10);
    write_data('0'+bai);
    write_com(0x80+11);
    write_data('0'+shi);
    write_com(0x80+12);
    write_data('0'+ge);  
       display(s3num*10+s2num,bai*100+shi*10+ge);//显示
        s5num=0;
    while(!s5);
   }
         }
    }
}
//////////////// 累加金额   ////    // /////////
void leijia()
{
    if(s6==0)//s6按下
    {
        delay(10);
        if(s6==0)//检测确实按下     
         {  s6num++;
            while(s6==0);
            if(s6num==1)   
          {   c=(s3num*100+s2num*10+s1num)*(bai*100+shi*10+ge);
    a1=c/100000;
       a2=c%100000/10000;
       a3=c%100000%10000/1000;
       a4=c%100000%10000%1000/100;
       a5=c%100000%10000%1000%100/10;
    a6=c%100000%10000%1000%100%10;
       write_com(0xc3);
       write_data('0'+a1);
        write_com(0xc4);
       write_data('0'+a2);
        write_com(0xc5);
       write_data('0'+a3);
        write_com(0xc6);
       write_data('0'+a4);
        write_com(0xc7);
       write_data('0'+a5);
    write_com(0xc9);
       write_data('0'+a6);
    while(!s6);
          }
      if(s6num==2)
   {   d=(s3num*100+s2num*10+s1num)*(bai*100+shi*10+ge);
     d=d+c;
    a1=d/100000;
       a2=d%100000/10000;
       a3=d%100000%10000/1000;
       a4=d%100000%10000%1000/100;
       a5=d%100000%10000%1000%100/10;
    a6=d%100000%10000%1000%100%10;
       write_com(0xc3);
       write_data('0'+a1);
        write_com(0xc4);
       write_data('0'+a2);
        write_com(0xc5);
       write_data('0'+a3);
        write_com(0xc6);
       write_data('0'+a4);
        write_com(0xc7);
       write_data('0'+a5);
    write_com(0xc9);
       write_data('0'+a6);
    while(!s6);
   }    if(s6num==3)
   {
     e=(s3num*100+s2num*10+s1num)*(bai*100+shi*10+ge);
     e=e+d;
    a1=e/100000;
       a2=e%100000/10000;
       a3=e%100000%10000/1000;
       a4=e%100000%10000%1000/100;
       a5=e%100000%10000%1000%100/10;
    a6=e%100000%10000%1000%100%10;
       write_com(0xc3);
       write_data('0'+a1);
        write_com(0xc4);
       write_data('0'+a2);
        write_com(0xc5);
       write_data('0'+a3);
        write_com(0xc6);
       write_data('0'+a4);
        write_com(0xc7);
       write_data('0'+a5);
    write_com(0xc9);
       write_data('0'+a6);
       s6num=0;
    while(!s6);

   }
  
  
         }
    }
}
   /////////////
void main()
{    //ad_data=0;
    init();
    write_com(0x80);
    for(num=0;num<8;num++)
    {
        write_data(table[num]);
        delay(20);
    }
    write_com(0x80+0x40);
    for(num=0;num<12;num++)
    {
        write_data(table1[num]);
        delay(20);
    }
    write_com(0x80+8);
    for(num=0;num<9;num++)
    {
        write_data(table2[num]);
        delay(20);
    }  
      delay(20);
      
       ADC();     ///////
          write_com(0x80+10);  /////////
          write_data('0'+bai);    //
          write_com(0x80+11);  //////
          write_data('0'+shi);
          write_com(0x80+12);   ////
          write_data('0'+ge);   //////////
          //keyscan();
           display(s3num*100+s2num*10+s1num,bai*100+shi*10+ge);//显示

        while(1)
    {   ad_data =Adc0832(0);    //采样值存储单元初始化为0
      data_pro1();
          keyscan();
     qupi();
  leijia();
            
    }
/* if(s5==0)
{
  int c;
  c=bai*100+shi*10+ge;
  if(c<100)
  {
   ;
  }  
}  */
}
   ////////////////////
void data_pro1(void)
{
      //unsigned int;
      float  press;        
   if(0<ad_data<256)                 
   {      
      int vary=ad_data;         
   press=(0.012*(vary-7.680)*5.000);   
               
   ya=(int)(press*1000);                 //放大1000倍,便于后面的计算
                  
                 
   bai=ya/1000;         //取压力值百位
   shi=(ya%1000)/100;       //取压力值十位
   ge=((ya%1000)%100)/10;      //取压力值个位
   //press_qianfen=((temp1%1000)%100)%10;   //取压力值十分位
        }     
   
}




评分

参与人数 2黑币 +5 收起 理由
673745472 + 1 回帖助人的奖励!
高字扬 + 4

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:157057 发表于 2017-3-20 21:10 | 只看该作者
感谢分享。。
回复

使用道具 举报

板凳
ID:171060 发表于 2017-3-21 17:40 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

地板
ID:188658 发表于 2017-4-11 22:30 | 只看该作者
很棒,正在找这个。
回复

使用道具 举报

5#
ID:184237 发表于 2017-4-16 16:59 | 只看该作者
新手请教 这里面的ad驱动程序不需要吗
回复

使用道具 举报

6#
ID:175526 发表于 2017-4-29 20:52 | 只看该作者
小伙贼TMD的帅 发表于 2017-4-16 16:59
新手请教 这里面的ad驱动程序不需要吗

就在里面吧,adc()后面的
回复

使用道具 举报

7#
ID:200661 发表于 2017-6-16 12:35 | 只看该作者
YOUXIAOYUE 发表于 2017-4-11 22:30
很棒,正在找这个。


很棒,正在找这个。
回复

使用道具 举报

8#
ID:220720 发表于 2017-7-24 10:07 | 只看该作者
extern void ADC();
extern uchar Adc0832(unsigned char channel);     //AD转换,返回结果
extern uchar bai,shi,ge;
这个的程序看不到,文件烧不了求解答
回复

使用道具 举报

9#
ID:239821 发表于 2017-10-17 16:03 | 只看该作者
有没有以MCS51单片机为核心器件设计一款集身高、体重及体型判断于一体的多功能电子秤分享呀
回复

使用道具 举报

10#
ID:380287 发表于 2018-7-28 19:27 | 只看该作者
这个用的什么显示屏
1602?还是其他
回复

使用道具 举报

11#
ID:447268 发表于 2018-12-16 16:26 | 只看该作者
怎么仿真时显示屏一直在闪
回复

使用道具 举报

12#
ID:503358 发表于 2019-4-4 10:44 | 只看该作者
不需要放大电路吗
回复

使用道具 举报

13#
ID:503358 发表于 2019-4-4 14:44 | 只看该作者
太棒了,谢谢
回复

使用道具 举报

14#
ID:542129 发表于 2019-5-19 15:58 | 只看该作者
这个怎么连
真萌新
回复

使用道具 举报

15#
ID:572891 发表于 2019-6-26 20:19 来自手机 | 只看该作者
Ohio_yes 发表于 2019-4-4 10:44
不需要放大电路吗

你好,,,,,
回复

使用道具 举报

16#
ID:572998 发表于 2019-6-27 08:47 | 只看该作者
感谢分享
回复

使用道具 举报

17#
ID:572998 发表于 2019-6-27 08:48 | 只看该作者
太棒了
回复

使用道具 举报

18#
ID:572991 发表于 2019-6-27 09:37 | 只看该作者
挺好非常适合
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表