avr m8 18b20 调试程序

程序从maxim官方程序和论坛上程序修改而来,可以在串口打印每一个操作,配合我上传的zoc软件效果很赞,

我的第一个18b20 程序,注释详细。用avr studio5编写。

欢迎拍砖 

ps:avr studio 5太炫了

其他程序会在下载链接中打包给

#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "uart.h"
//定义UART流文件
FILE UartStream = FDEV_SETUP_STREAM(UartPutchar, UartGetchar, _FDEV_SETUP_RW);

/******************************************************
*********************输出调试信息***********************
****************如不需调试,注释掉这句即可****************
*******************************************************/
#define DEBUG
/*******************************************************
*******************************************************/
//1-Wire通信基本操作宏
//切换到写模式
#define OW_W_MODE() (DDRD |= _BV(PD3))
//切换到读模式
#define OW_R_MODE() (DDRD &= ~_BV(PD3))
#define OW_SET() (PORTD |= _BV(PD3))
#define OW_CLR() (PORTD &= ~_BV(PD3))
#define OW_STA() ((PIND & _BV(PD3))>>PD3)

//1-Wire通信标准速度时间常数
#define A 6
#define B 64
#define C 60
#define D 10
#define E 9
#define F 55
#define G 0
#define H 480
#define I 70
#define J 410

//1-Wire复位 没有检测到设备返回1否则返回0
uint8_t OWReset(void)
{
 uint8_t result;

 OW_W_MODE();
 _delay_us(G);
 OW_CLR();
 _delay_us(H);
 OW_SET();
 _delay_us(I);
 OW_R_MODE();
 result = OW_STA();
 _delay_us(J);
 #ifdef DEBUG
 if (result)
 {
  printf_P(PSTR("no rest\r\n"));
 }
 else
 {
  printf_P(PSTR("rest\r\n"));
 }
 #endif
 return result;
}

//从1-Wire设备读一位
uint8_t OWReadBit(void)
{
 uint8_t result;
 
 OW_W_MODE();
 OW_CLR();
 _delay_us(A);
 OW_SET();
 _delay_us(E);
 OW_R_MODE();
 result = OW_STA();
 _delay_us(F);

 return result;
}

//从1-Wire设备读一个字节
uint8_t OWReadByte(void)
{
 uint8_t result = 0;

 for(uint8_t loop=0; loop<8; loop++)
 {
  result >>= 1;
  if (OWReadBit())
   result |= 0x80;
 }
 #ifdef DEBUG
 printf_P(PSTR("read 1 byte %x\r\n"),result);
 #endif
 return result;
}

//向1-Wire设备写一位
void OWWriteBit(uint8_t bit)
{
 OW_W_MODE();
 if (bit)
 {
  OW_CLR();
  _delay_us(A);
  OW_SET();
  _delay_us(B);
 }
 else
 {
  OW_CLR();
  _delay_us(C);
  OW_SET();
  _delay_us(D); 
 }
}

//向1-Wire设备写一个字节
void OWWriteByte(uint8_t data)
{
 #ifdef DEBUG
 printf_P(PSTR("write 1 byte %x\r\n"),data);
 #endif
 for(uint8_t loop = 0; loop < 8; loop++)
 {
  OWWriteBit(data & 0x01);
  data >>= 1;
 }
}

//读取DS18B20温度
int16_t TemperatureQuery(void)
{
 if(OWReset())  //总线复位没有检测到设备为1,返回值为0
  return 0;
 //检测到总线上有设备
 OWWriteByte(0xCC); //跳过ROM
 OWWriteByte(0x44); //启动转换指令
 
 _delay_ms(750);  //等待12位最大转换时间
 
 if(OWReset())  //总线复位
  return 0;
 OWWriteByte(0xCC); //跳过ROM
 OWWriteByte(0xBE); //读数据指令
 uint8_t tempL= OWReadByte(); //读取低字节
 uint8_t tempH = OWReadByte(); //读取高字节
 #ifdef DEBUG
 printf_P(PSTR("temph is : %x templ is : %x\r\n"), tempH,tempL);
 #endif
 //寄存器数据转化为摄氏温度
 return (((tempH>>3) ? -1:1) * ((0x7&tempH)<<8 | tempL)*6.25 ); //*6.25保留两位小数,*0.625保留一位,*0.0625避免用double,float运算
}

int main(void)
{
 
 UartInit(19200);  //UART初始化
 //绑定标准输入输出到流文件
 stdout = stdin = &UartStream;

 while(1)
 {
  int16_t tempera=TemperatureQuery();
  //温度通过RS232发送到超级终端上
  printf_P(PSTR("Current temperature is: %d.%d\r\n\r\n"), tempera/100,tempera%100);//不支持%f输出
  _delay_ms(1000);
 }
}

 下载链接

http://download.csdn.net/source/3505859

猜你喜欢

转载自blog.csdn.net/catshit322/article/details/6672715