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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1599|回復: 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;
        }

望解答,急用!!!!!


回復

使用道具 舉報

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 ,在系統掉電以后,它仍可保存分辨率及報警溫度的設定值。只是網上大多數示例程序沒有使用這一塊。
回復

使用道具 舉報

ID:69038 發表于 2023-6-29 08:48 | 顯示全部樓層
18B20與I2C,風馬牛不相及~~
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一区三区 | 最近中文字幕在线视频1 | 国产成人福利在线观看 | 久久国产精品亚洲 | 成人免费观看男女羞羞视频 | 亚洲一区二区在线播放 | 九九色综合 | 综合久久色 | 91精品国产91久久久久久最新 | 久久久欧洲 | 作爱视频免费看 | 中文字幕99 | 国产高清毛片 | 精品电影 | 99久久久久国产精品免费 | 午夜伦理影院 | 亚洲视频在线观看一区二区三区 | 中文字幕在线观看国产 | 日韩精品久久久久久 | 中文字幕一区二区三区乱码图片 | 精品一二区 | 国产免费xxx | h视频在线免费看 | 性欧美xxxx | 久久精品国产免费看久久精品 | 亚洲国产欧美国产综合一区 | 欧美激情va永久在线播放 | 亚洲成人av在线播放 | 亚洲视频在线看 | 自拍偷拍中文字幕 | 亚洲精品无 | 午夜免费网站 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 精品久久久久久中文字幕 | 亚洲日本视频 | 在线观看亚洲欧美 | 美女久久视频 | 精品乱子伦一区二区三区 | 本道综合精品 | 精品国产乱码久久久久久图片 | 成人精品视频 |