📄 good.txt
字号:
{ //SCL为高电平时,将SDA拉高,时钟芯片和单片机结束时钟信号传输
SDA=0;
SCL=1;
nop;
nop;
SDA=1;
nop;
nop;
}
void ic_SendByte(byte ic_data)
{ //SCL为低电平时,从低位到高位的顺序按位传输
unsigned int i,g;
unsigned char dat=ic_data;
for(i=0;i<8;++i)
{
dat=ic_data;
g=7-i;
if((dat>>g)&0x01)SDA=1; //判断发送位
else SDA=0;
SCL=1;
nop;
nop;
nop;
nop;
nop;
SCL=0;
nop;
nop;
nop;
nop;
nop;
}
}
byte ic_ReceiveByte(void)
{ //SCL被拉为高电平后, 从低位到高位的顺序按位读入
unsigned int result=0x00;
unsigned int i;
bit j;
SDA=1;
for(i=0;i<8;i++)
{
j=SDA;
nop;
SCL=1;
nop;
result=result<<1;
if(j==1)
result++;
nop;
nop;
SCL=0;
nop;
nop;
nop;
nop;
nop;
}
return result;
}
bit WaitAck(void)
{ //等待应答信号,SDA为1后拉高SCL等待一段时间,如果SDA被拉低则将SCL拉低,等待应答成功,反之失败
bit j;
bit r;
SDA=1;
nop;
SCL=1;
nop;
j=SDA;
if(j==0)
r=0;//应答成功.
else
r=1;
nop;
nop
SCL=0;
nop;
nop;
nop;
nop;
nop;
return r;
}
void SendAck(void)
{ //发送端发送应答信号,将SDA位置0后,SCL置1后清零
SDA=0;SCL=1;
nop;
nop;
nop;
nop;
SCL=0;
nop;
nop;
nop;
nop;
nop;
}
void SendNotAck(void)
{ //接收端发送非应答信号
SDA=1;
nop;
SCL=1;
nop;
nop;
nop;
nop;
SCL=0;
nop;
nop;
nop;
nop;
nop;
}
/*************************PCF8563******************************/
void GetPCF8563(uchar firsttype,uchar count,uchar * buff)
{ //读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取的字节数,则会一次把时间读取到buff中。顺序是:0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
ic_start();
ic_SendByte(0xA2);
WaitAck();
ic_SendByte(firsttype);
WaitAck();
ic_start();
ic_SendByte(0xA3);
WaitAck();
for(i = 0; i<count; i++)
{
buff[i] = ic_ReceiveByte();
if (i !=count-1)
SendAck();//除最后一个字节外,其他都要从MASTER发应答。
}
SendNotAck();
ic_end();
}
void SetPCF8563(uchar timetype,uchar value)
{ //调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式),0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
ic_start();
ic_SendByte(0xA2);
WaitAck();
ic_SendByte(timetype);
WaitAck();
ic_SendByte(value);
WaitAck();
ic_end();
}
void Readtemperature(void)
{ //读取温度值
if(save[7] > 7) //HDATA>7为负温度
{
tem_flag=0;
hd = ~(save[7]&0x07);
ld = ~(save[8]>>4);
result = hd*16 + ld;
dis_buf[13] = 10;
}
else
{
tem_flag = 1;
result = (save[7] & 0x07)*16 + (save[8] >> 4);//转换为十进制存到显示缓冲区
}
dis_buf[13] = (result/10); //温度值十位
dis_buf[14] = (result%10); //温度值个位
dis_buf[15] = belowzero[save[8]&0x0f]; //小数
}
/**************************刷新数码管**************************/
void ReadTime(type)
{ //刷新时钟数码管
switch(type)
{case 0:dis_buf[11] = save[0]&0x0f;
dis_buf[10] = save[0]>>4;
if(key2_time==type&&state==1&&change_alarm==1)
{temp[0]=dis_buf[10];temp[1]=dis_buf[11];}
break;
case 1:dis_buf[9]=save[1]&0x0f;
dis_buf[8]=save[1]>>4;
if(key2_time==type&&state==1&&change_alarm==1)
{temp[0]=dis_buf[8];temp[1]=dis_buf[9];}
break;
case 2:dis_buf[7]=save[2]&0x0f;
dis_buf[6]=save[2]>>4;
if(key2_time==type&&state==1&&change_alarm==1)
{temp[0]=dis_buf[6];temp[1]=dis_buf[7];}
break;
case 3:dis_buf[5]=save[3]&0x0f;
dis_buf[4]=save[3]>>4;
if(key2_time==type&&state==1&&change_alarm==1)
{temp[0]=dis_buf[4];temp[1]=dis_buf[5];}
break;
case 4:dis_buf[12]=save[4]&0x07;
if(key2_time==type&&state==1&&change_alarm==1)
{temp[0]=dis_buf[12];}
break;
case 5:dis_buf[3]=save[5]&0x0f;
dis_buf[2]=save[5]>>4;
if(key2_time==type&&state==1&&change_alarm==1)
{temp[0]=dis_buf[2];temp[1]=dis_buf[3];}
break;
case 6:dis_buf[1]=save[6]&0x0f;
dis_buf[0]=save[6]>>4;
if(key2_time==type&&state==1&&change_alarm==1)
{temp[0]=dis_buf[0];temp[1]=dis_buf[1];}
break;
}//switch
}//ReadTime()
void ReadTime2(type)
{ //刷新时钟数码管
switch(type)
{
case 1:dis_buf2[9]=save2[1]&0x0f;
dis_buf2[8]=save2[1]>>4;
if(key2_time==type&&state==1&&change_alarm==0)
{temp2[0]=dis_buf2[8];temp2[1]=dis_buf2[9];}
break;
case 2:dis_buf2[7]=save2[2]&0x0f;
dis_buf2[6]=save2[2]>>4;
if(key2_time==type&&state==1&&change_alarm==0)
{temp2[0]=dis_buf2[6];temp2[1]=dis_buf2[7];}
break;
case 3:dis_buf2[5]=save2[3]&0x0f;
dis_buf2[4]=save2[3]>>4;
if(key2_time==type&&state==1&&change_alarm==0)
{temp2[0]=dis_buf2[4];temp2[1]=dis_buf2[5];}
break;
case 4:dis_buf2[12]=save2[4]&0x07;
if(key2_time==type&&state==1&&change_alarm==0)
{temp2[0]=dis_buf2[12];}
break;
}//switch
}//ReadTime()
void dmsec (unsigned int count)
{
unsigned int i;
while (count)
{
i = 115;
while (i>0) i--;
count--;
}
}
/////////////////////////////////////// 发送复位//////////////////////////
void tmreset (void)
{
unsigned int i;
TMDAT = 0;
i = 50;
while (i>0) i--;
TMDAT = 1;
i = 2;
while (i>0) i--;
}
///////////////////////////////////// 读一位//////////////////////////////
bit tmrbit (void)
{
unsigned int i;
bit dat;
TMDAT = 0; i++;
TMDAT = 1; i++; i++;
dat = TMDAT;
i = 4; while (i>0) i--;
return (dat);
}
//////////////////////////////////////// 读一个字节///////////////////////
unsigned char tmrbyte (void)
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmrbit ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// 写一个字节////////////////////////
void tmwbyte (unsigned char dat) //
{ //
unsigned int i; //
unsigned char j; //
bit testb; //
for (j=1;j<=8;j++) //
{ //
testb = dat & 0x01; //
dat = dat >> 1; //
if (testb) //
{ //
TMDAT = 0; // 写0 //
i++; i++; //
TMDAT = 1; //
i = 4; while (i>0) i--; //
} //
else //
{ //
TMDAT = 0; // 写0 //
i = 4; while (i>0) i--; //
TMDAT = 1; //
i++; i++; //
} //
} //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////发送ds1820 开始转换//////////////////////
void tmstart (void) //
{ //
tmreset (); //复位 //
//tmpre (); //等待存在脉冲 //
dmsec (1); //延时 //
tmwbyte (0xcc); //跳过序列号命令 //
tmwbyte (0x44); //发转换命令 44H, //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////// 读取温度//////////////////////////////
void tmrtemp(void) //
{ //
//unsigned char a,b; //
tmreset (); //复位 //
//tmpre (); //等待存在脉冲 //
dmsec (1); //延时 //
tmwbyte (0xcc); //跳过序列号命令 //
tmwbyte (0xbe); //发送读取命令 //
save[8] = tmrbyte (); //读取低位温度 //
save[7] = tmrbyte (); //读取高位温度 //
//
} //
//////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -