久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉到指定樓層
樓主
1.將程序下載進去后,第一行顯示RMB/kg: (計價數據)第二行顯示m:(重量)K  P:(價格)¥
2.仿真圖是利用四個電位器模擬稱重傳感器的四個電阻應變式電阻,通過調節這四個電位器的大小可以測量物體的重量,但是程序有個漏洞就是調節電位器的大小不能及時的反應物體的重量,需要按下ENTER鍵才能檢測物體的重量,此程序還待優化
3.通過按鍵可以設定物品的計價,程序中設計的每千克多少錢,程序只支持設定整數價格(小數價格朋友可以自己適當修改下即可),當設定好價格后按下ENTER鍵即可顯示物品的重量及價格,如果還要設定其他的價格,則需要按下CLEAR清除按鍵再設定即可。
4.此電子秤最大稱重為5KG,計價總和最大為999.99。
5.此設計還可以添加語音錄放模塊,實現智能化報價
6.電子秤LCD上顯示的重量值是電阻應變器電橋的對邊電壓,這樣一來我們可以利用這個電壓值反應稱重的重量

仿真原理圖如下(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寫數據  1001 A2A1A0 R/W
    ack();
    iicwrbyte(channel|0x70);   //通過打開通道channelX,模擬輸出使能打開
    noack();
    iicstop();
}
uint8 pcf8591read()
{
    uint8 dat;
    iicinit();
    iicstart();
    iicwrbyte(0x90);
    ack();
    iicstart();
    iicwrbyte(0x91);     //    pcf8591讀數據  1001 A2A1A0 R/W
    ack();
    dat=iicread();
    noack();
    iicstop();
    return dat;   
}

void pcf8591dac(uint8 value)       //DA轉換
{
    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()          //按鍵處理函數
{
    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; //小數點按下標志位
        case 0xd7: kn=11;break; //計價確認按鍵標志
        case 0xb7: kn=13;break; //clear,清空計價輸入
        case 0x77: break;
        default :  break;
    }   
}
void datapros()
{
    uint8 i,count=0;
    do                       //將按鍵值保存在數組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)      //清除按鍵計價數
            {
                wrc(0x01);//清屏處理   
                pric=0;
            }
            if(kn==11)     //當計價確認按鍵按下時候退出循環
            {
                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;//當進行一次轉換后清空計數器的值   
    }
}
void display()
{
    float v;
    uint8 i;
    uint16 price;
    pcf8591wrbyte(0);      //電位器轉換
    ad[0]=pcf8591read();    //讀取第一次之前的那次數據
    delay(10);
    v=ad[0]*0.01953;//將電位器的數據轉換成電壓值
    v=v*100;//取2位有效數值
    ad[0]=v;
    price=ad[0]*pric;     //每千克多少錢如果我們定義每千克2元那么就可以乘以2,如果為其他我們可以乘以其他數,最大定義的價格是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);//將數字量轉換為模擬量由pcf8591的AOUT輸出

    wrd(' ');
    wrd('P');
    wrd(':');
    wrd(num[price/10000]);//為什么是除以10000,本來不計價的話是除以100,但是計價最大可以使百位數,所以除以的數也得乘以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下載地址:
基于單片機設計的數字電子秤(程序,proteus仿真,原理圖都有).zip (2.93 MB, 下載次數: 762)


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

5#
ID:424725 發表于 2019-3-31 17:17 | 只看該作者
謝謝樓主分享!!
回復

使用道具 舉報

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

使用道具 舉報

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

加一  求程序電路   仿真
回復

使用道具 舉報

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

你要下載Proteus8.0才打得開
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

謝謝樓主分享
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

謝謝分享!!!
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

keil試試
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

Keil uVision4
回復

使用道具 舉報

29#
ID:1140248 發表于 2024-12-18 09:13 | 只看該作者
電子秤怎么實現的啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品在线看 | 欧美在线观看一区 | 国产欧美日韩综合精品一区二区 | 国产精品久久久久久久 | 综合色在线 | 精品免费国产视频 | 欧美精产国品一二三区 | 国产精品久久久久久久久免费丝袜 | 91免费观看 | 日韩成人国产 | 少妇一级淫片免费放播放 | av国产精品 | 欧美精品一二三区 | 国产午夜精品视频 | 亚洲综合色网 | 黄色毛片在线看 | 精久久久 | 精品国产一区二区三区观看不卡 | 日韩精品成人 | 久久宗合色 | 懂色av一区二区三区在线播放 | 久久se精品一区精品二区 | 产真a观专区 | www.久| 欧美精品中文字幕久久二区 | 欧美日韩亚洲视频 | 亚洲免费在线观看 | 91.xxx.高清在线 | 日韩一区二区三区在线 | 中午字幕在线观看 | 成人精品免费视频 | 亚洲一区二区三区在线播放 | 国产精品一区二区免费 | 欧美电影在线观看网站 | 性色的免费视频 | 成人毛片网 | 亚洲不卡在线视频 | 精品乱码一区二区三四区 | av日韩精品 | 久久一热 | 91极品视频|