DIY编程器网
标题:
18B20通讯程序--源代码介绍
[打印本页]
作者:
liyf
时间:
2012-1-16 16:43
标题:
18B20通讯程序--源代码介绍
这是我在16F877,18F1320,18F1220上通过的18b20程序,18b20主要是延时问题,这个解决了,什么都可以通过。
[原作者没有提供所使用的编译器,由于是C程序,所以大同小异,建议使用时,确认是否与你的编译器兼容]
?
?
C程序
?#
include
#
define
uch
unsigned
char
#
define
unint
unsigned
int
#
define
DQ Rb3 //定义18b20数据端口#
define
DQ_DIR TRISb3 //定义18b20D口方向寄存器#
define
W1_INPUT 1#
define
W1_OUTPUT 0#
define
FALSE 0#
define
TRUE !FALSE#
define
DQ_HIGH() DQ_DIR = W1_INPUT#
define
DQ_LOW() DQ = 0; DQ_DIR = W1_OUTPUT
void
delay(unint x){unint d;d=x;
while
(--d){;}}
bit
reset(
void
) //初始化18b20{
static
bit
presence; //定义一个应答信号DQ_LOW();delay(70); //置总线为低电平并保持至少480usDQ_HIGH(); //等电阻拉高总线并保持15-60usdelay(5);presence=DQ; //接受应答信号delay(20); //延时60-240us
return
(presence); //返回应答信号}//*************** 读一位函数******************//
bit
read_bit(
void
){
static
bit
i;DQ_LOW();DQ_LOW();DQ_HIGH();asm("nop");asm("nop");asm("nop");i=DQ;delay(3);
return
(i);}//*********************写一位函数****************//
void
write_bit(uch bitval){DQ_LOW();delay(1);
if
(bitval==1){DQ_HIGH();}delay(3);DQ_HIGH();}//************** 从18b20中读一个字节**************//uch read_byte(
void
){uch i;uch j;uch value=0;
for
(i=0;i>i;temp&=0x01;write_bit(temp); //调写位函数}asm("nop");asm("nop");asm("nop");}
main
(){uch teml,temh;GIE=0;OSCCON=0X6E; //这是18F1320的频率选择寄存器ADCON1=0X7F;
do
{;}
while
(reset()) ; //复位等待从机应答write_byte(0XCC); //忽略ROM匹配write_byte(0X44); //发送温度转化命令delay(25000); //延时100-300us
do
{;}
while
( reset()); //再次复位,等待从机应答write_byte(0XCC); //忽略ROM匹配write_byte(0XbE); //发送读温度命令teml =read_byte(); //读出温度低8temh=read_byte(); //读出温度高8位DQ_HIGH(); //释放总线}
?
欢迎光临 DIY编程器网 (http://diybcq.com/)
Powered by Discuz! X3.2