致远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;
}
作者:九宫真人