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

📄 ds18b20-shm-c51-avr.c

📁 8个数码管显示时钟程序,LED数字钟,流水灯程序,红外遥控,键控看门狗程序
💻 C
字号:
/*******************************************************************/
/*                                                                 */
/* ME300B单片机开发系统演示程序 - DS18B20温度显示                  */
/*                                                                 */
/* 8数码管显示两个DS18B20的温度值                                  */
/*                                                                 */
/*工作芯片:ATMGA8515L   工作频率:8MHz                            */
/*                                                                 */
/* 版本: V1.0 (2006/11/20)                                        */
/* 作者: gguoqing (Email: gguoqing@willar.com)                    */
/* 网站: www.willar.com(伟纳电子)   www.mcusj.com(伟纳单片机世界) */
/* 邮箱: support@willar.com                                       */
/*                                                                 */                                                               
/*【版权】Copyright(C)伟纳电子 www.willar.com  All Rights Reserved */
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       */
/*                                                                 */
/*******************************************************************/

#include "avr/io.h"      //头文件
#include "avr/delay.h"   //头文件

#define  BEEP  PD7       //蜂鸣器
#define  DQ    PD3	     //ds18b20的DQ
#define  FREQ  8         //芯片工作频率

#define uchar unsigned char
#define uint  unsigned int

uchar presence,flash=0,ch;

uchar  LEDData[ ]   =  {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                        0x80,0x90,0xff,0xbf};
									  
uchar temp_data[2] =   {0x00,0x00};

uchar display[5] =     {0x00,0x00,0x00,0x00,0x00};

uchar ditab[16] =      {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                        0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
								
uchar RomCode[2][8] = {
                        {0x28,0xd6,0x31,0x8a,0x00,0x00,0x00,0xe3},
                        {0x28,0x0e,0x4e,0xb3,0x00,0x00,0x00,0x5f}
                       }; //二维数组
 
/********************************************************/
/*                                                      */
/* N*ms延时函数                                         */
/*                                                      */
/********************************************************/    
void delay_nms(uint n)        
   { 
      uint i=0 ; 
      for (i=0 ;i<n ;i++) 
      _delay_loop_2(250*FREQ) ;
   }
 
/********************************************************/
/*                                                      */
/* y*us延时函数                                         */
/*                                                      */
/********************************************************/   
void  Delay(uint y)
  { 
    _delay_loop_2(2*y);
  }
  
/********************************************************/
/*                                                      */
/* 蜂鸣器驱动函数                                       */
/*                                                      */
/********************************************************/
void beep(void)
  {
    uchar i;
    for (i=0;i<100;i++)
    {
      PORTD&=~_BV(BEEP);
      Delay(500);
      PORTD=_BV(BEEP);
      Delay(500);
    } 
    PORTD|=_BV(BEEP);           //关闭蜂鸣器
	delay_nms(200); 
  } 
   
/********************************************************/
/*                                                      */
/* IO口初始化                                            */
/*                                                      */
/********************************************************/
void  init_io(void)
  {
    DDRA=0xFF;       //置PA口输出
    PORTA=0xFF;      //PA口设置内部上拉电阻 
    DDRB=0xFF;       //置PB口输出
    PORTB=0xFF;      //PB口设置内部上拉电阻
    DDRC=0xFF;       //置PC口输出
    PORTC=0xFF;      //PC口设置内部上拉电阻
    DDRD=0xFF;       //置PD口输出
    PORTD=0xFF;      //PD口设置内部上拉电阻
  }

/*********************************************************/
/*                                                       */
/* 初始化DS18B20                                         */ 
/*                                                       */ 
/*********************************************************/
int Init_DS18B20(void)
{    
    PORTD|=_BV(DQ);       //DQ复位
    Delay(70);            //稍做延时70us    

    PORTD&=~_BV(DQ);      //将DQ拉低  
    Delay(780);           //精确延时780us 大于 480us
    PORTD|=_BV(DQ);       //拉高总线
    
    DDRD&=~_BV(DQ);       //置PD3为输入
    Delay(70);            //稍做延时
   
    if(PIND&_BV(DQ))      //如果=0则初始化成功 =1则初始化失败
     presence = 1;
    else  
	 presence = 0;
          
    Delay(870);           //精确延时870us
    DDRD  |=_BV(DQ);      //置PD3为输出 
    PORTD |=_BV(DQ);      //释放总线 
     
    return(presence);    //返回信号,0=presence,1= no presence
}
/*********************************************************/
/*                                                       */
/* 读一个字节                                            */
/*                                                       */
/*********************************************************/
int ReadOneChar(void)
{
  uchar i = 0;
  uchar dat = 0;

  for (i = 8; i > 0; i--)
  {
    PORTD&=~_BV(DQ);      //总线为低电平
    dat >>= 1;
    
    PORTD|=_BV(DQ);       //总线为高电平(释放总线)   
    DDRD&=~_BV(DQ);       //置PD3为输入
        
    if(PIND&_BV(DQ))
    dat |= 0x80;
    Delay(70);
    DDRD |=_BV(DQ);  
    PORTD|=_BV(DQ);  
  }
   return (dat);
}

/**********************************************************/
/*                                                        */
/* 写一个字节                                             */
/*                                                        */
/**********************************************************/
void WriteOneChar(uchar dat)
{
  unsigned char i = 0;
  
  for (i = 8; i > 0; i--)
  {
    PORTD&=~_BV(DQ);
 
    if(dat&0x01)
     PORTD|=_BV(DQ);      //写"1" 
	else     
	 PORTD&=~_BV(DQ);     //写"0"

    Delay(70);
    PORTD|=_BV(DQ);        
    dat>>=1;
  }
}

/*********************************************************/
/*                                                       */
/* 读取温度                                              */
/*                                                       */
/*********************************************************/
void Read_Temperature(uchar x)
{
   uchar  i;
   Init_DS18B20();
   if(presence)
   { beep();}
   else        
   {
     WriteOneChar(0xCC);       //跳过读序号列号的操作
     WriteOneChar(0x44);       //启动温度转换

     Init_DS18B20();
//   WriteOneChar(0xCC);        //跳过读序号列号的操作
     WriteOneChar(0x55);        //匹配ROM命令
     for(i=0;i<8;i++)
     {
       WriteOneChar(RomCode[x][i]);
	 }
     WriteOneChar(0xBE);        //读取温度寄存器
     
     temp_data[0] = ReadOneChar();   //温度低8位
     temp_data[1] = ReadOneChar();   //温度高8位
    }
}

/*********************************************************/
/*                                                       */
/* 数据处理与温度显示                                    */
/*                                                       */
/*********************************************************/
void Disp_Temperature(uchar ch)
{
  display[4]=temp_data[0]&0x0f;
  display[0]=ditab[display[4]]; //查表得小数位的值
  
  display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
  display[3]=display[4]/100;
  display[1]=display[4]%100;
  display[2]=display[1]/10;
  display[1]=display[1]%10;

  if(!display[3])               //高位为0,不显示
  { 
    display[3]=0x0a;              
    if(!display[2])             //次高位为0,不显示
     display[2]=0x0a;
  }

   PORTA = 0xc6;                 //显示 C
   PORTC = 0x7f;
   delay_nms(1);

   PORTA = 0x9c;                 //显示 °  
   PORTC = 0xbf;
   delay_nms(1);

   PORTA =LEDData[display[0]];  //显示小数位
   PORTC = 0xdf;
   delay_nms(1);

   PORTA =LEDData[display[1]];  //显示个位
   PORTA &=~_BV(PA7);           //显示小数点
   PORTC = 0xef;
   delay_nms(1);

   PORTA =LEDData[display[2]];  //显示十位
   PORTC = 0xf7;
   delay_nms(1);

   PORTA =LEDData[display[3]];  //显示十位
   PORTC = 0xfb;
   delay_nms(1);
   
   PORTA =LEDData[0x0b];        //显示 "-"
   PORTC = 0xfd; 
   delay_nms(1);
   
   PORTA =LEDData[ch+1];        //显示通道号
   PORTC = 0xfe; 
   delay_nms(1);
   
   PORTC = 0xff;                //关闭显示
}

/********************************************************/
/*                                                      */
/* 主函数                                               */
/*                                                      */
/********************************************************/

int main(void)
{      
   init_io();                        //芯片初始化端口
   uint  time;  
   while(1)
    {
                                     //第一个DS18B20
	  for(time=0;time<200;time++)
	  {
        Read_Temperature(0);	     //读温度值          
        if(presence)
	     {PORTC = 0xff;}             //DS18B20不正常,关闭显示
	    else  Disp_Temperature(0);  //显示温度
      }
    
	                                 //第二个DS18B20
      for(time=0;time<200;time++)
	  {     
        Read_Temperature(1);        //读温度值
	    if(presence)             
	     {PORTC = 0xff ;}           //DS18B20不正常,关闭显示 
	    else  Disp_Temperature(1);  //显示温度
      }
    }
}   
/********************************************************/

⌨️ 快捷键说明

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