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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

hx711壓力傳感器的原理圖

[復制鏈接]
跳轉到指定樓層
樓主
ID:551481 發表于 2019-5-30 22:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "main.h"
#include "LCD1602.h"
#include "HX711.h"
#include "EEPROM.H"

//定義變量
unsigned char KEY_NUM = 0;   //用來存放按鍵按下的鍵值
unsigned long HX711_Buffer = 0;  //用來存放HX711讀取出來的數據
unsigned long Weight_Maopi = 0; //用來存放毛皮數據
long Weight_Shiwu = 0;          //用來存放實物重量
long Max_Value = 0;             //用來存放設置最大值
char maxValueTable[4] = {1,0,0,0};
unsigned char state = 0;    //用來存放設置狀態
unsigned char Blink_Speed = 0;
#define Blink_Speed_Max 6          //該值可以改變設置指針閃爍頻率

//校準參數
//因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里這個參數才能使測量值很準確。
//當發現測試出來的重量偏大時,增加該數值。
//如果測試出來的重量偏小時,減小改數值。
//該值可以為小數
#define GapValue 780

//傳感器最大測量值,單位是g
#define AlarmValue 3000                       

//****************************************************
//主函數
//****************************************************
void main()
{
        Init_LCD1602();                                                //初始化LCD1602

        LCD1602_write_com(0x80);                        //設置LCD1602指針
        LCD1602_write_word("Welcome to use!");
       
        Get_Maopi();
        Get_Maopi();
        Delay_ms(2000);                 //延時2s
        Get_Maopi();
        Get_Maopi();                                //稱毛皮重量        //多次測量有利于HX711穩定
    LCD1602_write_com(0x01);    //清屏

    //讀取EEPROM中保存的報警值
    maxValueTable[0] = byte_read(0x2000);
    maxValueTable[1] = byte_read(0x2001);
    maxValueTable[2] = byte_read(0x2002);
    maxValueTable[3] = byte_read(0x2003);
    Max_Value = maxValueTable[0]*1000+maxValueTable[1]*100+maxValueTable[2]*10+maxValueTable[3];    //計算超限報警界限值
        while(1)
        {
        Get_Weight();               
       
                //顯示當前重量
                LCD1602_write_com(0x80);
        LCD1602_write_word("Weight=");
                LCD1602_write_data(Weight_Shiwu%10000/1000 + 0x30);
                LCD1602_write_data('.');
                LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);
                LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);
                LCD1602_write_data(Weight_Shiwu%10 + 0x30);               
                LCD1602_write_word("Kg");

                KEY_NUM = Scan_Key();
        if(KEY_NUM == 1)        //按鍵1切換設置狀態
        {
            state++;
            if(state == 5)
            {
                state = 0;
                SectorErase(0x2000);
                byte_write(0x2000,maxValueTable[0]);                                //保存EEPROM數據
                byte_write(0x2001,maxValueTable[1]);
                byte_write(0x2002,maxValueTable[2]);                                //保存EEPROM數據
                byte_write(0x2003,maxValueTable[3]);
                Max_Value = maxValueTable[0]*1000+maxValueTable[1]*100+maxValueTable[2]*10+maxValueTable[3];    //計算超限報警界限值
            }
        }
        if(KEY_NUM == 2)        //按鍵加
        {
            if(state != 0)
            {
                maxValueTable[state-1]++;
                if(maxValueTable[state-1] >= 10)
                {
                    maxValueTable[state-1] = 0;
                }
            }

        }
        if(KEY_NUM == 3)        //按鍵減
        {
            if(state != 0)
            {
                maxValueTable[state-1]--;
                if(maxValueTable[state-1] <= -1)
                {
                    maxValueTable[state-1] = 9;
                }
            }
        }
                if(KEY_NUM == 4)
                {
                        Get_Maopi();                        //去皮       
                }


        if(state != 0)
        {
            Blink_Speed ++;
            if(Blink_Speed == Blink_Speed_Max)
            {
                Blink_Speed = 0;
            }
        }
        switch(state)
        {
            case 0:
                LCD1602_write_com(0x80+0x40);
                LCD1602_write_word("MAX=");
                LCD1602_write_data(maxValueTable[0]+0x30);
                LCD1602_write_data('.');
                LCD1602_write_data(maxValueTable[1]+0x30);
                LCD1602_write_data(maxValueTable[2]+0x30);
                LCD1602_write_data(maxValueTable[3]+0x30);
                LCD1602_write_word("Kg");
                break;
            case 1:
                LCD1602_write_com(0x80+0x40);
                LCD1602_write_word("MAX=");
                if(Blink_Speed < Blink_Speed_Max/2)
                {
                    LCD1602_write_data(maxValueTable[0]+0x30);
                }
                else
                {
                    LCD1602_write_data(' ');
                }
                LCD1602_write_data('.');
                LCD1602_write_data(maxValueTable[1]+0x30);
                LCD1602_write_data(maxValueTable[2]+0x30);
                LCD1602_write_data(maxValueTable[3]+0x30);
                LCD1602_write_word("Kg");
                break;
            case 2:
                LCD1602_write_com(0x80+0x40);
                LCD1602_write_word("MAX=");
                LCD1602_write_data(maxValueTable[0]+0x30);
                LCD1602_write_data('.');
                if(Blink_Speed < Blink_Speed_Max/2)
                {
                    LCD1602_write_data(maxValueTable[1]+0x30);
                }
                else
                {
                    LCD1602_write_data(' ');
                }
                LCD1602_write_data(maxValueTable[2]+0x30);
                LCD1602_write_data(maxValueTable[3]+0x30);
                LCD1602_write_word("Kg");
                break;
            case 3:
                LCD1602_write_com(0x80+0x40);
                LCD1602_write_word("MAX=");
                LCD1602_write_data(maxValueTable[0]+0x30);
                LCD1602_write_data('.');
                LCD1602_write_data(maxValueTable[1]+0x30);
                if(Blink_Speed < Blink_Speed_Max/2)
                {
                    LCD1602_write_data(maxValueTable[2]+0x30);
                }
                else
                {
                    LCD1602_write_data(' ');
                }               
                LCD1602_write_data(maxValueTable[3]+0x30);
                LCD1602_write_word("Kg");
                break;
            case 4:
                LCD1602_write_com(0x80+0x40);
                LCD1602_write_word("MAX=");
                LCD1602_write_data(maxValueTable[0]+0x30);
                LCD1602_write_data('.');
                LCD1602_write_data(maxValueTable[1]+0x30);
                LCD1602_write_data(maxValueTable[2]+0x30);
                if(Blink_Speed < Blink_Speed_Max/2)
                {
                    LCD1602_write_data(maxValueTable[3]+0x30);
                }
                else
                {
                    LCD1602_write_data(' ');
                }                 
                LCD1602_write_word("Kg");
                break;
            default:
                break;

        }

        //超限報警
        if(Weight_Shiwu >= Max_Value || Weight_Shiwu >= AlarmValue)                //超過設置最大值或者傳感器本身量程最大值報警       
                {
                        Buzzer = 0;       
                }
                else
                {
                        Buzzer = 1;
                }
        }
}

//****************************************************
//稱重
//****************************************************
void Get_Weight()
{
        Weight_Shiwu = HX711_Read();
        Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                //獲取凈重
        if(Weight_Shiwu >= 0)                       
        {       
                Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/GapValue);         //計算實物的實際重量
        }
        else
        {
                Weight_Shiwu = 0;
        }
       
}

//****************************************************
//獲取毛皮重量
//****************************************************
void Get_Maopi()
{
        Weight_Maopi = HX711_Read();       
}


//****************************************************
//MS延時函數(12M晶振下測試)
//****************************************************
void Delay_ms(unsigned int n)
{
        unsigned int  i,j;
        for(i=0;i<n;i++)
                for(j=0;j<123;j++);
}

//****************************************************
//蜂鳴器程序
//****************************************************
void Buzzer_Di()
{
        Buzzer = 0;
        Delay_ms(10);
        Buzzer = 1;
        Delay_ms(10);
}

//****************************************************
//按鍵掃描程序
//****************************************************
unsigned char Scan_Key()
{       
    if( KEY1 == 0 )                                                //按鍵掃描
        {
                Delay_ms(10);                                        //延時去抖
                if( KEY1 == 0 )
                {
                        Buzzer_Di();
                        while(KEY1 == 0);                        //等待松手
                        return 1;
                }
        }
    if( KEY2 == 0 )                                                //按鍵掃描
        {
                Delay_ms(10);                                        //延時去抖
                if( KEY2 == 0 )
                {
                        Buzzer_Di();
                        while(KEY2 == 0);                        //等待松手
                        return 2;
                }
        }
    if( KEY3 == 0 )                                                //按鍵掃描
        {
                Delay_ms(10);                                        //延時去抖
                if( KEY3 == 0 )
                {
                        Buzzer_Di();
                        while(KEY3 == 0);                        //等待松手
                        return 3;
                }
        }
        if( KEY4 == 0 )                                                //按鍵掃描
        {
                Delay_ms(10);                                        //延時去抖
                if( KEY4 == 0 )
                {
                        Buzzer_Di();
                        while(KEY4 == 0);                        //等待松手
                        return 4;
                }
        }
    return 0;
}
#include "LCD1602.h"

//****************************************************
//MS延時函數(12M晶振下測試)
//****************************************************
void LCD1602_delay_ms(unsigned int n)
{
        unsigned int  i,j;
        for(i=0;i<n;i++)
                for(j=0;j<123;j++);
}

//****************************************************
//寫指令
//****************************************************
void LCD1602_write_com(unsigned char com)
{
        LCD1602_RS = 0;
        LCD1602_delay_ms(1);
        LCD1602_EN = 1;
        LCD1602_PORT = com;
        LCD1602_delay_ms(1);
        LCD1602_EN = 0;
}

//****************************************************
//寫數據
//****************************************************
void LCD1602_write_data(unsigned char dat)
{
        LCD1602_RS = 1;
        LCD1602_delay_ms(1);       
        LCD1602_PORT = dat;
        LCD1602_EN = 1;
        LCD1602_delay_ms(1);
        LCD1602_EN = 0;
}

//****************************************************
//連續寫字符
//****************************************************
void LCD1602_write_word(unsigned char *s)
{
        while(*s>0)
        {
                LCD1602_write_data(*s);
                s++;
        }
}

void Init_LCD1602()
{
        LCD1602_EN = 0;
        LCD1602_RW = 0;                                                //設置為寫狀態
        LCD1602_write_com(0x38);                        //顯示模式設定
        LCD1602_write_com(0x0c);                        //開關顯示、光標有無設置、光標閃爍設置
        LCD1602_write_com(0x06);                        //寫一個字符后指針加一
        LCD1602_write_com(0x01);                        //清屏指令
}

#include "HX711.h"


//****************************************************
//延時函數
//****************************************************
void Delay__hx711_us(void)
{
        _nop_();
        _nop_();
}

//****************************************************
//讀取HX711
//****************************************************
unsigned long HX711_Read(void)        //增益128
{
        unsigned long count;
        unsigned char i;
          HX711_DOUT=1;
        Delay__hx711_us();
          HX711_SCK=0;
          count=0;
          while(HX711_DOUT);
          for(i=0;i<24;i++)
        {
                  HX711_SCK=1;
                  count=count<<1;
                HX711_SCK=0;
                  if(HX711_DOUT)
                        count++;
        }
        HX711_SCK=1;
    count=count^0x800000;//第25個脈沖下降沿來時,轉換數據
        Delay__hx711_us();
        HX711_SCK=0;  
        return(count);
}
#include "EEPROM.H"

/* ================ 打開 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void)
{
EA = 0;       /* 關中斷   */
ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WaitTime; /* 寫入硬件延時 */
ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
}
/* =============== 關閉 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA   =   1;   /* 開中斷 */
}
/* ================ 公用的觸發代碼 ==================== */
void ISPgoon(void)
{
ISP_IAP_enable();   /* 打開 ISP,IAP 功能 */
ISP_TRIG = 0x46;  /* 觸發ISP_IAP命令字節1 */
ISP_TRIG = 0xb9;  /* 觸發ISP_IAP命令字節2 */
_nop_();
}
/* ==================== 字節讀 ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址賦值 */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */
ISP_CMD   = ISP_CMD | RdCommand; /* 寫入讀命令 */
ISPgoon();       /* 觸發執行  */
ISP_IAP_disable();    /* 關閉ISP,IAP功能 */
return (ISP_DATA);    /* 返回讀到的數據 */
}
/* ================== 扇區擦除 ======================== */
void SectorErase(unsigned int sector_addr)
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* 取扇區地址 */
ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
ISPgoon();       /* 觸發執行  */
ISP_IAP_disable();    /* 關閉ISP,IAP功能 */
}
/* ==================== 字節寫 ======================== */
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取地址  */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 */
ISP_CMD  = ISP_CMD | PrgCommand;  /* 寫命令2 */
ISP_DATA = original_data;   /* 寫入數據準備 */
ISPgoon();       /* 觸發執行  */
ISP_IAP_disable();     /* 關閉IAP功能 */
}








51單片機電子秤原理圖.pdf

284.59 KB, 下載次數: 43, 下載積分: 黑幣 -5

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

使用道具 舉報

沙發
ID:1 發表于 2019-6-1 03:09 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91久久久www播放日本观看 | 成人伊人| 国产97碰免费视频 | 99久久国产精 | 国产精品视频免费观看 | 亚洲www啪成人一区二区 | av在线免费播放 | 国产免费看 | 国产馆 | 日韩精品免费在线观看 | www久久久| 欧美一区视频 | 999久久久 | 黄色免费网站在线看 | 欧美自拍另类 | 美女久久久久久久久 | 视频一区二区三区中文字幕 | h视频在线免费 | 亚洲精品一区二三区不卡 | 国产成人午夜精品影院游乐网 | 人成精品 | 久久久久久国产 | 国产精品一区在线观看 | 玖玖视频国产 | 久久久久久久久淑女av国产精品 | 精品日韩一区 | 亚洲一区二区三区四区五区中文 | 亚洲小说图片 | 日韩中文字幕在线视频 | 精品久久视频 | 国产精品久久久久久影视 | 高清视频一区二区三区 | 在线国产小视频 | 久久国产精品无码网站 | 欧美日韩国产中文字幕 | 99re国产| 久久国产精品久久久久久久久久 | 欧美激情综合五月色丁香小说 | 日韩一区在线视频 | 国产乱xxav | av一区二区三区 |