矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 43014|回复: 38

【参赛】51单片机控制RDA5820制作 数字FM对讲机/收音/发射一体机

   关闭 [复制链接]
     
发表于 2011-11-30 22:32:45 | 显示全部楼层 |阅读模式
本帖最后由 枫霰 于 2011-12-1 13:33 编辑

近几天刚刚学了IIC总线控制,想亲自实践一下,就从众多IIC控制的芯片中找到了这个RDA5820模块,刚从网上淘回来就开始写控制它的C51程序,经过一周多努力终于调试成功。
应用材料:
万用板、89C52单片机、LCD1206、rda5820、小喇叭、拉杆天线、驻集体话筒、触动开关、自锁开关、LED、LM386、电阻(可调)、电容(可调)、三极管(9018、8050、8550、3355、2053)、耳机插孔等。
整体图片:
IMG_20111130_165227_副本.jpg
主控电路:
资料_电子制作.jpg
发射功放电路及图片:
IMG_20111130_165227~1.jpg
RDA5820是FM收发一体芯片,由芯片引出IIC总线作为控制端与51单片机相接,通过IIC写RDA5820寄存器来控制:FM接收/发射切换、音量大小、重音提升、软静音、软静噪、频点设定、发射功率调节、灵敏度调节等功能。
利用5个按键对整个系统进行控制:上、下、左、右、发射键
IMG_20111130_165201.jpg
制作了个小小的菜单:
菜单.jpg
1、FM收音功能:
RDA5820可在65-115Mhz的频段内进行立体声FM接收,通过IIC设置40H寄存器的CHIP_FUNC[3:0]=0即可定义当前工作模式为FM接收模式。笔者选用常用频段87-108Mhz(设置03H寄存器的BAND[3:2]=00)并打开重音提升(设置01H寄存器的BASS [12]=1)进行测试。
笔者利用5个独立按键进行频率(03H CHAN[15:6])和音量(05H VOLUME[3:0])的控制,并将频率(0AH READCHAN[9:0])、音量(05H VOLUME[3:0])、信号强度(0BH RSSI[6:0])、是否立体声(0AH ST[10])等信息通过IIC读取显示在LCD1602屏上,如图(邯郸地区 中国之声88.7Mhz)由于RDA5820可以直接驱动耳机,接上50cm的拉杆天线,接上耳机就可以享受立体声广播了。
接收.jpg
2、FM发射功能:
同样,RDA5820也可在65-115Mhz进行立体声发射,设置40H寄存器的CHIP_FUNC[3:0]=1即可定义当前工作模式为FM发射模式。笔者通过5个按键进行频率、发射功率(42H TX_PA_GAIN[5:0])(-30-3dB)的控制,并将频率(03H CHAN[15:6])、发射功率(42H TX_PA_GAIN[5:0])等信息显示在LCD屏上,如(图)。接上50cm的拉杆进行测试,在宿舍楼中实测距离在40米左右,有点近,要想达到更远的距离就要再加上功放了,笔者采用了以前制作好的调频发射器功放,如图(2sc9018+2sc3355+2sc2053功率在0.6W左右)发射距离能达到200m以上,把立体声插头接好插到MP3上就可以进行立体声转发了。
fashe.jpg

3、对讲机功能
很简单啦,将上述两种功能结合在一起就能实现对讲机功能,笔者采用
130-135MHz作为对讲频段,进入对讲机模式模块自动切到软静音状态,通过读取0BH寄存器来判断是否去噪,当模块接收到发射信号时0BH寄存器FM_TRUE[8]=1(有台),此时关掉软静音进入接收状态,否则继续软静音。当按键5按下时,模块切换到FM发射模式,并可通过上下按键调整功率大小。在天线端接上功放,一台数字对讲机就做成啦!
duijiang.jpg
装机图片:
Microsoft Word - 矿石.jpg
Microsoft Word - 矿石_副本.jpg

评分

3

查看全部评分

     
 楼主| 发表于 2012-1-19 17:08:50 | 显示全部楼层
本帖最后由 枫霰 于 2012-1-19 17:10 编辑

RDA5820收音+发射模块PL102BH-20.pdf 资料
RDA5820收音 发射模块PL102BH-20.pdf (285.06 KB, 下载次数: 5548)

还有两个资料上传不上去
回复 支持 1 反对 0

使用道具 举报

     
发表于 2012-1-12 09:55:45 | 显示全部楼层
这个不错,我很早就在淘宝上发现这款芯片,可惜我自己不懂单片机,不会编程,淘宝上也没有配套的控制电路。
今天才看到楼主的帖子,很好,投了楼主一票。
如果能公布烧写程序就好了,如果不方便公布的话,出套件也行。
回复 支持 1 反对 0

使用道具 举报

     
发表于 2011-11-30 23:10:42 | 显示全部楼层
这个不错,帮顶
回复 支持 反对

使用道具 举报

     
发表于 2011-12-1 08:51:22 | 显示全部楼层
能提供详细的资料和程序就好了
回复 支持 反对

使用道具 举报

     
发表于 2011-12-1 09:30:21 | 显示全部楼层
羡慕呀,这个就是我一直想做的,苦于没有rda5820。希望提供资料。
回复 支持 反对

使用道具 举报

     
发表于 2011-12-1 15:11:52 | 显示全部楼层
这个不错 ;
rda5820希望提供资料。
回复 支持 反对

使用道具 举报

     
发表于 2011-12-1 20:20:37 | 显示全部楼层
不错 帮顶了
回复 支持 反对

使用道具 举报

     
发表于 2012-1-11 22:51:32 | 显示全部楼层
太厉害了!加分。另外,作为对讲机使用时最多可以在开阔地通话有多远?
回复 支持 反对

使用道具 举报

     
发表于 2012-1-13 13:50:01 | 显示全部楼层
支持动手!!!!!!!!
回复 支持 反对

使用道具 举报

     
发表于 2012-1-16 15:37:33 | 显示全部楼层
这个不错,我很早就在淘宝上发现这款芯片,可惜我自己不懂单片机,不会编程,淘宝上也没有配套的控制电路。 ...
66718 发表于 2012-1-12 09:55



    我也投了楼主一票,如果高频功放部分使用双面覆铜板的话效果更好(另一面接地)。
回复 支持 反对

使用道具 举报

发表于 2012-1-16 17:50:19 | 显示全部楼层
外加eeprom,实现频率记忆功能才实用。要不每次都要重新调频率。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2012-1-19 16:21:12 | 显示全部楼层
主程序来楼,刚学完单片机,格式错误多多

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uint key_=0;
uint k_1=0;
uint a_3=0;
uint m1,m_1,m_4;
uint a_4=0;
uint k_2=0;
uint i_1=0;
uint n_0=1;
uint l1=1;
uint l2=1;
uint z,p=1;
uint j_=1;
uint r_i=0x0427;
double b1=0;
uint a1=0;
uint a2=0;
uint FreqTune=0x0000;
uint vol=0xa;
const uchar FmAddr  = 0x22;
sbit SDA =P0^0;
sbit SCL =P0^1;
sbit KEY =P1^4;
sbit KEYu=P1^0;
sbit KEYd=P1^2;
sbit KEY1=P1^1;
sbit KEY2=P1^3;
sbit rs=P0^5;
sbit rw=P0^6;
sbit en=P0^7;
sbit P02=P0^2;
sbit P03=P0^3;
sbit P04=P0^4;
uchar code table[]="0123456789.";
uchar code table_[]="Mhz Vol:";
uchar code table_1[]="RT";
uchar code table1[]="Welcome";
uchar code table2[]="Digital FMdevice";
uchar code table3[]="Please choose";
uchar code table_3[]="s ";
uchar code table4[]="function keys";
uchar code table5[]=" -Interphone    ";
uchar code table6[]="  FM receiver   ";
uchar code table7[]=" -FM receiver   ";
uchar code table8[]="  FM transmitter";
uchar code table9[]=" -FM transmitter";
uchar code table10[]="  Transmit Data ";
uchar code table11[]=" -Transmit Data ";
uchar code table12[]="  Interphone    ";
uchar code table14[]="Waiting         ";
uchar code table15[]="............... ";
uchar code table16[]="  Interphone    ";
uchar code table18[]="    FM RX       ";
uchar code table20[]="     FM TX      ";
uchar code table22[]="  TX DATA       ";
uchar code tabletp[]="                ";
uchar code table23[]={0x00,0x1F,0x0A,0x04,0x04,0x04,0x04,0x00,
                                          0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,};
uchar code table24[]={0x00,0x1F,0x0A,0x04,0x04,0x04,0x04,0x00,
                                          0x00,0x00,0x00,0x00,0x02,0x06,0x0E,0x1E,};
uchar code table25[]={0x00,0x1F,0x0A,0x04,0x04,0x04,0x04,0x00,
                                          0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x1C,};
uchar code table26[]={0x00,0x1F,0x0A,0x04,0x04,0x04,0x04,0x00,
                                          0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x18,}        ;
uchar code table27[]={0x00,0x1F,0x0A,0x04,0x04,0x04,0x04,0x00,
                                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,};
uchar code table28[]={0x00,0x1F,0x0A,0x04,0x04,0x04,0x04,0x00,
                                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
uchar code table29[]={0x02,0x06,0x1E,0x1E,0x1E,0x1E,0x06,0x02,};
void Dela_y(uint c)        //延时
        {
        int i=0;
        for(i=0;i<c;i++);
        }
void DelayIT(uint del_1)//延时 10ms * del
        {
        uint i,j;
        for(i=0; i<del_1; i++)
        for(j=0; j<1827; j++)   
        ;
        }
void delay_lcd(uint n)//lcd延时
        {uint x,y;
        for(x=n;x>0;x--)
        for(y=110;y>0;y--);
        }                                                                                                                     
void lcd_wcom(uchar com)//lcd写命令
        {
        rs=0;
        rw=0;
        P3=com;
        delay_lcd(5);
        en=1;
        en=0;
        }
void lcd_wdat(uchar dat)//lcd写数据
        {
        rs=1;
        rw=0;
        P3=dat;
        delay_lcd(5);
        en=1;
        en=0;
        }
void lcd_init()//lcd初始化
        {
        lcd_wcom(0x38);
        lcd_wcom(0x0c);
        lcd_wcom(0x06);
        lcd_wcom(0x01);
        }
void OpenIIC()
        {
        SDA = 1;
        SCL = 1; Dela_y(5);
        SDA = 0; Dela_y(5);
        SCL = 0; Dela_y(5);
        }
void CloseIIC()
        {
         SDA = 0 ;
         SCL = 1; Dela_y(5);
         SDA = 1; Dela_y(5);
         SCL = 1; SDA = 1; Dela_y(150); //防止过快的读取造成EPPROM 来不及反应}
        }
void IICWriteByte( uchar byte )
        {
        uchar i=0;
        int f=30000;
        bit bitdata;
        for(i=0;i<8;i++)
                {
                bitdata=byte>>(7-i) & 1;   
                SDA = bitdata;   
                SCL =1;    Dela_y(5);
                SCL = 0;    Dela_y(5);
                }
         SCL = 1;
           while(SDA && -f); Dela_y(5);
         SCL = 0; Dela_y(5);
         }
void IICWrite(uchar uaddr, uchar romaddr, uint rdata,bit _16b)
        {
        uchar temp;
        OpenIIC();
        IICWriteByte(uaddr);
        IICWriteByte(romaddr);
        if(_16b)
                {
                temp =(uchar)((rdata>>8) & 0x00ff) ;
                IICWriteByte(temp);
                }
        temp = (uchar) (rdata & 0xff);
        IICWriteByte(temp);
        CloseIIC();
        }
uchar IICReadByte(bit next)
        {
         uchar buf =0,i=0;
         for(i=0;i<8;i++)
                 {
                buf <<=1;
                 SCL = 1;  buf |= SDA;  Dela_y(5);
                 SCL = 0;  Dela_y(5);
                }
         if(next)
                 {
                SDA = 0;  SCL = 1;  Dela_y(5);
                  SCL = 0;  Dela_y(5);  SDA = 1;
                 }
        else
                 {
                SDA = 1;  SCL = 1;  Dela_y(5);
                  SCL = 0;  Dela_y(5);   SDA=0;
                }
        return buf;
        }
uint IICRead(uchar uaddr, uchar ramAddr,bit _16b)
        {
         uint buf;
         OpenIIC();
         IICWriteByte(uaddr);
         IICWriteByte(ramAddr);
         OpenIIC();
         IICWriteByte(uaddr | 0x01);
         if(_16b)
                 {
                 buf = IICReadByte(1);
                 buf = buf<<8;
                 buf =buf|IICReadByte(0);
                 }
         else
                 {
                 buf = IICReadByte(0);
                 }
         CloseIIC();
         return buf;
         }
uint FM_ReadReg(uchar regAddr)//读取FM模块的寄存器
        {
        return IICRead(FmAddr,regAddr,1);
        }
void FM_WriteReg(uchar regAddr,uint dat)//写FM模块的寄存器
        {
        IICWrite(FmAddr,regAddr,dat,1);
        }
void FM_SetFreq_RX(uint FreqTune_1)//设置RX频道的频率87-1*,步进频率100k        0x00
        {
        FM_WriteReg(3,(FreqTune_1<<6) | 0x0010);
        }
void FM_SetFreq__RX(uint FreqTune__1)//设置RX频道的频率65-90,步进频率100k 0x00
        {
        FM_WriteReg(53,0x28a);
        FM_WriteReg(53,0x384);
        FM_WriteReg(3,(FreqTune__1<<6) | 0x001c);
        }
void FM_SetVolume(uint vol_)//设置音量 0x0
        {
         FM_WriteReg(5,vol_|=0x88a0);
        }
void show(uint addr,double m)//lcd显示初始地址addr及数字xxx.x
        {
        uchar n;
        uchar _n=10;
        for(n=0;n<5;n++)
                {
                if(n==0) _n=m/100;
                if(n==1) _n=((int)m/10)%10;
                if(n==2) _n=(int)m%10;
                if(n==3) _n=10;
                if(n==4) _n=((int)(m*10))%10;
                lcd_wcom(addr+n);
                lcd_wdat(table[_n]);
                }
        }
void show_(uint a_ddr,double k_)//lcd显示初始地址addr及数字xx
        {
        uchar n;
        uchar _n=10;
        for(n=0;n<2;n++)
                {
                if(n==0) _n=(int)k_/10;
                if(n==1) _n=(int)k_%10;
                lcd_wcom(a_ddr+n);
                lcd_wdat(table[_n]);
                }
        }
void rssi(uint r_addr,int rssi)        //LCD信号强度指示显示(地址,0——5)
{
lcd_wcom(0x40);
if(rssi==0)
        {
        for(m1=0;m1<16;m1++)
                {
                lcd_wdat(table28[m1]);                  
                }                                                                 
        };       
if(rssi==1)
        {
        for(m1=0;m1<16;m1++)
                {
                lcd_wdat(table27[m1]);                  
                }                                                                 
        };
if(rssi==2)
        {
        for(m1=0;m1<16;m1++)
                {
                lcd_wdat(table26[m1]);                  
                }                
        };
if(rssi==3)
        {
        for(m1=0;m1<16;m1++)
                {
                lcd_wdat(table25[m1]);                  
                }                
        };
if(rssi==4)
        {
        for(m1=0;m1<16;m1++)
                {
                lcd_wdat(table24[m1]);                  
                }                
        };
if(rssi==5)
        {
        for(m1=0;m1<16;m1++)
                {
                lcd_wdat(table23[m1]);                  
                }                
        };
lcd_wcom(r_addr);   //显示地址
        for(m1=0;m1<2;m1++)     //将table[]中的数据依次写入1602显示
                {
                lcd_wdat(m1);                  
                } ;
}

void kanji()//开机画面
        {
         uchar m1;
         DelayIT(20);
     lcd_init();   //液晶初始化
     lcd_wcom(0x84);   //显示地址
     for(m1=0;m1<7;m1++)     //将table1[Welcome]中的数据依次写入1602显示
             {
        lcd_wdat(table1[m1]);                  
             }
         lcd_wcom(0x80+0x40);   //显示地址
     for(m1=0;m1<16;m1++)     //将table2[Digital FMdevice]中的数据依次写入1602显示
             {
             lcd_wdat(table2[m1]);                  
             }
         DelayIT(100);
         lcd_init();     //液晶初始化
         lcd_wcom(0x81);   //显示地址
         for(m1=0;m1<13;m1++)     //将table3[Please choose]中的数据依次写入1602显示
             {
             lcd_wdat(table3[m1]);  DelayIT(4) ;               
             }
         lcd_wcom(0x80+0x41);   //显示地址
         for(m1=0;m1<13;m1++)     //将table4[function keys]中的数据依次写入1602显示
             {
              lcd_wdat(table4[m1]); DelayIT(5)  ;               
             }
         DelayIT(50) ;
        }
void K_S()//主键盘扫描
        {       
                    if(a_3!=1)//有后退按键
                                {
                                a_3=1;
                                if(k_1==0)//对讲机模式
                                        {
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table5[-Interphone]中的数据依次写入1602显示
                                     {
                                          lcd_wdat(table5[m1]);                  
                                     }
                                         lcd_wcom(0x80+0x40);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table6[FM receiver]中的数据依次写入1602显示
                                     {
                                          lcd_wdat(table6[m1]);                  
                                     }
                                        };
                                if(k_1==1)//收音机模式
                                        {
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table12[]中的数据依次写入1602显示
                                     {
                                          lcd_wdat(table12[m1]);                  
                                     }
                                         lcd_wcom(0x80+0x40);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table7[]中的数据依次写入1602显示
                                     {
                                          lcd_wdat(table7[m1]);                  
                                     }
                                        };
                                if(k_1==2)//FM发射模式
                                        {
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table6[]中的数据依次写入1602显示
                                     {
                                          lcd_wdat(table6[m1]);                  
                                     }
                                         lcd_wcom(0x80+0x40);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table9[]中的数据依次写入1602显示
                                     {
                                          lcd_wdat(table9[m1]);                  
                                     }
                                        };
                                if(k_1==3) //第四模式
                                        {
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table8[]中的数据依次写入1602显示
                                     {
                                          lcd_wdat(table8[m1]);                  
                                     }
                                         lcd_wcom(0x80+0x40);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table11[]中的数据依次写入1602显示
                                     {
                                          lcd_wdat(table11[m1]);                  
                                     }
                                        };
                                };
                        if(KEYu==0) key_--;//按键判断
                        if(KEYd==0) key_++;
                        if(k_1!=key_%4)        //有上下选择按键
                                {k_1=key_%4;
                                if(k_1==0)
                                        {
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table5[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table5[m1]);                  
                                             }
                                        lcd_wcom(0x80+0x40);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table6[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table6[m1]);                  
                                             }
                                         
                                        };
                                if(k_1==1)
                                        {
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table12[m1]);                  
                                             }
                                         lcd_wcom(0x80+0x40);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table7[m1]);                  
                                             }
                                               
                                        };
                                if(k_1==2)
                                        {
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table6[m1]);                  
                                             }
                                         lcd_wcom(0x80+0x40);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table9[m1]);                  
                                             }
                                               
                                        };
                                if(k_1==3)
                                        {
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table11[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table8[m1]);                  
                                             }
                                         lcd_wcom(0x80+0x40);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table11[m1]);                  
                                             }
                                        };
                                DelayIT(30);
                                };
        }
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2012-1-19 16:22:58 | 显示全部楼层
接上:


void mace()//主程序扫描
        {

        if(k_1==0)//第一模式
                {
                for(;m_1>0;m_1--)
                        {
                        m_4=8;
                        lcd_init();     //液晶初始化
                        for(;m_4<12;m_4++)
                                {
                                lcd_wcom(0x80+0x44);   //显示地址
                                for(m1=0;m1<m_4;m1++)     //将table15[ ]中的数据依次写入1602显示
                                    {
                                    lcd_wdat(table15[m1]);
                           DelayIT(4);
                                    }
                                }
                        lcd_init();     //液晶初始化
                        lcd_wcom(0x80);   //显示地址
                        for(m1=0;m1<16;m1++)     //将table[]中的数据依次写入1602显示
                                {
                                lcd_wdat(table16[m1]);                  
                                }
                        };
                z=1;
                };                                       
        if(k_1==1) //第二模式
                {
                for(;m_1>0;m_1--)
                        {               
                                        m_4=8;
                                        lcd_init();     //液晶初始化
                                        for(;m_4<12;m_4++)
                                                {
                                                lcd_wcom(0x80+0x44);   //显示地址
                                                for(m1=0;m1<m_4;m1++)     //将table[]中的数据依次写入1602显示
                                                     {
                                                  lcd_wdat(table15[m1]);
                                        DelayIT(4);
                                                     }
                                                };
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<18;m1++)     //将table[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table18[m1]);                  
                                            }
                        };
                 z=2;
                };                               
        if(k_1==2)//第三模式
                {
                for(;m_1>0;m_1--)
                        {
                                        m_4=8;
                                        lcd_init();     //液晶初始化
                                        for(;m_4<12;m_4++)
                                                {
                                                lcd_wcom(0x80+0x44);   //显示地址
                                                for(m1=0;m1<m_4;m1++)     //将table[]中的数据依次写入1602显示
                                                     {
                                                  lcd_wdat(table15[m1]);
                                        DelayIT(5);
                                                     }
                                                };
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table20[m1]);                  
                                            }
                        };
                z=3;
                };                               
        if(k_1==3&&k_2==1)        //第四模式
                {
                for(;m_1>0;m_1--)
                        {
                                        m_4=8;
                                        lcd_init();     //液晶初始化
                                        for(;m_4<12;m_4++)
                                                {
                                                lcd_wcom(0x80+0x44);   //显示地址
                                                for(m1=0;m1<m_4;m1++)     //将table[]中的数据依次写入1602显示
                                                     {
                                                  lcd_wdat(table15[m1]);
                                        DelayIT(5);
                                                     }
                                                };
                                        lcd_init();     //液晶初始化
                                        lcd_wcom(0x80);   //显示地址
                                        for(m1=0;m1<16;m1++)     //将table[]中的数据依次写入1602显示
                                             {
                                          lcd_wdat(table22[m1]);                  
                                            }                

                        };
                z=4;
                };       
        }

void main()         //主程序
        { uint z_1,Tune;
        P1=0xff;
        FM_WriteReg(2,0xd281);//rda5820地址
        FM_ReadReg(0x0b);
        P02=0;
        P03=0;
        kanji();  //开机画面
        while(1) //进入程序死循环
                {
                 if(KEY2==0&&k_2<1) k_2++;//左右按键判断
                 if(KEY1==0&&k_2>0) k_2--;
                 if(k_2==0)        //没有右按键
                         {
                        n_0=1;
                        m_1=1;
                        K_S();          //上下模式建扫描
                        };
                 if(k_2==1)        //有右键
                         {
                        a_3=0;
                        mace();        //模式扫描
                        if(z==1) //第一模式
                                {
                                if(KEY==1)
                                        {
                                         for(;p>0;p--) FM_SetFreq__RX(0x00);//设置频率65Mhz
                                         lcd_wcom(0x80+0x46);   //显示地址
                                      for(m1=0;m1<8;m1++)     //将table[]中的数据依次写入1602显示
                                             {
                                              lcd_wdat(table_[m1]);                  
                                             } ;
                                         lcd_wcom(0x80+0x40);   //显示地址
                                      for(m1=0;m1<1;m1++)     //将table[]中的数据依次写入1602显示
                                             {
                                              lcd_wdat(table_1[m1]);                  
                                             } ;
                                        for(;l1>0;l1--)l2=1;
                                        FM_WriteReg(0x40,0x0000);//进入接收模式
                                        if(KEYu==0&&KEY2==0&&vol<0xf)vol+=0x1;
                                          else if(KEYd==0&&KEY2==0&&vol>0x0)vol-=0x1;
                                          else if(KEYu==0&&Tune<20)a1++,Tune+=1;
                                          else if(KEYd==0&&Tune>0)a1--,Tune-=1;        //声音,频率调节
                                          FreqTune=Tune*10;
                                          if(b1!=65+(double)Tune*1)
                                                  {
                                                   b1=65+(double)Tune*1;
                                                   FM_SetFreq__RX(FreqTune);//写入频率=65+tune       
                                                  };
                                      z_1=0xff&(FM_ReadReg(0x0a));
                                          FM_SetVolume(vol);  //写入音量
                                          show(0x80+0x41,65+((double)z_1)/10);
                                          show_(0x80+0x4e,((double)vol));  //显示频率音量
                                          rssi(0x8d,(uint)((FM_ReadReg(0x0b)>>10)/5)); //显示信号强度
                                          if( ((FM_ReadReg(0x0b)>>10)/5)        )
                                                        {
                                                        lcd_wcom(0x8f);
                                                        for(m1=6;m1<7;m1++)     //将s显示
                                                             {
                                                              lcd_wdat(table10[m1]);                  
                                                             } ;
                                                        };
                                          if( !((FM_ReadReg(0x0b)>>10)/5)        )
                                                        {
                                                        lcd_wcom(0x8f);
                                                        for(m1=0;m1<1;m1++)     //将 显示
                                                             {
                                                              lcd_wdat(table10[m1]);                  
                                                             } ;
                                                        };                  
                                          DelayIT(10);//延时 10ms * del
                                                };
                                if(KEY==0)
                                                {
                                                for(;l2>0;l2--)
                                                        {       
                                                        l1=1,FM_WriteReg(0x40,0x0001),FM_SetFreq__RX(FreqTune),
                                                        lcd_wcom(0x80+0x40);   //显示地址
                                                     for(m1=0;m1<16;m1++)     //将table[]中的数据依次写入1602显示
                                                             {
                                                              lcd_wdat(tabletp[m1]);                  
                                                             } ;
                                                        };
                                                FM_WriteReg(0x40,0x0001) ;
                                                z_1=0xff&(FM_ReadReg(0x0a));
                                                show(0x80+0x44,65+((double)z_1)/10);
                                                lcd_wcom(0x80+0x43);   //显示地址
                                             for(m1=1;m1<2;m1++)     //将table[]中的数据依次写入1602显示
                                                     {
                                                      lcd_wdat(table_1[m1]);                  
                                                     } ;
                                                if(KEYu==0&&KEY==0&&r_i<0x043b)r_i+=0x000c;//功率调节
                                                if(KEYd==0&&KEY==0&&r_i>0x0405)r_i-=0x000c;
                                                FM_WriteReg(0x42,r_i);  
                                                rssi(0x80+0x4d,(uint)((r_i&0xff)/0x0c));
                                                DelayIT(10);//延时 10ms * del
                                                };                                  
                                };
                        if(z==2) //第二模式
                                {
                                  p=1;
                                  for(;j_>0;j_--)FM_SetFreq_RX(0x00);
                                  FM_WriteReg(0x40,0x0000);
                                  lcd_wcom(0x80+0x46);   //显示地址
                               for(m1=0;m1<8;m1++)     //将table[]中的数据依次写入1602显示
                                     {
                                      lcd_wdat(table_[m1]);                  
                                     } ;
                                  if(KEYu==0&&KEY2==0&&FreqTune<0xd2)a1+=10,FreqTune+=0x000a;
                                  else if(KEYd==0&&KEY2==0&&FreqTune>0x00)a1-=10,FreqTune-=0x000a;
                                  else if(KEYu==0&&KEY==0&&vol<0xf)a2++,vol+=0x1;
                                  else if(KEYd==0&&KEY==0&&vol>0x0)a2--,vol-=0x1;
                                  else if(KEYu==0&&FreqTune<0xd2)a1++,FreqTune+=0x0001;
                                  else if(KEYd==0&&FreqTune>0x00)a1--,FreqTune-=0x0001;
                                  if(b1!=87+(double)a1*0.1)
                                          {
                                           b1=87+(double)a1*0.1;
                                           FM_SetFreq_RX(FreqTune);       
                                          };
                                  FM_SetVolume(vol);
                              z_1=0xff&(FM_ReadReg(0x0a));  
                                  show(0x80+0x41,87+((double)z_1)/10);
                                  show_(0x80+0x4e,((double)vol));
                                  rssi(0x8d,(uint)((FM_ReadReg(0x0b)>>10)/5));
                                          if( ((FM_ReadReg(0x0b)>>10)/5)        )
                                                        {
                                                        lcd_wcom(0x8f);
                                                        for(m1=6;m1<7;m1++)     //将table[]中的数据依次写入1602显示
                                                             {
                                                              lcd_wdat(table10[m1]);                  
                                                             } ;
                                                        };
                                          if( !((FM_ReadReg(0x0b)>>10)/5)        )
                                                        {
                                                        lcd_wcom(0x8f);
                                                        for(m1=0;m1<1;m1++)     //将table[]中的数据依次写入1602显示
                                                             {
                                                              lcd_wdat(table10[m1]);                  
                                                             } ;
                                                        };                          
                                  DelayIT(10);//延时 10ms * del
                                };
                                 
                        if(z==3)  //第三模式
                                { p=1;
                                  for(;j_>0;j_--)FM_SetFreq_RX(0x00);
                                  FM_WriteReg(0x40,0x0001) ;
                                  lcd_wcom(0x80+0x49);   //显示地址
                               for(m1=0;m1<3;m1++)     //将table[]中的数据依次写入1602显示
                                     {
                                      lcd_wdat(table_[m1]);                  
                                     } ;
                                  if(KEYu==0&&KEY2==0&&FreqTune<0xd2)a1+=10,FreqTune+=0x000a;
                                  else if(KEYd==0&&KEY2==0&&FreqTune>0x00)a1-=10,FreqTune-=0x000a;
                                  else if(KEYu==0&&KEY==0&&r_i<0x043b)r_i+=0x000c;
                                  else if(KEYd==0&&KEY==0&&r_i>0x0405)r_i-=0x000c;
                                  else if(KEYu==0&&FreqTune<0xd2)a1++,FreqTune+=0x0001;
                                  else if(KEYd==0&&FreqTune>0x00)a1--,FreqTune-=0x0001;
                                  if(b1!=87+(double)a1*0.1)
                                          {
                                           b1=87+(double)a1*0.1;
                                           FM_SetFreq_RX(FreqTune);
                                                  
                                          };
                              z_1=0xff&(FM_ReadReg(0x0a));
                                  FM_WriteReg(0x42,r_i);  
                                  show(0x80+0x44,87+((double)z_1)/10);
                                  rssi(0x8d,(uint)((r_i&0xff)/0x0c));
                                  DelayIT(10);//延时 10ms * del
                                };
                        if(z==4) //第四模式
                                {
                                p=1;
                               
                                };
                        };
                };
        }
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2012-1-19 17:23:36 | 显示全部楼层
回复 10# ka2209


    距离大概500米左右,功射管2053大概在0.5瓦左右 我在楼下,同学在5楼可以对讲,由于条件有限只能用洞洞板做射频功放部分
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-6 12:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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