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

📄 gai610.c

📁 本科毕业设计做的一个小玩意。设计的语音播报记事器系统使用AT89S52单片机为微控制器
💻 C
📖 第 1 页 / 共 2 页
字号:
   i&=0x3f;
   j=i;
   i&=0xf0;
   i>>=4;
   led[6]=i;     /*日的十位*/
   i=j;
   i&=0x0f;
   led[7]=i;     /*日的个位*/
//时
   i=rd[2];
   i&=0x3f;
   j=i;
   i&=0xf0;
   i>>=4;
   led[9]=i;    /*时的十位*/
   i=j;
   i&=0x0f;
   led[10]=i;   /*时的个位*/
//分
   i=rd[1];
   i&=0x7f;
   j=i;
   i&=0xf0;
   i>>=4;
   led[11]=i;   /*分的十位*/
   i=j;
   i&=0x0f;
   led[12]=i;   /*分的个位*/
//秒
   i=rd[0];
   i&=0x7f;
   j=i;
   i&=0xf0;
   i>>=4;
   led[13]=i;   /*秒的十位*/
   i=j;
   i&=0x0f;
   led[14]=i;  /*秒的个位*/
}
/************************************************************************************
                                     显示函数
*************************************************************************************/
 void Display(uchar *s)
{ uchar i,k=0;
  P3=0x00;
  for(i=0;i<15;i++)
  {  k=*s;
     P0=tab[k];
     Delay1ms(1);
     P3+=1;
     s++;
  }
}
/**************************************************************************************
                                     isd4004驱动
**************************************************************************************/
 void Delay(uint i)  /*isd4004专用延时程序*/
{
   while(i--);
}

 void Stopmode()    /*停止*/
{
   uchar m,i,j;
   _cs=1;
   _sclk=0;
   _cs=0;

   m=0x30;
   for(i=0;i<8;i++)
   {
      m=_cror_(m,1);
      j=m<<1;
      _mosi=CY;
      _sclk=0;
      _sclk=1;
   }
   _cs=1;
}

 void Powerdown()   /*下电*/
{
    uchar m,i,j;
    _cs=1;
   _sclk=0;
   _cs=0;

   m=0x10;
   for(i=0;i<8;i++)
   {
      m=_cror_(m,1);
      j=m<<1;
      _mosi=CY;
      _sclk=0;
      _sclk=1;
   }
   _cs=1;
}

 void Powerup()    /*上电*/
{
   uchar m,i,j;
   _cs=1;
   _sclk=0;
   _cs=0;

   m=0x20;
   for(i=0;i<8;i++)  /*参照8位命令格式*/
   {
      m=_cror_(m,1); /*循环右移*/
      j=m<<1;
      _mosi=CY;      /*主控器应在串行时钟上升沿之前半个周期将数据送到本端*/
      _sclk=0;
      _sclk=1;
   }
   _cs=1;
}

 void Record4004(uint address)  /*录音  address--录音地址 0---2400*/
{
      uchar i,m,j;
      uint datasoute;
      Powerup();
      Delay1ms(50);/*上电延时*/
      Powerup();
      Delay1ms(50);/*上电延时*/
      Delay1ms(50);/*上电延时*/
      _cs=1;
      _sclk=0;
      m=0xa0;
      _cs=0;
      for(i=0;i<16;i++)                /*发地址为00的SETREC命令*/
     {
         address=_iror_(address,1);
         datasoute=address<<1;
         _mosi=CY;
         _sclk=0;
         _sclk=1;
     }
      for(i=0;i<8;i++)
     {
         m=_cror_(m,1);
         j=m<<1;
         _mosi=CY;
         _sclk=0;
         _sclk=1;
     }
     _cs=1;
     _sclk=0;
     m=0xb0;
     _cs=0;

     for(i=0;i<8;i++)        /*发REC指令*/
     {
        m=_cror_(m,1);
        j=m<<1;
        _mosi=CY;
        _sclk=0;
        _sclk=1;
     }
     _cs=1;
     P1=0xff;
}

  void Recording(uint address)
{
  uchar i=0;
  uchar hour,minute,second; /*用来保存td[9]中的时、分、秒、数据*/
  uchar *pointer;
  bit flag=0;                                   /*录音满标志位*/
  racaddress[tag]=rac_address;              /*保存每段的首地址*/
  segment[tag]=seg_ment;                    /*保存录音段的段号*/
  tag++;
  seg_ment++;
  _segment=seg_ment;

  TMOD=0x50;        /*T1工作在计数方式1*/
  pointer=&address; /*预置计数初值*/
  TL1=*(pointer+1);
  TH1=*pointer;
  TR1=1;            /*启动T1*/
 {
    IRcvStr(PCF8563,RDADDR,rd,0x07);  /*读pcf8563*/
    hour=rd[2];                    /*保存时分秒*/
    minute=rd[1];
    second=rd[0];
    td[4]=td[3]=td[2]=0;
    ISendStr(PCF8563,WRADDR,td,0x09);       /*重写pcf8563,录音时pcf8563计时*/
  }

   while(kbscan()!=0x77&&flag!=1)
  {
      *(pointer+1)=TL1;
      *pointer=TH1;
      if(address==2400)           /*如果rac到了2400行,就将flag置1,并将T1清0,退出循环*/
        {
          flag=1;
          TL1=0;
          TH1=0;
        }
   IRcvStr(PCF8563,RDADDR,rd,0x07);  /*读pcf8563*/
   Ledsave();
   Display(led);                     /*显示*/
  }

  Stopmode();                             /*停止录音*/
  TR1=0;                                  /*停止T1*/
  {
   TL1+=3;
   pointer=&rac_address;
   *(pointer+1)=TL1;
   *pointer=TH1;
  }                            /*将T1的值加3后赋给rac_address*/
  {
   IRcvStr(PCF8563,RDADDR,rd,0x07);  /*读pcf8563*/
   seg_ment--;
   length[seg_ment][0]=rd[0];        /*保存录音秒长*/
   length[seg_ment][1]=rd[1];        /*保存录音分长*/
   seg_ment++;
  }
  {
   second+=rd[0];          //pcf8563读出来的都是bcd数
   if(second>=0x60)
     {
       i=1;
       second-=0x60;
     }
   minute+=rd[1]+i;
   i=0;
   if(minute>=0x60)
     {
      i=1;
      minute-=0x60;
     }
   hour+=rd[2]+i;
   i=0;
  }

  {
   td[4]=hour;
   td[3]=minute;
   td[2]=second;
   ISendStr(PCF8563,WRADDR,td,0x09);        /*重写pcf8563*/
  }

    if(flag==1)                             /*如果录音录满了led全亮3s作为提示*/
  {
    Ledcheck();
  }
    if(tag==4)
     tag=0;
    if(seg_ment==4)
     {
       seg_ment=0;
     }
}

  void Audioout(uint address)           /*放音程序*/
{
    uchar i,m,j;
    unsigned int datasoute;

    Powerup();
    Delay1ms(50);//上电延时

    _cs=1;
    _sclk=0;
    _cs=0;
    m=0xe0;
      for(i=0;i<16;i++)
    {
        address=_iror_(address,1);
        datasoute=address<<1;
        _sclk=0;
        _mosi=CY;
        _sclk=1;
    }
    for(i=0;i<8;i++)
    {
         m=_cror_(m,1);
         j=m<<1;
         _sclk=0;
         _mosi=CY;
         _sclk=1;
    }

    _cs=1;
     _sclk=0;
     m=0xf0;
    _cs=0;
    for(i=0;i<8;i++)
    {
       m=_cror_(m,1);
       j=m<<1;
       _sclk=0;
       _mosi=CY;
       _sclk=1;
    }
    _cs=1;
    P1=0xff;
}

  void Playing(uchar segment)
 {
    uchar hour,minute,second; /*用来保存td[9]中的时、分、秒、数据*/
   {
    IRcvStr(PCF8563,RDADDR,rd,0x07);  /*读pcf8563*/
    hour=rd[2];                       /*保存时分秒*/
    minute=rd[1];
    second=rd[0];
    td[4]=td[3]=td[2]=0;
    ISendStr(PCF8563,WRADDR,td,0x09);       /*重写pcf8563,放音时pcf8563计时*/
   }
    while(_int==1)
   {
     IRcvStr(PCF8563,RDADDR,rd,0x07);  /*读pcf8563*/
     Ledplay(segment);
     Display(led);                     /*显示*/
   }
   {
     second+=rd[0];          //pcf8563读出来的都是bcd数
     if(second>=0x60)
    {
      i=1;
      second-=0x60;
    }
     minute+=rd[1]+i;
     i=0;
     if(minute>=0x60)
    {
      i=1;
      minute-=0x60;
    }
      hour+=rd[2]+i;
      i=0;
   }
   {
     td[4]=hour;
     td[3]=minute;
     td[2]=second;
     ISendStr(PCF8563,WRADDR,td,0x09);        /*重写pcf8563*/
   }
 }


/**************************************************************************************
                                  按键转化为相应的数字
**************************************************************************************/
 uchar Key_number(uchar keycode)
{
  uchar number;
  if(keycode==0xee)
    number=0;
  if(keycode==0xde)
    number=1;
  if(keycode==0xbe)
    number=2;
  if(keycode==0x7e)
    number=3;
  if(keycode==0xed)
    number=4;
  if(keycode==0xdd)
    number=5;
  if(keycode==0xbd)
    number=6;
  if(keycode==0x7d)
    number=7;
  if(keycode==0xeb)
    number=8;
  if(keycode==0xdb)
    number=9;
  if(keycode==0xbb)
    number=10;
  if(keycode==0x7b)
    number=11;
  if(keycode==0xe7)
    number=12;
  if(keycode==0xd7)
    number=13;
  if(keycode==0xb7)
    number=14;
  if(keycode==0x77)
    number=15;
  if(keycode==0xff)
    number=16;
  return(number);
}

/**************************************************************************************
                                  时间设置函数
**************************************************************************************/
 void Settime()
{
   uchar keycode,keynumber;
   uchar i=2;

   while(kbscan()!=0x77)
  {
     keycode=kbscan();
     keynumber=Key_number(keycode);
     do
    {
     Display(led);
    }while(keycode==kbscan());
     Delay1ms(5);
     if(keynumber!=10&&keynumber!=11&&keynumber!=12&&keynumber!=13&&keynumber!=14&&keynumber!=15&&keynumber!=16)
    {
      led[i]=keynumber;
      i++;
    }
     if(i==15)
    {
      i=2;
    }
    Display(led);
 }
}

/**************************************************************************************
                                      合成
**************************************************************************************/
 void Led_change()
{
   uchar i;
   i=led[2];
   i<<=4;
   td[8]=i+led[3];                  /*年*/
   i=led[4];
   i<<=4;
   td[7]=i+led[5];                  /*月*/
   i=led[6];
   i<<=4;
   td[5]=i+led[7];                  /*日*/
   td[6]=led[8];                    /*星期*/
   i=led[9];
   i<<=4;
   td[4]=i+led[10];                 /*时*/
   i=led[11];
   i<<=4;
   td[3]=i+led[12];                 /*分*/
   i=led[13];
   i<<=4;
   td[2]=i+led[14];                 /*秒*/
}

/*************************************主程序******************************************/
 void main()
{

   uchar key;
   //Ledcheck();     /*开机后LED全亮3秒*/
  {
   //Record4004(0);               /*录音*/
   //Delay1ms(400);
   //Stopmode();                             /*停止录音*/
  }
   ISendStr(PCF8563,WRADDR,td,0x09);
   while(1)
  {
    {
     IRcvStr(PCF8563,RDADDR,rd,0x07);
     Change_Led();
     Display(led);
    }           /*LED显示*/

    {
      key=kbscan();
      do
     {
       IRcvStr(PCF8563,RDADDR,rd,0x07);
       Change_Led();
       Display(led);
     }while(key==kbscan());   /*当按键弹起来的时候再转向各功能*/
    }

   switch(key)
   {
    case 0xe7:                       /*如果设置键按下就可以设置时间*/
     {
       Settime();                            /*设置时间*/
       Led_change();                         /*重写td*/
       ISendStr(PCF8563,WRADDR,td,0x09);     /*写pcf8563*/
     }break;
    case 0xbb:                         /*如果录音键按下就可以录音*/
     {
       if(rac_address==2400)
         {
           rac_address=0;                     /*如果录满了从头开始录音*/
         }
      {
       Record4004(rac_address);               /*录音*/
       Recording(rac_address);
      }
     }break;
    case 0xdb:                        /*如果播放键按下就可以放音*/
    {
     Audioout(racaddress[seg_ment1]);
     Playing(seg_ment1);
     seg_ment1++;
     if(seg_ment1==4)
       seg_ment1=0;
    }break;
   }
  }
}



⌨️ 快捷键说明

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