TMP101 用STM32模拟I2C的方式调通 附上代码

宏定义

#ifndef __GPIO_H__
#define __GPIO_H__
#include "stm32f10x.h"

//*****************************************************************
//i9320
#define LCD_CS_H()            GPIO_SetBits(GPIOE,GPIO_Pin_2)                //片选
#define LCD_CS_L()           GPIO_ResetBits(GPIOE,GPIO_Pin_2)

#define LCD_RS_H()            GPIO_SetBits(GPIOE,GPIO_Pin_0)            //数据/命令切换
#define LCD_RS_L()            GPIO_ResetBits(GPIOE,GPIO_Pin_0)

#define LCD_WR_H()            GPIO_SetBits(GPIOE,GPIO_Pin_1)              //写控制
#define LCD_WR_L()             GPIO_ResetBits(GPIOE,GPIO_Pin_1)

#define LCD_RD_H()            GPIO_SetBits(GPIOE,GPIO_Pin_4)              //读控制
#define LCD_RD_L()            GPIO_ResetBits(GPIOE,GPIO_Pin_4)

#define LCD_RST_H()    GPIO_SetBits(GPIOE,GPIO_Pin_3)                          //复位
#define LCD_RST_L()     GPIO_ResetBits(GPIOE,GPIO_Pin_3)

//**********************************************************************

#define  TMP101_SCL_H()    GPIO_SetBits(GPIOA,GPIO_Pin_0)
#define  TMP101_SCL_L()    GPIO_ResetBits(GPIOA,GPIO_Pin_0)

#define  TMP101_SDA_H()    GPIO_SetBits(GPIOA,GPIO_Pin_1)
#define  TMP101_SDA_L()    GPIO_ResetBits(GPIOA,GPIO_Pin_1)

//**********************************************************************
void GPIO_Config(void);
void GPIO_In_FLOATING_Mode(void);
//void GPIO_Out_PP_Mode(void);
//void GPIO_OutPP_Mode(void);
//void GPIO_Out_OD_Mode(void);
#endif

子函数模块

#include<gpio.h>
#include<delay.h>
void start(void)
{
   //  GPIO_Out_PP_Mode();
     TMP101_SCL_H();
   TMP101_SDA_H();
  delay1us(2);
  TMP101_SDA_L();
  delay1us(2);
  TMP101_SCL_L(); 
}

void master_ack(void)  //yes
{
    TMP101_SDA_L();
 delay1us(3);
 TMP101_SCL_H();
 delay1us(3);
 TMP101_SCL_L();
 delay1us(3);
         
}


void stop(void)
{
     TMP101_SDA_L();
  delay1us(3);
     TMP101_SCL_H();
  delay1us(2);
  TMP101_SDA_H();

}

bool answer(void)

     u8 i=30;
     TMP101_SDA_H();
     delay1us(3);
  TMP101_SCL_H();
  delay1us(2);
     while(i--)
  {
         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)
       {
        TMP101_SCL_L();
     return TRUE;
    }

  }
 TMP101_SCL_L();
 return FALSE;
  
       

}

void write_onebyte(u8 data)
{
    u8 i,j;
 u8 temp=0x80;
 for(i=0;i<8;i++)
   {   
        j=data&temp;
     if(j==0)
         TMP101_SDA_L();
      else
      TMP101_SDA_H();
     delay1us(2);
     TMP101_SCL_H();
     delay1us(2);
     TMP101_SCL_L();
      delay1us(1);
     temp=temp>>1;
   }
    //if(answer())
     // return TRUE;
 //else
  //return FALSE;
  
 
}


u8 read_data(void)
{
    u8 i,temp;
    TMP101_SDA_H();
 delay1us(1);
 for(i=0;i<8;i++)
 {
      temp=temp<<1;
   TMP101_SCL_L();
   delay1us(3);
   TMP101_SCL_H();
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1))
       {
         temp=temp | 0x01;
      delay1us(2);
    }
      else
         delay1us(2); 
 }
 TMP101_SCL_L();
 return temp;         
}


 //*********************************************
 /*自己写的
u8 read_data(void)
{
    u8 i,j;
    u16 temp=0x0001;
 u16 temp1=0x0001;
   // GPIO_IPU_Mode();
 
 for(i=0;i<8;i++)
 {
     TMP101_SCL_H();
  delay1us(10);
     if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1)
         temp=temp|0x01;
     else
        temp=temp&0x01;
  delay1us(10);
   
  TMP101_SCL_L();
  temp=temp<<1;
  delay1us(10); 
 }
 answer();
 //TMP101_SCL_H();
 delay1us(10);
 for(j=0;j<8;j++)
 {
     TMP101_SCL_H();
  delay1us(10);
  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1)
         temp1=temp1|0x01;
     else
        temp1=temp1&0x01;
  
  TMP101_SCL_L();
   delay1us(10);
  temp1=temp1<<1; 
 }
 return (temp<<7)|(temp1>>1) ;
}

 */  
 //*****************************************************************


/*
void rst_to_write(u8 s_addr)     //0x92
{
    start(void);
 write_onebyte(0x92);
 answer(void);
 write_onebyte(0x01);
  

 */

u8 read_temperature()
{
    bool a,b,c;
    u8 temp,temp1,temp2;
    start();
 write_onebyte(0x92);
 a=answer();
 write_onebyte(0x00);
 b=answer();
 delay1us(3);
    start();
 write_onebyte(0x93);
 c=answer();
 temp=read_data();
 master_ack();
 temp1=read_data();
 master_ack();
 stop();
 //temp2=((temp<<8)|temp1);
 return temp; //取第一个寄存器中的值
}

引脚配置

#include "gpio.h" 

//*******************************************************************************
//  pins are used by 9320

void GPIO_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE);
   
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOD, &GPIO_InitStructure);
       
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOE, &GPIO_InitStructure);

 //void GPIO_Out_PP_Mode(void)  //output mode
//{

 // GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
//}                 

//void GPIO_Out_OD_Mode(void)  //input mode
//{
   // GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
//}
 
}

延时子程序

void delay1us(u16 time)      //1us,还是比较精确地
{
    u16 j;
 while(time--)
 {
       for(j=9;j>0;j--);
  }

}

主函数

#include<stm32f10x.h>
#include <string.h>
#include"i9320.h"
#include"delay.h"
#include"gpio.h"
#include"tmp101.h"
u8 temperature=0;
//u8 temperature1=0;
u8 num[]={'0','1','2','3','4','5','6','7','8','9'};


int main()

    SystemInit();
 delay_init(72);
  
 GPIO_Config();
 //GPIO_DQ_Out_Mode();
   /* while(1)
 {
   DQ_L();
  delay_us(5);
  DQ_H();
  delay_us(2);
 }   */
 LCD_Init();
 LCD_SetWindowToFullScreen();
 LCD_ClearScreen(0xffff);
 //LCD_test();
 //LCD_SetXY(0,0);
 //LCD_SetWindow(0,0,240,40);
 //LCD_ClearScreen(0xf800);
 //LCD_DrawPicture(0,0,image,37, 50);
 
 //paint_part(0,0,240,16,0xf800);
    //paint_part(0,304,240,320,0xf800);
 //LCD_SetWindow(0,51,240,269);
 //LCD_SetPoint(10,90,0x0000);
// LCD_StringLine(3,160,240,160,0x0000);
// LCD_StringLine(3,30,3,290,0x0000);

 //LCD_CharDisp(220,165,0xf800,0xffff,'x');
 //LCD_CharDisp(8,35,0xf800,0xffff,'y');
   // LCD_CharDisp(8,165,0xf800,0xffff,'0');
 //LCD_StrDisp(20,90,0xf800,0xffff,"china union" );


 PutGB1616(60, 90, "现", 0xf800,0xffff);
 PutGB1616(76, 90, "在", 0xf800,0xffff);
 PutGB1616(92, 90, "温", 0xf800,0xffff);
 PutGB1616(108, 90, "度", 0xf800,0xffff);
 LCD_CharDisp(180,83,0xf800,0xffff,'o');

 LCD_CharDisp(188,90,0xf800,0xffff,'C');
 
 while(1)
 {
     temperature=read_temperature();
  LCD_CharDisp(120,90,0xf800,0xffff,num[temperature/100]);
  LCD_CharDisp(140,90,0xf800,0xffff,num[(temperature%100)/10]);
  LCD_CharDisp(160,90,0xf800,0xffff,num[temperature%10]);
  delay1us(2000);
 } 
 
 
}

原文地址:https://www.cnblogs.com/huazhongwang/p/2745362.html