找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4910|回复: 0
打印 上一主题 下一主题
收起左侧

Arduino控制RadioShack Pro-405 MB1501仿真源码与实践(宽频接收机改造)

[复制链接]
跳转到指定楼层
楼主
本人的Pro-405 宽频接收机部分按键无效,显示看不清楚,出差改了这个程序,29-54/87.3-107.9/137-174/380-512MHz 基本步进均为12.5kHz,可选50/100kHz,有W/NFM切换控制,未做波段控制。29-54可接电视高频头中频,87.3-107.9可有可无,音质一般,380-512本地还能收到几套模拟伴音,欢迎各位改进。
MB1501_Scanner.ino 副本(2)V0.1直接计算参数,副本采用递加递减,仿真长按F+,发送间隔均为111ms,主要取决于按键延时100ms。V0.2按键延时可变,仿真长按F+,发送间隔约为21ms。
Arduino无法直接输入中文,有简单英文说明,引用部分保留日文注释。
Pro-405.xls为相关参数计算,其中380MHz 4F应为50,难道是WPS的问题?

MB1501仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


MB1501引脚图与管脚功能定义:

MB1501的arduino源程序如下:
  1. /*
  2. QRP 2m FM Transceiver Project with BS2 shiftout any bits
  3. modify by learning 2016.11 V0.2 fast scan */
  4. //RadioShack Pro-405 29-54/87.3-107.9/137-174/380-512MHz with 12.5kHz steps
  5. #include<stdlib.h>
  6. #include <LiquidCrystal.h>
  7. LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
  8. int buttonpin = A3;
  9. int audiopin = A2;
  10. const int PLL_data = 8 ;
  11. const int PLL_clock = 9 ;
  12. const int PLL_LE = 10 ;

  13. //unsigned int  R_up = 0x84 ;  //M=64 R=512
  14. unsigned int  R_up = 0x88 ;  //M=64 R=1024
  15. unsigned int  R_low = 0x01 ;
  16. unsigned int  N_up = 0;
  17. unsigned int  N_low;
  18. unsigned int A_0; //A0 A' can't be used
  19. unsigned int A;
  20. int T = 100;

  21. char* audiotext[]={
  22.   "NFM", "WFM"};
  23. int audio = 0;
  24. long freqbandarray[] = {
  25.   873000, 290000, 1370000, 3800000};//0.1kHz
  26. char* bandtext[]={
  27.   "FM", "VL", "VH", "U"};
  28. int band = 1;
  29. long stepsizearray[] = {
  30.   125 ,500 ,1000 ,80000};//0.1kHz
  31. char* stepsizetext[]={
  32.   "12.5 kHz", "50 kHz", "100 kHz", "8 MHz"};
  33. int stepsize = 0;
  34. int button;
  35. int buttondelay = 0;
  36. int menuoption = 0;

  37. void pll_set_frequency(long pllfreq) {
  38.   if (band == 0 || band == 1) {
  39.     N_low=((pllfreq+107000)/8000);
  40.     A=(freqbandarray[band]+107000)/125%64;
  41.   }
  42.   if (band == 2 ) {
  43.     N_low=((pllfreq-107000)/8000);
  44.     A=(freqbandarray[band]-107000)/125%64;
  45.   }
  46.   if (band == 3) {
  47.     N_up=highByte((pllfreq-107000)/8000);
  48.     N_low=lowByte ((pllfreq-107000)/8000);
  49.     A=(freqbandarray[band]-107000)/125%64;
  50.   }
  51.   A_0 = A << 1;

  52.   //M,Rを設定
  53.   digitalWrite(PLL_LE, LOW);
  54.   // シフト演算を使ってデータを送信する
  55.   shiftOut(PLL_data, PLL_clock, MSBFIRST, R_up);
  56.   shiftOut(PLL_data, PLL_clock, MSBFIRST, R_low);
  57.   digitalWrite(PLL_LE, HIGH);

  58.   //N,Aを設定   
  59.   digitalWrite(PLL_LE, LOW);
  60.   // シフト演算を使ってデータを送信する
  61.   shiftOut(PLL_data, PLL_clock, MSBFIRST, N_up);
  62.   shiftOut(PLL_data, PLL_clock, MSBFIRST, N_low);
  63.   shiftOut(PLL_data, PLL_clock, MSBFIRST, A_0);
  64.   digitalWrite(PLL_LE, HIGH);
  65. }

  66. void readbuttons(){
  67.   int pinread = analogRead(buttonpin);
  68.   if (pinread > 90 && pinread < 120) { //1k 1k2
  69.     buttondelay ++;
  70.     if (buttondelay == 2) button = 0;//M-
  71.     else button = -1;
  72.   }
  73.   if (pinread > 190 && pinread < 230) { //2k4 2k7
  74.     buttondelay ++;
  75.     if (buttondelay == 2) button = 1;//M+
  76.     else button = -1;
  77.   }
  78.   if (pinread > 320 && pinread < 360) { //4k7 5k1
  79.     button = 2;//--
  80.     //delay (100);//ms
  81.     delay (T);
  82.     buttondelay ++;
  83.     if (buttondelay == 2) {
  84.       button = 4;
  85.       T=10;
  86.     } //-
  87.   }
  88.   if (pinread > 480 && pinread < 540) { //10k
  89.     buttondelay ++;
  90.     if (buttondelay == 2) { //BAND
  91.       band ++;
  92.       if (band > 3) band = 0;
  93.       if (band == 0 || band == 1) {
  94.         A=(freqbandarray[band]+107000)/125%64;
  95.         R_up = 0x88;
  96.         N_up = 0;
  97.       }
  98.       if (band == 2) {
  99.         A=(freqbandarray[band]-107000)/125%64;
  100.         R_up = 0x88;
  101.         N_up = 0;
  102.       }
  103.       if (band == 3) {
  104.         A=(freqbandarray[band]-107000)/125%64;
  105.         R_up = 0x98;
  106.       }
  107.       //setfrequency();//?
  108.       pll_set_frequency(freqbandarray[band]);
  109.       delay (30);//ms
  110.     }
  111.   }
  112.   if (pinread > -1 && pinread < 40) {
  113.     button = 3;//++
  114.     //delay (100);//ms
  115.     delay (T);
  116.     buttondelay ++;
  117.     if (buttondelay == 2) {
  118.       button = 5;
  119.       T=10;
  120.     } //+
  121.   }
  122.   if (pinread > 1000) {
  123.     buttondelay = 0;
  124.     T=100;
  125.     button = -1;
  126.   }
  127. }

  128. void menu(){
  129.   if (button == 1) menuoption ++;
  130.   if (button == 0) menuoption --;
  131.   if (menuoption > 2 ) menuoption = 0;
  132.   if (menuoption < 0 ) menuoption = 2;
  133.   if (menuoption == 0) setfrequency();
  134.   if (menuoption == 1) setstepsize();
  135.   if (menuoption == 2) setaudio();
  136. }

  137. void setfrequency(){
  138.   lcd.setCursor(0, 0);
  139.   lcd.print("frequency  ");
  140.   //  lcd.print("FREQ  ");
  141.   lcd.setCursor(0, 1);
  142.   if (button == 2) {
  143.     freqbandarray[band] = freqbandarray[band] - (stepsizearray[stepsize]);
  144.     if (band == 0 && freqbandarray[band] < 873000) {
  145.       freqbandarray[band] = 1079000;
  146.       A=(freqbandarray[band]+107000)/125%64;
  147.     }
  148.     if (band == 1 && freqbandarray[band] < 290000) {
  149.       freqbandarray[band] = 540000;
  150.       A=(freqbandarray[band]+107000)/125%64;
  151.     }
  152.     if (band == 2 && freqbandarray[band] < 1370000) {
  153.       freqbandarray[band] = 1740000;
  154.       A=(freqbandarray[band]-107000)/125%64;
  155.     }
  156.     if (band == 3 && freqbandarray[band] < 3800000) {
  157.       freqbandarray[band] = 5120000;
  158.       A=(freqbandarray[band]-107000)/125%64;
  159.     }
  160.     pll_set_frequency(freqbandarray[band]);
  161.   }
  162.   if (button == 3) {
  163.     freqbandarray[band] = freqbandarray[band] + (stepsizearray[stepsize]);
  164.     if (band == 0 && freqbandarray[band] > 1079000) {
  165.       freqbandarray[band] = 873000;
  166.       A=(freqbandarray[band]+107000)/125%64;
  167.     }
  168.     if (band == 1 && freqbandarray[band] >= 540000) {
  169.       freqbandarray[band] = 290000;
  170.       A=(freqbandarray[band]+107000)/125%64;
  171.     }
  172.     if (band == 2 && freqbandarray[band] >= 1740000) {
  173.       freqbandarray[band] = 1370000;
  174.       A=(freqbandarray[band]-107000)/125%64;
  175.     }
  176.     if (band == 3 && freqbandarray[band] > 5120000) {
  177.       freqbandarray[band] = 3800000;
  178.       A=(freqbandarray[band]-107000)/125%64;
  179.     }
  180.     pll_set_frequency(freqbandarray[band]);
  181.   }
  182.   lcd.print((freqbandarray[band]) / 10000);
  183.   lcd.print (".");
  184.   if (((freqbandarray[band]) % 10000) <1000) {
  185.     lcd.print("0");
  186.     if (((freqbandarray[band]) % 10000) == 0) lcd.print("000");
  187.     else lcd.print((freqbandarray[band]) % 10000);
  188.   }
  189.   else lcd.print((freqbandarray[band]) % 10000);
  190.   lcd.print(" MHz    ");
  191. }  

  192. void setstepsize(){
  193.   lcd.setCursor(0, 0);
  194.   lcd.print("stepsize        ");
  195.   lcd.setCursor(0, 1);
  196.   if (button == 4) stepsize --;
  197.   if (button == 5) stepsize ++;
  198.   if (stepsize < 0) stepsize = 2;
  199.   if (stepsize > 2) stepsize = 0;
  200.   lcd.print(stepsizetext[stepsize]);
  201.   lcd.print("             ");
  202. }  

  203. void setaudio(){
  204.   lcd.setCursor(0, 0);
  205.   lcd.print("audio           ");
  206.   lcd.setCursor(0, 1);
  207.   if (button == 4) audio --;
  208.   if (button == 5) audio ++;  
  209.   if (audio < 0) audio = 1;
  210.   if (audio > 1) audio = 0;
  211.   lcd.print(audiotext[audio]);
  212.   lcd.print("            ");
  213.   digitalWrite(audiopin, audio);
  214. }


  215. void setup(){
  216.   pinMode(audiopin, OUTPUT);
  217.   pinMode(PLL_data, OUTPUT);//!
  218.   pinMode(PLL_clock, OUTPUT);
  219.   pinMode(PLL_LE, OUTPUT);
  220.   lcd.begin(16, 2);
  221.   //setfrequency();//?
  222.   pll_set_frequency(freqbandarray[band]);
  223.   delay (30);//ms
  224.   digitalWrite(audiopin, audio);
  225. }


  226. void loop(){
  227.   readbuttons();
  228.   menu();
  229. }

复制代码


所有资料51hei提供下载:
MB1501_Scanner.7z (293.18 KB, 下载次数: 16)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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