历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2018年08月26日 | STM8L 温度传感器DS18B20

2018-08-26 来源:eechina

#define DS18B20_GPIO_PORT  (GPIOC)
#define DS18B20_GPIO_PIN   (GPIO_Pin_2)


#define DS18B20_PIN_SET_OUT()   GPIO_Init(DS18B20_GPIO_PORT, (GPIO_Pin_TypeDef)DS18B20_GPIO_PIN, GPIO_Mode_Out_PP_High_Fast)
#define DS18B20_PIN_SET_IN()    GPIO_Init(DS18B20_GPIO_PORT, (GPIO_Pin_TypeDef)DS18B20_GPIO_PIN, GPIO_Mode_In_PU_No_IT)
#define DS18B20_WR1()           GPIO_SetBits(DS18B20_GPIO_PORT, (GPIO_Pin_TypeDef)DS18B20_GPIO_PIN)
#define DS18B20_WR0()           GPIO_ResetBits(DS18B20_GPIO_PORT, (GPIO_Pin_TypeDef)DS18B20_GPIO_PIN)
#define R_DS18B20()             GPIO_ReadInputDataBit(DS18B20_GPIO_PORT, (GPIO_Pin_TypeDef)DS18B20_GPIO_PIN)
/* Private macro -------------------------------------------------------------*/
#define READ_ROM              0x33  //读取序列号
#define SKIP_ROM              0xCC  //跳过ROM
#define MATCH_ROM             0x55  //匹配ROM
#define CONVERT_TEM           0x44  //转换温度
#define READ_RAM              0xBE  //读暂存器
#define WRITE_RAM             0x4E  //写暂存器
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void _delay_us(uint16_t nCount)
{
    nCount *= 3; 
    while(--nCount);
}
/**
  * @brief _delay_ms
  * @param nCount
  * @retval None
  */
void _delay_ms(uint16_t nCount)
{
    while(nCount--)
    {
        _delay_us(1000);
    }
}
/* Private functions ---------------------------------------------------------*/
/* Public functions ----------------------------------------------------------*/
void Alarm_for_No_DS18B20(void)
{
    //单总线上没有发现DS18B20则报警,该动作据具体应用具体处理
}
//---------------------------------------------------------------------
unsigned char DS18B20_Start(void) //复位ds18b20芯片
{
    unsigned char i,succ=0xff;
    DS18B20_PIN_SET_OUT(); //置为输出口
    DS18B20_WR0();          //总线产生下降沿,初始化开始
    for(i=0; i<30; i++)_delay_us(25); //总线保持低电平在480 - 960微秒之间  ;i<20;(25us)
    DS18B20_WR1();         //总线拉高
    DS18B20_PIN_SET_IN();  //置为输入,主机释放总线,准备接收DS18B20的应答脉冲
    i=0;
    while(R_DS18B20())         //等待DS18B20发出应答脉冲
    {
        _delay_us(5);          //5
        if(++i>12)            //DS18B20检测到总线上升沿后等待15-60us
        {
            succ=0x00;           //如果等待大于约60us,报告复位失败
            break;
        }
    }
    i=0;
    while(!R_DS18B20())       //DS18B20发出存在脉冲,持续60-240us
    {
        _delay_us(5);         //5
        if(++i>48)            //如果等带大于约240us,报告复位失败
        {
            succ=0x00;
            break;
        }
    }
    _delay_us(20);
    return succ;
}
//---------------------------------------------------------------------
void DS18B20_SendU8(unsigned char d8)//向DS18B20写一字节函数
{
    unsigned char i;
    DS18B20_PIN_SET_OUT();   //置为输出口
    for(i=0; i<8; i++)
    {
        DS18B20_WR0();       //总线拉低,启动“写时间片”
        _delay_us(2);            //大于1微妙
        if(d8&0x01)DS18B20_WR1();
        _delay_us (32);      //延时至少60微秒,使写入有效
        _delay_us (30);
        DS18B20_WR1();       //总线拉高,释放总线,准备启动下一个“写时间片”
        d8>>=1;
        _delay_us (1);
    }
    DS18B20_PIN_SET_IN();   //主机释放总线
}
//---------------------------------------------------------------------
unsigned char DS18B20_ReadU8(void)//从DS18B20读1个字节函数
{
    unsigned char i,d8;
    for(i=0; i<8; i++)
    {
        d8>>=1;
        DS18B20_PIN_SET_OUT();//置为输出口
        DS18B20_WR0();        //总线拉低,启动读“时间片”
        _delay_us(2);         //大于1微妙
        DS18B20_WR1();        //主机释放总线,接下来(2~15)us内读有效
        DS18B20_PIN_SET_IN(); //引脚设定为输入口,准备读取
        _delay_us(2);         //延时2个us后进行读


        if(R_DS18B20())d8|=0x80;//从总线拉低时算起,约15微秒内读取总线数据
        _delay_us(32);       //60us后读完成
        _delay_us(30);
        DS18B20_WR1();       //总线拉高,主机释放总线,准备启动下一个“写时间片”
    }
    DS18B20_PIN_SET_IN();    //主机释放总线
    return(d8);
}
//------------------------------------------------------------------------------------
void Init_DS18B20(void)           //初始化DS18B20
{
    unsigned char i;
    i=DS18B20_Start();             //复位
    if(!i)                          //单总线上没有发现DS18B20则报警
    {
        Alarm_for_No_DS18B20();
        return;
    }
    DS18B20_SendU8 (SKIP_ROM);  //跳过rom匹配
    DS18B20_SendU8 (WRITE_RAM); //设置写模式
    DS18B20_SendU8 (0x64);        //设置温度上限100摄氏度
    DS18B20_SendU8 (0x8a);        //设置温度下线-10摄氏度
    DS18B20_SendU8 (0x7f);        //12bit(默认)
}


//--------------------------------------------------------------------------------------


unsigned int Read_DS18B20(void)  //读取并计算要输出的温度
{
    unsigned char i;
    unsigned char tl;
    unsigned int  th;
    i=DS18B20_Start();           //复位
    if(!i)                        //单总线上没有发现DS18B20则报警
    {
        Alarm_for_No_DS18B20();
        return 0;
    }
    _delay_ms(1);
    DS18B20_SendU8(SKIP_ROM);     //发跳过序列号检测命令
    DS18B20_SendU8(CONVERT_TEM); //命令Ds18b20开始转换温度
    i=0;
    _delay_ms(1);
    while(!R_DS18B20())       //当温度转换正在进行时,主机读总线将收到0,转换结束为1
    {
        _delay_ms(3);
        if(++i>250) break;              //至多转换时间为750ms
    }
    DS18B20_Start();                 //初始化
    _delay_ms(1);
    DS18B20_SendU8(SKIP_ROM);    //发跳过序列号检测命令
    DS18B20_SendU8(READ_RAM);  //发读取温度数据命令
    tl=DS18B20_ReadU8();           //先读低8位温度数据
    th=DS18B20_ReadU8()<<8;        //再读高8位温度数据
    return (th|tl)*10>>4;              //温度放大了10倍,*0.0625=1/16=>>4
}

推荐阅读

史海拾趣

High Tech Chips Inc公司的发展小趣事

机顶盒,全称为数字视频变换盒,是连接电视机与外部信号源的重要设备,具有高度的专业性和广泛的应用性。它不仅能接收来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,还能将这些信号转换成适合在电视机上播放的格式,极大地丰富了用户的观看体验。

机顶盒分为数字机顶盒和网络机顶盒两大类。数字机顶盒主要实现数模转换功能,使用户能用原有的模拟电视机观看数字电视,包括有线电视、卫星电视和地面广播电视的数字机顶盒。而网络机顶盒则进一步扩展了功能,能接入互联网,提供如IPTV、视频点播、在线游戏、网页浏览等多元化服务,使电视机转变为一个智能互动终端。

机顶盒的工作原理涵盖接收、解码和显示三个关键步骤。通过内置的调谐器接收信号,解调器将信号从载波中提取,解码器再将信号转换为电视可识别的视频和音频流,最终通过电视机呈现给用户。随着技术的不断进步,机顶盒的功能也在不断升级,如支持4K、8K超高清视频播放,搭载智能推荐算法提供个性化内容推荐,以及通过语音识别技术实现便捷操作等。

综上所述,机顶盒作为连接电视与互联网的重要桥梁,其专业性和科普性不言而喻。它不仅为用户提供了丰富多彩的电视节目和娱乐选择,还推动了电视产业的智能化发展,成为现代家庭不可或缺的一部分。

台湾三礼(3L)公司的发展小趣事

近年来,随着环保意识的提升和绿色能源的普及,三礼公司也积极投身于绿色生产领域。2019年,公司在广西南宁开始建设新厂,预定投资3亿元人民币用于厂房及自动化设备的建设。新厂总建筑面积达70,000平方米,将成为公司目前所有生产基地中规模最大的一个。同时,公司还计划全面架设太阳能发电系统,目标是在未来三年内承担公司总需求电量的30%。这一举措不仅有助于降低公司的生产成本,还体现了公司对环保事业的积极贡献。

这五个故事只是三礼公司发展历程中的一部分缩影,但它们却生动地展现了公司在电子行业中的成长轨迹和不懈努力。从北美市场的拓展到中国内地生产能力的扩大,再到技术突破和新产品开发,三礼公司始终保持着敏锐的市场洞察力和强大的创新能力。同时,公司还积极投身于绿色生产领域,为推动电子行业的可持续发展做出了积极贡献。

ApexTool Group公司的发展小趣事

Apex Tool Group一直将产品质量视为企业的生命线。在电子行业中,Apex Tool Group的产品以其卓越的品质和稳定的性能赢得了客户的广泛信赖。有一次,一家知名电子企业因为生产线上的电动工具出现故障,导致生产效率大幅下降。在紧急关头,Apex Tool Group迅速提供了替代方案,并派出技术人员现场解决问题。最终,Apex Tool Group的产品成功帮助该企业恢复了正常生产,赢得了客户的赞誉和信赖。

德尔创(Dersonic)公司的发展小趣事

随着业务的逐步扩展,德尔创意识到品质对于品牌的重要性。因此,公司投入大量资金用于提升生产设备的精度和稳定性,同时加强了对原材料采购和质量控制的管理。这些措施使得德尔创的产品质量得到了显著提升,客户满意度也大幅提高。此外,公司还积极开展品牌宣传活动,通过参加行业展会、举办技术交流会等方式提升品牌知名度和影响力。

Digital Equipment Corp公司的发展小趣事

2001年,惠普公司与康柏公司宣布合并,DEC作为康柏的一部分也随之并入惠普。这次合并进一步扩大了DEC的业务范围和市场影响力。在合并后,DEC的计算机产品和技术被整合到惠普的产品线中,同时DEC的品牌也逐渐淡出市场。然而,DEC在计算机行业中的贡献和影响力仍然被广泛认可,其技术遗产和创新精神在惠普及其他科技公司中得到了传承和发展。

EMI Filter Company公司的发展小趣事

Kemet公司在EMI滤波器领域也有着一席之地。他们致力于研发符合环保标准的EMI滤波器。随着全球对环保问题的日益重视,Kemet看到了绿色环保EMI滤波器的巨大潜力。他们采用环保材料和无铅工艺,生产出了符合RoHS标准的EMI滤波器。这些产品不仅性能稳定,而且对环境友好,赢得了众多环保意识强烈的客户的青睐。

问答坊 | AI 解惑

不明白这些组件的关系,请前辈赐教

在WINCE里,定制OS的时候有很多组件可选。但我有点不明白如下问题: 如果要想目标板子可以上网,很显然需要Internet Explorer这个组件,再就是网卡驱动组件。 那么在Custom Devices->Communications Service and NetWorking下面 LAN WAN NetWo ...…

查看全部问答>

usb 虚拟串口,出现两个相同的串口名

图中com9出现了两次。驱动程序里什么函数用来删除此名称的呢?为什么没有被执行到?…

查看全部问答>

DSP下的USB的驱动的一些问题

在USB的状态寄存器中,有以下一些会引起DSP中断的状态不知道该怎么处理: USB接受到SETUP包 USB接受到IN包 USB接受到OUT包 ENDPOINT状态寄存器中的HALT为1 ENDPOINT状态寄存器中的STALL为1 发生传送错误 USB接收到ACK包 USB的统计计数器发 ...…

查看全部问答>

无法提交方案

不知道为何无法提交方案 希望管理员帮忙   DIY专属应急灯方案提交 1、通过AC-DC适配器为应急灯充电2、通过按钮调节LED灯光强弱3、提供MP3、MP4、手机等便携设备的充电接口 1、利用MAX16802驱动多只HB LED2、利用Atmega8管理锂电池充放电、 ...…

查看全部问答>

STM32的功能太强大了,强大到看了一遍都不知道该如何设置.

                                 感觉比以前接触的ARM7的功能都多,很复杂啊...…

查看全部问答>

【为C2000做贡献】2812的SPWM源程序

有用的就拷过去,如果感觉好的话,我还会把SVPWM的程序奉上!!     //SPWM #include \"DSP281x_Device.h\"#include \"stdio.h\"#include \"math.h\"#include \"float.h\"#define NX 404#define PI 3.1415925float M=0.8;int k0=0,h1 ...…

查看全部问答>

基于 TI Stellaris 的 μCOS-Ⅱ 例程集下载

基于 TI Stellaris 的 μCOS-Ⅱ 例程集下载,从 micrium 官网下载,供大家下载学习。                   [ 本帖最后由 Study_Stellaris 于 2011-9-9 23:37 编辑 ]…

查看全部问答>

高手还是在民间

TI的MSP430的那款手表相信大家还记得,连这个都被DIY了。基本特性是- small (34 x 30 mm physical size. Viewing area 28×19)- 3-line SPI 9-bit (Driver Sitronix ST7579-G2)- low power- backlight- black and white LCD- approx 3 USD cost 搞 ...…

查看全部问答>

XILINX NEXYS3-实现流水灯

本帖最后由 hjl240 于 2014-1-24 19:49 编辑 (本文适合FPGA及Verilog初学者,大牛们可以直接忽略)上一次已经讲过如何实现点亮全部的LED,这次分享一下如何实现简单的流水灯。如果不知道如何新建工程以及怎么下载程序,可以参考“XILINX NEXYS3 ...…

查看全部问答>