网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > C/C++ > 正文
18B20通讯程序-PIC_C/C++_开发语言_软件开发_天新网
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/11/27
下载{$ArticleTitle}原创论文样式

  这是我在16F877,18F1320,18F1220上通过的18B20程序,18B20主要是延时问题,这个解决了,什么都可以通过。

  [原作者没有提供所使用的编译器,由于是C程序,所以大同小异,建议使用时,确认是否与你的编译器兼容]

  C程序

#include <pic18f1220.h> 
#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); //置总线为低电平并保持至少480us
DQ_HIGH(); //等电阻拉高总线并保持15-60us
delay(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<8;i++) 
{ 
j=read_bit(); //调读位函数
if (j) //如果是 1 置1
{ 
value|=(0x01<<i); //先读低位,再读高位
asm("nop"); 
asm("nop"); 
asm("nop"); 
} 
} //否则置 0
return(value); 
} 
//*********************向18B20中 写一个字节**************//
void write_byte(uch val) 
{ 
uch i; 
uch temp; 
for (i=0;i<8;i++) 
{ 
temp=val>>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(); //读出温度低8
temh=read_byte(); //读出温度高8位
DQ_HIGH(); //释放总线
} 

(责任编辑:admin)

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号