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

📄 radio.c

📁 一个车载音响控制程序,包括高保真立体收部分,VFD驱动显示,4路音频电子切换, 红外遥控控制 采用51单片机
💻 C
📖 第 1 页 / 共 2 页
字号:
     iniband1(band);
     if(reuse==reuse_seach)
	 in0.in0.frq=0x0a30;			//从最低端开始搜索
     ab=0;
	 remkey=0x00;
	 while((in0.in0.frq!=0x0230)&(in0.in0.frq!=0x0d98))		    //设置搜台的范围(中波575KHZ-1605HZ)
         {
		   e=(stepserch(dir,in0.in0.frq)&0x0000ffff);
           display();
		   if((e<0x3880)&&(e>0x3800))//判断搜台是否准确的依据(在这里设置了一个范围来提高搜台数量减少漏台,但是实质范围过大将会搜到很多的假台)
			  {
			   b[0]=in0.in0.frq>>8;
			   b[1]=in0.in0.frq;
               if(reuse==reuse_waite)
                  {

                   goto likai;
                  }
               wrnbyt(0xa0,ab*2+120,2,b); //将搜到的电台存储起来
                                      //rdnbyt(0xa0,ab*2,2,a);//此语句为校验写入的和读出的是否相同
			   ab=ab+1;
			  }
              if(tund&&tuni)
                key_long=1;
              if(key_long)
                if(!tund||!tuni)
                 {
                  key_long=0;
                  goto likai;
                  }
               if(remkey==0xed)
                 {
                   remkey=0;
                   goto likai;
                 }
		   	  if(remkey==0xb5)
		          {
		           remkey=0x27;
				   mute_(off);
		           return;
	 	          }
         }
         save_eeprom();
     }
   else if(band==fm)
	{
	 iniband();
     iniband1(band);
     ab=0;
	 remkey=0x00;
     if(reuse==reuse_seach)
	 in0.in0.frq=0x35e0;			//从最低端开始搜索
	 while((in0.in0.frq!=0x85e0)&(in0.in0.frq!=0x6290))			    //设置搜台的范围(中波86.9mHZ-108mHZ)
         {
		   e=(stepserch(dir,in0.in0.frq)&0x000fffff);
           display();
		   if((e<0x539c0)&&(e>0x53880))//判断搜台是否准确的依据(在这里设置了一个范围来提高搜台数量减少漏台,但是实质范围过大将会搜到很多的假台)
			 {
			    b[0]=in0.in0.frq>>8;
			    b[1]=in0.in0.frq;
                 if(reuse==reuse_waite)
                  {
                   goto likai;
                  }
               wrnbyt(0xa0,ab*2,2,b); //将搜到的电台存储起来
                                      //rdnbyt(0xa0,ab*2,2,a);//此语句为校验写入的和读出的是否相同
			   ab=ab+1;
			  }
              if(tuni&&tund)
                key_long=1;
              if(key_long)
                if(!tuni||!tund)
                 {
                  key_long=0;
                  goto likai;
                  }
              if(remkey==0xed||remkey==0x1d)
                 {
                   remkey=0;
                   goto likai;
                 }
		   	  if(remkey==0xb5)
		         {
		          remkey=0x27;
				  mute_(off);
		          return;
	 	         }

		   }

       }
likai:
	 remkey=0x00;
         tai=0x00;
	 mute_(off);
   if (reuse==reuse_seach)
     {
      remkey=0xef;
      b[0]=0xaa;
      b[1]=0xaa;
      if(band==fm)
      wrnbyt(0xa0,ab*2,2,b);
      else
      wrnbyt(0xa0,ab*2+120,2,b);
      ab=0;
     }
 }
 void volcheack(void)
 {
    uchar a;
	voli=1;
	vold=1;
	if(!funp)
	{
	  while(!funp);
	  remkey=0xdf;
	  return;
	}     //功能按键检测
 	if(!dvd_tv)
	{
	  while(!dvd_tv);
	  remkey=0xf4;
	  return;
	}     //功能按键检测
if((band!=dvd)&&(band!=tape)&&(band!=tv))
  {
	if(!next)
	{
	  while(!next);
	  remkey=0xef;
	  return;
	}     //步进一个电台频率
	if(!pre)
	{
	  delaytime(10);
	  while(!pre);
	  remkey=0x85;
	  return;
	}     //步退一个电台频率
	if(!memory_key)
	{
	  delaytime(400);
	  while(!memory_key);
	  remkey=0x47;
	  return;
	}     //存储电台频率
	if(!band_key)
	{
	  delaytime(400);
	  while(!band_key);
	  remkey=0x78;
	  return;
	}     //波段转换函数

}
 if(!power_key)
	{
	  delaytime(400);
	  while(!power_key);
      power_l=~power_l;
      if(power_l)
      remkey=0x99;
      else
      remkey=0x98;
	  return;
	}     //电源处理
    if(!eq)
	{
	  delaytime(400);
	  while(!eq);
	  remkey=0x97;
	  return;
	}     //波段转换函数
/*   	if(!mute_key)
	{
	  delaytime(400);
	  while(!mute_key);
	  if(!mute_l)
      {
      mute_l=~mute_l;
      mute_(on);
      }
      else
      {
      mute_l=~mute_l;
      mute_(off);
      remkey=0x00;
      }
	  return;
	}
        */
if(tuni&&tund)
 key_sta=0;//按键释放检测
if(band!=dvd&&band!=tape)
{
 if(!key_sta)
 {
	if(!tuni)//步进一个电台频率
	{
	  delaytime(400);
      key_sta=key();
      if(key_sta)
       remkey=0x34;//短按:步进一个电台频率
      else
       remkey=0x77;//常按:向前搜索一个电台并停止
	}
	if(!tund)//步退一个电台频率
	{
	  delaytime(400);
      key_sta=key();
      if(key_sta)
       remkey=0x33;//短按:步退一个电台频率
      else
       remkey=0x55;//常按:向后搜索一个电台并停止
	}
   }
  }
   if(voli&&vold)//音量编码器开始
	 {
	   for(a=0;a<3;a++)
	   {
	     if(!(voli&&vold))
		 {
         start=0;
		 return;
		 }
		}
	   start=1;
	   return;
	 }
	 if(start)
	 {
	   start=0;
       delaytime(100);
	   if(voli==0)
	   {
	   remkey=0x65;
	   return;
	   }

       delaytime(100);
	   if
       (vold==0)
	   {

	    remkey=0x64;
		return;
		}
	 }//音量编码器结束

 }
void sys_ini()
 {
    delaytime(50000);
    inidelay();            //初始定时中断资源
    rdnbyt(0xa0,add_band,1,&test_iic_rd);
    band=test_iic_rd;		   //初始化波段为调频
    inivfd();		   //初始化VFD显示
    vfd_clean();           //清屏
//    fun_power=power_radio; //电源为收音
//   fun_vfd=vfd_radio;     //VFD控制给收音
//   mute=off;
//	mute_(off);

        rdnbyt(0xa0,add_volume,1,&test_iic_rd);
	volume=test_iic_rd;

        rdnbyt(0xa0,add_tai,1,&test_iic_rd);
	ab=test_iic_rd;
        tai=test_iic_rd;
        rdnbyt(0xa0,add_eq,1,&test_iic_rd);
	eq=test_iic_rd;
//	channel(radio_fun);
//       band_change();
       if(band==am||band==fm)
       {
       band=tape;
       dvd_tv_ch() ;
       }
       else if(band==tape)
       {
       band=fm;
       dvd_tv_ch() ;
       }
       else if(band==dvd)
       {
       band=tv;
       band_change();
       }
       else if(band==tv)
       {
       band=dvd;
       band_change();
       }
        volume--;
	sub_vol(up);
	wr_pt2313(0x80);
	wr_pt2313(0xa0);
	wr_pt2313(0xc0);
	wr_pt2313(0xe0);
}
void pub()                     //异常处理:初始化最底频率
{
    if(in0.in0.frq==0x0230)
     in0.in0.frq=0x0a30;
     if(in0.in0.frq==0x0398)
     in0.in0.frq=0x0d98;
     if(in0.in0.frq==0x85e0)
     in0.in0.frq=0x45e0;
     if(in0.in0.frq==0xe290)
     in0.in0.frq=0x6290;
}
bit key()                       //开关机处理
{
  uint b;
  uchar a;
  for(a=0;a<75;a++)
   for(b=0;b<1000;b++)
     {
       if((tuni)&&(tund))
       return(off);
      }
    return(on);
}
void mute_(bit fun)
 {
   if(fun==on)                 //静音处理
    {
    wr_pt2313(0xdf);
    wr_pt2313(0xff);
    }
    else if(fun==off)
    {
    wr_pt2313(0x80);
    wr_pt2313(0xa0);
    wr_pt2313(0xc0);
    wr_pt2313(0xe0);
    wr_pt2313((0x3f&(63-volume)));
    }
 }
void radio_change()           //调频调幅转换
{
  if((band==am)||(band==fm))
 {
  if(band==fm)
  band=am;
  else if(band==am)
  band=fm;
      fun_power=power_radio;//电源为收音
      fun_vfd=vfd_radio;    //VFD控制给收音
	  channel(radio_fun);
	  vfd_clean();       //清屏
	  if(band==fm)
      ab=ab_fm;
      else
      ab=ab_am;
	  iniband();
	 if(band==fm)
     rdnbyt(0xa0,ab*2,2,a);			 //经过IIC总线调出硬件地址为0XA0,子地址为tai*2的24C02中的数据高第一字节放在A[0]中第二字节放在A[1]中
	 else
     rdnbyt(0xa0,ab*2+120,2,a);
	 in0.in0.frq=a[0];
	 in0.in0.frq=(in0.in0.frq<<8)|(0x00ff&a[1]);//将调出的两个字节频率值付给in0.in0.frq
     iniband1(band);					  //初始化具体波段的私有部分
     e=stepserch(1,in0.in0.frq);		  //加载频率
     display();							  //更新显示
	 remkey=0x00;
  remkey=0;
}
remkey=0;
}
void inieeprom()          //初始化EPROM 因为不初试华,在第一次使用时候收音会错乱
{
test_iic_wr='z';
wrnbyt(0xa0,add_la_1,1,&test_iic_wr);
test_iic_wr='t';
wrnbyt(0xa0,add_la_2,1,&test_iic_wr);
test_iic_wr='y';
wrnbyt(0xa0,add_la_3,1,&test_iic_wr);
test_iic_wr=48;
wrnbyt(0xa0,add_volume,1,&test_iic_wr);
test_iic_wr=dvd;
wrnbyt(0xa0,add_band,1,&test_iic_wr);
test_iic_wr=1;
wrnbyt(0xa0,add_eq,1,&test_iic_wr);
test_iic_wr=1;
wrnbyt(0xa0,add_tai,1,&test_iic_wr);
in0.in0.frq=0x0a30;
b[0]=in0.in0.frq>>8;
b[1]=in0.in0.frq;
for(ab=0;ab<50;ab++)
wrnbyt(0xa0,ab*2+120,2,b);      //把所有频率初始为最低,87。5MHZ
in0.in0.frq=0x35e0;
b[0]=in0.in0.frq>>8;
b[1]=in0.in0.frq;
for(ab=0;ab<50;ab++)
wrnbyt(0xa0,ab*2,2,b);
}
void save_eeprom()                   //保存现在的音量  音调 音色 台位 功能位 等数据
{
test_iic_wr=eq;
wrnbyt(0xa0,add_eq,1,&test_iic_wr);
test_iic_wr=volume;
wrnbyt(0xa0,add_volume,1,&test_iic_wr);
test_iic_wr=band;
wrnbyt(0xa0,add_band,1,&test_iic_wr);
test_iic_wr=ab;
wrnbyt(0xa0,add_tai,1,&test_iic_wr);
}
/*
注意:
(1)遥控发射芯片用TC9012/TC9243
经常用到的还有UPD6121和LC7461,它们的不同只处在于引导码的时间不同或者数据位的个数不同,接受原理基本一样。将本程序的相关位置修改就可以通用。
系统时钟22.1184MHZ,如果用其他的时钟请将delay.c文件中的定时器装载值修改一下
(2)
 键盘检测在VFD程序中,16312可以驱动VFD,另外外部可接24个按键,并将按键值放到
 其内部的存储中,使用时只须发命令读即可。
(3)
 由于时间原因,只给出调幅波段的自动搜台功能,调频的自动搜台程序和调幅一样,自己写了。
(4)主要用在组合机和功放机上的收音头大部分以LC72171做锁象环,LA1823做高中频处理
和音频解调,但是有的数调收音头把锁象环和高频处理做在一起,典型的有TEA5757和TEA5756
TEA5757采用了一种所谓的自动调谐系统,在自动搜索时无须读中频,简化了程序。
*/

⌨️ 快捷键说明

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