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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5267|回復: 3
收起左側

STM32F103c8t6+AHT10+OLED源程序

  [復制鏈接]
ID:230600 發(fā)表于 2020-3-23 22:51 | 顯示全部樓層 |閱讀模式
51hei圖片20200323223507.png 這是c8t6的原理圖
核心板.png

從核心板我們可以看到 c8t6有兩個IIC接口 所以我們可以使用這兩個IIC接口共同使用AHT10和OLED屏
AHT10的核心代碼
下面是aht10.c
從.c文件里的IIC_Init函數 并且結合我們的核心板原理圖我們可以看出 我們使用的是I2C_1
引腳連接PB6 —SCL  PB7—SDA
#include "bsp_i2c.h"
#include "delay.h"

uint8_t   ack_status=0;
uint8_t   readByte[6];
uint8_t   aht10_status=0;

uint32_t  H1=0;  //Humility
uint32_t  T1=0;  //Temperature

uint8_t  AHT10_OutData[4];
uint8_t  AHT10sendOutData[10] = {0xFA, 0x06, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF};

void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        
           
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽輸出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        IIC_SCL=1;
        IIC_SDA=1;

}
//產生IIC起始信號
void IIC_Start(void)
{
        SDA_OUT();     //sda線輸出
        IIC_SDA=1;                    
        IIC_SCL=1;
        delay_us(4);
         IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        IIC_SCL=0;//鉗住I2C總線,準備發(fā)送或接收數據
}         
//產生IIC停止信號
void IIC_Stop(void)
{
        SDA_OUT();//sda線輸出
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
         delay_us(4);
        IIC_SCL=1;
        IIC_SDA=1;//發(fā)送I2C總線結束信號
        delay_us(4);                                                                  
}
//等待應答信號到來
//返回值:1,接收應答失敗
//        0,接收應答成功
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //SDA設置為輸入  
        IIC_SDA=1;delay_us(1);           
        IIC_SCL=1;delay_us(1);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;//時鐘輸出0            
        return 0;  
}
//產生ACK應答
void IIC_Ack(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=0;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}
//不產生ACK應答                    
void IIC_NAck(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=1;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}                                                                              
//IIC發(fā)送一個字節(jié)
//返回從機有無應答
//1,有應答
//0,無應答                          
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
                SDA_OUT();            
    IIC_SCL=0;//拉低時鐘開始數據傳輸
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;           
                delay_us(2);   //對TEA5767這三個延時都是必須的
                IIC_SCL=1;
                delay_us(2);
                IIC_SCL=0;        
                delay_us(2);
    }         
}            
//讀1個字節(jié),ack=1時,發(fā)送ACK,ack=0,發(fā)送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();//SDA設置為輸入
  for(i=0;i<8;i++ )
        {
    IIC_SCL=0;
    delay_us(2);
                IIC_SCL=1;
    receive<<=1;
    if(READ_SDA)receive++;   
                delay_us(1);
  }                                         
        if (!ack)
                        IIC_NAck();//發(fā)送nACK
        else
                        IIC_Ack(); //發(fā)送ACK   
        return receive;
}

void IIC_WriteByte(uint16_t addr,uint8_t data,uint8_t device_addr)
{
        IIC_Start();  
        
        if(device_addr==0xA0) //eeprom地址大于1字節(jié)
                IIC_Send_Byte(0xA0 + ((addr/256)<<1));//發(fā)送高地址
        else
                IIC_Send_Byte(device_addr);            //發(fā)器件地址
        IIC_Wait_Ack();
        IIC_Send_Byte(addr&0xFF);   //發(fā)送低地址
        IIC_Wait_Ack();
        IIC_Send_Byte(data);     //發(fā)送字節(jié)                                                           
        IIC_Wait_Ack();                                 
  IIC_Stop();//產生一個停止條件
        if(device_addr==0xA0) //
                delay_ms(10);
        else
                delay_us(2);
}

uint16_t IIC_ReadByte(uint16_t addr,uint8_t device_addr,uint8_t ByteNumToRead)  //讀寄存器或讀數據
{        
                uint16_t data;
                IIC_Start();  
                if(device_addr==0xA0)
                        IIC_Send_Byte(0xA0 + ((addr/256)<<1));
                else
                        IIC_Send_Byte(device_addr);        
                IIC_Wait_Ack();
                IIC_Send_Byte(addr&0xFF);   //發(fā)送低地址
                IIC_Wait_Ack();

                IIC_Start();         
                IIC_Send_Byte(device_addr+1);            //發(fā)器件地址
                IIC_Wait_Ack();
                if(ByteNumToRead == 1)//LM75溫度數據為11bit
                {
                        data=IIC_Read_Byte(0);
                }
                else
                        {
                                data=IIC_Read_Byte(1);
                                data=(data<<8)+IIC_Read_Byte(0);
                        }
                IIC_Stop();//產生一個停止條件            
                return data;
}


/**********
*上面部分為IO口模塊I2C配置
*
*從這以下開始為AHT10的配置I2C
*函數名有IIC和I2C的區(qū)別,請注意!!!!!
*
*2020/2/23最后修改日期
*
***********/
void  read_AHT10_once(void)
{
        delay_ms(10);

        reset_AHT10();
        delay_ms(10);

        init_AHT10();
        delay_ms(10);

        startMeasure_AHT10();
        delay_ms(80);

        read_AHT10();
        delay_ms(5);
}


void  reset_AHT10(void)
{

        I2C_Start();

        I2C_WriteByte(0x70);
        ack_status = Receive_ACK();
        if(ack_status) printf("1");
        else printf("1-n-");
        I2C_WriteByte(0xBA);
        ack_status = Receive_ACK();
                if(ack_status) printf("2");
        else printf("2-n-");
        I2C_Stop();

        /*
        AHT10_OutData[0] = 0;
        AHT10_OutData[1] = 0;
        AHT10_OutData[2] = 0;
        AHT10_OutData[3] = 0;
        */
}



void  init_AHT10(void)
{
        I2C_Start();

        I2C_WriteByte(0x70);
        ack_status = Receive_ACK();
        if(ack_status) printf("3");
        else printf("3-n-");        
        I2C_WriteByte(0xE1);
        ack_status = Receive_ACK();
        if(ack_status) printf("4");
        else printf("4-n-");
        I2C_WriteByte(0x08);
        ack_status = Receive_ACK();
        if(ack_status) printf("5");
        else printf("5-n-");
        I2C_WriteByte(0x00);
        ack_status = Receive_ACK();
        if(ack_status) printf("6");
        else printf("6-n-");
        I2C_Stop();
}



void  startMeasure_AHT10(void)
{
        //------------
        I2C_Start();

        I2C_WriteByte(0x70);
        ack_status = Receive_ACK();
        if(ack_status) printf("7");
        else printf("7-n-");
        I2C_WriteByte(0xAC);
        ack_status = Receive_ACK();
        if(ack_status) printf("8");
        else printf("8-n-");
        I2C_WriteByte(0x33);
        ack_status = Receive_ACK();
        if(ack_status) printf("9");
        else printf("9-n-");
        I2C_WriteByte(0x00);
        ack_status = Receive_ACK();
        if(ack_status) printf("10");
        else printf("10-n-");
        I2C_Stop();
}



void read_AHT10(void)
{
        uint8_t   i;

        for(i=0; i<6; i++)
        {
                readByte[ i]=0;
        }

        //-------------
        I2C_Start();

        I2C_WriteByte(0x71);
        ack_status = Receive_ACK();
        if(ack_status) printf("11");
        else printf("11-n-");
        readByte[0]= I2C_ReadByte();
        printf("test0:%d",readByte[0]);
        Send_ACK();

        readByte[1]= I2C_ReadByte();
        printf("test1:%d",readByte[1]);
        Send_ACK();

        readByte[2]= I2C_ReadByte();
        printf("test2:%d",readByte[2]);
        Send_ACK();

        readByte[3]= I2C_ReadByte();
        printf("test3:%d",readByte[3]);
        Send_ACK();

        readByte[4]= I2C_ReadByte();
        printf("test4:%d",readByte[4]);
        Send_ACK();

        readByte[5]= I2C_ReadByte();
        printf("test5:%d",readByte[5]);
        SendNot_Ack();
        //Send_ACK();

        I2C_Stop();

        //--------------
        if( (readByte[0] & 0x68) == 0x08 )
        {
                H1 = readByte[1];
                H1 = (H1<<8) | readByte[2];
                H1 = (H1<<8) | readByte[3];
                H1 = H1>>4;

                H1 = (H1*1000)/1024/1024;

                T1 = readByte[3];
                T1 = T1 & 0x0000000F;
                T1 = (T1<<8) | readByte[4];
                T1 = (T1<<8) | readByte[5];

                T1 = (T1*2000)/1024/1024 - 500;

                AHT10_OutData[0] = (H1>>8) & 0x000000FF;
                AHT10_OutData[1] = H1 & 0x000000FF;

                AHT10_OutData[2] = (T1>>8) & 0x000000FF;
                AHT10_OutData[3] = T1 & 0x000000FF;
                printf("成功了");
        }
        else
        {
                AHT10_OutData[0] = 0xFF;
                AHT10_OutData[1] = 0xFF;

                AHT10_OutData[2] = 0xFF;
                AHT10_OutData[3] = 0xFF;
                printf("失敗了");

        }
        printf("\r\n");
        printf("溫度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
        printf("濕度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
        printf("\r\n");
}




uint8_t  Receive_ACK(void)
{
        uint8_t result=0;
        uint8_t cnt=0;

        IIC_SCL = 0;
        SDA_IN();
        delay_us(4);

        IIC_SCL = 1;
        delay_us(4);

        while(READ_SDA && (cnt<100))
        {
                cnt++;
        }

        IIC_SCL = 0;
        delay_us(4);

        if(cnt<100)
        {
                result=1;
        }
        return result;
}



void  Send_ACK(void)
{
        SDA_OUT();
        IIC_SCL = 0;
        delay_us(4);

        IIC_SDA = 0;
        delay_us(4);

        IIC_SCL = 1;
        delay_us(4);
        IIC_SCL = 0;
        delay_us(4);

        SDA_IN();
}



void  SendNot_Ack(void)
{
        SDA_OUT();
        IIC_SCL = 0;
        delay_us(4);

        IIC_SDA = 1;
        delay_us(4);

        IIC_SCL = 1;
        delay_us(4);

        IIC_SCL = 0;
        delay_us(4);

        IIC_SDA = 0;
        delay_us(4);
}


void I2C_WriteByte(uint8_t  input)
{
        uint8_t  i;
        SDA_OUT();
        for(i=0; i<8; i++)
        {
                IIC_SCL = 0;
                delay_ms(5);

                if(input & 0x80)
                {
                        IIC_SDA = 1;
                        //delaymm(10);
                }
                else
                {
                        IIC_SDA = 0;
                        //delaymm(10);
                }

                IIC_SCL = 1;
                delay_ms(5);

                input = (input<<1);
        }

        IIC_SCL = 0;
        delay_us(4);

        SDA_IN();
        delay_us(4);
}        


uint8_t I2C_ReadByte(void)
{
        uint8_t  resultByte=0;
        uint8_t  i=0, a=0;

        IIC_SCL = 0;
        SDA_IN();
        delay_ms(4);

        for(i=0; i<8; i++)
        {
                IIC_SCL = 1;
                delay_ms(3);

                a=0;
                if(READ_SDA)
                {
                        a=1;
                }
                else
                {
                        a=0;
                }

                //resultByte = resultByte | a;
                resultByte = (resultByte << 1) | a;

                IIC_SCL = 0;
                delay_ms(3);
        }

        SDA_IN();
        delay_ms(10);

        return   resultByte;
}


void  set_AHT10sendOutData(void)
{
        /* --------------------------
         * 0xFA 0x06 0x0A temperature(2 Bytes) humility(2Bytes) short Address(2 Bytes)
         * And Check (1 byte)
         * -------------------------*/
        AHT10sendOutData[3] = AHT10_OutData[0];
        AHT10sendOutData[4] = AHT10_OutData[1];
        AHT10sendOutData[5] = AHT10_OutData[2];
        AHT10sendOutData[6] = AHT10_OutData[3];

//        AHT10sendOutData[7] = (drf1609.shortAddress >> 8) & 0x00FF;
//        AHT10sendOutData[8] = drf1609.shortAddress  & 0x00FF;

//        AHT10sendOutData[9] = getXY(AHT10sendOutData,10);
}


void  I2C_Start(void)
{
        SDA_OUT();
        IIC_SCL = 1;
        delay_ms(4);

        IIC_SDA = 1;
        delay_ms(4);
        IIC_SDA = 0;
        delay_ms(4);

        IIC_SCL = 0;
        delay_ms(4);
}



void  I2C_Stop(void)
{
        SDA_OUT();
        IIC_SDA = 0;
        delay_ms(4);

        IIC_SCL = 1;
        delay_ms(4);

        IIC_SDA = 1;
        delay_ms(4);
}




下面是aht10.h
#ifndef __BSP_I2C_H
#define __BSP_I2C_H

#include "sys.h"
#include "delay.h"
#include "usart.h"
//使用IIC1 掛載M24C02,OLED,LM75AD,HT1382    PB6,PB7

#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

//IO操作函數         
#define IIC_SCL    PBout(6) //SCL
#define IIC_SDA    PBout(7) //SDA         
#define READ_SDA   PBin(7)  //輸入SDA


//IIC所有操作函數
void IIC_Init(void);                //初始化IIC的IO口                                 
void IIC_Start(void);                                //發(fā)送IIC開始信號
void IIC_Stop(void);                                  //發(fā)送IIC停止信號
void IIC_Send_Byte(u8 txd);                        //IIC發(fā)送一個字節(jié)
u8 IIC_Read_Byte(unsigned char ack);//IIC讀取一個字節(jié)
u8 IIC_Wait_Ack(void);                                 //IIC等待ACK信號
void IIC_Ack(void);                                        //IIC發(fā)送ACK信號
void IIC_NAck(void);                                //IIC不發(fā)送ACK信號

void IIC_WriteByte(uint16_t addr,uint8_t data,uint8_t device_addr);
uint16_t IIC_ReadByte(uint16_t addr,uint8_t device_addr,uint8_t ByteNumToRead);//寄存器地址,器件地址,要讀的字節(jié)數  


void  read_AHT10_once(void);
void  reset_AHT10(void);
void  init_AHT10(void);        
void  startMeasure_AHT10(void);
void  read_AHT10(void);
uint8_t  Receive_ACK(void);
void  Send_ACK(void);
void  SendNot_Ack(void);
void I2C_WriteByte(uint8_t  input);
uint8_t I2C_ReadByte(void);        
void  set_AHT10sendOutData(void);
void  I2C_Start(void);
void  I2C_Stop(void);
#endif


主要代碼我壓縮成文件了
OLED的引腳連接是
PB10-SCL
PB11-SDA
可以直接使用
全部資料51hei下載地址:
AHT10+OLED.7z (197.08 KB, 下載次數: 141)

評分

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

查看全部評分

回復

使用道具 舉報

ID:328334 發(fā)表于 2020-4-1 21:49 | 顯示全部樓層
請問你iic兩根線有沒有接上拉電阻
回復

使用道具 舉報

ID:660780 發(fā)表于 2020-4-10 12:25 | 顯示全部樓層
感謝分享。。。。。。
回復

使用道具 舉報

ID:59363 發(fā)表于 2020-9-1 09:25 | 顯示全部樓層
多謝分享,希望能成功讀出
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产乱码久久久久久一区二区 | 欧美一区二区三区国产 | 日韩视频精品在线 | 久久久精品亚洲 | 午夜免费福利电影 | 久久久九九 | 精品乱码一区二区三四区视频 | 涩涩视频网站在线观看 | 日日日干干干 | 欧美视频在线一区 | av影音| 欧美成人a| 久久久久99 | 久久亚洲经典 | 亚洲国产一区二区三区 | 91精品国产美女在线观看 | 日韩视频三区 | 午夜视频网站 | 亚洲人va欧美va人人爽 | 欧美极品在线播放 | 国产欧美精品一区二区色综合朱莉 | 国产高潮好爽受不了了夜色 | 91精品国产乱码久久久久久久久 | 国内自拍视频在线观看 | 操操日| 在线免费看91 | 在线国产精品一区 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 天天操人人干 | 久久综合九色综合欧美狠狠 | 美女视频三区 | 欧美日韩在线观看一区二区三区 | 亚洲欧美日韩国产综合 | 日本在线免费看最新的电影 | 91电影在线播放 | 日韩日韩日韩日韩日韩日韩日韩 | 午夜视频在线观看视频 | 日本精品国产 | 免费激情网站 | 欧美一级高潮片免费的 | 99热在线播放 |