?? radio.c
字號(hào):
#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; //定義功能數(shù)據(jù),改變它的有遙控程序和按鍵程序
uchar tai; //顯示的臺(tái)號(hào)
bit band; uchar ab=0; //目前波段標(biāo)志
ulong e=4;
uchar i=4;
uchar b[2]; //I2C發(fā)送緩沖
uchar a[2]; //I2C接收緩沖
main()
{
delay(100);
in0.in0.frq=0x6410;//初始華調(diào)頻頻率為南陽(yáng)人民廣播電臺(tái)
band=fm; //初始化波段為調(diào)頻
inivfd(); //初始化VFD顯示
remkey=0xc7;
while(1)
{
while(rdkey()); //將鍵盤檢測(cè)放到主循環(huán)中,得到的結(jié)果放在remkey,
if(remkey==0xc7)
band_step(inc); //向前步進(jìn)一個(gè)電臺(tái)頻率
else if(remkey==0x47)
band_step(dec); //退后一個(gè)電臺(tái)頻率
else if(remkey==0x87)
band_change(); //調(diào)頻調(diào)幅轉(zhuǎn)換
else if(remkey==0x57)
station_search(); //自動(dòng)搜索所有頻道電臺(tái),并存儲(chǔ)到24C02。
else if(remkey==0xf7)
station_change(inc);//調(diào)出搜到的電臺(tái),并使電臺(tái)號(hào)加1指向下一個(gè)存儲(chǔ)的電臺(tái)
else if(remkey==0x77)
station_change(dec);//調(diào)出搜到的電臺(tái),并使電臺(tái)號(hào)減1指向上一個(gè)存儲(chǔ)的電臺(tái)
}
}
void display(void) //在VFD上顯示目前頻率和當(dāng)前的臺(tái)號(hào)
{
if(in1.in1.band==am)
vfddigit(swdata(in0.in0.frq<<4)*5-450);//調(diào)頻波段電臺(tái)實(shí)際頻率和寫入鎖相環(huán)的算法
else
vfddigit(swdata(in0.in0.frq)/2-107); //調(diào)幅波段電臺(tái)實(shí)際頻率和寫入鎖相環(huán)的算法
}
void band_step(bit direction) //頻率步進(jìn)調(diào)幅5KHZ/STEP 調(diào)頻50HZ/STEP
{
iniband();
iniband1(band);
e=stepserch(direction,in0.in0.frq); //根據(jù)形參 direction 決定步進(jìn)方向
display();
remkey=0x00;
}
void band_change(void) //波段換函數(shù)
{
band=~band; //初始化波段公共部分
iniband();
if(band==fm)
in0.in0.frq=0x6410; //如果是調(diào)頻調(diào)出最低端電臺(tái)87MHZ
else
in0.in0.frq=0x0330; //如果是調(diào)幅調(diào)出最低端電臺(tái)575KHZ
iniband1(band); //初始化具體波段的私有部分
e=stepserch(1,in0.in0.frq); //加載頻率
display(); //更新顯示
remkey=0x00;
}
void station_change(bit direction) //調(diào)出已經(jīng)存儲(chǔ)的電臺(tái)并設(shè)置為當(dāng)前電臺(tái)
{
if(direction)
tai++;
else
tai--;
rdnbyt(0xa0,tai*2,2,a); //經(jīng)過(guò)IIC總線調(diào)出硬件地址為0XA0,子地址為tai*2的24C02中的數(shù)據(jù)高第一字節(jié)放在A[0]中第二字節(jié)放在A[1]中
in0.in0.frq=a[0];
in0.in0.frq=(in0.in0.frq<<8)|(0x00ff&a[1]);//將調(diào)出的兩個(gè)字節(jié)頻率值付給in0.in0.frq
iniband();
iniband1(band);
e=stepserch(1,in0.in0.frq);
display();
remkey=0x00;
}
void station_search(void) //電臺(tái)搜索并存儲(chǔ)
{
uchar i;
if(band==am)
{
iniband();
iniband1(band);
in0.in0.frq=0x0330; //從最低端開(kāi)始搜索
for(i=0;i<207;i++) //設(shè)置搜臺(tái)的范圍(中波575KHZ-1605HZ)
{
e=(stepserch(1,in0.in0.frq)&0x0000ffff);
display();
if((e<0x38e0)&&(e>0x37a0))//判斷搜臺(tái)是否準(zhǔn)確的依據(jù)(在這里設(shè)置了一個(gè)范圍來(lái)提高搜臺(tái)數(shù)量減少漏臺(tái),但是實(shí)質(zhì)范圍過(guò)大將會(huì)搜到很多的假臺(tái))
{
b[0]=in0.in0.frq>>8;
b[1]=in0.in0.frq;
wrnbyt(0xa0,ab*2,2,b); //將搜到的電臺(tái)存儲(chǔ)起來(lái)
//rdnbyt(0xa0,ab*2,2,a);//此語(yǔ)句為校驗(yàn)寫入的和讀出的是否相同
ab=ab+1;
}
}
}remkey=0x00;tai=0x00;
}
/*
注意:
(1)遙控發(fā)射芯片用TC9012/TC9243
經(jīng)常用到的還有UPD6121和LC7461,它們的不同只處在于引導(dǎo)碼的時(shí)間不同或者數(shù)據(jù)位的個(gè)數(shù)不同,接受原理基本一樣。將本程序的相關(guān)位置修改就可以通用。
系統(tǒng)時(shí)鐘22.1184MHZ,如果用其他的時(shí)鐘請(qǐng)將delay.c文件中的定時(shí)器裝載值修改一下
(2)
鍵盤檢測(cè)在VFD程序中,16312可以驅(qū)動(dòng)VFD,另外外部可接24個(gè)按鍵,并將按鍵值放到
其內(nèi)部的存儲(chǔ)中,使用時(shí)只須發(fā)命令讀即可。
(3)
由于時(shí)間原因,只給出調(diào)幅波段的自動(dòng)搜臺(tái)功能,調(diào)頻的自動(dòng)搜臺(tái)程序和調(diào)幅一樣,自己寫了。
(4)主要用在組合機(jī)和功放機(jī)上的收音頭大部分以LC72171做鎖象環(huán),LA1823做高中頻處理
和音頻解調(diào),但是有的數(shù)調(diào)收音頭把鎖象環(huán)和高頻處理做在一起,典型的有TEA5757和TEA5756
TEA5757采用了一種所謂的自動(dòng)調(diào)諧系統(tǒng),在自動(dòng)搜索時(shí)無(wú)須讀中頻,簡(jiǎn)化了程序。
*/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -