关于stc12c5a60s2单片机无法获取ds18b20温度的相关问题

前段时间动手做了一个关于ds18b20的小型项目(学校的电子设计大赛),自以为对ds18b20这个模块比较了解了。不过前几天因为专业课,要求在学校发的最小系统板(基于stc12c5a60s2)上实现某些功能,所以先对ds18b20这个模块进行了调试。

学校发的最小系统板(基于stc12c5a60s2)

参考了之前做ds18b20这个模块的keil代码,感觉差别不大,修改了lcd1602和onewire总线相关定义端口并进行了编译和烧录,但是发现lcd1602的显示内容异常。

异常显示

所以对之前的代码进行了检查,发现没有问题。后来请教了交流群的大佬发现,stc12c5a60s2是增强型单片机,它是1T的,而我的keil代码(包括网上大部分的例程)都是针对89系列单片机而写的,传统51单片机内核是12T的(包括89系列在内)

T指的是指令周期与时钟周期的比例。

例如传统51内核是12T的,每12个时钟周期构成一个指令周期。

那么问题就可以用一句话来概述了:STC12C5A60S2是1T的芯片,运行速度比89C52快,延时函数需要进行调整。

DS18B20是一个对时序控制极其严苛的系统,所以延时控制非常重要!!时序顺序非常重要!!

清楚认识的以上事实后,针对于上述问题,理清思路:

1. 要解决精确延时问题;

2. 要搞清楚DS18B20交互方法;

3. 要搞清楚DS18B20时序结构;

注意:以下代码是在89系列单片机代码基础上做时序调整的。

1.ds18b20初始化操作:

2.ds18b20写操作:

3. ds18b20读操作:

因为作者的ds18b20模块代码是通过调用onewire单总线模块化写法,所以下面就在onewire.h文件里面进行修改

#include <8051.h>
#include <intrins.h>
#define uchar unsigned char
#define _nop_() __asm nop __endasm
//引脚定义
#define OneWire_DQ P1_1

/**
  * @brief  单总线初始化
  * @param  无
  * @retval 从机响应位,0为响应,1为未响应
  */
uchar OneWire_Init(void)
{
    uchar i;
    uchar AckBit;
    OneWire_DQ=1;
    OneWire_DQ=0;
    i = 247;while (--i);        //Delay 500us
    OneWire_DQ=1;
    i = 32;while (--i);            //Delay 70us
    AckBit=OneWire_DQ;
    i = 247;while (--i);        //Delay 500us
    return AckBit;
}

/**
  * @brief  单总线发送一位
  * @param  Bit 要发送的位
  * @retval 无
  */
void OneWire_SendBit(unsigned char Bit)
{
    uchar i;
    OneWire_DQ=0;
    i = 4;while (--i);            //Delay 10us
    OneWire_DQ=Bit;
    i = 24;while (--i);            //Delay 50us
    OneWire_DQ=1;
}

/**
  * @brief  单总线接收一位
  * @param  无
  * @retval 读取的位
  */
uchar OneWire_ReceiveBit(void)
{
    uchar i;
    uchar Bit;
    OneWire_DQ=0;
    i = 2;while (--i);            //Delay 5us
    OneWire_DQ=1;
    i = 2;while (--i);            //Delay 5us
    Bit=OneWire_DQ;
    i = 24;while (--i);            //Delay 50us
    return Bit;
}

/**
  * @brief  单总线发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void OneWire_SendByte(unsigned char Byte)
{
    uchar i;
    for(i=0;i<8;i++)
    {
        OneWire_SendBit(Byte&(0x01<<i));
    }
}

/**
  * @brief  单总线接收一个字节
  * @param  无
  * @retval 接收的一个字节
  */
uchar OneWire_ReceiveByte(void)
{
    uchar i;
    uchar Byte=0x00;
    for(i=0;i<8;i++)
    {
        if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}
    }
    return Byte;
}

原代码

修改后的代码

ds18b20模块主要的onewire.h文件里面用到delay函数,所以修改代码部分主要在onewire.h文件里面

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STC12C5A60S2单片机手册是一本详细介绍STC12C5A60S2单片机特性、功能以及使用方法的参考资料。这本手册对于想要了解和使用STC12C5A60S2单片机的工程师和学生来说非常重要。 首先,手册会详细介绍STC12C5A60S2单片机的基本特性。它将包括单片机的工作电压范围、时钟频率、存储容量等信息,这些特性对于确保单片机能够适用于特定的应用场景非常关键。 其次,手册会提供STC12C5A60S2单片机的功能描述。这包括单片机所支持的指令集、输入输出端口、通信接口等。这些功能可以帮助工程师更好地了解单片机的能力,为他们设计和开发适当的电路布局和软件代码提供指导。 在手册中,还会给出STC12C5A60S2单片机的引脚功能描述和电气特性。这将涵盖每个引脚的具体功能和用途,以及引脚的电气特性,例如驱动能力和输入电平范围。工程师可以根据这些信息来设计适当的电路连接。 此外,手册还会提供关于STC12C5A60S2单片机编程和调试的详细信息。它包括单片机所支持的编程语言、开发环境以及调试工具。这对于学习和使用STC12C5A60S2单片机来说非常重要,有助于确保开发过程的顺利进行。 最后,手册还会提供示例电路图和代码,以帮助工程师更好地理解和应用STC12C5A60S2单片机。这些示例可以作为起点,为工程师提供一些实际应用的指导,帮助他们更好地利用单片机的功能。 总的来说,STC12C5A60S2单片机手册是一本功能丰富的参考资料,它提供了关于STC12C5A60S2单片机基本特性、功能描述、引脚功能和电气特性、编程和调试等方面的详细信息。这本手册对于学习和使用STC12C5A60S2单片机的人来说是一个宝贵的工具,将帮助他们更好地理解和应用这款单片机

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值