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

📄 radio.c

📁 收音头程序+VFD驱动+遥控接收(LC72130+LA1823)
💻 C
字号:
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
#include <reg52.h>
#include <absacc.h>
#include "mylib.h"
#define fm 0
#define am 1
#define inc 1
#define dec 0
extern uchar remkey;	 //定义功能数据,改变它的有遥控程序和按键程序
uchar tai;				 //显示的台号
bit band; uchar ab=0;	 //目前波段标志
ulong e=4;				 
uchar i=4;				
uchar b[2];			   	//I2C发送缓冲
uchar a[2];			    //I2C接收缓冲
main()
{
delay(100);
in0.in0.frq=0x6410;//初始华调频频率为南阳人民广播电台
band=fm;		   //初始化波段为调频
inivfd();		   //初始化VFD显示
remkey=0xc7;
while(1)
  {
  while(rdkey());		//将键盘检测放到主循环中,得到的结果放在remkey,
  if(remkey==0xc7)					 
     band_step(inc);	//向前步进一个电台频率						
  else if(remkey==0x47)
     band_step(dec);	//退后一个电台频率				 
  else if(remkey==0x87)				 
     band_change();		//调频调幅转换
  else if(remkey==0x57)
     station_search();	//自动搜索所有频道电台,并存储到24C02。
  else if(remkey==0xf7)
    station_change(inc);//调出搜到的电台,并使电台号加1指向下一个存储的电台
  else if(remkey==0x77)
    station_change(dec);//调出搜到的电台,并使电台号减1指向上一个存储的电台
  }
}
void display(void)		//在VFD上显示目前频率和当前的台号
 {
   if(in1.in1.band==am)
      vfddigit(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);
     e=stepserch(direction,in0.in0.frq);	//根据形参 direction 决定步进方向
     display();
     remkey=0x00;
 }
 void band_change(void)					  //波段换函数
  {    
     band=~band;						  //初始化波段公共部分
	 iniband();							  
	 if(band==fm)
	   in0.in0.frq=0x6410;				  //如果是调频调出最低端电台87MHZ
	 else
	   in0.in0.frq=0x0330;				  //如果是调幅调出最低端电台575KHZ
     iniband1(band);					  //初始化具体波段的私有部分
     e=stepserch(1,in0.in0.frq);		  //加载频率
     display();							  //更新显示
	 remkey=0x00;
  }

 void station_change(bit direction)		 //调出已经存储的电台并设置为当前电台
  {	 
     if(direction)
	   tai++;
	 else
	   tai--;
     rdnbyt(0xa0,tai*2,2,a);			 //经过IIC总线调出硬件地址为0XA0,子地址为tai*2的24C02中的数据高第一字节放在A[0]中第二字节放在A[1]中
	 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);
     display();
     remkey=0x00;
  }
void station_search(void)			  //电台搜索并存储
 {
    uchar i;
    if(band==am)
    {
	 iniband();
     iniband1(band); 				
	 in0.in0.frq=0x0330;			//从最低端开始搜索
	 for(i=0;i<207;i++)			    //设置搜台的范围(中波575KHZ-1605HZ)
         { 	
		   e=(stepserch(1,in0.in0.frq)&0x0000ffff);
           display();
		   if((e<0x38e0)&&(e>0x37a0))//判断搜台是否准确的依据(在这里设置了一个范围来提高搜台数量减少漏台,但是实质范围过大将会搜到很多的假台)
			  {
			   b[0]=in0.in0.frq>>8;
			   b[1]=in0.in0.frq;
               wrnbyt(0xa0,ab*2,2,b); //将搜到的电台存储起来
                                      //rdnbyt(0xa0,ab*2,2,a);//此语句为校验写入的和读出的是否相同
			   ab=ab+1;
			  }
         }
     }remkey=0x00;tai=0x00;
 }
 

/*
注意:
(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 + -