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

📄 gai6101.c

📁 本科毕业设计做的一个小玩意。设计的语音播报记事器系统使用AT89S52单片机为微控制器
💻 C
📖 第 1 页 / 共 2 页
字号:
   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 j=0;
  uchar hour,minute,second; /*用来保存td[9]中的时、分、秒、数据*/
  bit flag=0;                                   /*录音满标志位*/
 {
  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)
  {
     if(address==2400)           /*如果rac到了2400行,就将flag置1,并将T1清0,退出循环*/
    {
      flag=1;
    }
   IRcvStr(PCF8563,RDADDR,rd,0x07);  /*读pcf8563*/
   Ledsave();
   Display(led);                     /*显示*/
  }
   Stopmode();                             /*停止录音*/
  {
   IRcvStr(PCF8563,RDADDR,rd,0x07);  /*读pcf8563*/
   secondsave=rd[0];        /*保存录音秒长*/
   minutesave=rd[1];        /*保存录音分长*/
  }
  {
   second+=rd[0];          //pcf8563读出来的都是bcd数
   j=second&0x0f;
   if(j>0x09)
     second+=6;
   if(second>=0x60)
     {
       i=1;
       second-=0x60;
     }
   minute+=rd[1]+i;
   i=0;
   j=minute&0x0f;
   if(j>0x09)
     minute+=6;
   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();
  }
}

  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 i=0;
    uchar j=0;
    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();
     Display(led);                     /*显示*/
   }
  {
   second+=rd[0];          //pcf8563读出来的都是bcd数
   j=second&0x0f;
   if(j>0x09)
     second+=6;
   if(second>=0x60)
     {
       i=1;
       second-=0x60;
     }
   minute+=rd[1]+i;
   i=0;
   j=minute&0x0f;
   if(j>0x09)
     minute+=6;
   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 0x7b:                        /*如果播放键按下就可以放音*/
    {
     Audioout(rac_address);
     Playing();
    }break;
   }
  }
}



⌨️ 快捷键说明

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