betway88必威体育
电子产品世界 » 论坛首页 » 企业专区 » TI » 【MSP焕新大作战】课程1+任务3

共2条 1/1 1 跳转至

【MSP焕新大作战】课程1+任务3

菜鸟
2024-06-25 14:45:38     打赏

任务描述:实现温度报警器

 实验目的:

- 掌握DS18B20温度传感器的使用方法

- 掌握HC595模块的使用方法

- 掌握蜂鸣器模块的使用方法

DS18B20延时



命令

接线图:

外设引脚
蜂鸣器(buzzer)I/O=PA4
HC595

DIO ==> PA27

SCLK==>PA26

RCLK ==> PA13

DS18B20DQ ==> PA1

systools 配置

1719297420308.png

DS18B20初始化配置,读取

//DS18B20 DQ 相关定义
#define SET_DQ_OUT() do{\
    DL_GPIO_initDigitalOutput(DQ_PORT_DQ_IOMUX);\
    DL_GPIO_enableOutput(DQ_PORT_PORT, DQ_PORT_DQ_PIN);   \
} while(0)
#define SET_DQ_IN() do{\
    DL_GPIO_disableOutput(DQ_PORT_PORT, DQ_PORT_DQ_PIN); \
    DL_GPIO_initDigitalInput(DQ_PORT_DQ_IOMUX);          \
} while(0)
  
#define DQ(x) (x) ? (DL_GPIO_setPins(DQ_PORT_PORT, DQ_PORT_DQ_PIN)) : (DL_GPIO_clearPins(DQ_PORT_PORT, DQ_PORT_DQ_PIN))

#define GET_DQ() DL_GPIO_readPins(DQ_PORT_PORT, DQ_PORT_DQ_PIN)

unsigned char tempL = 0; // 设全局变量
unsigned char tempH = 0;
unsigned int sdata;		// 测量到的温度的整数部分
unsigned char xiaoshu1; // 小数第一位
unsigned char xiaoshu2; // 小数第二位
unsigned char xiaoshu;
//相关延时函数
void delay(uint32_t us)
{
    delay_cycles(32*us);  //delay 1us
}

void delay1ms(uint32_t ms)
{
    delay(1000*ms);
}
void Init_DS18B20(void)
{
	unsigned char x = 0;
    SET_DQ_OUT();
	DQ(1);	   // DQ先置高
	delay(8*8);  // 稍延时
	DQ(0);	   // 发送复位脉冲
	delay(490); // 延时(>480us)
	DQ(1);	   // 拉高数据线
	delay(60);  // 等待(15~60us)
    SET_DQ_IN();
	x=GET_DQ();	   // 用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
    
	delay(160);
}

/**********读一个字节************/

uint8_t ReadOneChar(void) // 主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
	unsigned char i = 0; // 每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
	unsigned char dat = 0;

	for (i = 8; i > 0; i--) // 一个字节有8位
	{
        SET_DQ_OUT();
		DQ(1);
		delay(8);
		DQ(0);
		dat >>= 1;
		DQ(1);
        SET_DQ_IN();
       if( GET_DQ())
	       dat |= 0x80;
		delay(32);
	}
	return (dat);
}

/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    SET_DQ_OUT();
    DQ(0);
    DQ(dat&0x01);  //与1按位与运算,dat最低位为1时DQ总线为1,dat最低位为0时DQ总线为0
	delay(42);
    DQ(1);
    dat>>=1;
  }
  delay(33);
}

// 读温度值(低位放tempL;高位放tempH;)
uint8_t fg;
void ReadTemperature(void)
{
	Init_DS18B20();		   // 初始化
	WriteOneChar(0xcc);	   // 跳过读序列号的操作
	WriteOneChar(0x44);	   // 启动温度转换
	delay(800);			   // 转换需要一点时间,延时
	Init_DS18B20();		   // 初始化
	WriteOneChar(0xcc);	   // 跳过读序列号的操作
	WriteOneChar(0xbe);	   // 读温度寄存器(头两个值分别为温度的低位和高位)
	tempL = ReadOneChar(); // 读出温度的低位LSB
	tempH = ReadOneChar(); // 读出温度的高位MSB

    if (tempH > 0x7f) // 最高位为1时温度是负
    {
        tempL = ~tempL; // 补码转换,取反加一
        tempH = ~tempH + 1;
        fg = 0; // 读取温度为负时fg=0
    }
    sdata = tempL / 16 + tempH * 16;		   // 整数部分

	xiaoshu1 = (tempL & 0x0f) * 10 / 16;	   // 小数第一位
	xiaoshu2 = (tempL & 0x0f) * 100 / 16 % 10; // 小数第二位
	xiaoshu = xiaoshu1 * 10 + xiaoshu2;		   // 小数两位

}

实际测试结果

问题:1) HC595的显示 ,有明有暗 这个待解决(把读取函数放到定时器中断回调函数里可以解决一下 ,但还是不太亮)

        2) 借用串口打印数据 ,使用printf函数过程中选择Use Micro LIB

        打印不了浮点数(程序hardware default)

      




高工
2024-06-30 05:47:31     打赏
2楼

感谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]