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

📄 radio.c

📁 一个车载音响控制程序,包括高保真立体收部分,VFD驱动显示,4路音频电子切换, 红外遥控控制 采用51单片机
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 好利来音响部设计
 未经同意不得散布于网络
 2005年2月15日
*/
/*
本项目专门为宣传本站的51 PIC AVR 多功能学习开发板而奉献,仅供参考,请勿做商业用途,欢迎转载但要保留本站信息
                                  志博电子专注于8位单片机开发板设计和教学  
                                      让人耳目一心的经济又豪华型开发板
                                                性价比最高 
                                                 仅售378! 
欢迎访问我们的网站 www.elecmcu.com                                              
*/
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
#include <reg52.h>
#include <absacc.h>
#include "mylib.h"
#define power_dvd 1
#define power_radio 0
#define vfd_dvd 1
#define vfd_radio 0
#define fm 0
#define am 1
#define dvd 2
#define tape 3
#define tv   4
#define inc 1
#define dec 0
#define add_volume 248
#define add_band   249
#define add_eq     250
#define add_tai    251
#define add_la_1   252
#define add_la_2   253
#define add_la_3   254
uchar test_iic_wr=8;
uchar test_iic_rd=0;
sbit vold=P0^0;//音量加按键     39
sbit voli=P0^1;//音量减按键     38
sbit funp=P1^3;//tape/radio转换按键  4
sbit next=P2^7;//下一个电台按键    28
sbit pre=P2^6;//上一个电台按键     27
sbit tuni=P2^5;//步进一个电台频率按键  26
sbit tund=P2^4;//步退一个电台频率按键  25
sbit fun_vfd=P1^4;//VFD控制权切换      5
sbit fun_power=P3^3;//DVD电源控制      13
sbit mute_key=P0^5;//净音按键          34
sbit memory_key=P0^7;//存储按键        32
sbit band_key=P0^6;  //AM FM切换按键   33
sbit power_key=P0^4; //电源控制按键    35
sbit tape_p=P3^1;    //TAPE电源控制    11
sbit eq=P0^2;        //EQ按键          37
sbit mute=P3^5;      //净音控制        15
sbit dvd_tv=P0^3;    //DVD TV 切换     36
sbit func_dvd=P1^2;  //TFT屏进入DVD状态控制  3
sbit func_tv=P1^1;   //TFT屏进入 TV状态控制  2
sbit power_led=P1^0; //电源指示灯输出   1
bit key_sta;
bit key_long;
bit start=0;
extern bit mute_l=0;
extern bit power_l=0;
bit key();
uchar ab_am=0;
uchar ab_fm=0;
void pub();
#define on 1
#define off 0
extern uchar eq_l;
uchar u;
uchar k;
uchar fun=0;
uchar code dx58[3] _at_ 0x3b;
extern uchar remkey;	 //定义功能数据,改变它的有遥控程序和按键程序
uchar tai;				 //显示的台号
uchar band;
bit int_power_off=0;
static bb;
extern uchar ab=0;	 //目前波段标志
ulong e=4;
uchar i=4;
uchar b[2]={2,3};			   	//I2C发送缓冲
uchar a[2];			    //I2C接收缓冲
main()
{
//func_dvd=0;
//func_tv=1;
//func_dvd=1;

//inieeprom();
rdnbyt(0xa0,add_la_1,1,&test_iic_rd);
if(test_iic_rd!='z')
inieeprom();
rdnbyt(0xa0,add_la_2,1,&test_iic_rd);
if(test_iic_rd!='t')
inieeprom();
rdnbyt(0xa0,add_la_3,1,&test_iic_rd);
if(test_iic_rd!='y')
inieeprom();
test_iic_wr=test_iic_rd;
func_tv=0;
func_dvd=0;
dvd_tv=1;
remkey=0x99;
fun_power=power_radio;//电源为收音
m:
  key_long=key();
//  sys_ini();
  tape_p=1;
 //       fun_power=power_radio;//电源为收音
 //     fun_vfd=vfd_radio;    //VFD控制给收音
 //while(1)
// vfd_test();
  while(1)
  {
   if(!int_power_off)
   {
   remkey=0x99;
   power_l=1;
   }
  volcheack();
  if(remkey==0x99)//关机处理
     {
      func_tv=0;
      func_dvd=0;
      fun_power=power_radio;//电源为收音
      fun_vfd=vfd_radio;    //VFD控制给收音
      vfd_clean();
      remkey=0;
      power_led=1;
      mute_(on);
      int_power_off=1;
      tape_p=0;
      TR1=0;
      }
  if(remkey==0x98)//开机处理
    {
      remkey=0;
      mute_(off);
      power_led=0;
      int_power_off=1;
      mute_(off);
      sys_ini();
      tape_p=1;
      goto 	m;
    }
  if(!power_l)
 {
  if(remkey==0x97)
  {
     eqchange();
     save_eeprom();
    }
  if(remkey==0xdf)
  {
     band_change();
     save_eeprom();		                //功能切换
     }
  if(remkey==0xf4)
    dvd_tv_ch();
if(band==fm||band==am)
{
  if(remkey==0x78)
     radio_change();
  else if(remkey==0xB5)
     station_search(reuse_seach,up);	//自动搜索所有频道电台,并存储到24C02。
  else if(remkey==0xef)
    {
    if(TR0)
     {
       if(ab<50)
	   ab++;
	   else
	   ab=0;
       taiwei();
       remkey=0x00;//如果是在存台状态下台号改变而不真正调台
      }
     else
     {
     station_change(inc);//调出搜到的电台,并使电台号  加1  指向下一个存储的电台
     save_eeprom();
     }
    }
  else if(remkey==0x85)
    {
    if(TR0)
     {
       if(ab>=1)
	   ab--;
       taiwei();
       remkey=0x00;      //如果是在存台状态下台号改变而不真正调台
     }
    else
    {
    station_change(dec);//调出搜到的电台,并使电台号  减1   指向上一个存储的电台
    save_eeprom();
    }
    }
    else if(remkey==0x33)
     station_search(reuse_waite,up);	//向前搜索一个电台并停止。
    else if(remkey==0x34)
     station_search(reuse_waite,down);	//向后搜索一个电台并停止。
    else if(remkey==0x55)
     band_step(up);	    //向前步进一个电台频率;
    else if(remkey==0x77)
     band_step(down);	//向前步进一个电台频率;
}
     if(remkey==0x64)//总音量加
	sub_vol(up);
	else if(remkey==0x65)//总音量减
	sub_vol(down);
    else if(remkey==0x47)//存台处理
     {
       if((band==fm)||(band==am))
       {
       bb=~bb;
       if(bb)
       TR0=1;
       else
      {
       TR0=0;
       if(band==fm)
       in0.in0.frq=swdata(swdata(in0.in0.frq)-1);
       if(band==am)
       in0.in0.frq=swdata(swdata(in0.in0.frq)-0x10);
       b[0]=in0.in0.frq>>8;
	   b[1]=in0.in0.frq;
       if(band==fm)
       wrnbyt(0xa0,ab*2,2,b);
       else if(band==am)
       wrnbyt(0xa0,ab*2+120,2,b);
       taiwei();
      }
      }
       remkey=0x00;
      }
  }}
}
void display()		//在VFD上显示目前频率和当前的台号
 {
   if(in1.in1.band==am)
     {
      vfddigit(swdata(in0.in0.frq<<4)*5-450);//调频波段电台实际频率和写入锁相环的算法
      //if((swdata(in0.in0.frq<<4)*5-450));
     }
   else
      vfddigit(swdata(in0.in0.frq)/2-107);	 //调幅波段电台实际频率和写入锁相环的算法
 }
void band_step(bit direction)				 //频率步进调幅5KHZ/STEP 调频50HZ/STEP
 {
     iniband();
     iniband1(band);
     pub();
     e=stepserch(direction,in0.in0.frq);	//根据形参 direction 决定步进方向
	 vfd_clean();
     display();
     remkey=0x00;
 }
 void band_change(void)					  //波段换函数
  {
     TR0=0;
     fun++;
     tape_p=1;
	if(band==tape||band==fm||band==am||band==tv)
	 {
	  band=dvd;
          func_dvd=0;
          func_tv=1;
          fun_power=power_dvd;//电源为收音
          fun_vfd=vfd_radio;    //VFD控制给收音
          vfd_clean();
          wrvfd(0x05,0x5f);//清屏
	  wrvfd(0x04,0x24);
	  wrvfd(0x07,0x5e);
          fun_vfd=vfd_dvd;
	  channel(dvd_fun);
	  remkey=0x00;
          save_eeprom();
	  return;
	 }
         else if(band==tape||band==fm||band==am||band==dvd)
         {
          band=tv;
          func_dvd=1;
          func_tv=0;
          fun_power=power_radio;//电源为收音
          fun_vfd=vfd_radio;    //VFD控制给收音
          vfd_clean();
          wrvfd(0x05,0xb6);//清屏
	  wrvfd(0x04,0x76);
	  wrvfd(0x07,0x6f);
          wrvfd(0x06,0x40);
	  channel(tv_fun);
	  remkey=0x00;
          save_eeprom();
          tape_p=1;
	  return;
          }

         /*
	 else if(band==dvd)
     {
	  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;
	 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;
     }
    else if((band==fm)||(band==am))
    {
     band=tape;
     fun_power=power_radio;//电源为收音
     fun_vfd=vfd_radio;    //VFD控制给收音
     channel(tape_fun);
     vfd_clean();       //清屏
     wrvfd(0x06,0x40);
     wrvfd(0x07,0xfd);
     wrvfd(0x04,0xfa);
     wrvfd(0x05,0xb6);
     remkey=0x00;
    }
    */
}
 void dvd_tv_ch(void)					  //波段换函数
  {
     TR0=0;
     fun++;
	if(band==dvd||band==fm||band==am||band==tv)
	 {  func_dvd=0;
            func_tv=0;
            band=tape;
            fun_power=power_radio;//电源为收音
            fun_vfd=vfd_radio;    //VFD控制给收音
            channel(tape_fun);
            vfd_clean();       //清屏
            wrvfd(0x06,0x40);
            wrvfd(0x07,0xfd);
            wrvfd(0x04,0xfa);
            wrvfd(0x05,0xb6);
            remkey=0x00;
           tape_p=1;
            save_eeprom();
	  return;
	 }
         else if(band==tape||band==tv||band==dvd)
         {
          tape_p=0;
          func_dvd=0;
          func_tv=0;
	  band=fm;
      fun_power=power_radio;//电源为收音
      fun_vfd=vfd_radio;    //VFD控制给收音
	  channel(radio_fun);
	  vfd_clean();       //清屏
	 if(band==fm)
     station_change(up);		  //加载频率
     station_change(down);
     display();							  //更新显示
	 remkey=0x00;
         save_eeprom();
         tape_p=1;
          }
}
 void station_change(bit direction)		 //调出已经存储的电台并设置为当前电台
  {
     if(direction)
	 {
	   if(ab<50)
	   ab++;
	   else
	   ab=0;
	 }
	 else
	  {
	   if(ab>=1)
	   ab--;
	  }
	 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);
     if(a[0]==0xaa&&a[1]==0xaa)
     {
      ab=0;
      	 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
     iniband();
     iniband1(band);
     e=stepserch(1,in0.in0.frq);
	 vfd_clean();
     display();
     remkey=0x00;
     if(band==fm)
     ab_fm=ab;
     else
     ab_am=ab;
  }
void station_search(bit reuse,bit dir)			  //电台搜索并存储
 {
	mute_(on);
    pub();
    if(band==am)
    {
	 iniband();

⌨️ 快捷键说明

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