⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18b20.c

📁 实现了AVR环境下的单总线器件18B20的操作
💻 C
字号:
//ICC-AVR application builder : 2007-7-15 17:38:07
// Target : M16
// Crystal: 1.0000Mhz

#include <iom16v.h>
#include <macros.h>
//#define ds18b20_dq PC5 
#define set_ds18b20_dq_ddr() DDRC|=0x04
#define set_ds18b20_dq() PORTC|=0x04
#define clr_ds18b20_dq() PORTC&=~0x04
#define clr_ds18b20_dq_ddr() DDRC&=~0x04
#define in_ds18b20_dq() PINC&0x04

#define ds18b20_read_rom 0x33 
#define ds18b20_match_rom 0x55 
#define ds18b20_skip_rom 0xcc 
#define ds18b20_search_rom 0xf0 
#define ds18b20_alarm_search_rom 0xec 
#define ds18b20_write_ram 0x4e 
#define ds18b20_read_ram 0xbe 
#define ds18b20_copy_ram 0x48 
#define ds18b20_convert_tem 0x44 
#define ds18b20_eecall_eeprom 0xb8 
#define ds18b20_read_power_supply 0xb4 
#define uchar unsigned char
#define uint  unsigned int
#define clk0 PORTB|=0x02//时钟宏定义port2接clk
#define clk1 PORTB&=~0x02
#define data1 PORTB|=0x01//数字宏定义port1接data
#define data0 PORTB&=~0x01

uchar table[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//数字编码
uchar table1[10]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};//带点编码
uchar pata[4]={0,0,0,0};//显存
uchar pata1[4]={0,0,0,0};
float t=0.0;//wenduzhi
uint temperature_low; 
uint temperature_high; 
	
	
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

void delay_ms(uint n)//10ms延时函数
{uint i,j;
 for(i=0;i<n;i++)
  {
   for(j=0;j<1000;j++){;}
  }
}


void delay_us(uint n)//us延时函数
{
    uint i,j;
    for(i=0;i<n;i++)
    {
        ;
      //for(j=0;j<1000;j++){;}
    }
}




void neirong1(int n)//此法优于上面的列表法
{
   uint ge,shi,bai,qian;
   ge=n%10;//取n的各位个位
   shi=n/10%10;//十位
   bai=n/100%10;//百位
   qian=n/1000;//千位 
   pata[0]=table[ge];//数字查表为该字符编码
   pata[1]=table[shi];
   pata[2]=table[bai];
   pata[3]=table[qian];
}


void display(uchar p[]) //数字显示程序...不含显示小数点且不累集
{
 uint i,j;
 for(j=0;j<4;j++)
     {for(i=0;i<8;i++)//八位全部显示完毕
	  {
		  if(p[j]&0x01)
		    data1;
		  else
		    data0;
	        clk0;//产生时钟脉冲
		    clk1;
		p[j]=p[j]>>1;//右移以便取下一位
	  }
     }
}



void convert_dianya(float t2)
 {
     float temp=t2;//未实际电压值
     float xiaoshu;//小数
     int zhenshu,t1;//t存储小数部分乘以十;整数;
    // temp=adc*5.03/1024.0;//转化为电压
     zhenshu=(int)temp;//取整数部分
     xiaoshu=temp-zhenshu;
     t1=xiaoshu*100;//江小树转换为整数
     pata[3]=table[zhenshu/10];
     pata[2]=table1[zhenshu%10];
     pata[1]=table[t1/10];
     pata[0]=table[t1%10];
 } 
 
 
 void reset_ds18b20(void) 
{ 
     set_ds18b20_dq_ddr();
     clr_ds18b20_dq(); 
     delay_us(3);//100us 
     delay_us(3);//100us 
     delay_us(3);//100us 
     delay_us(3);//100us 
	 delay_us(3);//100us 
     set_ds18b20_dq(); 
     delay_us(2);//20us 
} 


void ack_ds18b20(void) 
{ 
    while(in_ds18b20_dq()); 
    while(!(in_ds18b20_dq())); 
    delay_us(1);//20us 
} 


uchar read_ds18b20(void) 
{ 
     uchar data=0; 
     uchar i=0; 
    for(i=0;i<8;i++) 
    { 
      data>>=1; 
	  set_ds18b20_dq_ddr();//shuru
      clr_ds18b20_dq(); 
     // delay_us(1);//1us 
	  i=i;
      set_ds18b20_dq();
	  clr_ds18b20_dq_ddr();// shuru
      delay_us(2);//2us 
	  i=i;
	  i=i;
      if(in_ds18b20_dq()) data|=0x80; 
      delay_us(2);//60us 
} 
   return(data); 
} 


void write_ds18b20(uchar data) 
{ 
      uchar i=0; 
     for(i=0;i<8;i++) 
     { 
      if(data&0x01)
	  { 
	   set_ds18b20_dq_ddr();
       clr_ds18b20_dq(); 
       delay_us(1);//8us
       set_ds18b20_dq(); 
	   delay_us(2);//55us 
	   PORTC=PORTC;
	   PORTC=PORTC;
      } 
      else 
     { 
	  set_ds18b20_dq_ddr();
      clr_ds18b20_dq(); 
      delay_us(1);//55us
	  PORTC=PORTC; 
      set_ds18b20_dq(); 
      //delay_us(14);//8us
	  PORTC=PORTC;  
      } 
      data>>=1; 
     } 
} 

void convert_ds18b20(void) 
{ 
    reset_ds18b20(); 
  //  ack_ds18b20(); 
    delay_ms(1); 
    write_ds18b20(ds18b20_skip_rom); 
    write_ds18b20(ds18b20_convert_tem); 
} 

void read_temperature(void) 
{ 
    reset_ds18b20(); 
   // ack_ds18b20(); 
    delay_ms(1); 
    write_ds18b20(ds18b20_skip_rom); //rom中为序列号
    write_ds18b20(ds18b20_read_ram); 
    temperature_low=read_ds18b20(); 
    temperature_high=read_ds18b20(); 
} 

void main(void)
 {
   uint i;
   int temp;
   port_init();
   DDRB=0xff;
   PORTB=0x00;
   while(1)
   {
       convert_ds18b20();
	   delay_us(500); 
	   read_temperature();
	   temp=temperature_high<<8+temperature_low;
	   t=temp*0.0625;//转换为实际温度值
	  // t=13.23;
	   convert_dianya(t); 
	   display(pata);
	   delay_ms(200);
	 }
}
	 



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -