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

📄 allgai.c

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

      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;
     datasoute=0;
  while(_int==1)       //存储地址换行标志
  {
   if(_rac) {Delay(44444); datasoute++; }  //记录本次录音所占的行数(也就是本次录音有多大)
   if(datasoute==0x96)                     //delay(44444)是延时0.4s
     {                                     //录音60s
       Stopmode();                         //0x32是20s
       _int=0;                                        //
     }                                      //  在这里应该加上自己的程序,就是录音退出程序
                                           //
  }
}//while end;

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;
}


/************************************键盘专用延时****************************************/
      void dlms(void)
    {
       uchar i;
       for(i=200;i>0;i--)
       {  }
    }

/*******************************键盘扫描(用时408us)**********************************/
    uchar kbscan(void)
   {
      uchar sccode,recode;
      P2=0xf0;                             //p0.0---p0.3发全0,p0.4--p0.7输入
      if((P2&0xf0)!=0xf0)                  //如果p0口高四位不全为1,有键按下
       { dlms();                           //延时去抖动
         if((P2&0xf0)!=0xf0)               //重读输入值
          {  sccode=0xfe;                  //最底位置0
             while((sccode&0x10)!=0)       //不到最后一行循环
             { P2=sccode;                  //p0口输出扫描码
               if((P2&0xf0)!=0xf0)         //如果p0.4--p0.7不全为1,该行有键按下
                 { recode=P2&0xf0;
                   sccode=sccode&0x0f;     //保留p0口高四位输入值,低四位变为全1,作为列值
                   return(sccode+recode);
                 }
          else
             sccode=(sccode<<1)|0x01;      //如该行无键按下,查下一行,行扫描值左移一位
           }
        }
     }
     return(0xff);
   }


/************************************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*/

     }

  }
}


⌨️ 快捷键说明

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