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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18B20怎么調用I2C通訊協議實現閘值的掉電存儲

[復制鏈接]
回帖獎勵 20 黑幣 回復本帖可獲得 20 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:1084388 發表于 2023-6-28 21:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <REGX51.H>
sbit I2C_SCL = P1^3;
sbit I2C_SDA = P1^4;

I2C:
//延時
void delay_us(unsigned char i)
{
        while(i--);
}

// 開始信號:在I2C_SCL時鐘信號在高電平期間I2C_SDA信號產生一個下降沿
void I2C_Start()
{
        I2C_SDA=1;
        delay_us(1);
        I2C_SCL=1;
        delay_us(1);//保持時間>4.7us
        I2C_SDA=0;
        delay_us(1);//保持時間是>4us
        I2C_SCL=0;                       
        delay_us(1);               
}

//結束信號:在I2C_SCL時鐘信號高電平期間I2C_SDA信號產生一個上升沿
void I2C_Stop()
{
        I2C_SDA=0;
        delay_us(1);
        I2C_SCL=1;
        delay_us(1);
        I2C_SDA=1;
        delay_us(1);               
}

//通過I2C發送一個字節。在I2C_SCL時鐘信號高電平期間, 保持發送信號I2C_SDA保持穩定
unsigned char I2C_SendByte(unsigned char dat, unsigned char ack)
{
        unsigned char a = 0,b = 0;                       
        for(a=0; a<8; a++)//要發送8位,從最高位開始
        {
                I2C_SDA=dat>>7;         
                dat=dat<<1;//傳輸
                delay_us(1);
                I2C_SCL=1;
                delay_us(1);
                I2C_SCL=0;
                delay_us(1);       
        }
                I2C_SDA=1;
                delay_us(1);
                I2C_SCL=1;
                delay_us(1);
                while(I2C_SDA&&(ack==1))//等待應答
        {
                b++;
                if(b>255)         //如果超過255us沒有應答發送失敗,或者為非應答,表示接收結束
                {
                        I2C_SCL=0;
                        delay_us(1);
                        return 0;
                }
        }
        I2C_SCL=0;
        delay_us(1);
        return 1;       
}

// 使用I2c讀取一個字節
unsigned char I2C_ReadByte()
{
        unsigned char a = 0,dat = 0;
        I2C_SDA = 1;//時序
        delay_us(1);       
        for(a=0; a<8; a++)//接收8個字節
        {
                I2C_SCL = 1;
                delay_us(1);       
                dat<<=1;
                dat|=I2C_SDA;
                delay_us(1);       
                I2C_SCL=0;
                delay_us(1);       
        }
        return dat;               
}

//往24c02的一個地址寫入一個數據
void At24c02Write(unsigned char addr,unsigned char dat)
{
        I2C_Start();
        I2C_SendByte(0xa0,1);//發送寫器件地址
        I2C_SendByte(addr,1);//發送要寫入內存地址
        I2C_SendByte(dat,0);        //發送數據
        I2C_Stop();
}

// 讀取24c02的一個地址的一個數據
unsigned char At24c02Read(unsigned char addr)
{
        unsigned char num;
        I2C_Start();
        I2C_SendByte(0xa0, 1); //發送寫器件地址
        I2C_SendByte(addr, 1); //發送要讀取的地址
        I2C_Start();
        I2C_SendByte(0xa1, 1); //發送讀器件地址
        num=I2C_ReadByte(); //讀取數據
        I2C_Stop();
        return num;       
}
這個I2C時序應該沒寫錯吧,下面是我的掉電存儲函數:
從主函數中截出來的
unsigned int shangxian=35;unsigned int xiaxian=10;
unsigned char set_st=0;
unsigned char As=0,Ds=0;//As是第二個按鍵(加一ADD)按下的次數,Ds是第三個按鍵(減一)按下的次數
//{
//        while(1)
//        {
//                if(set_st==0)                 //設置按鍵按下,等待
//                        while(1);
//                else if(set_st==1)//轉到上限設置
//                                {
//                                        if(As--){
//                                                shangxian=shangxian+As;
//                                                At24c02Write(2,shangxian);
//                                        shangxian=At24c02Read(2);}
//                                        else if(Ds--){
//                                                shangxian=shangxian-Ds;
//                                                At24c02Write(3,shangxian);
//                                        shangxian=At24c02Read(3);}
//                                        }
//                        else if(set_st==2)//轉到下限設置
//                                {
//                                        if(As--){
//                                                xiaxian=xiaxian+As;
//                                                At24c02Write(4,xiaxian);
//                                        xiaxian=At24c02Read(4);}
//                                        else if(Ds--){
//                                                xiaxian=xiaxian-Ds;
//                                                At24c02Write(5,xiaxian);
//                                        xiaxian=At24c02Read(5);}
//                                        }
//                        }
//}

而As的外部中斷函數:
void Xint0 () interrupt 0//外部中斷0------
{
        EX0=0;
        if(ADD==0&&set_st==1){//進入上限第二個按鍵按下,增大上限值
        do{
                display_anjian(shangxian,set_st);
        }
                while(ADD==0);//設置范圍
        As++;
        shangxian=shangxian+1;
        if(shangxian>99)
                shangxian=99;}
        else if(ADD==0&&set_st==2)//進入下限第二個按鍵按下,增大下限值
        {
                do{
                        display_anjian(xiaxian,set_st);
                }
                        while(ADD==0);//設置范圍
                xiaxian=xiaxian+1;
                if(xiaxian>shangxian)
                        xiaxian=shangxian;
        }

望解答,急用。。。!


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

使用道具 舉報

沙發
ID:190832 發表于 2023-6-28 21:31 | 只看該作者
你學雜了吧,18b20和I2C是一塊用的嗎?
回復

使用道具 舉報

板凳
ID:1084388 發表于 2023-6-28 21:54 | 只看該作者
hange_v 發表于 2023-6-28 21:31
你學雜了吧,18b20和I2C是一塊用的嗎?

DS18B20單線肯定不能用啊,只不過我問的是存儲的是閘值跟AC24C02的交換,就相當于數碼管或者LCD(或者說是I/O口)與AC24C02的調用。我再說明白一點就是,怎么把改變的上下限存到AC24C02,又怎么取出來。
回復

使用道具 舉報

地板
ID:213173 發表于 2023-6-29 07:18 | 只看該作者
單純就DS18B20溫度上下限報警功能而言,不需要用24c02保存報警閾值。DS18B20 內部含有 EEPROM ,在系統掉電以后,它仍可保存分辨率及報警溫度的設定值。只是網上大多數示例程序沒有使用這一塊。
回復

使用道具 舉報

5#
ID:69038 發表于 2023-6-29 08:48 | 只看該作者
18B20與I2C,風馬牛不相及~~
回復

使用道具 舉報

6#
ID:1084388 發表于 2023-6-29 11:54 | 只看該作者
wulin 發表于 2023-6-29 07:18
單純就DS18B20溫度上下限報警功能而言,不需要用24c02保存報警閾值。DS18B20 內部含有 EEPROM ,在系統掉電 ...

大體思路是有了,謝謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久不卡 | 婷婷狠狠| 国产69精品久久久久777 | 亚洲精品黄色 | www.亚洲精品 | 色狠狠桃花综合 | 天堂一区二区三区 | 久久精品福利视频 | 精品av久久久久电影 | 国产午夜精品一区二区三区嫩草 | 日日夜夜影院 | 欧美日韩在线一区 | 久久三级影院 | 日日淫 | 成人免费共享视频 | 激情国产视频 | 久久亚洲国产精品日日av夜夜 | 91视频在线观看 | 美女天天干| aaa级片 | 69视频在线播放 | 亚洲精品视频一区二区三区 | 影音先锋久久 | 亚洲久久久 | 五月激情六月婷婷 | 午夜看片网站 | 福利视频网址 | caoporn视频在线 | av在线天堂网 | 国产日韩欧美精品一区二区三区 | 日韩精品一区二区三区免费观看 | 亚洲一级视频在线 | 99免费视频 | 免费观看色 | 久久久精选 | 一级做a爰片性色毛片视频停止 | 在线日韩欧美 | 91香蕉视频在线观看 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 欧美黄色性生活视频 | 中文字幕亚洲视频 |