gai6102.c

来自「本科毕业设计做的一个小玩意。设计的语音播报记事器系统使用AT89S52单片机为微」· C语言 代码 · 共 1,109 行 · 第 1/2 页

C
1,109
字号
         _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;                                   /*录音满标志位*/
  save=1;
 {
  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(0);
   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 segment,bit tag)
 {
    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(segment,tag);
     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 Led_change1()
{
   uchar i;
   i=led[2];
   i<<=4;
   playtime[6]=i+led[3];                  /*年*/
   i=led[4];
   i<<=4;
   playtime[5]=i+led[5];                  /*月*/
   i=led[6];
   i<<=4;
   playtime[3]=i+led[7];                  /*日*/
   playtime[4]=led[8];                    /*星期*/
   i=led[9];
   i<<=4;
   playtime[2]=i+led[10];                 /*时*/
   i=led[11];
   i<<=4;
   playtime[1]=i+led[12];                 /*分*/
   i=led[13];
   i<<=4;
   playtime[0]=i+led[14];                 /*秒*/
}
/*************************************************************************************/

 void Recording_30s(uint address,uchar segment)
{
  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计时*/
 }
   IRcvStr(PCF8563,RDADDR,rd,0x07);  /*读pcf8563*/
   while(rd[0]!=0x30)
  {
   IRcvStr(PCF8563,RDADDR,rd,0x07);  /*读pcf8563*/
   Ledsave(segment);
   Display(led);                     /*显示*/
  }
   Stopmode();                             /*停止录音*/
  {
   IRcvStr(PCF8563,RDADDR,rd,0x07);  /*读pcf8563*/
   secondsave_30s=0x30;        /*保存录音秒长*/
   minutesave_30s=0x00;        /*保存录音分长*/
  }
  {
   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*/
  }

}

  void Playing_30s(uchar segment,bit tag)
 {
    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(segment,tag);
     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*/
   }
}

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

      {
       key=kbscan();  /*扫描键盘*/
           do
          {
            {
               IRcvStr(PCF8563,RDADDR,rd,0x07); /*读PCF8563*/
               rd[0]&=0x7f;                     /*屏蔽秒无效位*/
               rd[1]&=0x7f;                     /*屏蔽分无效位*/
               rd[2]&=0x3f;                     /*屏蔽时无效位*/
               rd[3]&=0x3f;                     /*屏蔽日无效位*/
               rd[5]&=0x1f;                     /*屏蔽月无效位*/
               if(playtime[0]==rd[0]&&playtime[1]==rd[1]&&playtime[2]==rd[2]&&playtime[3]==rd[3]&&playtime[5]==rd[5]&&playtime[6]==rd[6]&&save==1)
              {
                Audioout(rac_address);
                Playing(0,0);
              }
            }
           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:                        /*如果播放键按下就可以放音*/
    {
        if(save==1)
      {
        Audioout(rac_address);
        Playing(0,0);
      }
    }break;
     case 0xd7:                         /*播放时间设置*/
    {
      Settime();
      Led_change1();
    }break;
     case 0xb7:                    /*录音1到4*/
    {
        do
       {
         key=kbscan();
         IRcvStr(PCF8563,RDADDR,rd,0x07);
         Change_Led();
         Display(led);
       }while(key!=0xde&&key!=0xbe&&key!=0x7e&&key!=0xed);   /*当按下的键不是1,2,3,4时*/

        switch(key)
       {
          case 0xde:/*录音1*/
         {
           Record4004(10);                
           Recording_30s(10,1);
         }break;
          case 0xbe:/*录音2*/
         {
           Record4004(90);
           Recording_30s(90,2);
         }break;
          case 0x7e:/*录音3*/
         {
           Record4004(170);
           Recording_30s(170,3);
         }break;
          case 0xed:/*录音4*/
         {
           Record4004(250);
           Recording_30s(250,4);
         }break;   
       }
    }break;
    case 0xde:
   {
    Audioout(10);
    Playing_30s(1,1);
   }break;/*播放1*/
    case 0xbe:
   {
    Audioout(90);
    Playing_30s(2,2);
   }break;/*播放2*/
    case 0x7e:
   {
    Audioout(170);
    Playing_30s(3,3);
   }break;/*播放3*/
    case 0xed:
   {
    Audioout(250);
    Playing_30s(4,4);
   }break;/*播放4*/  

  }//switch结束

 }//while结束
}//main函数结束



⌨️ 快捷键说明

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