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

📄 good.txt

📁 利用51单片机做的一个闹钟程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
{   //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 + -