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

📄 ds1624.c

📁 ds1624.rar
💻 C
字号:
/**********************************
晶振:11.0592M
模拟I2C总线操作DS1624
2007/11/27
编写:fjh
/**********************************/
#include <iom128v.h>
#include <macros.h>
#include "lcd.c"
#define uchar unsigned char 
#define uint  unsigned int 
#define ulong  unsigned long 

#define SCL_H  PORTD|=(1<<0)
#define SCL_L  PORTD&=~(1<<0)

#define SDA_H  PORTD|=(1<<1)
#define SDA_L  PORTD&=~(1<<1)

unsigned char temperdata[2]={0,0};
unsigned char buffer[6]={1,1,1,1,1,1};

/******************应用程序********************/
void timer1_init(void);
void delay(uchar us);
void Start(void);
void Stop(void);
void SendByte(uchar Dat);
uchar ReceiveByte(uchar b);
void Start_Temperature_T(void);
void I2cByteRead(void);
void data_to_buffer(uint a);
void Display(void);
/**********************************************/
void port_init(void)
{
 PORTA = 0xff;
 DDRA  = 0xff;
 
 PORTB = 0xff;
 DDRB  = 0xff;
 
 PORTC = 0xff; 
 DDRC  = 0xff;
 
 PORTD = 0xff;
 DDRD  = 0xff;
 
 PORTE = 0xff;
 DDRE  = 0xff;
 
 PORTF = 0xff;
 DDRF  = 0xff;
 
 PORTG = 0x00;
 DDRG  = 0x00;
}

// actual value:  1.000Sec (0.0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xD5; //setup
 TCNT1L = 0xD1;
 OCR1AH = 0x2A;
 OCR1AL = 0x2F;
 OCR1BH = 0x2A;
 OCR1BL = 0x2F;
 OCR1CH = 0x2A;
 OCR1CL = 0x2F;
 ICR1H  = 0x2A;
 ICR1L  = 0x2F;
 TCCR1A = 0x00;
 TCCR1B = 0x05; //start Timer
 TIMSK  = 0x04; //timer interrupt sources
}

#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{
    uint temperbuf=0;
	ulong temperbuff=0;
  //TIMER1 has overflowed
  TCNT1H = 0xD5; //reload counter high value
  TCNT1L = 0xD1; //reload counter low value
  PORTC=~PORTC;
  I2cByteRead();
  buffer[5]=temperdata[1]/10;
  buffer[4]=temperdata[1]%10;
  temperbuf=temperdata[0];
  temperbuf=(temperbuf>>3)*312;
  data_to_buffer(temperbuf);
  Display();
  Start_Temperature_T();
}

void delay(uchar us)
{
   while(us--);
}
/************************START***************************/
void Start(void)
{
  //SDA_H;
  delay(5);
  SCL_H;
  delay(5);
  SDA_L;
  delay(5);
  SCL_L;
  delay(5);
} 

void Stop(void)
{
  //SDA_L;
  delay(5);
  SCL_H;
  delay(5);
  SDA_H;
  delay(5);
  SCL_L;
  delay(5);  
}
/********************************************************/
/***********向I2C总线发送一个字节+接收一个ACK************/
void SendByte(uchar Dat)
{
  uchar i=0;
  uchar T_Data=0;
  
  DDRD|=(1<<1);//输出
  SCL_L; 
  delay(10);
  T_Data=Dat;
  for(i=0;i<8;i++)
    { 	  
  
	  if(T_Data&0x80)
	    SDA_H;
	  else 
	    SDA_L;
	  delay(5);
      SCL_L;
	  delay(5);
	  SCL_H;
	  delay(5);
	  T_Data=T_Data<<1;
	  SCL_L;
	  delay(5);
   }
  SDA_H;//释放总线 
  delay(5); 
  SCL_L;     /*********************/
  delay(5);//接收一个ACK,不做处理
  SCL_H;     /*********************/
  delay(5);

  SCL_L;
}
/********************************************************/
/**********从I2C总线上读取一个字节+发送一个ACK***********/
uchar ReceiveByte(uchar b)
{
  uchar i;
  uchar temp;
  uchar Dat;

  SDA_H;
  delay(5);
  SCL_L;
  delay(5);

  DDRD&=~(1<<1);//输入
  for(i=0;i<8;i++)
    {
	  SCL_H;
      delay(5);
 
	  Dat=Dat<<1;
	  delay(5);
	  temp=PIND;
	  if(temp&0x02)
	    Dat|=0x01;
	  else
	    Dat|=0x00;
	 delay(5);
	 SCL_L; 
	  delay(5); 
    }
  DDRD|=(1<<1);//输出
  
  if(b)//每收一个数后发送ACK或nACK
    SDA_H;
  else
    SDA_L;
	
  delay(5);
  SCL_H;
  delay(5);
  SCL_L;
  delay(5);
  SDA_H;        //释放总线
  delay(100);
  return Dat;
}
/****************************************************/
/***********将一个字节写入DS3231指定的地址***********/
void Start_Temperature_T(void)
{
  Start();
  SendByte(0x90);
  delay(5);
  SendByte(0xee);//
  delay(5);
  Stop();
}
/****************************************************/
/************从DS3231指定的地址读一个字节************/
void I2cByteRead(void)
{ 
  Start();
  SendByte(0x90);
  delay(5);
  SendByte(0xaa);
  delay(5);
  Start();//Restart
  SendByte(0x91);//读数
  delay(5);
  temperdata[1]=ReceiveByte(0);
  delay(5);
  temperdata[0]=ReceiveByte(1);//只接收一个字节,所以发nACK
  delay(2);
  Stop();
}
/***************************************************/
void data_to_buffer(uint a)
{
  uchar i;
  for(i=0;i<4;i++)
  {
    buffer[i]=a%10;
	a=a/10;
  }
}

void Display(void)
{
  disp_two_char (0x8a,tab[buffer[5]],tab[buffer[4]]);
  disp_two_char (0x8b,'.',tab[buffer[3]]);
  disp_two_char (0x8c,tab[buffer[2]],tab[buffer[1]]);  
  disp_one_char (0x8d,tab[buffer[0]]);  
  disp_one_word (0x8e,"℃");
}
/*******************MAIN函数*************************/
void main()
{  
  CLI();
  port_init();
  init_lcd ();
  lat_disp (0x00,0x00);
  chn_disp(tab1);
  delay1ms(5500);
  chn_disp(tab2);
  
  timer1_init();
  SCL_L;
  Stop();
  Start_Temperature_T();
  SEI();
  lat_disp (0x00,0x00);//显示点阵

  while(1)
    {
    }  
}

⌨️ 快捷键说明

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