本人的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源程序如下:
- /*
- QRP 2m FM Transceiver Project with BS2 shiftout any bits
- modify by learning 2016.11 V0.2 fast scan */
- //RadioShack Pro-405 29-54/87.3-107.9/137-174/380-512MHz with 12.5kHz steps
- #include<stdlib.h>
- #include <LiquidCrystal.h>
- LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
- int buttonpin = A3;
- int audiopin = A2;
- const int PLL_data = 8 ;
- const int PLL_clock = 9 ;
- const int PLL_LE = 10 ;
- //unsigned int R_up = 0x84 ; //M=64 R=512
- unsigned int R_up = 0x88 ; //M=64 R=1024
- unsigned int R_low = 0x01 ;
- unsigned int N_up = 0;
- unsigned int N_low;
- unsigned int A_0; //A0 A' can't be used
- unsigned int A;
- int T = 100;
- char* audiotext[]={
- "NFM", "WFM"};
- int audio = 0;
- long freqbandarray[] = {
- 873000, 290000, 1370000, 3800000};//0.1kHz
- char* bandtext[]={
- "FM", "VL", "VH", "U"};
- int band = 1;
- long stepsizearray[] = {
- 125 ,500 ,1000 ,80000};//0.1kHz
- char* stepsizetext[]={
- "12.5 kHz", "50 kHz", "100 kHz", "8 MHz"};
- int stepsize = 0;
- int button;
- int buttondelay = 0;
- int menuoption = 0;
- void pll_set_frequency(long pllfreq) {
- if (band == 0 || band == 1) {
- N_low=((pllfreq+107000)/8000);
- A=(freqbandarray[band]+107000)/125%64;
- }
- if (band == 2 ) {
- N_low=((pllfreq-107000)/8000);
- A=(freqbandarray[band]-107000)/125%64;
- }
- if (band == 3) {
- N_up=highByte((pllfreq-107000)/8000);
- N_low=lowByte ((pllfreq-107000)/8000);
- A=(freqbandarray[band]-107000)/125%64;
- }
- A_0 = A << 1;
- //M,Rを設定
- digitalWrite(PLL_LE, LOW);
- // シフト演算を使ってデータを送信する
- shiftOut(PLL_data, PLL_clock, MSBFIRST, R_up);
- shiftOut(PLL_data, PLL_clock, MSBFIRST, R_low);
- digitalWrite(PLL_LE, HIGH);
- //N,Aを設定
- digitalWrite(PLL_LE, LOW);
- // シフト演算を使ってデータを送信する
- shiftOut(PLL_data, PLL_clock, MSBFIRST, N_up);
- shiftOut(PLL_data, PLL_clock, MSBFIRST, N_low);
- shiftOut(PLL_data, PLL_clock, MSBFIRST, A_0);
- digitalWrite(PLL_LE, HIGH);
- }
- void readbuttons(){
- int pinread = analogRead(buttonpin);
- if (pinread > 90 && pinread < 120) { //1k 1k2
- buttondelay ++;
- if (buttondelay == 2) button = 0;//M-
- else button = -1;
- }
- if (pinread > 190 && pinread < 230) { //2k4 2k7
- buttondelay ++;
- if (buttondelay == 2) button = 1;//M+
- else button = -1;
- }
- if (pinread > 320 && pinread < 360) { //4k7 5k1
- button = 2;//--
- //delay (100);//ms
- delay (T);
- buttondelay ++;
- if (buttondelay == 2) {
- button = 4;
- T=10;
- } //-
- }
- if (pinread > 480 && pinread < 540) { //10k
- buttondelay ++;
- if (buttondelay == 2) { //BAND
- band ++;
- if (band > 3) band = 0;
- if (band == 0 || band == 1) {
- A=(freqbandarray[band]+107000)/125%64;
- R_up = 0x88;
- N_up = 0;
- }
- if (band == 2) {
- A=(freqbandarray[band]-107000)/125%64;
- R_up = 0x88;
- N_up = 0;
- }
- if (band == 3) {
- A=(freqbandarray[band]-107000)/125%64;
- R_up = 0x98;
- }
- //setfrequency();//?
- pll_set_frequency(freqbandarray[band]);
- delay (30);//ms
- }
- }
- if (pinread > -1 && pinread < 40) {
- button = 3;//++
- //delay (100);//ms
- delay (T);
- buttondelay ++;
- if (buttondelay == 2) {
- button = 5;
- T=10;
- } //+
- }
- if (pinread > 1000) {
- buttondelay = 0;
- T=100;
- button = -1;
- }
- }
- void menu(){
- if (button == 1) menuoption ++;
- if (button == 0) menuoption --;
- if (menuoption > 2 ) menuoption = 0;
- if (menuoption < 0 ) menuoption = 2;
- if (menuoption == 0) setfrequency();
- if (menuoption == 1) setstepsize();
- if (menuoption == 2) setaudio();
- }
- void setfrequency(){
- lcd.setCursor(0, 0);
- lcd.print("frequency ");
- // lcd.print("FREQ ");
- lcd.setCursor(0, 1);
- if (button == 2) {
- freqbandarray[band] = freqbandarray[band] - (stepsizearray[stepsize]);
- if (band == 0 && freqbandarray[band] < 873000) {
- freqbandarray[band] = 1079000;
- A=(freqbandarray[band]+107000)/125%64;
- }
- if (band == 1 && freqbandarray[band] < 290000) {
- freqbandarray[band] = 540000;
- A=(freqbandarray[band]+107000)/125%64;
- }
- if (band == 2 && freqbandarray[band] < 1370000) {
- freqbandarray[band] = 1740000;
- A=(freqbandarray[band]-107000)/125%64;
- }
- if (band == 3 && freqbandarray[band] < 3800000) {
- freqbandarray[band] = 5120000;
- A=(freqbandarray[band]-107000)/125%64;
- }
- pll_set_frequency(freqbandarray[band]);
- }
- if (button == 3) {
- freqbandarray[band] = freqbandarray[band] + (stepsizearray[stepsize]);
- if (band == 0 && freqbandarray[band] > 1079000) {
- freqbandarray[band] = 873000;
- A=(freqbandarray[band]+107000)/125%64;
- }
- if (band == 1 && freqbandarray[band] >= 540000) {
- freqbandarray[band] = 290000;
- A=(freqbandarray[band]+107000)/125%64;
- }
- if (band == 2 && freqbandarray[band] >= 1740000) {
- freqbandarray[band] = 1370000;
- A=(freqbandarray[band]-107000)/125%64;
- }
- if (band == 3 && freqbandarray[band] > 5120000) {
- freqbandarray[band] = 3800000;
- A=(freqbandarray[band]-107000)/125%64;
- }
- pll_set_frequency(freqbandarray[band]);
- }
- lcd.print((freqbandarray[band]) / 10000);
- lcd.print (".");
- if (((freqbandarray[band]) % 10000) <1000) {
- lcd.print("0");
- if (((freqbandarray[band]) % 10000) == 0) lcd.print("000");
- else lcd.print((freqbandarray[band]) % 10000);
- }
- else lcd.print((freqbandarray[band]) % 10000);
- lcd.print(" MHz ");
- }
- void setstepsize(){
- lcd.setCursor(0, 0);
- lcd.print("stepsize ");
- lcd.setCursor(0, 1);
- if (button == 4) stepsize --;
- if (button == 5) stepsize ++;
- if (stepsize < 0) stepsize = 2;
- if (stepsize > 2) stepsize = 0;
- lcd.print(stepsizetext[stepsize]);
- lcd.print(" ");
- }
- void setaudio(){
- lcd.setCursor(0, 0);
- lcd.print("audio ");
- lcd.setCursor(0, 1);
- if (button == 4) audio --;
- if (button == 5) audio ++;
- if (audio < 0) audio = 1;
- if (audio > 1) audio = 0;
- lcd.print(audiotext[audio]);
- lcd.print(" ");
- digitalWrite(audiopin, audio);
- }
- void setup(){
- pinMode(audiopin, OUTPUT);
- pinMode(PLL_data, OUTPUT);//!
- pinMode(PLL_clock, OUTPUT);
- pinMode(PLL_LE, OUTPUT);
- lcd.begin(16, 2);
- //setfrequency();//?
- pll_set_frequency(freqbandarray[band]);
- delay (30);//ms
- digitalWrite(audiopin, audio);
- }
- void loop(){
- readbuttons();
- menu();
- }
复制代码
所有资料51hei提供下载:
MB1501_Scanner.7z
(293.18 KB, 下载次数: 17)
|