xiaozhiyong
发表于 2009-3-13 13:22:50
确实好使,谢谢啦,希望更多的人看到这份资料...
tyff
发表于 2009-3-13 16:39:44
不错 记号 18B20
fsclub
发表于 2009-3-27 17:14:42
好使.我试了!
hhrfjz
发表于 2009-3-30 17:30:01
TO: feiyang007 不正
我又来了,我是菜鸟,不明白这三个宏定义:
------------------------------------------------------------------
#define CLR_DIR_1WIRE DDRC&=~BIT(2) //只要修改这里的参数就可以了!呵呵!
#define SET_DIR_1WIRE DDRC|=BIT(2) //里面什么都不用该!
#define CLR_OP_1WIRE PORTC&=~BIT(2)
#define SET_OP_1WIRE PORTC|=BIT(2)
------------------------------------------
这个是对单总线占用你单片机的I/O口的一个宏定义。
我用的是 PC2 口。
第一个的意思是让PC2口设置为输入状态。
第二个的意思是让PC2口设置为输出状态。
第三个的意思是让PC2口下拉为低电平。
第四个的意思是让PC2口上拉为高电平。
如果你要更换I/O口你只需要修改一下 DDRX、PORTX 和BIT(X)就可以了。
不知道我说清楚了没有.
ml07077
发表于 2009-3-31 15:29:16
请问hhrfjz ---
小数如何处理。谢!
barnaby
发表于 2009-4-12 18:40:40
出口参数wmh是显示的高位,wml使显示的低位????
为什么呢
什么迹象表明出口参数是wmh 和 wml
barnaby
发表于 2009-4-12 20:34:22
其中的 init_f = SREG;
SEI();
是什么意思,请教大侠
ximitiejiang
发表于 2009-4-13 10:41:29
感谢分享!
janor
发表于 2009-4-14 12:22:09
mark
1860
发表于 2009-4-15 21:01:05
顶一个
hedgehog
发表于 2009-4-15 21:21:09
唉,最近买DS18B20都不好买,缺货啊~
talangtingyu
发表于 2009-4-20 09:21:10
不好意思,我是新手来的,请问有无详细的实例,具体如何操作,谢谢!
fsclub
发表于 2009-4-20 09:59:21
楼上,这要怎么操作啊?
你要温度就去GETTEMP,全局就是WML和WMH就是你要的。
talangtingyu
发表于 2009-4-20 11:14:54
void gettemp() //读取温度值
这个函数不用带返回值 吗?
talangtingyu
发表于 2009-4-21 07:58:19
想请教下各位,为什么我这样用却不能成功的,我的液晶显示程序没有问题的,我只是在我原来写好的液晶程序中加入了下while(1)
{
gettemp();
for(num=20;num>0;num--)
{
write_dat(wmh);
}
但却不能读出18B20的数据,请各位指教,谢谢!
#include<avr/io.h>//编译环境为WINAVR,8M晶振
#include<util/delay.h>
#define uchar unsigned char
#define uint unsigned int
#include "delay.h"
#include "18B20.h"
uchar table[]={"I LOVE CHY"};
void write_com(uchar com)//写命令函数
{ _delay_ms(5);
PORTC&=~(1<<PC3);
PORTA=com;
_delay_ms(5);
PORTC|=(1<<PC2);
_delay_ms(5);
PORTC&=~(1<<PC2);
}
void write_dat(uchar dat)//写数据函数
{ _delay_ms(5);
PORTC|=(1<<PC3);//RS设置为高电平,写数据
PORTA=dat;//将数据送到数据端口A
_delay_ms(5);
PORTC|=(1<<PC2);
_delay_ms(5);//
PORTC&=~(1<<PC2);
}
int main(void)
{ uchar num;
DDRA=0xff;
DDRC|=(1<<PC3)|(1<<PC2);
PORTC&=~(1<<PC2);
write_com(0x01);
write_com(0x38);
_delay_ms(5);
write_com(0x0e);//显示光标
_delay_ms(5);
write_com(0x0f);
_delay_ms(5);
write_com(0x80);
while(1)
{
gettemp();
for(num=20;num>0;num--)
{
write_dat(wmh);
}
}
a105
发表于 2009-4-22 02:28:49
mark
barnaby
发表于 2009-4-25 13:17:54
在主函数中还要初始化吗?
是不是直接用:
个位温度=wml;
十位温度=wmh;
就可以了?是这样的吗
biansf2001
发表于 2009-4-25 16:48:54
你把gettemp函数定义为uint多好啊,直接返回,省得加2个全局变量
Lee.
发表于 2009-4-25 20:34:30
再学习下!
wkxu
发表于 2009-4-28 20:10:04
mark
zsy777
发表于 2009-4-28 23:30:42
MARK
lihao266
发表于 2009-5-22 20:19:14
多谢LZ!好用。
machi518
发表于 2009-6-10 10:59:35
谢谢!
jackielau
发表于 2009-6-10 14:09:21
程序只能在未优化的情况下工作,建议楼主修改一下延时函数,使其在优化时调用函数库中_delay_us(),这样可使其通用工作!
zhao_yun
发表于 2009-6-10 22:03:52
avr比51延时就是好。
tomy
发表于 2009-6-10 22:14:09
谢谢楼主分享
yangyb
发表于 2009-6-11 09:15:05
谢谢!收藏,要用时再仔细看。
ml07077
发表于 2009-6-14 18:34:24
void init_1820()
{
SET_DIR_1WIRE; //设置PC2 为输出
SET_OP_1WIRE;
CLR_OP_1WIRE;
delay_nus(480); //480us以上
SET_OP_1WIRE;
CLR_DIR_1WIRE;
delay_nus(20); //15~60us
while(CHECK_IP_1WIRE);
SET_DIR_1WIRE;
SET_OP_1WIRE;
delay_nus(140); //60~240us
}
void write_1820(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
CLR_OP_1WIRE;
if(x&1)//(x&(1<<m)) //写数据了,先写低位的!
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
delay_nus(40); //15~60us
SET_OP_1WIRE;
x>>=1;
}
SET_OP_1WIRE;
}
unsigned char read_1820()
{
unsigned char temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
ttemp>>=1;
k=(CHECK_IP_1WIRE); //读数据,从低位开始
if(k)
temp|=0x80;//(1<<n);
else
temp&=0x7f;//~(1<<n);
delay_nus(50); //60~120us
SET_DIR_1WIRE;
}
return (temp);
}
小改一下可省60多个字节。
ennyandson
发表于 2009-6-18 22:01:03
mark
onebobo126com
发表于 2009-6-20 10:00:16
MAK
onebobo126com
发表于 2009-6-20 10:03:05
以前自己玩了一下没成,有时间再试试
guangan854214
发表于 2009-6-23 11:26:32
谢谢
记号
snail0204
发表于 2009-6-23 13:28:40
mark
lf8013
发表于 2009-6-24 12:37:52
都是强人!!!
wanghengzhi
发表于 2009-6-27 22:12:39
记号!
huangjian1344
发表于 2009-8-20 13:53:33
谢谢,记下号!
fandy
发表于 2009-8-20 17:25:02
3q
xiongcy
发表于 2009-8-20 18:02:19
18b20,先MARK了。。
LMCHEN
发表于 2009-8-20 19:17:16
我很菜,加之刚学C,看了LZ的佳作,有以下几点还没明白:
1,void gettemp()这个函数用了VOID不是说明这个函数没有返回值吗?
2, wml, wmh是子函数里面的变量,函数调用后书上不是说此变量开辟的存储空间不是会覆盖吗,
那怎么还能把值返回合调用函数呢?
以上两点疑惑请各们帮忙解答下,万分感谢!!!
T_sunny_boy
发表于 2009-8-23 17:24:06
谢谢
shizt
发表于 2009-9-7 16:30:37
mark
hpdell
发表于 2009-9-8 19:10:21
好东东。高人!!!!!顶!!!!!!!!!!!
aohuahua
发表于 2009-10-9 20:04:43
MARK,好东西`
coolfish
发表于 2009-10-9 22:00:16
记号一下,前几天还在迷茫不知道怎么用这个东东了
QQ373466062
发表于 2009-10-10 00:17:22
一直想弄个1602+18B20 先Mark
hzpyj
发表于 2009-10-10 12:27:56
mark
aohuahua
发表于 2009-10-10 22:56:20
MARK
Stitch
发表于 2009-10-11 00:07:55
M
jone_zplay
发表于 2009-10-11 00:54:43
顶!
ggyyll8683
发表于 2009-10-11 07:48:21
mark
bcfai123
发表于 2009-10-11 10:01:36
mark
worldff
发表于 2009-10-11 11:08:17
mark
67122997
发表于 2009-10-27 14:23:38
做个记号
dugutianma
发表于 2009-11-2 10:32:11
mark
wkxu
发表于 2009-11-3 00:42:32
mark
penguin
发表于 2009-11-3 23:47:42
围观一下
dingwei
发表于 2009-11-4 04:12:32
18B20记号
lizhihuanok
发表于 2009-11-10 08:57:08
mark
xiaoluo2009
发表于 2009-11-20 16:00:20
好东西,我刚好也在调试18b20
chenchen1103
发表于 2009-11-23 02:06:05
mark
dingwei
发表于 2009-11-23 13:49:06
18b20
CRC校验函数
记号
chen0610
发表于 2009-11-29 09:49:54
请问各位能精确到0.1摄氏度吗??
ainet
发表于 2009-12-8 18:56:48
ds18b20 的精度为0.5度,不能到0.1度
kangkang
发表于 2009-12-10 16:49:40
顶一下!
icevel
发表于 2009-12-10 23:30:09
支持个!mark
allenjwb
发表于 2009-12-11 07:13:03
mark
fuanzwg
发表于 2009-12-11 07:18:37
mark
sonyex678
发表于 2009-12-11 10:49:08
mark~~
yanwuxu
发表于 2009-12-11 11:13:38
【10楼】 btpig
积分:101
派别:
等级:------
来自:
很菜的问一句,用示波器怎么调延时。。谢谢
调用你自己的延时程序使某个端口输出高低电平,然后用示波器测试就好了!
fengye2009
发表于 2009-12-12 20:58:58
mark
up2dream
发表于 2010-1-15 14:20:28
MARK
smartzou
发表于 2010-1-15 17:51:39
mark
beer
发表于 2010-1-21 20:34:26
mark
stevencao
发表于 2010-1-21 21:52:33
mark
luojiyin
发表于 2010-3-6 21:38:20
mark
huang137
发表于 2010-3-7 11:56:44
关于18B20我也来谈点体会,从51开始就接触18B20,也用18B20做过一些关于温度检测的产品,总的来说18B20使用比较方便,2-3条线解决硬件连接,节省单片机引脚之源,内部转换温度值,节省单片机内部或外部之源,但是18B20有个致命的弱点,就是温度转换时间过长,从大家写的程序来看,一般发出转换指令后,延时等待转换完成,在去读取温度值,这样的做法无疑浪费单片机处理事件的时间,而且如果说每秒要刷新一次温度的话,单片机基本没什么时间在去处理其它事件,关于这部分的程序上的改进大家可以考虑定时器中断,外部循环只发出转换指令,发出转换指令后,把定时器中断打开,设置时间为转换时间,并把外部循环发转换温度指令关闭,在去处理其它事件,中断产生后,关中断防止连续中断,发读温度值,读回温度值后,在开放外部循环的发转换温度指令,这样做的目的是大大节省单片机对18B20操作所需要的时间,对于整个操作不影响程序其它事件的处理,尤其对扫描方式下的显示过程不会出现显示停止现象。
在就是,18B20在网上基本99%的都是跳过ROM,很少有匹配ROM的文章,所以我觉得谈论18B20的ROM以外的过程实在是没有什么意义了,18B20可以值得讨论的地方估计就是匹配ROM这块了
sodohe
发表于 2010-3-7 16:27:14
好,18B20的时序的确很烦人,谢谢LZ的资料,这回要好好学习一下了
xunke
发表于 2010-3-7 16:52:47
回复【楼主位】hhrfjz ---
-----------------------------------------------------------------------
我的18B20比实际的高出约2度,不知问题在那?
CAI2010
发表于 2010-3-13 18:45:46
我的也是8M晶振,为什么看不到显示呢?
xinjie1023
发表于 2010-3-17 16:07:36
好东东
electricit
发表于 2010-4-18 01:26:56
果然厉害呀
RF2010
发表于 2010-4-18 10:49:28
NRF24L01无线数传模块(13RMB为人民服务)
http://item.taobao.com/auction/item_detail.htm?item_num_id=5029339086
sangreal
发表于 2010-4-20 20:19:04
好,mark
gdmfq
发表于 2010-4-20 23:01:48
mark
charley
发表于 2010-4-21 08:25:22
mark
hongyancl
发表于 2010-4-21 08:46:46
回复【楼主位】hhrfjz ---
-----------------------------------------------------------------------
ddddd
wangxiaoacc
发表于 2010-4-21 20:28:53
谢谢楼主,请教一下,我用你的头文件。在while(CHECK_IP_1WIRE);这个语句停住了,就是说没有读到这个引脚低电平,我把这句注释了,程序顺利过去了。温度也读出来了。这个语句有必要吗?
thinki
发表于 2010-4-22 00:36:26
MARK
electricit
发表于 2010-4-22 07:44:51
while(CHECK_IP_1WIRE); 我加了个超时处理,防止程序死掉了
wangxiaoacc
发表于 2010-4-22 09:07:46
非要等到这个信号吗?我看了网站上其他程序。有的就用它判断一下初始化是否成功,不成功也继续读温度。
10086RainEr
发表于 2010-4-22 15:37:24
棒棒!
haowei236
发表于 2010-4-22 18:59:34
MARK
yutian_ouravr
发表于 2010-4-22 19:28:42
不错啊,恭喜楼主,顶一个。
yejinbing
发表于 2010-4-26 21:00:13
多谢了
xunpianzhen
发表于 2010-5-8 21:53:38
谢过楼主。参考了。。。太好使了。
522yt
发表于 2010-6-19 21:58:58
谢谢啊,我正在调这个东西!
icefier
发表于 2010-6-19 22:47:34
小顶个
zengyi703
发表于 2010-6-19 23:46:06
mark
wangshaosh
发表于 2010-6-20 18:06:57
~~~
slzzmcu
发表于 2010-6-20 18:16:42
Mark