wangshaosh
发表于 2010-6-20 18:06:57
~~~
slzzmcu
发表于 2010-6-20 18:16:42
Mark
super373
发表于 2010-6-20 22:56:44
拿来用一下 3Q!
wbanng
发表于 2010-7-22 12:04:43
mark
qinhya
发表于 2010-7-22 18:53:37
顶下!!
muscledev
发表于 2010-8-5 22:47:55
楼主,我用你的程序,用共阴数码管显示,但是不行,不知出什么问题了,帮忙看一下。非常感激
#include<ioavr.h>
/*************************************************************************
ds18b20头文件
M16内部8M
*************************************************************************/
#define CLR_DIR_1WIRE DDRC&=~0x80 //只要修改这里的参数就可以了!呵呵!
#define SET_DIR_1WIRE DDRC|=0x80 //里面什么都不用该! //BIT(2)换成0x80
#define CLR_OP_1WIRE PORTC&=~0x80
#define SET_OP_1WIRE PORTC|=0x80
#define CHECK_IP_1WIRE (PINC & 0x80) //检测
unsigned char wmh,wml;
unsigned charNum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9
#define uint unsigned int
#define uchar unsigned char
//uchar data;
unsigned char wmh,wml,wm3;
//延时程序:
//delay.h
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
void init_1820()
{
SET_DIR_1WIRE; //设置PC2 为输出
SET_OP_1WIRE;
CLR_OP_1WIRE;
delay_nus(580); //480us以上
SET_OP_1WIRE;
CLR_DIR_1WIRE;
delay_nus(25); //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<<m)) //写数据了,先写低位的!
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
delay_nus(40); //15~60us
SET_OP_1WIRE;
}
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;
k=(CHECK_IP_1WIRE); //读数据,从低位开始
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
delay_nus(50); //60~120us
SET_DIR_1WIRE;
}
return (temp);
}
void gettemp() //读取温度值
{
unsigned char temh,teml,wm0,wm1,wm2;
init_1820(); //复位18b20
write_1820(0xcc); // 发出转换命令
write_1820(0x44);
//delay_nms(800); //不延时也好使,不知道怎么回事!
init_1820();
write_1820(0xcc);//发出读命令
write_1820(0xbe);
teml=read_1820();//读数据
temh=read_1820();
wm0=teml>>4; //只要高8位的低四位和低8位的高四位,温度范围0~99啦!
wm1=temh<<4;
wm2=wm1+wm0; //16进制转10进制
wm3=wm2/100;
wmh=(wm2%100)/10; //出口参数了!wmh是显示的高位,wml使显示的低位
wml=(wm2%100)%10;
}
void main(void)
{
delay_nms(1);
uint a,b,c,d;
DDRA=0Xff;//假设数码管接在PA口上,数码管为共阴
PORTA=0x00;
DDRC=0X0f;
PORTC=0x00;//假设控制数码管位数的是PC口的低四位
a=wm3;
b=wmh;
c=wml;
while(1)
{
gettemp //a=(uint)i/100;
if(a==0)PORTC&=0xf7;
else
{
PORTC|=0x08;
PORTA=Num;
delay_nms(3);
}
if(b==0&&a==0)PORTC&=0xfb;
else
{
PORTC|=0x04;
PORTA=Num;
delay_nms(3);
}
PORTC|=0x02;
PORTA=Num;
PORTA|=0X80; //假设数码管小数点的控制位是 PA7,使小数点点亮
delay_nms(3);
PORTC|=0x01;
PORTA=Num;
delay_nms(3);
}
}
zhq1989723
发表于 2010-8-5 23:01:10
这东西确实不错。。。。
allenjwb
发表于 2010-8-6 08:03:13
标记一下啊
xfloveyou886
发表于 2010-8-6 11:19:12
标记~
sailor0908
发表于 2010-8-6 11:39:37
mark
xtaens
发表于 2010-8-29 20:34:45
mark
liujinyu
发表于 2010-8-31 16:58:59
做个记号保留,用到的时候再来下。谢谢了!
woshinlb
发表于 2010-8-31 19:47:31
感谢楼主分享
icer1
发表于 2010-9-2 08:59:56
收藏
fshunj
发表于 2010-9-2 09:09:21
谢谢分享
zkcheng606
发表于 2010-9-17 09:32:16
刚开始看DS18S20,MARK下。
poet_lee
发表于 2010-9-17 19:06:31
谢谢分享~
worldly_guest
发表于 2010-9-17 20:31:12
收藏!
xuejianhua1986
发表于 2010-9-17 21:01:46
mark
cai361305
发表于 2010-9-20 21:25:41
标记
XQGG
发表于 2010-9-20 21:32:38
记号
wangbin6030
发表于 2010-9-21 09:57:44
为什么我的关机以后再重新开机温度显示就不正常了呢?
jsarthur
发表于 2010-10-14 17:13:57
回复【楼主位】hhrfjz---
-----------------------------------------------------------------------
前两天正好在调 参考了坛子里的不少帖子 在这边贴下自己写的 读温的函数 支持正负值 及小数
写的不好还望大家见谅
//------------DS18BB0读温度----------
int readTemp(void)
{
int temp,temp3;
unsigned char temp1,temp2,temp4,temp5;
convertDs18b20();
resetOnewire();
wOnewire(0xcc);
wOnewire(0xbe);
temp1=rOnewire(); //低位
temp2=rOnewire(); //高位
temp4=temp1;
temp5=temp2;
temp2=temp2<<4;
temp1=temp1>>4;
temp2|=temp1;
// return (temp2&0x7F); //返回0~99
if((temp5&0xF0)==0xf0) //负值
{
temp3=((~temp4+1)&0x0F)*0.0625*100;
temp=(~temp2&0x7F)*100+temp3;
temp=~temp+1;
}
else //正值
{
temp3=(temp4&0x0F)*0.0625*100;
temp=(temp2&0x7F)*100+temp3;
}
return (temp); //扩大100取整
}
changzi2008
发表于 2010-10-14 17:29:27
好强,学习了
guxingganyue
发表于 2010-10-21 22:13:25
顶
zhaoghsea
发表于 2010-10-21 22:30:24
mark
arvidwen
发表于 2010-10-21 23:10:52
mark
wenfeiexe
发表于 2010-10-21 23:13:34
mark
zchenj
发表于 2010-10-22 08:42:49
mark
sxdy99
发表于 2010-10-29 10:07:31
这必须得顶
w99991888
发表于 2010-10-29 10:32:34
cvavr里面有这个库。
pingguo2012
发表于 2010-10-31 00:17:19
我也做个记号,下次学到的时候来看。
sddzycnq
发表于 2010-10-31 21:08:59
细读。
luvemcu
发表于 2010-10-31 21:31:25
回复【楼主位】hhrfjz---
-----------------------------------------------------------------------
好东西值得收藏
zhenhuah
发表于 2010-10-31 22:16:14
mark
heero
发表于 2010-10-31 22:35:09
谢谢了,收藏先.
danielzhuang
发表于 2010-11-1 00:21:59
mark
adamj
发表于 2010-11-6 13:30:41
不错
www1519
发表于 2010-11-21 00:59:44
mark
sharp0
发表于 2010-11-22 13:39:31
好,学习了,谢谢各位
chinawrj
发表于 2010-11-22 13:51:57
mark
love_zjb
发表于 2010-11-22 18:07:00
mark
kelos3000
发表于 2010-11-22 18:35:22
ddddddddd
AG17
发表于 2010-11-22 21:49:25
mark
pengeiei
发表于 2010-11-22 22:24:56
学习下
hackerzw
发表于 2010-11-23 23:44:19
收藏了。
martial
发表于 2010-11-24 12:33:49
很强悍,学习了
heroling
发表于 2010-12-19 23:09:03
太厉害了 ,拿去看看 。
kongan
发表于 2011-1-11 15:22:53
收藏,学习
enjoyliwenhua
发表于 2011-3-8 19:36:29
标记
enjoyliwenhua
发表于 2011-3-12 09:16:41
先崇拜一下
aidby2004
发表于 2011-3-13 10:43:30
MARK
poet_lee
发表于 2011-3-13 13:22:39
感谢分享~
hydraulics
发表于 2011-3-13 22:17:48
mark
dasemo2008
发表于 2011-3-15 14:54:23
Mark!!!!!!
lixupeng
发表于 2011-3-15 20:20:49
mark!!!!!
416446891
发表于 2011-3-15 21:08:25
mark
scsdwxj2005
发表于 2011-3-16 09:35:51
标记一下
lsy5110
发表于 2011-3-16 21:54:00
mark
CaineStrong
发表于 2011-3-17 13:26:02
打酱油
tianyuanqike
发表于 2011-3-19 14:35:13
正好要用到,谢谢!
fanbinhua
发表于 2011-3-20 20:47:40
mark
billbot501
发表于 2011-3-20 21:47:23
不错很好用
liangyaozhan
发表于 2011-3-20 21:48:25
我看了一下,这个函数好像有点问题(看使用的优化选项不同会有不一样的结果):
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
在for循环内什么都不做时,此函数达不到你要的延时。但可以使用volatile定义变量i,防止被优化了。
gnail092
发表于 2011-4-5 18:59:03
void delay_1us(void) //1us延时函数
{
asm("nop");
}
8M时,asm("nop")这条指令的时间应该是1/8000000 = 0.125uS 吧,为什么会是1us呢
babytaomail
发表于 2011-4-5 19:37:25
有木有负温度??我发觉我自己弄的头文件比楼主的好看多了。。./emotion/em025.gif
附上自己写的18B20代码~
//12M晶振,数据线接口为DQ,请自己修改绑定IO口
#ifndef _18B20_H_
#define _18B20_H_
/**************************************************/
#ifndef uchar
#define uchar unsigned char
#define uint unsigned int
#endif
/********************函数定义**********************/
voidReadTemp(uchar *TempInt, uchar *TempDot, uchar *SignedFlag); //使用时调用这条函数就OK了
voidInit_DS18B20(void);
uchar ReadOneChar(void);
voidWriteOneChar(unsigned char dat);
voidDelayx(unsigned int i);//注意延时,MCU速度快时要加大,而且只可大不可小
/***************************************************
功能说明: 微秒级延时
****************************************************/
void Delayx(unsigned int i)
{
while(i--);
}
/***************************************************
void Init_DS18B20()
功能说明: 初始化18B20
****************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
Delayx(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delayx(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delayx(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delayx(5);
}
/***************************************************
void ReadOneChar()
功能说明: 从18B20中读取一个字节的数据
返回值: 返回具体数据
****************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delayx(5);
}
return(dat);
}
/***************************************************
void WriteOneChar()
功能说明: 字一个字节的数据进18B20中
****************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delayx(5);
DQ = 1;
dat>>=1;
}
Delayx(5);
}
/**************************************************
void ReadTemp(uchar *TempInt,uchar *TempDot, uchar *SignedFlag)
功能说明:从18B20中读出温度
出口:TempInt 温度整数部分
TempDot 温度整数部分
SignedFlag为温度正负标志,正为0,负为1
**************************************************/
void ReadTemp(uchar *TempInt,uchar *TempDot, uchar *SignedFlag)
{
unsigned char a=0;
unsigned char b=0;
unsigned int i;
unsigned long int temp;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); //12位温度分辨率,默认9位
Delayx(100);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //读低位
b=ReadOneChar(); //读高位
*SignedFlag=b>>7; //符号标志
if(*SignedFlag>0)//负数处理
{
temp=b;
temp=temp<<8|a;
temp=0xffff-temp; //负数时为补码,因而要取反加一
temp+=1;
b=temp>>8;
a=temp;
}
i=a&0x0f; //小数部分三位二制码
*TempInt=(a>>4)|(b<<4);
i=i*625; //小数部分转换
*TempDot=i/1000; //只取一位小数。TS:你可以修改1000的大小,以达自己想要的分辨率
}
#endif
fw190d9
发表于 2011-4-5 20:05:47
mark
CSU_David
发表于 2011-5-22 00:27:08
谢谢LZ,借用你的例子调试成功了~
oysy
发表于 2011-5-24 18:43:11
好东西
wanzhouyang29
发表于 2011-6-2 21:51:51
mark
stewen
发表于 2011-6-3 23:07:39
谢谢分享!
有空试试。
cuit4017
发表于 2011-6-4 22:12:30
mark
Elderfox
发表于 2011-6-4 22:17:14
MARK
ervinzz
发表于 2011-6-24 16:20:54
回复【楼主位】hhrfjz ---
-----------------------------------------------------------------------
18B20读写数据不都是从高位开始的吗?
bingshuihuo888
发表于 2011-6-24 22:02:17
标记!!!!!
Garbage614
发表于 2011-6-28 10:26:12
mark
bingshuihuo888
发表于 2011-6-28 13:49:53
mark
ervinzz
发表于 2011-6-28 20:53:16
回复【265楼】babytaomail 陶子
-----------------------------------------------------------------------
你这弄的是51机子上的吧……不适合用在AVR上 光是定义位操作DQ就不行,AVR还要考虑IO的输入输出设置的你上面的IO都是输出情况很显然不行的!
ervinzz
发表于 2011-6-28 20:55:15
回复【267楼】CSU David
-----------------------------------------------------------------------
为什么 我没调成功呢哭……
ervinzz
发表于 2011-6-28 21:19:54
回复【267楼】CSU David
-----------------------------------------------------------------------
void disp()
{
PORTA=dula;
PORTC=wela;
_delay_us(10);
PORTA=dula;
PORTC=wela;
_delay_us(10);
}
int main()
{
DDRA=0xff;
DDRC=0xff;
PORTA=0x00;
PORTC=0xff;
while(1)
{
gettemp();
_delay_ms(1);
disp();
}
}
这是我的显示程序还有主函数 帮我看看哪里有问题 怎么烧进去没反应呢谢谢!(省略了借用楼主的代码)
liguanglei
发表于 2011-7-2 00:24:33
MARK
jinjinge
发表于 2011-7-13 18:28:47
#define CLR_DIR_1WIRE DDRC&=~BIT(2)
请问楼主,这句里的 DDRC&=~BIT(2)里的BIT(2),是什么意思呀,什么函数?怎么用来的?
感谢
zhangchenggong
发表于 2011-7-16 10:30:58
又学到不少,谢谢
yikuang
发表于 2011-12-7 21:20:23
mark
LSZD
发表于 2011-12-7 23:53:11
回复【283楼】yikuang
mark
-----------------------------------------------------------------------
void_delay
发表于 2011-12-8 04:13:05
ding la
ap0405209
发表于 2011-12-8 11:37:23
DS18B20头文件!绝对好使!还使用方便!M16 8M 的!
shiqj
发表于 2011-12-8 12:08:57
mark
yaozi321
发表于 2011-12-8 15:37:47
我还有mega1288的,pic的,谁要?
xingpoull
发表于 2011-12-8 21:20:36
回复【楼主位】hhrfjz ---
-----------------------------------------------------------------------
刚好要用到这个,你那个数据线是接在PC.2口?
xingpoull
发表于 2011-12-8 21:27:31
回复【23楼】panxiaoyi 啊艺
-----------------------------------------------------------------------
是在佩服,能求指点吗?
evileva
发表于 2011-12-10 14:22:11
mark一下先,谢谢楼主了!
airfex
发表于 2012-2-2 22:43:15
谢谢楼主和楼上各位,下载学习了
jack_yu
发表于 2012-2-3 09:26:44
受教了.谢谢大家!
ba4wi
发表于 2012-2-6 10:18:30
这个有点意思。收藏先。
jz701209李
发表于 2013-4-10 20:11:07
不错,收藏了
zhexuejia
发表于 2013-5-6 00:15:35
不错的 顶个
lchunsong
发表于 2013-6-18 14:48:58
CPU为STM32F107,系统时钟为72M可以用吗
308343327
发表于 2013-6-19 12:05:10
顶一下,学习学习