📄 radio.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 + -