新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LM75A的數字溫度計的設計

        LM75A的數字溫度計的設計

        作者: 時間:2016-11-21 來源:網絡 收藏
        LM75A是PHILPS公司生產的數字溫度傳感器及看門狗。通過片內集成的帶隙溫度傳感器和∑-△數摸轉換器來實現數字溫度的測量,并通過該溫度傳感器為用戶提供溫度超限報警輸出。LM75A內部包含多個數據寄存器:(1)配置寄器(Conf):用來存儲器件的配置,如:器件工作模式、OS工作模式、OS極性和OS故障隊列;(2)溫度寄存器(Temp):用于存儲讀取的數字溫度;(3)設定點寄存器(Tos&Thyst):用來存儲可編程的過熱關斷和滯后限制。器件通過2線的串行I2C總線接口與控制器通信。LM75A包含一個開漏輸出(OS),當溫度超過編程限制的值時該輸出有效。LM75A有3個可選的邏輯地址管腳,使得同一總線上可同時掛8個LM75A而無需其他硬件的支持

        CPU:STC89C54RD+
        晶震:11.0592M
        A0 A1 A2 均接地 地址設置為0 OS腳和INT0相連并通過10K上拉到VCC;當轉換溫度超過極限溫度,輸出中斷蜂鳴器報警;刷新數碼管顯示溫度 共5位前一位表示正負溫度后三位為溫度125 - -55 最后一位為0.1度 最高可精確到0.125 數碼管圖略定時器100MS采集溫度一次

        本文引用地址:http://www.104case.com/article/201611/319373.htm

        #include
        #include
        #include

        sbit xiaoshu=P2^0; //COM口
        sbit ge=P2^1;
        sbit shi=P2^3;
        sbit bai=P2^4;
        sbit fh=P2^5;
        sbit SDA_LM75=P1^0; //數據
        sbit SCL_LM75=P1^1;
        sbit BP=P2^1;
        bit dp=0;
        unsigned char JS=0;


        #define LED P0 //8位數碼管 動態時時刷新

        #define CONF 0X01 //配置寄存器
        #define TEMP 0X00 //溫度寄存器 只讀
        #define ALARM 0X03 //超溫關閉極限寄存器默認5000H
        #define DELAY 0X02 //滯后寄存器默認4B00H
        #define WADDR 0X90 //寫地址
        #define RADDR 0X91 //讀地址

        unsigned int tempdata=0; //全局變量申明溫度

        unsigned char code tab[]={ 0x3f,0x30,0x6d,0x79,0x72,0x5b,0x5f,0x31,0x7f,0x7b,0x40};//共陰
        //0, 1, 2 3 4 5 6 7 8 9
        //unsigned char tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽
        //0, 1, 2 3 4 5 6 7 8 9

        unsigned char code tabdp[]={ 0xbf,0xb0,0xed,0xf9,0xf2,0xdb,0xdf,0xb1,0xff,0xfb,0xc0};//共陰帶小數點
        //0, 1, 2 3 4 5 6 7 8 9
        //unsigned char tabdp[]={ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共陽


        void delay_xms(unsigned int count) //延時函數
        {
        register unsigned char j;
        while (count --)
        {
        for (j=0;j<125;j++) //約1MS
        {
        }
        }
        }


        void Led_Display(unsigned int i,bit mode) //顯示函數
        {
        if(mode)
        LED = 0x40; //共陰負
        //LED=0xBF;
        else
        LED = 0x00;
        //LED= 0XFF;
        fh = 1;
        bai = 0;
        shi = 0;
        ge = 0;
        xiaoshu=0;
        delay_xms(1);
        LED = tab[i/1000];
        i%=1000;
        fh = 0;
        bai = 1;
        shi = 0;
        ge = 0;
        xiaoshu=0;
        delay_xms(1);
        LED = tab[i/100];
        i%=100;
        fh=0;
        bai = 0;
        shi = 1;
        ge = 0;
        xiaoshu=0;
        delay_xms(1);
        LED = tabdp[i/10]; //帶小數點
        fh=0;
        bai = 0;
        shi = 0;
        ge = 1;
        xiaoshu=0;
        delay_xms(1);
        LED = tab[i%10];
        fh=0;
        bai = 0;
        shi = 0;
        ge = 0;
        xiaoshu=1;
        delay_xms(1);
        }

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

        void start_lm75(void)//起始
        {
        SDA_LM75=1;
        SCL_LM75=1;
        delay();
        SDA_LM75=0;
        delay();
        SCL_LM75=0;
        }

        void stop_lm75(void)//停止
        {
        SDA_LM75=0;
        SCL_LM75=1;
        delay();
        SDA_LM75=1;
        delay();
        SCL_LM75=0;
        }

        void Check_Ack(void) //檢查應答信號
        {
        SDA_LM75=1;
        SCL_LM75=1;
        F0=0;
        delay();
        if(SDA_LM75) //如果數據為高 置位非應答標志FO
        F0=1; //通用標志位 PSW狀態寄存器
        SCL_LM75=0; //準備下一變化數據
        }

        void Ack(void) //發響應信號
        {
        SDA_LM75=0;
        delay();
        SCL_LM75=1;
        delay();
        SCL_LM75=0;
        }

        void no_Ack(void) //發非響應信號
        {
        SDA_LM75=1;
        SCL_LM75=0;
        delay();
        SCL_LM75=1; //迫使數據傳輸結束
        delay();
        }

        void send_byte(unsigned char temp) //發送一字節數據
        {
        unsigned char i=8;
        while(i--)
        {
        SDA_LM75=(bit)(temp&0x80);
        SCL_LM75=1;
        delay();
        SCL_LM75=0;
        temp<<=1;
        }
        SCL_LM75=0;
        delay();
        SDA_LM75=1; //釋放SDA數據線
        }

        unsigned char read_byte(void) //讀一字節數據
        {
        unsigned char i=8;
        unsigned char temp;
        while(i--)
        {
        temp<<=1;
        if(SDA_LM75)
        temp++;
        SCL_LM75=1;
        delay();
        SCL_LM75=0;
        }
        SCL_LM75=0;
        delay();
        SDA_LM75=1; //釋放SDA數據線
        return (temp);
        }

        void Write_chardata(unsigned char addr,unsigned char tempdata)//寫配置寄存器
        {
        start_lm75();
        send_byte(WADDR);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return;
        }
        Ack();
        send_byte(addr);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return;
        }
        Ack();
        send_byte(tempdata);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return;
        }
        Ack();
        delay();
        stop_lm75();
        }

        void Write_intdata(unsigned char addr,unsigned int tempdata)//寫16位寄存器
        {
        unsigned char datahigh;
        unsigned char datalow;
        datahigh=(unsigned char)(tempdata>>8);
        datalow=(unsigned char)(tempdata&0x00FF);
        start_lm75();
        send_byte(WADDR);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return;
        }
        Ack();
        send_byte(addr);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return;
        }
        Ack();
        send_byte(datahigh);
        send_byte(datalow);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return;
        }
        Ack();
        delay();
        stop_lm75();
        }

        unsigned char read_chardata(unsigned char addr) //讀8位寄存器
        {
        unsigned char temp;
        start_lm75();
        send_byte(WADDR);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return 0;
        }
        Ack();
        send_byte(addr);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return 0;
        }
        Ack();
        send_byte(RADDR);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return 0;
        }
        Ack();
        temp=read_byte();
        stop_lm75();
        return (temp);
        }

        unsigned int read_intdata(unsigned char addr) //讀16位寄存器
        {
        unsigned char temphigh,templow;
        start_lm75();
        send_byte(WADDR);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return 0;
        }
        Ack();
        send_byte(addr);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return 0;
        }
        Ack();
        send_byte(RADDR);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return 0;
        }
        Ack();
        temphigh=read_byte();
        templow=(read_byte())&0xe0;
        stop_lm75();
        if(!(temphigh&0x80))
        {
        dp=0;
        return (((temphigh<<8)|templow)>>5);
        }
        else
        {
        dp=1;
        return (0x800-((temphigh<<8)|templow)>>5);
        }
        }

        void initial() // 初始化LM75A
        {
        Write_chardata(CONF,0X20); //0S中斷模式,溫度轉換正常模式
        Write_intdata(ALARM,0x3300); //100度極限 由高9位有效位組成 BIT15為1表示為負為0表示為正超過100度 觸發外部中斷0
        Write_intdata(DELAY,0X4A80); // 95度后不報警
        }


        void int0_int() interrupt 0 using 1 // 外部中斷0服務函數
        {
        BP=0;
        delay_xms(1000);
        BP=1;
        delay_xms(1000);
        }
        void t0_int() interrupt 1 using 1 //定時器0中斷服務函數
        {
        TR0=0;
        TH0=0xdc; // 10MS中斷初值
        TL0=0xff;
        TR0=1;
        JS++;
        if(JS>10) //加到10為100MS
        {
        JS=0;
        tempdata=read_intdata(TEMP); //采集數據
        tempdata=(tempdata/8)*10; //轉換為溫度
        }
        }

        void main() // 入口函數
        {
        IP=0X01;
        TMOD=0X01;
        TH0=0xdc; // 10MS中斷初值
        TL0=0xff;
        IT0=0; //外部中斷0采用電平觸發

        ET0=1;
        TR0=1; //開放定時器0中斷
        EX0=1;
        EA=1;
        initial();
        while(1)
        {
        if(dp)
        Led_Display(tempdata,1);
        else
        Led_Display(tempdata,0);
        }
        }




        關鍵詞: LM75A數字溫度

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 金阳县| 临高县| 武冈市| 德格县| 奉节县| 兴和县| 珠海市| 桐庐县| 苗栗县| 阿拉善右旗| 罗城| 古浪县| 新宾| 安仁县| 清河县| 日喀则市| 岱山县| 南京市| 马龙县| 岢岚县| 马山县| 胶州市| 大庆市| 临夏县| 永福县| 新平| 奉化市| 陇川县| 宣城市| 简阳市| 海原县| 静安区| 上思县| 高州市| 安顺市| 若羌县| 鸡泽县| 永宁县| 韩城市| 绥宁县| 霞浦县|