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_OUTPUTvoid 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-240usreturn(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-300usdo{;}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