zoukankan      html  css  js  c++  java
  • 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);
     } 
     
     
    }

  • 相关阅读:
    SQl 事物+视图+游标+索引+锁
    常用经典SQL语句大全完整版--详解+实例 《来自网络,很全没整理,寄存与此》
    SQL--存储过程+触发器 对比!
    SQL---触发器
    SQL (一)定义变量以及变量赋值
    Js 事件大全
    ASP.NET 常用内置对象详解-----Response
    母板页----路径问题
    构建低代码开发生态,APICloud全面进入3.0时代
    APICloud:云端服务开发的硬核要素
  • 原文地址:https://www.cnblogs.com/huazhongwang/p/2745362.html
Copyright © 2011-2022 走看看