致远ZAM6228测温模组ARM单片机驱动程序下载

//STM32–2024-4-16,致远8路测温模组搞定,8路24个参数都读出来了,OLED显示第8路
 

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "AD.h"
#include "Serial.h"
#include "MyI2C.h"
#include "Delay.h"
uint16_t ADValue;//ADC参数,12位精度0-4095
uint8_t RxData;
uint8_t MyArray[]={0x11,0x12,0x13,0x14,0x15,0x1A,0x1B};//定义串口发送数组

uint8_t Temperature_array1[24];//1号测温模组,IIC读取8路参数16进制参数

void led_init(void)//C口设为输出
{   
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能GPIOC时钟
    GPIO_InitTypeDef GPIO_InitStruct;                    //定义初始化结构体
    GPIO_InitStruct.GPIO_Mode    = GPIO_Mode_Out_PP;     //配置模式
    GPIO_InitStruct.GPIO_Pin     = GPIO_Pin_13;           //配置哪个IO口
    GPIO_InitStruct.GPIO_Speed   = GPIO_Speed_50MHz;     //配置IO口速度,仅输出有效
    GPIO_Init(GPIOC,&GPIO_InitStruct);                   //初始化GPIOC的参数为以上结构体
}
//————————————————————————-
void Key_Init(void)//B1口设为输入
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//B1口做输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//———————————————————————-
//毫秒级的延时,实测参数1000约1秒,晶振8M
void delay_ms(u16 time)
{    
   u16 i=0;  
   while(time–)
   {
      i=12000;  //自己定义
      while(i–) ;    
   }
}
//———————————————————————–
//-IIC读取致远8路温控模组温度参数
uint8_t read_PT100_8CH_date(uint8_t RegAddress)
{
    MyI2C_Start();//拉低SDA,形成起始波形
    MyI2C_SendByte(0x90);//先发1号测温模组地址,
                         //实战时有两个8通道模组,另一个 下面单独再弄个读取函数
    MyI2C_ReceiveAck();//等待测温模组返回的ACK应答信号
    
    MyI2C_Start();//2次拉低SDA,形成起始波形
    MyI2C_SendByte(0x90 |0x01);//开始发读取指令给测温模组,0x90最后一位置1,表示读
    MyI2C_ReceiveAck();//等待测温模组返回的ACK应答信号
    MyI2C_ReceiveByte();//接收模组返回来的数据
    
}

//—————————————————————————
int main(void)
{
    led_init();    //调用LED初始化函数,输出
    Key_Init();//调用B1初始化函数,设为输入
    OLED_Init();
    AD_Init();
    Serial_Init();
    MyI2C_Init();
    
    //OLED_ShowChar(1,1,'A');//屏第一行显示A
    //OLED_ShowString(2,1,"HALOword");//第二行显示字符串
    //OLED_ShowNum(3,1,12345,5);//显示无符号整数
    //OLED_ShowSignedNum(4,1,-965,3);//显示有符号数,前面会有负号
    //OLED_ShowHexNum(2,1,0xaa55,4);//显示16进制数
    //OLED_ShowBinNum(3,1,0xaa55,16);//显示2进制数 TTxData
START0:  __NOP;
        Delay_ms(300);
    MyI2C_Start();//拉低SDA,形成起始波形
    MyI2C_SendByte(0x90);//先发1号测温模组地址,
                         //实战时有两个8通道模组,另一个 下面单独再弄个读取函数
    MyI2C_ReceiveAck();//等待测温模组返回的ACK应答信号
    
    MyI2C_SendByte(0X00);//发读取数据寄存器的首地址,测温模组从0开始
    MyI2C_ReceiveAck();//等待测温模组返回的ACK应答信号
//—-上面完成从机地址和寄存器首地址发送
     
     
     
     MyI2C_Start();//2次拉低SDA,形成起始波形
     MyI2C_SendByte(0x90 | 0x01);//发读取指令,最后一位是1代表读,=0代表写
     MyI2C_ReceiveAck();//等待测温模组返回的ACK应答信号
    
        uint8_t i2;
       for (i2 = 0; i2 <24; i2 ++)//连续读出0-23个参数,共8通道温度值
    { 
      Temperature_array1[i2]=MyI2C_ReceiveByte();//接收模组返回来的数据,存入测试寄存器TTxdata
        MyI2C_SendAck(0);//主机给模组反馈ACK=1是不发了,=0是继续发 
    }     
      
      MyI2C_SendAck(1);//主机给模组反馈ACK=1是不发了,=0是继续发
      MyI2C_Stop();//给测温模组发停止信号,这里测试,先发一个试试看
        
    OLED_ShowHexNum(2,1,Temperature_array1[21],2);//显示模组返回来的数,应该是830000
    OLED_ShowHexNum(2,4,Temperature_array1[22],2);//
    OLED_ShowHexNum(2,7,Temperature_array1[23],2);//    
    
    

   
    ADValue = AD_GetValue();//ADC启动转换,获取参数
    OLED_ShowNum(3,1,ADValue,4);//显示ADC参数
    
    
    
    
    if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
    {
      GPIO_ResetBits(GPIOC,GPIO_Pin_13);    //B1口电平拉低,点亮LED
      
    }
      
    if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 1)
    {
       GPIO_SetBits(GPIOC,GPIO_Pin_13);         //B1口电平拉高,灭LED
       
    }
    
     if (Serial_GetRxFlag() == 1)
        {
            
            Serial_SendString("HALOWORD");
            
        }    
      
    
    goto START0;
        

}


作者:九宫真人

物联沃分享整理
物联沃-IOTWORD物联网 » 致远ZAM6228测温模组ARM单片机驱动程序下载

发表回复