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

📄 测温和显示可用.c

📁 单片机访问多片DS18B20,同时显示在SPI控制的8位8段数码管上,其中用到DS18B20的单总线技术,还有演示程序截图,其中主控单片机为MEGA16
💻 C
字号:

#include <mega16.h>
#include "delay.h"
// SPI functions
#include <spi.h> 

#define data_out PORTA.0
#define data_en DDRA.0
#define data_in PINA.0  

// 1 Wire Bus functions
#asm
   .equ __w1_port=0x1B ;PORTA
   .equ __w1_bit=0
#endasm
#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds1820.h>  
#define MAX_DS1820 2
unsigned char ds1820_devices;
unsigned char code[8];  
//eeprom unsigned char DS_mount;   //18B20个数
//eeprom unsigned char ds1820_rom_codes[MAX_DS1820][8];  //18b20的序列号
unsigned char DS_mount;   //18B20个数
unsigned char ds1820_rom_codes[MAX_DS1820][8];  //18b20的序列号
 
// Declare your global variables here
unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
//flash unsigned char seriouscode[64][8];     
float w=0.0;   
//*******************************************
//            74HC595驱动程序
     

unsigned char SPI_W_R(unsigned char data)
{
	SPCR=0x50;                  //SPI为查询方式,系统时钟四分频
	SPDR=data;                  //写入数据
	while((SPSR>>7)==0x00);     //等待数据发送完毕
	return SPDR;                //返回收到的数据  
 
}

//*******************************************************************
//                     温度测量
void init18b20()
{data_en=1;//置位输出状态
 data_out=1;
 data_out=0;
 delay_us(490);
 data_out=1;
 data_en=0;
 delay_us(20);
 while(data_in);
 data_en=1;
 data_out=1;
 delay_us(140);
 }
void write18b20(unsigned char n)
{ unsigned char m;  
    for(m=0;m<8;m++)  
    {  
       data_out=0;  
       data_out=n&1; 
       delay_us(40);   //15~60us  
       data_out=1; 
       n=n>>1; 
    }  
     data_out=1;  
 }
unsigned char read18b20()
{unsigned char temp,k,n;  
 temp=0;
 data_en=1;  
 for(n=0;n<8;n++)  
   {  
   data_out=0;  
   data_out=1;  
   data_en=0;  
   k=(data_in);    //读数据,从低位开始  
   if(k)  
   temp|=(1<<n);  
   else  
   temp&=~(1<<n);  
   delay_us(100); //60~120us      
   data_en=1;  
     }  
   return (temp);  
 }
 

 
unsigned int gettemperature(char codes[8])
{unsigned char k,temh,teml;//wm0,wm1,wm2,wm3;  
     init18b20();        //复位18b20   
     write18b20(0xcc);   // 发出转换命令   
     write18b20(0x44);   // 发出转换命令  
     delay_ms(800); 
     init18b20();
     write18b20(0x55);
     for(k=0;k<8;k++) {write18b20(codes[k]);delay_us(6);}
  //   write18b20(0xcc);   // 发出转换命令   
//     write18b20(0x44);   // 发出转换命令     
   //   init18b20();
  //    write18b20(0x55);
  //     for(k=0;k<8;k++) write18b20(codes[k]); 
//  delay_ms(800);
     write18b20(0xbe);  
     teml=read18b20();  //读数据  
     temh=read18b20(); 
     return (unsigned int)temh*256+(unsigned int)teml; 
     //wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99啦! 
     //wm1=temh<<4; 
     //wm2=wm1+wm0;        //16进制转10进制 
     //wm3=wm2/100; 
     //wmh=(wm2%100)/10;   //出口参数了!wmh是显示的高位,wml使显示的低位 
     //wml=(wm2%100)%10; 
 }  

void main(void)
{bit flag;   //初始化18B20时,开关开着,且没有读到一个18b20时为0
 int value;  
 char i,j;  
 DDRB=0xff;
 PORTB=0xff;
 DDRC=0x00;
 PORTC=0xff; 
 for(i=0;i<8;i++)
  {
   SPI_W_R(0xff);
   PORTB.0=0;
   delay_us(10);
   PORTB.0=1; 
   }   

   while(PINC.1==0)
   {     

     if(PINC.0==1&&flag==0)
      {
       init18b20();
       write18b20(0x33);
       for(i=0;i<8;i++){code[i]=read18b20();}
       for(i=0;i<8;i++){ds1820_rom_codes[DS_mount][i]=code[i];}
       DS_mount++;
       flag=1;
       }
     if(PINC.0==0)flag=0;
    }    
//      SPI_W_R(disp[DS_mount]); 
//     init18b20();        //复位18b20  
//     write18b20(0xcc);   // 发出转换命令   
//     write18b20(0x44);   // 发出转换命令  
//     delay_ms(800);
 while (1)
      {
  
   /*  
     value=gettemperature();
     w=(float)value;
     w/=16;  
     
     SPI_W_R(disp[(int)(w*10)%10]);
     SPI_W_R(disp[(int)w%10]); 
     SPI_W_R(disp[(int)w/10]); 
     SPI_W_R(disp[ds1820_devices]);   
     */  
  
     for(i=0;i<DS_mount;i++) 
     {
      value=gettemperature(ds1820_rom_codes[i]);
      w=(float)value;
      w/=16;  

      SPI_W_R(disp[(int)(w*10)%10]);
      SPI_W_R(disp[(int)w%10]); 
      SPI_W_R(disp[(int)(w/10)]); 
      SPI_W_R(0x0ff);
      SPI_W_R(disp[i]);      
      SPI_W_R(disp[0]); 

      PORTB.0=0;
      delay_us(10);
      PORTB.0=1; 
      delay_ms(1000);  
      }
     
      }
}
 

⌨️ 快捷键说明

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