极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29473|回复: 11

调频收音模块TEA5767,用arduino控制,请教!!

[复制链接]
发表于 2015-12-6 12:46:58 | 显示全部楼层 |阅读模式
本帖最后由 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的库文件编写的程序////////////////
因为这些天身体不舒服,还没有调试!大家帮忙测试一下!!修改完善一下。谢谢!!



  1. /*设想:有2个按钮,一个按钮是搜台并自动存台;另一个按钮读台,把搜到的保存的电台读出来播放,按一下读一个台,再按一下读下一个保存的电台。搜索按钮接D5,下一个电台按钮(读台按钮)接D6*/
  2. #include <LiquidCrystal.h>
  3. #include <TEA5767N.h>
  4. #include <Wire.h>
  5. #include <stdlib.h>
  6. #include <EEPROM.h>

  7. TEA5767N radio = TEA5767N();
  8. // LiquidCrystal lcd(RS, E, D10, D9, D8, D7);
  9. LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
  10. byte scan_pin=5, next_adj=6;//搜索按钮接D5,下一个电台按钮(读台按钮)接D6
  11. byte isBandLimitReached = 0;

  12. byte pressBtnSum=0;//下一电台按键次数累加
  13. byte keyval_next=0;//按键按下为1,否则为0
  14. //byte old_keyval_next=0;
  15. //byte old_keyval_scan=0;
  16. byte keyval_scan=0;//按键按下为1,否则为0
  17. byte SaveedStationSum =0;
  18. unsigned long starttime=0;//
  19. bool saved=0;//当前播放的电台是否保存

  20. void setup() {
  21. pinMode(scan_pin,INPUT);
  22. pinMode(next_adj,INPUT);//
  23. Wire.begin();
  24. lcd.begin(16, 2);
  25. lcd.clear();

  26. radio.mute();
  27. loadstation(0);
  28. radio.turnTheSoundBackOn();
  29. radio.setSoftMuteOn();
  30. radio.setStandByOff();
  31. loadstation(0);
  32. printSelectedFrequency(loadstation(0));
  33. SaveedStationSum = EEPROM.read(0);
  34. }
  35. void loop(){
  36. //检测(next下一电台)按钮是否按下
  37. keyval_next=digitalRead(next_adj);
  38. if((keyval_next==HIGH) {  
  39.         delay(20);//延时消抖
  40.         if((keyval_next==HIGH){
  41.           pressBtnSum+=1;
  42.         saved=0;//电台保存状态置为未保存
  43.         if(pressBtnSum> SaveedStationSum){
  44. pressBtnSum=1;
  45. }
  46. loadstation(pressBtnSum);
  47. printSelectedFrequency(loadstation(pressBtnSum));
  48.   starttime=millis();//暂存最后一次按钮按下的开始时间(ms)
  49. }
  50. }
  51. //如果播放10秒,则把当前播放的电台频率状态保存
  52. if((millis()-starttime)>10000){  
  53. if(saved==0){
  54. saveStation(radio.readFrequencyInMHz(),0);
  55. saved=1;//置电台保存状态为1,为保存状态
  56. }
  57. }
  58. //检测scan按钮是否按下
  59. keyval_scan= digitalRead(next_adj);
  60. if((keyval_scan==HIGH) {  
  61.         delay(20);//延时消抖
  62.         if((keyval_scan==HIGH) {
  63.   ScanSaveStation();
  64.   }
  65. }

  66. //读电台频率。0存放搜索电台总数;1、2位存当前的播放电台(n=0);3、4位存第1个搜索到的电台频率(n=1),以此类推
  67. void loadstation(byte n){
  68. byte intStation, floatStation;
  69.   float station;
  70.   
  71.   intStation = EEPROM.read(2*n+1 );
  72.   floatStation = EEPROM.read(2*n +2);
  73.   
  74.   if (intStation != 0xFF) {
  75.     station = (intStation*1.0)+(floatStation*0.1);
  76.     radio.selectFrequency(station);
  77. printSelectedFrequency(radio.readFrequencyInMHz());
  78.   }
  79. }
  80. //显示电台频率
  81. void printSelectedFrequency(float station){
  82.   lcd.setCursor(0,1);
  83.   lcd.print("                ");
  84.   lcd.setCursor(0,1);
  85. lcd.print("FM");
  86. lcd.print(station,1);
  87. lcd.print("MHz");
  88. }
  89. /*/自动搜索并保存电台频率。0位存放搜索电台总数;1、2位存当前播放电台;3、4位存第1个搜索到的电台频率,以此类推*/
  90. void ScanSaveStation(){
  91. byte ScanStationSum=0; //已存的电台总数
  92. radio.setSearchMidStopLevel();
  93. //radio.setSearchHighStopLevel();
  94. radio.selectFrequency(88.0);
  95. isBandLimitReached = radio.startsSearchMutingFromBeginning();
  96. float freq = radio.readFrequencyInMHz();
  97. /*第1个搜索到的电台,存到EEPROM中的第3、4位*/
  98. saveStation(freq,1);
  99. printSelectedFrequency(freq);
  100. lcd.print("  S1");
  101. ScanStationSum=1;
  102. delay(500);
  103. while(!isBandLimitReached){
  104.   isBandLimitReached=radio.searchNextMuting();
  105.   freq = radio.readFrequencyInMHz();
  106. ScanStationSum+=1;
  107.   saveStation(freq, ScanStationSum);
  108. printSelectedFrequency(freq);
  109. lcd.print("  S");
  110. lcd.print(ScanStationSum);
  111. delay(500);
  112. }
  113. //把搜索到的电台总数存到EEPROM中的第0位。
  114. EEPROM.write(0, ScanStationSum);
  115. lcd.setCursor(0,1);
  116.   lcd.print("                ");
  117.   lcd.setCursor(0,1);
  118. lcd.print("StationSum:");
  119. lcd.print(ScanStationSum);
  120. delay(500);
  121. }

  122. //存电台到EEPROM
  123. void  saveStation(float station,byte n){
  124. float aux;
  125.   byte byteValue;
  126.   
  127.   byteValue = (byte) floor(station);
  128.   EEPROM.write(2*n+1, byteValue);
  129.   aux = station - floor(station);
  130.   aux *= 10.0;
  131.   if (aux > 5.0) {
  132.     byteValue = byte(aux);
  133.     if ((((float)byteValue) - aux) > 0.1) {
  134.       byteValue--;
  135.     } else if ((aux - ((float)byteValue)) > 0.1) {
  136.       byteValue++;
  137.     }
  138.   } else {
  139.     byteValue = (int) ceil(aux);
  140.   }
  141.   EEPROM.write(2*n+2, byteValue);
  142. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-12-6 21:00:23 | 显示全部楼层
淘宝搜这个模块的卖家

有 arduino版的

另外我记得这个模块有专门的库,你可以搜一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-7 10:36:02 | 显示全部楼层
问题找到了!是这个出问题:int frey=107.1;
应该改为float frey=107.1;
原来用整型数据,导致频率计算错误,而收不到台!现在可以收到台了。
我想做一个能自动搜台,存台的收音机,存台可以存在arduino的EEprom中
有谁有资料可以共享一下?
回复 支持 反对

使用道具 举报

发表于 2015-12-10 00:37:13 | 显示全部楼层
搜台的代码你有么?
有搜台的代码
可以用FOR来遍历各频率 找到高信噪比的频率
然后写EEPROM即可  EEPROM可以用2个字节来存频率
回复 支持 反对

使用道具 举报

发表于 2015-12-12 00:16:31 来自手机 | 显示全部楼层
我用你程序1602怎么没显示
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-14 14:33:19 | 显示全部楼层
tianjiwen 发表于 2015-12-12 00:16
我用你程序1602怎么没显示


LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
/*1602液晶与UNO连接引脚
LiquidCrystal lcd(rs, enable,d10,d9,d8,d7)  */
看一看接线是否有错?,要按上面的正确接线!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-15 11:11:11 | 显示全部楼层
zoologist 发表于 2015-12-6 21:00
淘宝搜这个模块的卖家

有 arduino版的

谢谢,现在找到TEA5767的库了!!正在研究。
回复 支持 反对

使用道具 举报

发表于 2015-12-15 15:30:01 | 显示全部楼层
谢谢楼主分享资源。
楼主,用Arduino1.5.6-r2编译出现错误:
sketch_dec15a.ino: In function 'void set_frey()':
sketch_dec15a:30: error: call of overloaded 'write(unsigned int [5])' is ambiguous
D:\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:60: note: candidates are: virtual size_t TwoWire::write(uint8_t) <near match>
D:\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:69: note:                 size_t TwoWire::write(long unsigned int) <near match>
D:\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:70: note:                 size_t TwoWire::write(long int) <near match>
D:\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:71: note:                 size_t TwoWire::write(unsigned int) <near match>
D:\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:72: note:                 size_t TwoWire::write(int) <near match>
sketch_dec15a.ino: In function 'void frey_lcd()':
sketch_dec15a:40: error: incompatible types in assignment of 'int' to 'unsigned int [5]'

感觉可像库文件Wire.h有些问题,有什么好支招?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-17 09:16:51 | 显示全部楼层
yuqingshan 发表于 2015-12-15 15:30
谢谢楼主分享资源。
楼主,用Arduino1.5.6-r2编译出现错误:
sketch_dec15a.ino: In function 'void set_ ...

unsigned int [5]这个错了吧!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-17 20:36:20 | 显示全部楼层
本帖最后由 dcui 于 2015-12-17 20:48 编辑

一个按钮自动搜台存台,另一个按钮能够读取保存的电台。
正在测试!自动搜台没问题,测试时最多能收到34个台。但读台有问题,不能全部读出,
不知是存台还是读台的问题,正在查。高手们也帮忙一下。完善一下。
代码如下:
  1. #include <LiquidCrystal.h>
  2. #include <TEA5767N.h>
  3. #include <Wire.h>
  4. #include <stdlib.h>
  5. #include <EEPROM.h>

  6. TEA5767N radio = TEA5767N();
  7. // LiquidCrystal lcd(RS, E, D10, D9, D8, D7);
  8. LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
  9. byte scan_pin=5, next_adj=6;// 搜索按钮接D5,下一个电台按钮(读台按钮)接D6
  10. byte isBandLimitReached = 0;

  11. byte pressBtnSum=0;//下一电台按键次数累加
  12. byte keyval_next=0;//按键按下为1,否则为0
  13. //byte old_keyval_next=0;
  14. //byte old_keyval_scan=0;
  15. byte keyval_scan=0;//按键按下为1,否则为0
  16. byte SaveedStationSum =0;
  17. unsigned long starttime=0;//
  18. bool saved=0;//当前播放的电台是否保存

  19. void setup() {
  20. pinMode(scan_pin, INPUT_PULLUP); //使用内部上拉电阻,按钮接地
  21. pinMode(next_adj, INPUT_PULLUP);
  22. Wire.begin();
  23. lcd.begin(16, 2);
  24. lcd.clear();

  25. radio.mute();
  26. loadstation(0);
  27. radio.turnTheSoundBackOn();
  28. radio.setSoftMuteOn();
  29. radio.setStandByOff();
  30. loadstation(0);
  31. printSelectedFrequency(radio.readFrequencyInMHz());
  32. SaveedStationSum = EEPROM.read(0);
  33. }
  34. void loop(){
  35. //检测(next下一电台)按钮是否按下
  36. keyval_next=digitalRead(next_adj);
  37. if(keyval_next==LOW) {  
  38.   delay(20);//延时消抖
  39.   if(keyval_next==LOW){
  40.     pressBtnSum+=1;
  41.   saved=0;//电台保存状态置为未保存
  42.   if(pressBtnSum> SaveedStationSum){
  43. pressBtnSum=1;
  44. }
  45. loadstation(pressBtnSum);
  46. printSelectedFrequency(radio.readFrequencyInMHz());
  47.   starttime=millis();//暂存最后一次按钮按下的开始时间(ms)
  48. }
  49. }
  50. //如果播放10秒,则把当前播放的电台频率状态保存
  51. if((millis()-starttime)>10000){  
  52. if(saved==0){
  53. saveStation(radio.readFrequencyInMHz(),0);
  54. saved=1;//置电台保存状态为1,为保存状态
  55. }
  56. }
  57. //检测scan按钮是否按下
  58. keyval_scan= digitalRead(scan_pin);
  59. if(keyval_scan==LOW) {  
  60.   delay(20);//延时消抖
  61.   if(keyval_scan==LOW) {
  62.   ScanSaveStation();
  63.   }
  64. }
  65. }
  66. //读电台频率。0存放搜索电台总数;1、2位存当前的播放电台(n=0);3、4位存第1个搜索到的电台频率(n=1),以此类推
  67. void loadstation(byte n) {
  68. byte intStation, floatStation;
  69.   float station;
  70.     intStation = EEPROM.read(2*n+1 );
  71.   floatStation = EEPROM.read(2*n +2);
  72.     if (intStation!= 0xFF) {
  73.     station = (intStation*1.0)+(floatStation*0.1);
  74.     radio.selectFrequency(station);
  75. printSelectedFrequency(radio.readFrequencyInMHz());
  76.   }
  77. }
  78. //显示电台频率
  79. void printSelectedFrequency(float station){
  80.   lcd.setCursor(0,1);
  81.   lcd.print("                ");
  82.   lcd.setCursor(0,1);
  83. lcd.print("FM");
  84. lcd.print(station,1);
  85. lcd.print("MHz");
  86. }
  87. /*/自动搜索并保存电台频率。0位存放搜索电台总数;1、2位存当前播放电台;3、4位存第1个搜索到的电台频率,以此类推*/
  88. void ScanSaveStation(){
  89. byte ScanStationSum=0; //已存的电台总数
  90. radio.setSearchMidStopLevel();
  91. //radio.setSearchHighStopLevel();
  92. radio.selectFrequency(88.0);
  93. isBandLimitReached = radio.startsSearchMutingFromBeginning();
  94. float freq = radio.readFrequencyInMHz();
  95. /*第1个搜索到的电台,存到EEPROM中的第3、4位*/
  96. saveStation(freq,1);
  97. printSelectedFrequency(freq);
  98. lcd.print("  S1");
  99. ScanStationSum=1;
  100. delay(500);
  101. while(!isBandLimitReached){
  102.   isBandLimitReached=radio.searchNextMuting();
  103.   freq = radio.readFrequencyInMHz();
  104. ScanStationSum+=1;
  105.   saveStation(freq, ScanStationSum);
  106. printSelectedFrequency(freq);
  107. lcd.print("  S");
  108. lcd.print(ScanStationSum);
  109. delay(500);
  110. }
  111. //把搜索到的电台总数存到EEPROM中的第0位。
  112. EEPROM.write(0, ScanStationSum);
  113. lcd.setCursor(0,1);
  114.   lcd.print("                ");
  115.   lcd.setCursor(0,1);
  116. lcd.print("StationSum:");
  117. lcd.print(ScanStationSum);
  118. delay(500);
  119. }

  120. //存电台到EEPROM
  121. void  saveStation(float station,byte n){
  122. float aux;
  123.   byte byteValue;
  124.   
  125.   byteValue = (byte) floor(station);
  126.   EEPROM.write(2*n+1, byteValue);
  127.   aux = station - floor(station);
  128.   aux *= 10.0;
  129.   if (aux > 5.0) {
  130.     byteValue = byte(aux);
  131.     if ((((float)byteValue) - aux) > 0.1) {
  132.       byteValue--;
  133.     } else if ((aux - ((float)byteValue)) > 0.1) {
  134.       byteValue++;
  135.     }
  136.   } else {
  137.     byteValue = (int) ceil(aux);
  138.   }
  139.   EEPROM.write(2*n+2, byteValue);
  140. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-21 17:24:58 | 显示全部楼层
搜台效果不是很好,经常有漏台和假台的问题,看来哪里还要优化!或是要优化库文件?
回复 支持 反对

使用道具 举报

发表于 2016-3-19 16:34:20 | 显示全部楼层
大神,现在就自动搜台那部分没搞懂。能出来讲解一下吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 00:46 , Processed in 0.038403 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表