找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17792|回復: 18
打印 上一主題 下一主題
收起左側

基于51單片機的簡易電子秤設計

  [復制鏈接]
跳轉到指定樓層
樓主
ID:175526 發(fā)表于 2017-3-20 20:14 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

#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 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:157057 發(fā)表于 2017-3-20 21:10 | 只看該作者
感謝分享。。
回復

使用道具 舉報

板凳
ID:171060 發(fā)表于 2017-3-21 17:40 來自手機 | 只看該作者
感謝分享
回復

使用道具 舉報

地板
ID:188658 發(fā)表于 2017-4-11 22:30 | 只看該作者
很棒,正在找這個。
回復

使用道具 舉報

5#
ID:184237 發(fā)表于 2017-4-16 16:59 | 只看該作者
新手請教 這里面的ad驅動程序不需要嗎
回復

使用道具 舉報

6#
ID:175526 發(fā)表于 2017-4-29 20:52 | 只看該作者
小伙賊TMD的帥 發(fā)表于 2017-4-16 16:59
新手請教 這里面的ad驅動程序不需要嗎

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

使用道具 舉報

7#
ID:200661 發(fā)表于 2017-6-16 12:35 | 只看該作者
YOUXIAOYUE 發(fā)表于 2017-4-11 22:30
很棒,正在找這個。


很棒,正在找這個。
回復

使用道具 舉報

8#
ID:220720 發(fā)表于 2017-7-24 10:07 | 只看該作者
extern void ADC();
extern uchar Adc0832(unsigned char channel);     //AD轉換,返回結果
extern uchar bai,shi,ge;
這個的程序看不到,文件燒不了求解答
回復

使用道具 舉報

9#
ID:239821 發(fā)表于 2017-10-17 16:03 | 只看該作者
有沒有以MCS51單片機為核心器件設計一款集身高、體重及體型判斷于一體的多功能電子秤分享呀
回復

使用道具 舉報

10#
ID:380287 發(fā)表于 2018-7-28 19:27 | 只看該作者
這個用的什么顯示屏
1602?還是其他
回復

使用道具 舉報

11#
ID:447268 發(fā)表于 2018-12-16 16:26 | 只看該作者
怎么仿真時顯示屏一直在閃
回復

使用道具 舉報

12#
ID:503358 發(fā)表于 2019-4-4 10:44 | 只看該作者
不需要放大電路嗎
回復

使用道具 舉報

13#
ID:503358 發(fā)表于 2019-4-4 14:44 | 只看該作者
太棒了,謝謝
回復

使用道具 舉報

14#
ID:542129 發(fā)表于 2019-5-19 15:58 | 只看該作者
這個怎么連
真萌新
回復

使用道具 舉報

15#
ID:572891 發(fā)表于 2019-6-26 20:19 來自手機 | 只看該作者
Ohio_yes 發(fā)表于 2019-4-4 10:44
不需要放大電路嗎

你好,,,,,
回復

使用道具 舉報

16#
ID:572998 發(fā)表于 2019-6-27 08:47 | 只看該作者
感謝分享
回復

使用道具 舉報

17#
ID:572998 發(fā)表于 2019-6-27 08:48 | 只看該作者
太棒了
回復

使用道具 舉報

18#
ID:572991 發(fā)表于 2019-6-27 09:37 | 只看該作者
挺好非常適合
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表