找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17673|回復(fù): 28
打印 上一主題 下一主題
收起左側(cè)

基于單片機的數(shù)字電子秤(程序,proteus仿真,原理圖都有)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:363303 發(fā)表于 2018-7-2 16:29 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
1.將程序下載進去后,第一行顯示RMB/kg: (計價數(shù)據(jù))第二行顯示m:(重量)K  P:(價格)¥
2.仿真圖是利用四個電位器模擬稱重傳感器的四個電阻應(yīng)變式電阻,通過調(diào)節(jié)這四個電位器的大小可以測量物體的重量,但是程序有個漏洞就是調(diào)節(jié)電位器的大小不能及時的反應(yīng)物體的重量,需要按下ENTER鍵才能檢測物體的重量,此程序還待優(yōu)化
3.通過按鍵可以設(shè)定物品的計價,程序中設(shè)計的每千克多少錢,程序只支持設(shè)定整數(shù)價格(小數(shù)價格朋友可以自己適當修改下即可),當設(shè)定好價格后按下ENTER鍵即可顯示物品的重量及價格,如果還要設(shè)定其他的價格,則需要按下CLEAR清除按鍵再設(shè)定即可。
4.此電子秤最大稱重為5KG,計價總和最大為999.99。
5.此設(shè)計還可以添加語音錄放模塊,實現(xiàn)智能化報價
6.電子秤LCD上顯示的重量值是電阻應(yīng)變器電橋的對邊電壓,這樣一來我們可以利用這個電壓值反應(yīng)稱重的重量

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
sbit scl=P2^1;
sbit sda=P2^0;
uint8 num[]="0123456789";
uint8 d1[]="RMB/kg: ";
uint16 ad[5],m[5];
uint8 kn=10;
uint8 keynum[3];
uint16 pric=0;
void delay(uint16 i)
{
    while(i--);
}
void wrc(uint8 c)
{
    delay(1000);
    rs=0;
    rw=0;
    e=0;
    P0=c;
    e=1;
    delay(10);
    e=0;
}
void wrd(uint8 dat)
{
    delay(1000);
    rs=1;
    rw=0;
    e=0;
    P0=dat;
    e=1;
    delay(10);
    e=0;
    rs=0;
}
void init()
{
    delay(1000);
    wrc(0x38);
    wrc(0x38);
    wrc(0x38);
    wrc(0x06);
    wrc(0x0c);
    wrc(0x01);
}
void iicinit()
{
    sda=1;
    scl=1;   
}
void iicstart()
{
    sda=1;
    scl=1;
    delay(10);
    sda=0;
    delay(10);
    scl=0;
    delay(10);
}
void iicstop()
{
    sda=0;
    scl=1;
    delay(10);
    sda=1;
    delay(10);
    sda=0;
    delay(10);
}
void ack()
{
    sda=1;
    scl=0;
    delay(2);
    sda=0;
    delay(2);
    scl=1;
    delay(10);
    scl=0;
    delay(2);
    sda=1;
    delay(5);
}
void noack()
{
    sda=0;
    scl=0;
    delay(2);
    sda=1;
    delay(2);   
    scl=1;
    delay(10);
    scl=0;
    delay(2);
    sda=0;
    delay(5);
}

void iicwrbyte(uint8 dat)
{
    uint8 i;
    scl=0;
    for(i=0;i<8;i++)               
    {
        if(dat&0x80)   
        {
            sda=1;
        }
        else
        {
            sda=0;
        }
        dat<<=1;
        scl=1;
        delay(10);
        scl=0;
        delay(10);
    }
    sda=1;
    delay(10);
}

uint8 iicread()
{
    uint8 i,dat;
    scl=0;
    sda=1;
    for(i=0;i<8;i++)
    {
        dat<<=1;
        if(sda==1)        
        {
            dat|=0x01;   
        }
        scl=1;
        delay(10);
        scl=0;
        delay(10);
    }
    return     dat;
}

void pcf8591wrbyte(uint8 channel)
{
    iicinit();
    iicstart();
    iicwrbyte(0x90);       //pcf8591寫數(shù)據(jù)  1001 A2A1A0 R/W
    ack();
    iicwrbyte(channel|0x70);   //通過打開通道channelX,模擬輸出使能打開
    noack();
    iicstop();
}
uint8 pcf8591read()
{
    uint8 dat;
    iicinit();
    iicstart();
    iicwrbyte(0x90);
    ack();
    iicstart();
    iicwrbyte(0x91);     //    pcf8591讀數(shù)據(jù)  1001 A2A1A0 R/W
    ack();
    dat=iicread();
    noack();
    iicstop();
    return dat;   
}

void pcf8591dac(uint8 value)       //DA轉(zhuǎn)換
{
    iicinit();
    iicstart();
    iicwrbyte(0x90);
    ack();
    iicwrbyte(0x70);        //不需要打開通道channelX,模擬輸出使能打開
    ack();
    iicwrbyte(value);
    noack();
    iicstop();   
}
uint8 keyscan()         //按鍵掃描程序
{
    uint8 h,l,value;
    P1=0x0f;
    h=P1&0x0f;
    if(h!=0x0f)
    {
        delay(1);
        if(h!=0x0f)
        {
            h=P1&0x0f;
            l=P1|0xf0;
            P1=l;
            l=P1&0xf0;
            h=P1&0x0f;
            value=h+l;   
        }
        return value;
    }
}
void keypros()          //按鍵處理函數(shù)
{
    uint8 key;
    key=keyscan();
    switch(key)
    {
        case 0xee: kn=0;break;
        case 0xde: kn=1;break;
        case 0xbe: kn=2;break;
        case 0x7e: kn=3;break;
        case 0xed: kn=4;break;
        case 0xdd: kn=5;break;
        case 0xbd: kn=6;break;
        case 0x7d: kn=7;break;
        case 0xeb: kn=8;break;
        case 0xdb: kn=9;break;
        case 0xbb: break;   
        case 0x7b: break;
        case 0xe7: kn=12;break; //小數(shù)點按下標志位
        case 0xd7: kn=11;break; //計價確認按鍵標志
        case 0xb7: kn=13;break; //clear,清空計價輸入
        case 0x77: break;
        default :  break;
    }   
}
void datapros()
{
    uint8 i,count=0;
    do                       //將按鍵值保存在數(shù)組keynum中
    {
        P1=0x0f;
        if(P1!=0x0f)        
        {
            keypros();
            P1=0x0f;
            while(P1!=0x0f);//等待按鍵松開
            if(kn>=0&&kn<=9)
            {
                keynum[count]=kn;
                wrc(0x0b+count+0x80);  //移位顯示
                wrd(keynum[count]+0x30);
                count++;
            }
            if(kn==13)      //清除按鍵計價數(shù)
            {
                wrc(0x01);//清屏處理   
                pric=0;
            }
            if(kn==11)     //當計價確認按鍵按下時候退出循環(huán)
            {
                goto xian;
            }   
        }            
    }
    while(count<=2);
    if(count>=2)
    {
        goto xian;
    }
    xian:    for(i=0;i<count;i++)
    {
        pric=pric*10+keynum[ i];   
        if(i==count)count=0;//當進行一次轉(zhuǎn)換后清空計數(shù)器的值   
    }
}
void display()
{
    float v;
    uint8 i;
    uint16 price;
    pcf8591wrbyte(0);      //電位器轉(zhuǎn)換
    ad[0]=pcf8591read();    //讀取第一次之前的那次數(shù)據(jù)
    delay(10);
    v=ad[0]*0.01953;//將電位器的數(shù)據(jù)轉(zhuǎn)換成電壓值
    v=v*100;//取2位有效數(shù)值
    ad[0]=v;
    price=ad[0]*pric;     //每千克多少錢如果我們定義每千克2元那么就可以乘以2,如果為其他我們可以乘以其他數(shù),最大定義的價格是200元每千克
    wrc(0x00+0x80);
    for(i=0;i<8;i++)
    {
        wrd(d1[i ]);
    }
    wrc(0x40+0x80);
    wrd('m');
    wrd(':');
    wrd(num[ad[0]/100]);
    wrd('.');
    wrd(num[ad[0]%100/10]);
    wrd(num[ad[0]%100%10]);
//    wrd(num[ad[0]%1000%100%10]);
    wrd('K');
//    wrd('G');
    ad[4]=ad[0];
    pcf8591dac(ad[4]/2);//將數(shù)字量轉(zhuǎn)換為模擬量由pcf8591的AOUT輸出

    wrd(' ');
    wrd('P');
    wrd(':');
    wrd(num[price/10000]);//為什么是除以10000,本來不計價的話是除以100,但是計價最大可以使百位數(shù),所以除以的數(shù)也得乘以100
   
    wrd(num[price%10000/1000]);
   
    wrd(num[price%10000%1000/100]);
    wrd('.');
    if((price%10000%1000%100%10)>=5)  //進價,四舍五入法
        wrd(num[(price%10000%1000%100/10)+1]);
    else   
        wrd(num[price%10000%1000%100/10]);   
    wrd('$');
}

void main()
{
    init();
    while(1)
    {
        display();
        datapros();   
    }        
}


全部資料51hei下載地址:
基于單片機設(shè)計的數(shù)字電子秤(程序,proteus仿真,原理圖都有).zip (2.93 MB, 下載次數(shù): 762)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:428553 發(fā)表于 2018-11-19 09:56 | 只看該作者
如何提高稱重上限呢
回復(fù)

使用道具 舉報

板凳
ID:488521 發(fā)表于 2019-3-11 15:30 | 只看該作者
源程序用什么打開,我用proteus打不開
回復(fù)

使用道具 舉報

地板
ID:494473 發(fā)表于 2019-3-20 09:40 | 只看該作者
漂亮,很好的程序
回復(fù)

使用道具 舉報

5#
ID:424725 發(fā)表于 2019-3-31 17:17 | 只看該作者
謝謝樓主分享。
回復(fù)

使用道具 舉報

6#
ID:503358 發(fā)表于 2019-4-3 09:33 | 只看該作者
仿真圖用Proteus打不開,它們是PDSBAK、PDSPRJ和WORKSPACE文件,請問有人知道這些文件用什么打開嗎
回復(fù)

使用道具 舉報

7#
ID:371965 發(fā)表于 2019-4-3 11:38 | 只看該作者
Ohio_yes 發(fā)表于 2019-4-3 09:33
仿真圖用Proteus打不開,它們是PDSBAK、PDSPRJ和WORKSPACE文件,請問有人知道這些文件用什么打開嗎

加一  求程序電路   仿真
回復(fù)

使用道具 舉報

8#
ID:503358 發(fā)表于 2019-4-9 10:16 | 只看該作者
濤濤啊 發(fā)表于 2019-4-3 11:38
加一  求程序電路   仿真

你要下載Proteus8.0才打得開
回復(fù)

使用道具 舉報

9#
ID:405802 發(fā)表于 2019-6-13 11:05 | 只看該作者
沒有仿真電路
回復(fù)

使用道具 舉報

10#
ID:434736 發(fā)表于 2019-10-16 10:44 來自手機 | 只看該作者
謝謝大佬分享,東西很有用,幫助很大
回復(fù)

使用道具 舉報

11#
ID:588752 發(fā)表于 2020-2-18 21:02 | 只看該作者
好東西好東西
回復(fù)

使用道具 舉報

12#
ID:298008 發(fā)表于 2020-3-26 08:36 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報

13#
ID:698864 發(fā)表于 2020-3-31 19:10 | 只看該作者
請問 我用PROTEUS8.9打開,為什么打不開?要閃退出來?
回復(fù)

使用道具 舉報

14#
ID:719988 發(fā)表于 2020-4-1 09:31 | 只看該作者

謝謝樓主分享
回復(fù)

使用道具 舉報

15#
ID:555499 發(fā)表于 2020-4-1 15:54 | 只看該作者
資料很好,感謝樓主,感謝網(wǎng)站!
回復(fù)

使用道具 舉報

16#
ID:253767 發(fā)表于 2020-4-12 07:42 | 只看該作者
謝謝分享!!!
回復(fù)

使用道具 舉報

17#
ID:739617 發(fā)表于 2020-4-27 21:11 | 只看該作者

謝謝分享!!!
回復(fù)

使用道具 舉報

18#
ID:748874 發(fā)表于 2020-5-11 10:40 | 只看該作者
您好,想請教一下程序設(shè)計里面有很多的程序,用哪一個?才學(xué),不是太懂
回復(fù)

使用道具 舉報

19#
ID:748896 發(fā)表于 2020-5-11 11:11 | 只看該作者
原理圖在哪啊
回復(fù)

使用道具 舉報

20#
ID:676384 發(fā)表于 2020-6-2 16:38 | 只看該作者
好像要啊
回復(fù)

使用道具 舉報

21#
ID:778729 發(fā)表于 2020-6-14 09:55 | 只看該作者
厲害,謝謝樓主分享
回復(fù)

使用道具 舉報

22#
ID:781838 發(fā)表于 2020-6-19 14:11 | 只看該作者
感謝樓主的分享
回復(fù)

使用道具 舉報

23#
ID:643706 發(fā)表于 2020-6-28 21:09 | 只看該作者
ycsck 發(fā)表于 2019-3-11 15:30
源程序用什么打開,我用proteus打不開

keil試試
回復(fù)

使用道具 舉報

24#
ID:416239 發(fā)表于 2020-6-29 07:31 | 只看該作者
怎么實現(xiàn)重置復(fù)位并且讓他重新計算
回復(fù)

使用道具 舉報

25#
ID:845339 發(fā)表于 2020-11-19 17:12 | 只看該作者
用keil打不開源程序
回復(fù)

使用道具 舉報

26#
ID:712493 發(fā)表于 2020-11-20 09:39 | 只看該作者
這個程序有用到實物?感覺做電子稱要另外的技能(技巧)
回復(fù)

使用道具 舉報

27#
ID:867456 發(fā)表于 2020-12-25 15:02 | 只看該作者
謝謝樓主,代碼都沒問題,可以直接在Proteus上運行,很棒的設(shè)計
回復(fù)

使用道具 舉報

28#
ID:931894 發(fā)表于 2023-5-18 22:00 | 只看該作者
ycsck 發(fā)表于 2019-3-11 15:30
源程序用什么打開,我用proteus打不開

Keil uVision4
回復(fù)

使用道具 舉報

29#
ID:1140248 發(fā)表于 2024-12-18 09:13 | 只看該作者
電子秤怎么實現(xiàn)的啊
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表