历史上的今天
今天是:2025年02月22日(星期六)
2020年02月22日 | 基于STM8的DS18B20检测
2020-02-22 来源:eefocus
最近要鼓捣出5V的ds18b20用stm8采集,网上一搜发现大部分都是把数据端直接接到3.3的引脚,我也这么做的。
用的DS18B20为淘宝外面有钢管的那种,系统板为STM8L051,第一次接触stm8先去找的库函数,以附件形式粘贴到下面。用IAR建工程一搜一大把。
单总线协议因为只有一条线,时序很重要,肯定要使用延时函数,用的原子哥的延时函数,,照搬原子哥的代码:http://www.openedv.com/posts/list/17347/htm
记得定义头文件时加上 #include "stm8l15x_conf.h",不然会报错
#include "delay.h"
volatile u8 fac_us=0;
void delay_init(u8 clk)
{
if(clk>16)fac_us=(16-4)/4;
else if(clk>4)fac_us=(clk-4)/4;
else fac_us=1;
}
void delay_us(u16 nus)
{
__asm(
"PUSH A n" //1T,压栈
"DELAY_XUS: n"
"LD A,fac_us n" //1T,fac_us加载到累加器A
"DELAY_US_1: n"
"NOP n" //1T,nop延时
"DEC A n" //1T,A--
"JRNE DELAY_US_1 n" //不等于0,则跳转(2T)到DELAY_US_1继续执行,若等于0,则不跳转(1T).
"NOP n" //1T,nop延时
"DECW X n" //1T,x--
"JRNE DELAY_XUS n" //不等于0,则跳转(2T)到DELAY_XUS继续执行,若等于0,则不跳转(1T).
"POP A n" //1T,出栈
);
}
void delay_ms(u32 nms)
{
u8 t;
if(nms>65)
{
t=nms/65;
while(t--)delay_us(65000);
nms=nms%65;
}
delay_us(nms*1000);
}
因为我没有显示的东西,只能用printf,在参考大佬「C_Aya」的文章,原文链接:https://blog.csdn.net/baweiyaoji/article/details/72812045 成功弄出来后,可以正常打印字符串,但一遇到带参数的printf立马内存爆炸,然后又在参考大佬「Dancer__Sky」的文章,原文链接:https://blog.csdn.net/Dancer__Sky/article/details/82284961得以成功打印。记得自己的头文件不要定义成这个名字"stdarg.h",我都不记得C有这个头文件了,不然你无法调用C的stdarg.h,将会出现错误。
现在就到了最关键的时候了,这一部分我参考的大佬石破天开 https://blog.csdn.net/u012166958/article/details/84872480
// 复位,主机给从机发送复位脉冲
void DS18B20_Rst(void)
{
DS18B20_Mode_Out();
delay_us(2);
DS18B20_DQ_OUT_Low; // 产生至少480us的低电平复位信号
delay_us(700);
DS18B20_DQ_OUT_High; // 在产生复位信号后,需将总线拉高
delay_us(3);
}
// 写1字节到DS18B20
void DS18B20_Write_Byte(u8 dat)
{
u8 j;
u8 testb;
DS18B20_Mode_Out();
for (j = 1; j <= 8; j++)
{
testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{
DS18B20_DQ_OUT_Low;// 写1
delay_us(2);
DS18B20_DQ_OUT_High;
delay_us(80);
}
else
{
DS18B20_DQ_OUT_Low;// 写0
delay_us(78);
DS18B20_DQ_OUT_High;// 释放总线
delay_us(2);
}
}
这两部分延时不太一样,贴出来大家可以试一试。注意引脚输入不要弄错成浮空输入。
最后大体是这个效果
史海拾趣
|
28335片内FLASH插件安装方法 http://www.hellodsp.com/bbs/viewthread.php?tid=7487 28335的ADC_DMA例程 http://www.hellodsp.com/bbs/viewthread.php?tid=7488 SEED_DEC28335用户指南 http://www.hellodsp.com/bbs/viewthread.php?tid=7489 ...… 查看全部问答> |
|
eboot 分了 4个分区, 1个binfs 3个fatfs 3个fatfs在pc上都是别出来了, 现在遇到以下问题: 1). 我想隐藏其中2个fatfs分区, 因为 我要放 应用程序 用 所以需要隐藏起来 2). 现在分区的路径名是按默认的名字, 比如默认是 disk, 那么 后面几 ...… 查看全部问答> |
|
大家好: 谁对UI比较熟,还有就是做菜单的技术,菜单就像是彩屏手机里的菜单或是数字电视里的菜单等,这项技术如何实现,我开发过程中要用到,挺急的,请大家帮忙给我点建议或资料吧。先谢谢了。… 查看全部问答> |
|
XILINX的每个IO脚都有一个可选的可配上拉电阻功能,现在我在配置文件的UCF里使用了这个上拉电阻:语法如下:NET\"I_key_data\" LOC = \"C11\" | ...… 查看全部问答> |
|
使用的是数码管显示相应的电压 #include \"delay.h\" #define Num_of_Results 32 uint results[Num_of_Results]; uchar d[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar d1[11]={0xbf,0x86, ...… 查看全部问答> |
|
现在做实验需要一个430系列的单片机 主要就是A/D采样要达到16位的位宽,且最好AD是单端输入不要差分输入的, 430有能满足这个需求的型号吗? 请各位给推荐几个比较主流的型号,谢谢。… 查看全部问答> |




