查看: 3820|回复: 4

[经验] 小红板读取DS18B20温度+SysTick延时

[复制链接]

该用户从未签到

发表于 2016-1-27 16:20:24 | 显示全部楼层 |阅读模式
分享到:
本帖最后由 ningbian123 于 2016-1-27 16:40 编辑

寒假要玩电子设计竞赛,要用到温度监测,于是把去年玩AVR的时候买的18B20温度传感器翻了出来。按照当时的程序,对照着GD32的库函数修改了程序。
首先遇到的问题是GPIO口的模式问题。gpio的.h文件里是这样定义的:
typedef enum
{
    GPIO_MODE_AIN = 0x0,
    GPIO_MODE_IN_FLOATING = 0x04,
    GPIO_MODE_IPD = 0x28,
    GPIO_MODE_IPU = 0x48,
    GPIO_MODE_OUT_OD = 0x14,
    GPIO_MODE_OUT_PP = 0X10,
    GPIO_MODE_AF_OD = 0X1C,
    GPIO_MODE_AF_PP = 0X18
}GPIO_ModePara;
对于AVR来说只有输入和输出两个模式,对于GD32有这么多模式。输出使用的是OUT_PP推挽输出,肯定没错,但输入模式就有点奇怪了。18B20的信号线需要一个上拉电阻,一开始我用的是IPU模式,没有接外部的上拉电阻,然而并不能读出数据。后来改用OUT_OD模式加外部上拉电阻,而不切换输入输出模式,依然读不出数据。最后用了IN_FLOATING加外部上拉电阻才有了反应。

另外,参考了stm32的CUBE库,写了GD32使用SysTick定时器的一毫秒延时函数,SysTick每隔一毫秒产生一次中断。

uint32_t Tick;

void SysTickConfig(void)
{
        // 1ms
        if (SysTick_Config(SystemCoreClock / 1000))
        {
                while (1);
        }
        NVIC_SetPriority(SysTick_IRQn, 0x00);
}

void SysTick_Handler(void)
{
        Tick++;
}

uint32_t Sys_GetTick(void)
{
  return Tick;
}

void SysDelay(int Delay)
{
  int tickstart = 0;
  tickstart = Sys_GetTick();
  while((Sys_GetTick() - tickstart) < Delay)
  {
  }
}
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2016-1-27 16:44:06 | 显示全部楼层
本帖最后由 ningbian123 于 2016-1-27 16:49 编辑


回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2016-1-27 16:50:31 | 显示全部楼层
  1. #include "main.h"
  2. #include <stdio.h>

  3. uint32_t Tick;

  4. static void SysTickConfig(void)
  5. {
  6.         // 1ms
  7.         if (SysTick_Config(SystemCoreClock / 1000))
  8.         {
  9.                 while (1);
  10.         }
  11.         NVIC_SetPriority(SysTick_IRQn, 0x00);
  12. }

  13. void SysTick_Handler(void)
  14. {
  15.         Tick++;
  16. }

  17. uint32_t Sys_GetTick(void)
  18. {
  19.   return Tick;
  20. }

  21. void SysDelay(int Delay)
  22. {
  23.   int tickstart = 0;
  24.   tickstart = Sys_GetTick();
  25.   while((Sys_GetTick() - tickstart) < Delay)
  26.   {
  27.   }
  28. }

  29. void delayus(int us)
  30. {
  31.   int i=0,j=0;
  32.    for (i=0;i<us;i++)
  33.    {
  34.       for (j=0;j<(int)(16.0*(120/120.0));j++);
  35.    }
  36. }

  37. GPIO_InitPara GPIO_InitStructure;

  38. void TempGPIOInit(void)
  39. {

  40.         RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOE,ENABLE);

  41.         GPIO_InitStructure.GPIO_Pin = GPIO_PIN_1;
  42.         GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
  43.         GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  44.         GPIO_Init(GPIOE,&GPIO_InitStructure);
  45. }

  46. void TempGPIOin(void)
  47. {
  48.         GPIO_InitStructure.GPIO_Pin = GPIO_PIN_1;
  49.         GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;
  50.         GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  51.         GPIO_Init(GPIOE,&GPIO_InitStructure);
  52. }

  53. void TempGPIOout(void)
  54. {
  55.         GPIO_InitStructure.GPIO_Pin = GPIO_PIN_1;
  56.         GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
  57.         GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  58.         GPIO_Init(GPIOE,&GPIO_InitStructure);
  59. }

  60. void tempinit(void)
  61. {
  62. TempGPIOout();       
  63. GPIO_ResetBits(GPIOE, GPIO_PIN_1);                       
  64. delayus(600);
  65. GPIO_SetBits(GPIOE, GPIO_PIN_1);
  66. delayus(60);
  67. TempGPIOin();
  68. while(GPIO_ReadInputBit(GPIOE, GPIO_PIN_1));
  69. while(!(GPIO_ReadInputBit(GPIOE, GPIO_PIN_1)));
  70. }

  71. char tempread(void)
  72. {
  73. char i,retd=0;
  74. for(i=0;i<8;i++)
  75. {
  76.   retd>>=1;
  77.   TempGPIOout();
  78.   GPIO_ResetBits(GPIOE, GPIO_PIN_1);
  79.         delayus(5);
  80.   GPIO_SetBits(GPIOE, GPIO_PIN_1);
  81.   TempGPIOin();
  82.   if(GPIO_ReadInputBit(GPIOE, GPIO_PIN_1))
  83.   {
  84.    retd|=0x80;
  85.         }
  86.          delayus(50);
  87. }
  88. return retd;
  89. }

  90. void tempwrite(unsigned char wrd)
  91. {
  92. char i;
  93. for(i=0;i<8;i++)       
  94. {
  95.   TempGPIOout();
  96.   GPIO_ResetBits(GPIOE, GPIO_PIN_1);
  97.   delayus(1);
  98.   if(wrd&0x01)
  99.   {
  100.    GPIO_SetBits(GPIOE, GPIO_PIN_1);
  101.   }
  102.   else
  103.   {
  104.    GPIO_ResetBits(GPIOE, GPIO_PIN_1);
  105.   }
  106.   delayus(50);
  107.   GPIO_SetBits(GPIOE, GPIO_PIN_1);
  108.   wrd>>=1;
  109. }
  110. delayus(50);
  111. }

  112. int readtemp(void)
  113. {
  114. char temp1,temp2;
  115. int temp,minus;
  116.        
  117. tempinit();
  118. tempwrite(0xcc);
  119. tempwrite(0x44);
  120. tempinit();
  121. tempwrite(0xcc);
  122. tempwrite(0xbe);
  123. temp1=tempread();
  124. temp2=tempread();
  125. if(temp2&0xfc)
  126. {
  127.   minus=1;
  128.   temp=((temp2<<8)|temp1);
  129.   temp=((~temp)+1);
  130. }
  131. else
  132. {
  133.   minus=0;
  134.   temp=((temp2<<8)|temp1);
  135. }
  136. temp=temp*6.25;
  137. if(minus==1)
  138. {
  139.   temp=-temp;
  140. }
  141. return temp;             
  142. }

  143. int main(void)
  144. {
  145.         char temp[16]="abcd";
  146.         SysTickConfig();
  147.        
  148.         TempGPIOInit();
  149.         EvbUart1Config();
  150.        
  151.         tempinit();
  152.        
  153.         EvbUart1WriteStr("hello world\r\n");
  154.        
  155.         while(1)
  156.         {
  157.                 PRINTF("ζÈ:");
  158.                 sprintf(temp,"%2.2fÉãÊ϶È\r\n",readtemp()/100.0);
  159.                 PRINTF(temp);
  160.                 SysDelay(500);
  161.         }
  162.        
  163.         return 0;
  164. }
复制代码
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-15 09:28
  • 签到天数: 222 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-1-28 09:26:20 | 显示全部楼层
    楼主分享的不错!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 16:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-2-1 08:56:56 | 显示全部楼层
    亲,可以将内容一并发到经验频道,很有机会获得每月之星的呢http://jingyan.eeboard.com/
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 09:22 , Processed in 0.256405 second(s), 23 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.