这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » TI » 【MSP焕新大作战】课程3.1-蜂鸣器+按键++DS18B20

共3条 1/1 1 跳转至

【MSP焕新大作战】课程3.1-蜂鸣器+按键++DS18B20

高工
2024-05-16 21:39:13     打赏

蜂鸣器这里我直接连接PA6引脚,移植了安富莱的驱动程序,不再过多叙述,只是IO输出,跟LED灯同理按键,板子上的按键如下

两个按键分别在PA14和PA18,区别在S1带下拉,S2不带下拉,根据原理图,S1按下前PA18是低电平,按下后是高电平,S2没有上下拉电阻,按常规应该是要配置为上拉模式,所以按下前是高电平,按下后是低电平

按照原理图配置

PA18配置为输入不配置上下拉

PA14配置为上拉输入


#define GET_KEY()  DL_GPIO_readPins(GPIO_KEY_PORT, GPIO_KEY_S1_PIN|GPIO_KEY_S2_PIN)

key_in = GET_KEY();
if (key_in == 0X00044000) // S1
{
    key = 0x10;
}
else if (key_in == 0X00000000) // S2
{
    key = 0x20;
}
else if (key_in == 0X00040000) // S1&S2
{
    key = 0x30;
}

直接就可以读出按键状态

DS18B20,单总线的一个温度传感器,需要控制IO的输入输出,网上很容易找驱动,需要us级别的延迟

连接到PA1


#define DS18B20_DQ_OUTH DL_GPIO_setPins(GPIO_DQ_PORT, GPIO_DQ_PIN_4_PIN)
#define DS18B20_DQ_OUTL DL_GPIO_clearPins(GPIO_DQ_PORT, GPIO_DQ_PIN_4_PIN)
#define DS18B20_DQ_READ DL_GPIO_readPins(GPIO_DQ_PORT, GPIO_DQ_PIN_4_PIN)

#define DS18B20_DQ_IN DL_GPIO_initDigitalInput(GPIO_DQ_PIN_4_IOMUX);DL_GPIO_disableOutput(GPIO_DQ_PORT, GPIO_DQ_PIN_4_PIN)
#define DS18B20_DQ_OUT DL_GPIO_initDigitalOutput(GPIO_DQ_PIN_4_IOMUX);DL_GPIO_enableOutput(GPIO_DQ_PORT, GPIO_DQ_PIN_4_PIN)

// 复位DS18B20
void DS18B20_Rst(void)
{
  DS18B20_DQ_OUT;
  DS18B20_DQ_OUTL;        // 拉低DQ
  delay_cycles(750 * 32); // 拉低750us
  DS18B20_DQ_OUTH;        // DQ=1
  delay_cycles(15 * 32);  // 15US
}

// 等待DS18B20的回应
// 返回1:未检测到DS18B20的存在
// 返回0:存在
uint8_t DS18B20_Check(void)
{
  uint8_t retry = 0;
  DS18B20_DQ_IN;
  while (DS18B20_DQ_READ && retry < 200)
  {
    retry++;
    delay_cycles(1 * 32);
  };
  if (retry >= 200)
    return 1;
  else
    retry = 0;
  while (!DS18B20_DQ_READ && retry < 240)
  {
    retry++;
    delay_cycles(1 * 32);
  };
  if (retry >= 240)
    return 1;
  return 0;
}

// 从DS18B20读取一个位
// 返回值:1/0
uint8_t DS18B20_Read_Bit(void) // read one bit
{
  DS18B20_DQ_OUT;
  uint8_t data;
  DS18B20_DQ_OUTL;
  delay_cycles(2 * 32);
  DS18B20_DQ_OUTH;
  delay_cycles(12 * 32);
  DS18B20_DQ_IN;
  if (DS18B20_DQ_READ)
    data = 1;
  else
    data = 0;
  delay_cycles(50 * 32);
  return data;
}

// 从DS18B20读取一个字节
// 返回值:读到的数据
uint8_t DS18B20_Read_Byte(void) // read one byte
{
  uint8_t i, j, dat;
  dat = 0;
  for (i = 1; i <= 8; i++)
  {
    j = DS18B20_Read_Bit();
    dat = (j << 7) | (dat >> 1);
  }
  return dat;
}

// 写一个字节到DS18B20
//  dat:要写入的字节
void DS18B20_Write_Byte(uint8_t dat)
{
  uint8_t j;
  uint8_t testb;
  DS18B20_DQ_OUT;
  for (j = 1; j <= 8; j++)
  {
    testb = dat & 0x01;
    dat = dat >> 1;
    if (testb)
    {
      DS18B20_DQ_OUTL; // Write 1
      delay_cycles(2 * 32);
      DS18B20_DQ_OUTH;
      delay_cycles(60 * 32);
    }
    else
    {
      DS18B20_DQ_OUTL; // Write 0
      delay_cycles(60 * 32);
      DS18B20_DQ_OUTH;
      delay_cycles(2 * 32);
    }
  }
}

// 开始温度转换
void DS18B20_Start(void) // ds1820 start convert
{
  DS18B20_Rst();
  DS18B20_Check();
  DS18B20_Write_Byte(0xcc); // skip rom
  DS18B20_Write_Byte(0x44); // convert
}

// 初始化DS18B20的IO口 DQ 同时检测DS的存在
// 返回1:不存在
// 返回0:存在
uint8_t DS18B20_Init(void)
{
  DS18B20_Rst();
  return DS18B20_Check();
}

// 从ds18b20得到温度值
// 精度:0.1C
// 返回值:温度值 (-550~1250)
int16_t DS18B20_Get_Temp(void)
{
  uint8_t temp;
  uint8_t TL, TH;
  int16_t tem;
  DS18B20_Start(); // ds1820 start convert
  DS18B20_Rst();
  DS18B20_Check();
  DS18B20_Write_Byte(0xcc); // skip rom
  DS18B20_Write_Byte(0xbe); // convert
  TL = DS18B20_Read_Byte(); // LSB
  TH = DS18B20_Read_Byte(); // MSB

  if (TH > 7)
  {
    TH = ~TH;
    TL = ~TL;
    temp = 0; // 温度为负
  }
  else
    temp = 1; // 温度为正
  tem = TH;   // 获得高八位
  tem <<= 8;
  tem += TL;                // 获得底八位
  tem = (float)tem * 0.625; // 转换
  if (temp)
    return tem; // 返回温度值
  else
    return -tem;
}


所需基本驱动


专家
2024-05-17 06:44:16     打赏
2楼

学习一下


菜鸟
2024-06-06 14:13:19     打赏
3楼

文章不错,点个赞

代码运行流畅


共3条 1/1 1 跳转至

回复

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