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

📄 rw1302.c

📁 采用430单片机完成的门禁控制器程序
💻 C
字号:
//*************************************************************//
//片选信号使能
//*************************************************************//
void CE_Enable(void)
{
    P6OUT |= CE;
    return;
}
//*************************************************************//
//片选信号低电平的产生
//*************************************************************//
void CE_Disable(void)
{
    P6OUT &= ~(CE);
    return;
}
//*************************************************************//
//SCLK高电平的产生
//*************************************************************//
void SCLK_HI(void)
{
	P6OUT |= SCLK;
    return;
}
//*************************************************************//
//SCLK低电平的产生
//*************************************************************//
void SCLK_LO(void)
{
  P6OUT &= ~(SCLK);
  return;
}
//*************************************************************//
//数据发送,发送顺序是从最低位到最高位
//*************************************************************//
void WriteByte(uchar nVal) 
{ 
    char i,j;
    char nTemp = nVal;
    char nSend;
//设置DATA为输出管脚
    P6DIR |= DATA; 
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    for(i = 0; i < 8; i++)
    {
      nSend = (nTemp & 0x01);
      if(nSend == 1)
      {
        P6OUT |= DATA;
      }
      else
      {
        P6OUT &= ~(DATA);
      }
      SCLK_HI();
      for(j = 20; j > 0; j--) ;
      SCLK_LO();
      for(j = 20; j > 0; j--) ;
      nTemp >>= 1;
    } 
}
//*************************************************************//
//数据接收,接收顺序为从最低位到最高位。
//*************************************************************//
uchar ReadByte(void) 
{ 
    uchar nTemp = 0;
    uchar i;
    uchar j;
	//设置DATA为输入管脚
    P6DIR &=~DATA;
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    for(i = 0; i < 8; i++)
    {
        SCLK_HI();
        if(P6IN&DATA)
    	{
    	  nTemp |= (0x01 << i);
    	}
    	for(j = 10; j > 0; j--);
	SCLK_LO();
    } 
    return nTemp; 
}
//*************************************************************//
//DS1302的写操作。
//*************************************************************//
void WriteTo1302(uchar nAddr, uchar nVal)
{
	CE_Disable();
	SCLK_LO();
	CE_Enable();
	//地址,命令
	WriteByte(nAddr);
	//写1Byte数据
	WriteByte(nVal);
	SCLK_HI();
	CE_Disable();
	return;
}
//*************************************************************//
//采用BURST方式设置时间信息。
//*************************************************************//
void BurstWriteTime()
{
  if(FLAG & gb_wr1302)
  {
    FLAG &=~gb_wr1302;
    uchar i;
    clock[0] =RX_DATA[32];
    clock[0] |=RX_DATA[31]<<4;   //秒
    clock[1] =RX_DATA[30];
    clock[1] |=RX_DATA[29]<<4;   //分
    clock[2] =RX_DATA[28];
    clock[2] |=RX_DATA[27]<<4;   //时
    clock[3] =RX_DATA[24];
    clock[3] |=RX_DATA[23]<<4;    //日
    clock[4] =RX_DATA[22];
    clock[4] |=RX_DATA[21]<<4;    //月
    clock[5] =RX_DATA[26];
    clock[5] |=RX_DATA[25]<<4;    //星期
    clock[6] =RX_DATA[20];
    clock[6] |=RX_DATA[19]<<4;    //月
    clock[7]  =0;
    
    WriteTo1302(0x8e,0x00);    //控制命令,WP=0,写操作     
    CE_Disable();
    SCLK_LO();
    CE_Enable();	
    WriteByte(0xbe);    //8Byte = 7Byte 时钟数据 + 1Byte 控制
    for (i = 0; i < 8; i++)     
    {
      WriteByte(clock[i]); //写1Byte数据
    }
    SCLK_HI();
    CE_Disable();
    set_par_re();
  }
    return;
} 
//*************************************************************//
//采用BURST方式读取时间信息。
//*************************************************************//
void BurstReadTime()
{
  if(FLAG & gb_re1302)
  {
    FLAG &=~gb_re1302;
    uchar i;
    CE_Disable();
    SCLK_LO();
    CE_Enable();	
    WriteByte(0xbf);      //0xbf:时钟多字节读命令       
    for (i=0; i<8; i++) 
    {
      clock[i] = ReadByte();     //读1Byte数据    
    }
    SCLK_HI();
    CE_Disable();
    if(FLAG & gb_time_re)
    {
      FLAG &=~gb_time_re;
      set_tx();
      TX_DATA[7] =0x30;
      TX_DATA[8] =0x30;
      TX_DATA[9] =0x46;
      TX_DATA[10] =0x30;
      TX_DATA[11] =0x31;
      TX_DATA[12] =0x30;
      TX_DATA[13] =0x32;
      TX_DATA[14] =0x30;
      TX_DATA[15]=c_hex((clock[6]>>4)&0x0f);    //年
      TX_DATA[16]=c_hex(clock[6]&0x0f);    
      TX_DATA[17]=c_hex((clock[4]>>4)&0x0f);
      TX_DATA[18]=c_hex(clock[4]&0x0f);    //月
      TX_DATA[19]=c_hex((clock[3]>>4)&0x0f);
      TX_DATA[20]=c_hex(clock[3]&0x0f);   //日
      TX_DATA[21]=c_hex((clock[5]>>4)&0x0f);
      TX_DATA[22]=c_hex(clock[5]&0x0f);   //星期
      TX_DATA[23]=c_hex((clock[2]>>4)&0x0f);
      TX_DATA[24]=c_hex(clock[2]&0x0f);   //时
      TX_DATA[25]=c_hex((clock[1]>>4)&0x0f);
      TX_DATA[26]=c_hex(clock[1]&0x0f);   //分
      TX_DATA[27]=c_hex((clock[0]>>4)&0x0f);
      TX_DATA[28]=c_hex(clock[0]&0x0f);   //秒
      jisuanhe(29);
    }    
  }
  return ;
}

⌨️ 快捷键说明

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