標題: 基于51單片機的簡易電子秤設(shè)計 [打印本頁]

作者: 13294070836    時間: 2017-3-20 20:14
標題: 基于51單片機的簡易電子秤設(shè)計

#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轉(zhuǎn)換,返回結(jié)果
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);//顯示模式設(shè)置
    write_com(0x0c); //開顯示,不顯示光標,光標不閃爍
    write_com(0x06);//當讀或?qū)懸粋字符后地址指針加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++;   //小數(shù)十分位
            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;   //取壓力值十分位
        }     
   
}





作者: fefen0    時間: 2017-3-20 21:10
感謝分享。。
作者: lw1997    時間: 2017-3-21 17:40
感謝分享
作者: YOUXIAOYUE    時間: 2017-4-11 22:30
很棒,正在找這個。
作者: 小51hei56565    時間: 2017-4-16 16:59
新手請教 這里面的ad驅(qū)動程序不需要嗎
作者: 13294070836    時間: 2017-4-29 20:52
小伙賊TMD的帥 發(fā)表于 2017-4-16 16:59
新手請教 這里面的ad驅(qū)動程序不需要嗎

就在里面吧,adc()后面的
作者: fjc1979    時間: 2017-6-16 12:35
YOUXIAOYUE 發(fā)表于 2017-4-11 22:30
很棒,正在找這個。


很棒,正在找這個。
作者: 倒薩好煩好煩    時間: 2017-7-24 10:07
extern void ADC();
extern uchar Adc0832(unsigned char channel);     //AD轉(zhuǎn)換,返回結(jié)果
extern uchar bai,shi,ge;
這個的程序看不到,文件燒不了求解答
作者: 461727254    時間: 2017-10-17 16:03
有沒有以MCS51單片機為核心器件設(shè)計一款集身高、體重及體型判斷于一體的多功能電子秤分享呀
作者: 1838489290    時間: 2018-7-28 19:27
這個用的什么顯示屏
1602?還是其他
作者: abcr    時間: 2018-12-16 16:26
怎么仿真時顯示屏一直在閃
作者: Ohio_yes    時間: 2019-4-4 10:44
不需要放大電路嗎

作者: Ohio_yes    時間: 2019-4-4 14:44
太棒了,謝謝

作者: tenng14    時間: 2019-5-19 15:58
這個怎么連
真萌新
作者: 33額    時間: 2019-6-26 20:19
Ohio_yes 發(fā)表于 2019-4-4 10:44
不需要放大電路嗎

你好,,,,,

作者: 常韜    時間: 2019-6-27 08:47
感謝分享
作者: 常韜    時間: 2019-6-27 08:48
太棒了

作者: cgg547100632    時間: 2019-6-27 09:37
挺好非常適合




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1