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

📄 hhh.txt

📁 51 - 音乐测试程序--------------------
💻 TXT
📖 第 1 页 / 共 3 页
字号:
//******************************************************
wd24(unsigned char dd)//写意字节
{

   unsigned char a;
   for(a=0;a<8;a++)
   {
     if(((dd>>(7-a)) & 0x01)==1)PORTB.0=1;
     else PORTB.0=0;
     delay_us(20);
     scl=1;
     delay_us(50);
     scl=0;
     delay_us(20);
   }

}
//************************************
//************************************
unsigned char watack()//////接收应答
{
     unsigned int errtime=0;
     DDRB.0=0;
     PORTB.0=1;
      while(!(errtime>20))
       {
        errtime++;
        scl=1;
        if(sda==0)
		{
		delay_us(30);
		scl=0;
                PORTB.0=0;
                DDRB.0=1;
                delay_us(50);
		return 1;
		}
        else
                if(errtime>60)
		{
		delay_us(30);
		scl=0;
		PORTB.0=0;
                DDRB.0=1;
                delay_us(50);
		return 1;
		}

	  }
}
//**********************************************
//**********************************************
void notack(void)             //发送非应答    //
 {
   PORTB.0=1;
   delay_us(50);
   scl=1;
   delay_us(50);
   scl=0;
   delay_us(30);
 }
//**********************************************
//**********************************************
unsigned char readi2c(unsigned int c )//////读地址为c的数据
 {
               unsigned int address;
               unsigned char i, dd;
               DDRB.1=1;
               DDRB.0=1;
               PORTB.0=1;
               PORTB.1=1;
               address=c;
               dd=((address&0x7ff)/256)<<1;
               s24();
               wd24(0xa0|dd);
               watack();
               wd24(address);
               watack();
               s24();
               wd24(0xa1|dd);
               watack();
               i=rd24();
               notack();
               p24();
               return i;
 }
//**********************************************
//**********************************************
void writei2c(unsigned int x, unsigned char y)////////////写数据
            {
                unsigned char  m;
                unsigned int address;
                DDRB.1=1;
                DDRB.0=1;
                PORTB.1=1;
                PORTB.0=1;
                address=x;
                m=((address&0x7ff)/256)<<1;
                s24();
                wd24(0xa0|m);
                watack();
                wd24(address);
                watack();
                wd24(y);
                watack();
                p24();
                delay_ms(5);

	       }
///****************************************
//******************************************
//sd1320 的操作函数////////////
void clock_out(unsigned char dd)////时钟输出时序
{
        unsigned char a;
        DDRB.2=1;
        for(a=0;a<8;a++)
        {
         if(((dd>>a)& 0x01)==1)PORTB.2=1;
         else PORTB.2=0;
         delay_us(300);SD_CLK=1;
         delay_us(300);SD_CLK=0;
         delay_us(300);
        }
}

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

unsigned char clock_in(void) ////时钟输入时序
{
unsigned char a,b;
b=0;
DDRB.2=0; PORTB.2=1;
for(a=0;a<8;a++)
  {
     if(SD_DAT==1)b+=1<<a;
     SD_CLK=1;delay_us(350);SD_CLK=0;delay_us(350);
  }
  return b;
}
//***********************************************************
//***********************************************************
unsigned char read_clock(unsigned char ord) ///读信息
{
         unsigned char dd=0;
	 SD_CLK=0;
         SD_RST=0;
         delay_us(350);
         SD_RST=1;
	 delay_us(350);
         clock_out(ord);
         dd=clock_in();
         SD_RST=0;
         SD_CLK=1;
         return(dd);
}
//*****************************************************
//*****************************************************
void write_clock(unsigned char ord,unsigned char dd) //写信息
{

         SD_CLK=0;
         SD_RST=0;
         delay_us(350);
         SD_RST=1;
	 delay_us(350);
         clock_out(ord);
         clock_out(dd);
	 delay_us(350);
         SD_RST=0;
         SD_CLK=1;
}
//***************************************
unsigned char DecimalToBCD(unsigned char DEC_Byte)  //16-10:0X0C - OX12
{
    return (DEC_Byte/10)*16+DEC_Byte%10;
}
unsigned char BCDToDecimal(unsigned char BCD_Byte)  //10-16:0X12 - 0X0C
{
    return (BCD_Byte>>4)*10+(BCD_Byte&0x0f);
}

//读时间函数******************************

unsigned char ReadTime(unsigned char time)
{
  //   unsigned char i;
  //   i=read_clock(time);
  //   i=BCDToDecimal(i);                         ////////////////////////时间进制转换//
  //   return i;

  return BCDToDecimal(read_clock(time));
}
//*****************************************************
//*****************************************************
////////写时间
void WriteTime(unsigned char TimeType, unsigned char time)
{
     time=DecimalToBCD(time);                  ////////////////////////时间进制转换//
   //  putchar(time);
     write_clock(TimeType,time);

}
//*************************************
//************************************
/////写命令
void WriteCon(unsigned char bt)
{
     write_clock(WRITE_CON,bt);
}
//*****************************
//*****************************
///设置时间
void SetTime(unsigned char *Rtime)
{
  DDRB.3=1;
  DDRB.4=1;
  WriteCon(0x00);
  WriteTime(WRITE_TIME_YEAR,Rtime[0]);
  WriteTime(WRITE_TIME_MON, Rtime[1]);
  WriteTime(WRITE_TIME_DAY, Rtime[2]);
  WriteTime(WRITE_TIME_HR , Rtime[3]);
  WriteTime(WRITE_TIME_MIN, Rtime[4]);
  WriteTime(WRITE_TIME_SEC, 0x10);
}
//*********************************
//*********************************
////读取当前时间
void GetTime(unsigned char *Rtime)
{
 DDRB.3=1;
 DDRB.4=1;
 Rtime[0]=  ReadTime(READ_TIME_YEAR);
 Rtime[1]=  ReadTime(READ_TIME_MON);
 Rtime[2]=  ReadTime(READ_TIME_DAY);
 Rtime[3]= ReadTime(READ_TIME_HR  );
 Rtime[4]= ReadTime(READ_TIME_MIN );
 Rtime[5]= ReadTime(READ_TIME_SEC );
}
//******************************
//******************************

void LockOpen()//开锁
{
PW=1;
M1=1;
mep=1;
gai=0;
LED_BLUE=0;
LED_RED=1;
delay_ms(150);
mep=0;
delay_ms(200);
PW=0;
M1=0;

}

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

void LockClose()////关锁
{
PW=1;
M2=1;  
gai=1;
delay_ms(350);
PW=0;
M2=0;
LED_BLUE=1;
}
//*****************************
unsigned char  cptime(unsigned char *t1,unsigned char *t2)           //T1>T2 返回1   ==2 
{
   if(t2[0]>t1[0])return 0;                                           //年
   if(t2[0]<t1[0])return 1;
   if(t2[0]==t1[0])
      {
        if(t2[1]<t1[1])return 1;                                      //月
        if(t2[1]>t1[1])return 0;
        if(t2[1]==t1[1])

               {
	           if(t2[2]<t1[2])return 1;                           //日
                   if(t2[2]>t1[2])return 0;
                   if(t2[2]==t1[2])
                         {
			    if(t2[3]<t1[3])return 1;                  //时
                            if(t2[3]>t1[3])return 0;
                            if(t2[3]==t1[3])
                               {
                                 if(t2[4]<t1[4])return 1;            //分
                                 if(t2[4]>t1[4])return 0;
                                 if(t2[4]==t1[4])return 2;           //相等返回2
                               }
                          }
                }
      }
}

 ////////*************************
unsigned char  EndTime(unsigned char dd)//////判断挂失时间       //dd为卡类型,用来判断该卡挂失时间的存放地址
{
   unsigned char pp[6];     //,tt[6]
   unsigned char a,b,d;     // c,
   

    d=(dd-3)*5+31;     //存挂失时间的 地址
    for (a=0;a<5;a++) pp[a]=readi2c(d+a);   //读 挂失时间

    if (bit_guas==1)  //   写入挂失时间     
    { b=cptime(pp,tm1);
      if(b==0)                                   //  就是卡里开始时间比上次挂失时间 大
       {
        for (a=0;a<5;a++)writei2c(d+a,buf1[5+a]);    //把新的挂失时间记录下来
       }
      if(b==1) return 0;                            //挂失卡,没现存的大,就是过期卡片
      if(b==2) return 1;                            //相等
      return 0;
    }
                                                   //tm1 大于 PP返回 1 
    if( cptime(tm1,pp)==1 ) return 1;              //卡里开始时间大于等于 现存时间  合法卡  返回1为合法
    return 0;
}

//*****************************时间的比较函数
//********************************************

unsigned char  Timecp( unsigned char *p)       ///卡里时间比 现在时间小 =0  说明卡过期
{
   unsigned char cr[6];
   GetTime(cr);   
  // putchar(cr[0]);  putchar(cr[1]); putchar(cr[2]); putchar(cr[3]);  putchar(cr[4]);putchar(cr[5]);
  // putchar(0xaa); 
  // putchar(p[0]);  putchar(p[1]); putchar(p[2]); putchar(p[3]);    putchar(p[4]);
 //  if((p[0]>0x99)||(p[1]>0x12)||(p[1]>0x24)||(p[2]>0x60)||(p[3]>0x60))return 0;    //10进制
   if(cr[0]>p[0])return 0;
   if(cr[0]<p[0])return 1;     //年
   if(cr[0]==p[0])
      {
        if(cr[1]<p[1])return 1;
        if(cr[1]>p[1])return 0;    //月
        if(cr[1]==p[1])

               {
	           if(cr[2]<p[2])return 1;
                   if(cr[2]>p[2])return 0;    //日
                   if(cr[2]==p[2])
                         {
			    if(cr[3]<p[3])return 1;
                            if(cr[3]>p[3])return 0;    //时
                            if(cr[3]==p[3])
                               {
                                 if(cr[4]<=p[4])return 1;    //分
                                 else return 0;
                               }
                          }
                }
      }
}


 //*********************************************************
//**********************************************************记录信息     开门记录

void jilu(unsigned char a,unsigned char b,unsigned char c)
{
  unsigned char i;
   unsigned int j;
   unsigned char time[7];

   GetTime(time);
   i=readi2c(27);
   j=i;
   i++;
   if(i>=250)i=0;
   writei2c(27,i);     //记录数

   writei2c(100+j*7,a);

   writei2c(101+j*7,b);

   writei2c(102+j*7,c);

   writei2c(103+j*7,time[1]);

   writei2c(104+j*7,time[2]);

   writei2c(105+j*7,time[3]);

   writei2c(106+j*7,time[4]);

  // writei2c(106+j*5,time[6]);
 }

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

 //******************************
 ///////////关闭所有端口以便睡眠
 void SystemStop()
{

  a=b=c=0;
  SREG|=0x80;
  DDRB=0;
  PORTB=0x40;
  DDRC=0;
  PORTC=0x20;       //  40
  DDRD=0;
  PORTD=0x20;
  PCIFR=0x02;            //引脚电平变化唤醒
}
//*********************************
//*********************************
////////读手持机的信息
unsigned char GetData()
{
   unsigned int c,n;
   unsigned char m;
   unsigned int b;
   unsigned char mb,bm1;

   DDRD.3=1;
   PORTD.3=0;

   c=0;b=0;
   mb=0;
   bm1=1;
   while(PINB.5==1)
   {
      c++;
      if(c>=30000){c=0;b++;if(b>=5)return 255;}
   }
   c=0;
 for(m=0;m<8;m++)
   {
      while(PINB.5==0)
     {
         c++;
         if(c>=10000) return 255;
     }
         n=0;
     while(PINB.5==1) {n++; if(n>=1000) return mb;}
     if(n>400)mb+=1<<m;
   }
 for(m=0;m<8;m++)
   {
      while(PINB.5==0)
     {
      c++;
      if(c>=10000) return 255;
     }
     n=0;
     while(PINB.5==1){n++;if(n>=1000)return bm1;}
     if(n>400)bm1+=1<<m;
   }
   if(mb==bm1)  return mb;       //Beetmap(10);
   return 255;

}

//************************************  
//************************************   
void write_bit3(unsigned char x) 
{
     if(x==1)
        {
    	//p_U2270B_CFE=1;
	PwmRun();
        delay_us(1000);
    	//p_U2270B_CFE=0;
        PwmStop();
        delay_us(300);
       }
     else if(x==0)
       {
    	//p_U2270B_CFE=1;
	 PwmRun();
	 delay_us(400);
    	 //p_U2270B_CFE=0;
	 PwmStop();
	 delay_us(300);
      }

}
//************************************

unsigned char mm;
//向手持机发送信息
//*************************************************
void Write_block(unsigned char p)
{
     unsigned char m;
  //   nopthe=1;
     for(m=0;m<8;m++)
     {
      if(((p>>m)%2)==1)write_bit3(1);
   	  else write_bit3(0);
     
     }
     for(m=0;m<8;m++)
     {
      if(((p>>m)%2)==1)write_bit3(1);
   	  else write_bit3(0);
     
     }
    // nopthe=0;
}
//*******************************
//*******************************************
//*******************************************
///////电源电压的a/d转换并低压报警10声
void  Dinayuanchx()
{
   unsigned char a;
   DIDR0=0x00; //
   ADMUX=0xe6; //
   ADCSRA=0xc4;
   delay_us(5);
   while(!(ADCSRA==0x94))delay_us(10);
   ADCSRA=0;
   a=ADCH;
   if(a>=240){DIDR0=0;ADCSRA=0;ADMUX=0; return ;}
   else {DIDR0=0;ADCSRA=0;ADMUX=0;Beetmap(10);}
}
//*******************************************
decrypt()                                      //解密
{    unsigned char temp;


     buf1[0]=buf2[0]>>4;                          //卡类型
     buf1[1]=((buf2[0]&0x01)<<4)+(buf2[1]>>5);    //区域号
     buf1[2]=((buf2[1]&0x1f)<<2)+(buf2[2]>>6);    //栋
     buf1[3]=((buf2[2]&0x3f)<<1)+(buf2[3]>>7);    //层
     buf1[4]=buf2[3]&0x7f;                        //室
     buf1[5]=buf2[4]>>2;                          //开始年
     buf1[6]=((buf2[4]&0x03)<<2)+(buf2[5]>>6);    //开始月
     buf1[7]=((buf2[5]&0x3f)>>1);                 //开始日
     buf1[8]=((buf2[5]&0x01)<<4)+(buf2[6]>>4);    //开始时
     buf1[9]=((buf2[6]&0x0f)<<2)+(buf2[7]>>6);    //开始分
     buf1[10]=buf2[7]&0x7f;                       //开始秒
     buf1[11]=buf2[8]>>2;                         //结束年
     buf1[12]=((buf2[8]&0x03)<<2)+(buf2[9]>>6);   //开始月
     buf1[13]=((buf2[9]&0x3f)>>1);                //开始日
     buf1[14]=((buf2[9]&0x01)<<4)+(buf2[10]>>4);  //开始时
     buf1[15]=((buf2[10]&0x0f)<<2)+(buf2[11]>>6); //开始分
     buf1[16]=buf2[11]&0x7f;                      //开始秒
     buf1[17]=buf2[12];                           //代理商编号H
     buf1[18]=buf2[13]&0xf0;                      //代理商编号L
     buf1[19]=buf2[13]&0x0f;                      //客户代号H
     buf1[20]=buf2[14];                           //客户代号L
     buf1[21]=buf2[15];                           //8位CRC验证
     buf1[22]=buf2[5];                            //卡号1
     buf1[23]=buf2[6];                            //卡号2
     buf1[24]=buf2[7];                            //卡号3

     temp=buf2[0]<<4;

⌨️ 快捷键说明

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