本帖最后由 dcui 于 2015-12-18 07:25 编辑
我买的TEA5767模块,想做个调频收音机,如图
调频收音模块TEA5767,用arduino控制
电路图如图
调频收音模块TEA5767,用arduino控制
arduino的测试 代码如下:
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
/*1602液晶与UNO连接引脚
LiquidCrystal lcd(rs, enable,d4,d5,d6,d7) */
unsigned int PLL;
int frey=107.1;
unsigned buffer[5]={0x00,0x00,0xB0,0x10,0x00};
void setup() {
Wire.begin();
set_frey();//向TEA5767向频率
lcd.begin(16, 2);
delay(1);
frey_lcd();
}
void loop() {
}
///----------TEA5767相关程序模块--------/////
void set_frey(){ //向TEA5767写频率数据
PLL=4*(frey*1000000+225000)/32768;
buffer[0]=PLL>>8;
buffer[1]=PLL & 0xFF;
delay(50);
Wire.beginTransmission(0xc0);
for(byte i=0;i< 5;i++) {
Wire.write(buffer);
}
Wire.endTransmission();
delay(50);
}
void frey_lcd(){
Wire.requestFrom(0xc1,5);
// if(Wire.available()){
for(byte i=0;i<5;i++){
buffer=Wire.read();
}
frey=(((buffer[0]&0x3f)<<8)+buffer[1])*32768/4-225000;
lcd.print(" FM");
lcd.print(frey/1000000);
//}
}
写入arduino后,收不到电台,1602显示为FM0。
请高手帮忙看一看,哪里出问题!
有哪个高手能给一个自动搜台的完整程序吗?
以下是更新!!!(10楼有更新)
/////////////////////////////以下是用TEA5767的库文件编写的程序////////////////
因为这些天身体不舒服,还没有调试!大家帮忙测试一下!!修改完善一下。谢谢!!
- /*设想:有2个按钮,一个按钮是搜台并自动存台;另一个按钮读台,把搜到的保存的电台读出来播放,按一下读一个台,再按一下读下一个保存的电台。搜索按钮接D5,下一个电台按钮(读台按钮)接D6*/
- #include <LiquidCrystal.h>
- #include <TEA5767N.h>
- #include <Wire.h>
- #include <stdlib.h>
- #include <EEPROM.h>
- TEA5767N radio = TEA5767N();
- // LiquidCrystal lcd(RS, E, D10, D9, D8, D7);
- LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
- byte scan_pin=5, next_adj=6;//搜索按钮接D5,下一个电台按钮(读台按钮)接D6
- byte isBandLimitReached = 0;
- byte pressBtnSum=0;//下一电台按键次数累加
- byte keyval_next=0;//按键按下为1,否则为0
- //byte old_keyval_next=0;
- //byte old_keyval_scan=0;
- byte keyval_scan=0;//按键按下为1,否则为0
- byte SaveedStationSum =0;
- unsigned long starttime=0;//
- bool saved=0;//当前播放的电台是否保存
- void setup() {
- pinMode(scan_pin,INPUT);
- pinMode(next_adj,INPUT);//
- Wire.begin();
- lcd.begin(16, 2);
- lcd.clear();
- radio.mute();
- loadstation(0);
- radio.turnTheSoundBackOn();
- radio.setSoftMuteOn();
- radio.setStandByOff();
- loadstation(0);
- printSelectedFrequency(loadstation(0));
- SaveedStationSum = EEPROM.read(0);
- }
- void loop(){
- //检测(next下一电台)按钮是否按下
- keyval_next=digitalRead(next_adj);
- if((keyval_next==HIGH) {
- delay(20);//延时消抖
- if((keyval_next==HIGH){
- pressBtnSum+=1;
- saved=0;//电台保存状态置为未保存
- if(pressBtnSum> SaveedStationSum){
- pressBtnSum=1;
- }
- loadstation(pressBtnSum);
- printSelectedFrequency(loadstation(pressBtnSum));
- starttime=millis();//暂存最后一次按钮按下的开始时间(ms)
- }
- }
- //如果播放10秒,则把当前播放的电台频率状态保存
- if((millis()-starttime)>10000){
- if(saved==0){
- saveStation(radio.readFrequencyInMHz(),0);
- saved=1;//置电台保存状态为1,为保存状态
- }
- }
- //检测scan按钮是否按下
- keyval_scan= digitalRead(next_adj);
- if((keyval_scan==HIGH) {
- delay(20);//延时消抖
- if((keyval_scan==HIGH) {
- ScanSaveStation();
- }
- }
- //读电台频率。0存放搜索电台总数;1、2位存当前的播放电台(n=0);3、4位存第1个搜索到的电台频率(n=1),以此类推
- void loadstation(byte n){
- byte intStation, floatStation;
- float station;
-
- intStation = EEPROM.read(2*n+1 );
- floatStation = EEPROM.read(2*n +2);
-
- if (intStation != 0xFF) {
- station = (intStation*1.0)+(floatStation*0.1);
- radio.selectFrequency(station);
- printSelectedFrequency(radio.readFrequencyInMHz());
- }
- }
- //显示电台频率
- void printSelectedFrequency(float station){
- lcd.setCursor(0,1);
- lcd.print(" ");
- lcd.setCursor(0,1);
- lcd.print("FM");
- lcd.print(station,1);
- lcd.print("MHz");
- }
- /*/自动搜索并保存电台频率。0位存放搜索电台总数;1、2位存当前播放电台;3、4位存第1个搜索到的电台频率,以此类推*/
- void ScanSaveStation(){
- byte ScanStationSum=0; //已存的电台总数
- radio.setSearchMidStopLevel();
- //radio.setSearchHighStopLevel();
- radio.selectFrequency(88.0);
- isBandLimitReached = radio.startsSearchMutingFromBeginning();
- float freq = radio.readFrequencyInMHz();
- /*第1个搜索到的电台,存到EEPROM中的第3、4位*/
- saveStation(freq,1);
- printSelectedFrequency(freq);
- lcd.print(" S1");
- ScanStationSum=1;
- delay(500);
- while(!isBandLimitReached){
- isBandLimitReached=radio.searchNextMuting();
- freq = radio.readFrequencyInMHz();
- ScanStationSum+=1;
- saveStation(freq, ScanStationSum);
- printSelectedFrequency(freq);
- lcd.print(" S");
- lcd.print(ScanStationSum);
- delay(500);
- }
- //把搜索到的电台总数存到EEPROM中的第0位。
- EEPROM.write(0, ScanStationSum);
- lcd.setCursor(0,1);
- lcd.print(" ");
- lcd.setCursor(0,1);
- lcd.print("StationSum:");
- lcd.print(ScanStationSum);
- delay(500);
- }
- //存电台到EEPROM
- void saveStation(float station,byte n){
- float aux;
- byte byteValue;
-
- byteValue = (byte) floor(station);
- EEPROM.write(2*n+1, byteValue);
- aux = station - floor(station);
- aux *= 10.0;
- if (aux > 5.0) {
- byteValue = byte(aux);
- if ((((float)byteValue) - aux) > 0.1) {
- byteValue--;
- } else if ((aux - ((float)byteValue)) > 0.1) {
- byteValue++;
- }
- } else {
- byteValue = (int) ceil(aux);
- }
- EEPROM.write(2*n+2, byteValue);
- }
复制代码 |