📄 ds1624.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 + -