DIY高精度时钟、温度显示器Ds3231+12864+ds18b20+89c51 - 图文 联系客服

发布时间 : 星期日 文章DIY高精度时钟、温度显示器Ds3231+12864+ds18b20+89c51 - 图文更新完毕开始阅读3e9e625049649b6648d74799

void ReadTemperature(void) 高位放tempH;)// {

//读温度值(低位放tempL;

Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳过读序列号的操作 WriteOneChar(0x44); //启动温度转换 delay(125); //转换需要一点时间,延时 Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳过读序列号的操作

WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位) tempL=ReadOneChar(); //读出温度的低位LSB tempH=ReadOneChar(); //读出温度的高位MSB

if(tempH>0x7f) //最高位为1时温度是负 {

tempL=~tempL; //补码转换,取反加一 tempH=~tempH+1; fg=0; //读取温度为负时fg=0 }

sdata = tempL/16+tempH*16; //整数部分 xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位 xiaoshu2 = (tempL&0x0f)*100/16;//小数第二位 t[0]=numbr[sdata/10]; t[1]=numbr[sdata]; t[3]=numbr[xiaoshu1]; t[4]=numbr[xiaoshu2]; }

/*****************************************ds3231********************************************/

#define ADDRTW 0xD0 //器件写地址 #define ADDRTD 0xD1 //器件读地址 #define DS3231_SEC 0x00 //秒 #define DS3231_MIN 0x01 //分 #define DS3231_HOUR 0x02 //时 #define DS3231_DAY 0x03 //星期 #define DS3231_DATE 0x04 //日 #define DS3231_MONTH 0x05 //月 #define DS3231_YEAR 0x06 //年 //闹铃1

#define DS3231_Al1SEC 0x07 //秒 #define DS3231_AL1MIN 0x08 //分

#define DS3231_AL1HOUR 0x09 //时

#define DS3231_AL1DAY 0x0A //星期/日 //闹铃2

#define DS3231_AL2MIN 0x0b //分 #define DS3231_AL2HOUR 0x0c //时

#define DS3231_AL2DAY 0x0d //星期/日 #define DS3231_CONTROL 0x0e //控制寄存器 #define DS3231_STATUS 0x0f //状态寄存器 bit ack;

uchar BCD2HEX(uchar val) //BCD转换为Byte { uchar i; i= val&0x0f; val >>= 4; val &= 0x0f; val *= 10; i += val;

return i; }

uchar HEX2BCD(uchar val)//B码转换为BCD码 { uchar i,j,k; i=val/10; j=val; k=j+(i<<4); return k; }

void Start() {

SDA=1; //发送起始条件的数据信号 delay(1); SCL=1;

delay(5); //起始条件建立时间大于4.7us,延时 SDA=0; //发送起始信号

delay(5); // 起始条件锁定时间大于4μs

SCL=0; //钳住I2C总线,准备发送或接收数据 delay(2); }

void Stop() {

SDA=0; //发送结束条件的数据信号 delay(1); //发送结束条件的时钟信号

SCL=1; //结束条件建立时间大于4us delay(5);

SDA=1; //发送I2C总线结束信号 delay(4); }

/********************************************************/

/******************************************************************* 字节数据发送函数 函数原型: void SendByte(uchar Dat);

功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) ack=1 发送数据正常,

ack=0 被控器无应答或损坏。

********************************************************************/ void SendByte(uchar Dat) {

uchar BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位 {

if((Dat<

SDA=1; //判断发送位 else

SDA=0; delay(1);

SCL=1; //置时钟线为高,通知被控器开始接收数据位

delay(5); //保证时钟高电平周期大于4μs SCL=0; }

delay(2);

SDA=1; //8位发送完后释放数据线,准备接收应答位

delay(2); SCL=1; delay(3); if(SDA==1)

ack=0;

else

ack=1; //判断是否接收到应答信号 SCL=0; delay(2); }

uchar RcvByte() // 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机。 {

uchar retc; uchar BitCnt;

retc=0;

SDA=1; //置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt++) {

delay(1);

SCL=0; //置时钟线为低,准备接收数据位

delay(5); //时钟低电平周期大于4.7μs

SCL=1; //置时钟线为高使数据线上数据有效 delay(3); retc=retc<<1; if(SDA==1)

retc=retc+1; //读数据位,接收的数据位放入retc中 delay(2); }

SCL=0; delay(2); return(retc); }

void I2CACK(bit a) // 功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) {

if(a==0)

SDA=0; //在此发出应答或非应答信号 else

SDA=1; delay(3); SCL=1;