您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机AVR温度计DS18B20 正文
AVR温度计DS18B20

AVR温度计DS18B20

点击数:7241 次   录入时间:03-04 11:44:59   整理:http://www.55dianzi.com   AVR单片机
{               
  unsigned char n=8; 
  while(n>0) 
  {   
    n--; 
    SDIN=data<<7-n>>7;   //先发送数据高位MSB,后发送数据低位LSB 
    SCLK=0; SCLK=1;      //产生一个时钟 
  } 
}   
/*上面的是模拟SPI发送数据函数,下面的是硬件SPI发送数据函数 
void lcd_write(unsigned char data) 
{  
  SPCR=80; 
  SPDR=data;             //开始发送数据 
  while((SPSR>>7)==0);   //等待发送接收结束 
}        */ 

//======================================================================================= 
void lcd_cls(void)       //nokia3310清屏,光标复位 

  unsigned int  i=0;  
  DC=0; 
  lcd_write(128);        //光标回到0列 
  lcd_write(64);         //光标回到0行 
  DC=1;                  //准备写数据 
  for(i=0;i<504;i++)     //写504个0数据,就是清屏 
  lcd_write(0); 
}  

//======================================================================================= 
         
void lcd_init(void)      //nokia3310初始化函数 
{  
  RESET_DDRn =1;         //设置4个驱动LCD的IO脚为输出
  DC_DDRn    =1;
  SDIN_DDRn  =1;
  SCLK_DDRn  =1;
  RESET=0;     
  RESET=1;               //复位结束 
  DC=0;                  //准备写指令 
  lcd_write(32+1);       //进入扩展指令
  lcd_write(128+38);     //设置Vop,相当于亮度  
  lcd_write(4+3);        //设置温度系数,相当于对比度   
  lcd_write(16+3);       //设置偏置,这句要与不要的实际效果好像一样
  lcd_write(32+0);       //进入基本指令
  lcd_write(12);         //使能芯片活动/垂直寻址
}  

//======================================================================================= 

//光标定位,x(0-83)是列地址,y(0-5)是行地址     
void lcd_gotoxy(unsigned char x,unsigned char y) 

  DC=0; 
  lcd_write(x+128); 
  lcd_write(y+64); 

//======================================================================================= 
     
void lcd_putchar(unsigned char character) //显示ASCII值的字符 

  unsigned char i=0; 
  unsigned int No; 
  No=character-32;       //字模数据是由空格开始,空格字符的ASCII的值就是32 
  No=No*5;               //每个字符的字模是5个字节 
  DC=1;  
  while(i<5)             //一个字符的字模是5个字节,就是5*8点阵 
     { 
       lcd_write(data[No]);   
       i++; 
       No++; 
     } 
  lcd_write(0);          //每个字符之间空一列 
}   

//===================================================================================== 

void lcd_put(unsigned char byte_data) //以十进制显示一个字符变量
{
  lcd_putchar(byte_data/100+48);      //百位数转化为ASCII值再显示
  lcd_putchar(byte_data/10%10+48);    //十位数转化为ASCII值再显示
  lcd_putchar(byte_data%10+48);       //个位数转化为ASCII再再显示
}

//=====================================================================================

void lcd_puthex(unsigned char byte_data)   //以十六进制显示一个字节变量
{
  unsigned char data;
 
  data=byte_data>>4;                             //求高4位
  if(data<10) data+=48; else data+=55; //转化为ASCII值
  lcd_putchar(data);                             //显示
 
  data=byte_data&15;                             //求低4位
  if(data<10) data+=48; else data+=55; //转化为ASCII值
  lcd_putchar(data);                             //显示
}

//===================================================================================== 

void lcd_putsf(flash unsigned char *string , unsigned char n) //显示FLASH里面的字符串 
{         
  unsigned char i=0; 
  while(i<n) 
       {   
         lcd_putchar( string[ i ] );    //顺序显示字符 
         i++;                          
       } 
}

//**********************************************************************************

//**********************************************************************************

常用的CRC校验有CRC8、CRC16、CRC32等,DS18B20数字温度器件就是采用CRC8的校验方式,下面是CVAVR集成的CRC8校验函数

#include <mega48.h>
#include <1wire.h>
unsigned char a[]={0x28,0x6D,0x00,0x85,0x00,0x00,0x00,0xCF};
unsigned char crc8;
main()

  while(1)
       {
         crc8=w1_dow_crc8(a,7); //求数组a的前7个数的CRC8校验码
       }
}

上面的例子中,数组a的8个数据就是我的DS18B20的ID码,0x28是器件的家族码,0x6D,0x00,0x85,0x00,0x00,0x00这6个数就是ID码,0xCF是前面7个数的校验码

用AVR Studio调试上面的程序就可以看到,crc8的结果就是0xCF了

也可以自己写函数,功能与上面的一样

unsigned char crc8(unsigned char *ptr, unsigned char len) 

上一页  [1] [2] [3] [4]  下一页


本文关键字:温度计  AVR单片机单片机-工控设备 - AVR单片机

《AVR温度计DS18B20》相关文章>>>