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

📄 allgai1.c

📁 本科毕业设计做的一个小玩意。设计的语音播报记事器系统使用AT89S52单片机为微控制器
💻 C
📖 第 1 页 / 共 2 页
字号:
   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;
      uchar *pointer;
      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;

  TMOD=0x50;        /*T1工作在计数方式1   154321us*/
  pointer=&address; /*预置计数初值*/
  TL1=*(pointer+1);
  TH1=*pointer;
  TR1=1;            /*启动T1*/

   while(kbscan()!=0x77)                    /*当确定键没有按下*/
  {

  }

  Stopmode();                             /*停止录音*/
  TR1=0;                                  /*停止T1*/

  TL1+=3;
  pointer=&rac_address;
  *(pointer+1)=TL1;
  *pointer=TH1;                           /*将T1的值加3后赋给rac_address*/

  racaddress[tag]=rac_address;              /*保存每段的首地址*/
  segment[tag]=seg_ment;                    /*保存录音段的短号*/
  tag++;
  seg_ment++;
  if(tag==10)
     tag=0;
  if(seg_ment==10)
     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;
    while(_int==1)
    {
    }//while end;
}



/***************************************************************************************
                                           LED开机检测
***************************************************************************************/
 void Ledcheck()
{
  uchar j;
  uchar i,k=0;
  for(j=0;j<255;j++)
  {
   P3=0x00;
   for(i=0;i<15;i++)
   {
     P0=0xff;
     Delay1ms(1);
     P3+=1;
   }
  }
}


/***************************************************************************************
                                  按键转化为相应的数字
***************************************************************************************/
 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()
{


  //Ledcheck();     /*开机后LED全亮3秒*/
  //ISendStr(PCF8563,WRADDR,td,0x09);


    while(1)
  {

    //IRcvStr(PCF8563,RDADDR,rd,0x07);
    //Change_Led();
    //Display(led);                            /*LED显示*/
    //if(kbscan()==0xe7)                       /*如果设置键按下就可以设置时间*/
     {
       //Settime();                            /*设置时间*/
       //Led_change();                         /*重写td*/
       //ISendStr(PCF8563,WRADDR,td,0x09);     /*写pcf8563*/
     }
    if(kbscan()==0xbb)                         /*如果录音键按下就可以录音*/
     {
       if(rac_address==2400)
         {
           rac_address=0;                     /*如果录满了从头开始*/
         }
       Record4004(rac_address);               /*录音*/

     }
  }
}


⌨️ 快捷键说明

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