?? radio.c
字號:
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include <reg51.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 + -