FM8000B发射模块制作FM发射机,以前做的,为了换其他文件,所以贡献出来,含仿真、单片机程序、PPT
FM8000模块(GS1615)制作FM发射机的单片机仿真原理图:
GS1615FM发射机 ppt内容预览:
模块工作电压:2.4-3.6V
参考时钟:12MHZ
工作温度范围:-20——85摄氏度
调频方式:I2C总线端口选频
至此可知:寄存器0x00的bit1 bit0是频率参数的最高两位,+寄存器0x01的8位,共十位为频率参数
模块频率范围76MHz-108MHz,中间为92MHz,本人想开机即为此值。根据频率计算公式freq=CH*0.05+76可知,要求CH=01 0100 0000(即320),因为freq = 320*0.05 + 76 = 92MHz。
在设置FM8000时应首先使寄存器0x00设置为00100001(即0x21,第一个1是进入发射状态,最后01是CH高位)
再设置寄存器0x01为01000000(即0x40)
此时CH=01 0100 0000(即320)。
注:计算知,76MHz-108MHz对应CH值000-640。
FM8000模块(GS1615)制作FM发射机源程序中的SETCH()函数的讲解:
根据频率计算公式:freq=CH*0.05+76
模块可发射的频率范围为76MHz-108MHz,对应CH的范围为000-640
按二进制则为00 0000 0000—10 1000 0000
可以把CH(程序中为count)按寄存器位分为三段: 00 0000 0000—00 1111 1111 (000-255) 01 0000 0000—01 1111 1111 (256-511) 10 0000 0000—10 1000 0000 (512-640)
所以,CH的高两位只可能为00、01、10(分别对应值0、256、512),存入寄存器00h中。上面蓝色的要存入寄存器01h中,你该理解为什么程序中有count-256、 count-512 语句了。
思考与改进
按键长按时频率变化的能否更快?并且仍可以区别是长按或是短按。
按键长按时数码管显示的能否更稳定?
增加一个记忆功能,开机时自动调整到上次关机时的频率,加24C01等,程序怎改
单片机源程序:
- #include<intrins.h> //包含 _nop_()
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- //---------------------------
- //-------定义变量端口--------
- sbit sda=P2^1;
- sbit scl=P2^0;
- sbit DIN=P0^5; //小数点
- sbit K1=P2^7;
- sbit K2=P2^6;
- sbit K3=P2^5;
- sbit K4=P2^4;
- unsigned long count;
- uchar i,j;
- uchar a,b;
- uchar temp;
- unsigned long freq[8];
- unsigned long f;
- unsigned char code table1[ ]={0xd7,0x14,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f,0x9F,0xDA,0xC3,0xDC,0xCB,0x8B,0x00};
- /**左边LED四位 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F" "不亮"
- 共阴数码管段码表 (按图接法的编码)**/
- unsigned char code table2[ ]={0x5F,0x41,0x9D,0xd5,0xC3,0xD6,0xDE,0x45,0xDF,0xD7,0xCF,0xDA,0x1E,0xD9,0x9E,0x8E,0x00};
- /**右边LED四位 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F" "不亮"
- 共阴数码管段码表 (按图接法的编码)**/
- //----- 函数声明-------------
- void FM8000_init(); //初始化函数
- void start(); //开始函数
- void stop(); //终止函数
- void respon(); //应答信号
- void write_byte(uchar); //写字节函数
- uchar read_byte(); //读字节函数
- void write_add(uchar,uchar); //指定地址写一字节数据
- uchar read_add(uchar); //指定地址读一字节数据
- void delay();
- void delay_i2c(uint x);
- void SetCH();
- void addfreq();
- void decfreq();
- void fastadd();
- void fastdec();
- void delay10ms();
- void display();
- //----------------------------------------
- //----------------------
- void delay()
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- //----------------------------------------
- void FM8000_init() //初始化函数
- {
- scl=1;
- delay();
- sda=1;
- delay();
- }
- //----------------------------
- void start(void) //开始函数
- {
- sda=1;
- scl=1;
- delay();
- sda=0; //拉低电平
- delay();
- scl=0;
- }
- //--------------------------------
- void stop(void) //终止函数
- {
- sda=0;
- scl=1;
- delay();
- sda=1; //拉高电平
- delay();
- scl=0;
- }
- //---------------------------------
- void respon() //应答
- {
- uchar i;
- scl=1;
- delay();
- while((sda==1)&&(i<250))i++;
- scl=0;
- delay();
- }
- //-------------------------------
- void write_byte(uchar dat) //写字节
- {
- uchar i,temp;
- temp=dat;
- for(i=0;i<8;i++)
- {
- temp=temp<<1; //循环右移
- scl=0;
- delay();
- sda=CY; //CY为进位标志
- delay();
- scl=1; //拉高SCL
- delay();
- }
- scl=0;
- delay();
- sda=1;
- delay();
- }
- //------------------------------------
- uchar read_byte() //读字节
- {
- uchar i,k;
- scl=0;
- delay();
- sda=1;
- delay();
- for(i=0;i<8;i++)
- {
- scl=1;
- delay();
- k=(k<<1)|sda;
- scl=0;
- delay();
- }
- return k;
- }
- //------------------------------------
- //------------------------------------
- //-----指定地址写入一字节数据-------
- void write_add(uchar add,uchar dat)
- {
- start(); //开始
- write_byte(0x58); //写 器件地址及写信号
- respon();
- write_byte(add); //写字地址
- respon();
- write_byte(dat); //写数据
- respon();
- stop(); //终止
- }
- //---------------------------------
- //------指定地址读一字节数据-------
- uchar read_add(uchar add)
- {
- uchar date;
- start();
- write_byte(0x58); //写 器件地址
- respon();
- write_byte(add); //字节地址
- respon();
- start();
- write_byte(0x59);
- respon();
- date=read_byte();
- stop();
- return date;
- }
- //------延时函数-------
- void delay_i2c(uint x)//延时函数
- {
- uchar a,b;
- for(a=x;a>0;a--);
- //for(b=100;b>0;b--); //速度较慢,去掉加快点
- }
- void delay10ms(void) //延时10毫秒
- {
- unsigned char i,j;
- for(i=20;i>0;i--)
- for(j=248;j>0;j--);
- }
- /***********************************************************
- 0.1增加频率
- void addfreq()
- **********************************************************/
- void addfreq()
- {
-
- delay10ms();
- if(K2==0)
- {
- count+=2;
- if(count==642) //count=0对应76.0MHz,count=640对应108.0MHz,
- {
- count=0;
- }
- }
- P0=0; //写入时关闭LED,使LED显示亮度一样
- SetCH();
- do {display();}
- while(K2==0); //等松手,此时LED仍显示
- }
- /****************************************************************
- 0.1减小频率
- void decfreq()
- ******************************************************************/
- void decfreq()
- {
- delay10ms();
- if(K1==0)
- {
- if(count==0)
- {
- count=640;
- }
-
- count-=2;
- P0=0; //写入时关闭LED,使LED显示亮度一样
- SetCH();
- do {display();}
- while(K1==0); //等松手,此时LED仍显示
- }
- }
- /***********************************************************
- 快速增加频率
- void fastadd()
- **********************************************************/
- void fastadd()
- {
-
- delay10ms();
- if(K4==0)
- {
- count+=2;
- if(count==642)
- {
- count=0;
- }
- }
- P0=0; //写入时关闭LED,使LED显示亮度一样
- SetCH();
- // while(K4==0); //等松手
- }
- /****************************************************************
- 快速减小频率
- void fastdec()
- ******************************************************************/
- void fastdec()
- {
- delay10ms();
- if(K3==0)
- {
- if(count==0)
- {
- count=640;
- }
-
- count-=2;
- P0=0; //写入时关闭LED,使LED显示亮度一样
- SetCH();
- // while(K3==0); //等松手
- }
- }
-
-
- /*********************************************************
- 显示函数
- void display(void)
- *********************************************************/
- void display(void)
- {
- {
- f = (count*5+7600);
- freq[7]=f/10000;
- freq[6]=(f%10000)/1000;
- freq[5]=(f%1000)/100;
- freq[4]=(f%100)/10;
- freq[3]=f%10;
- freq[1]=11;
- freq[2]=10;
- freq[0]=12;
- temp=0;
- for(i=0;i<5;i++) //后四位不显
- {
- P1=temp;
- if (i<4)
- {P0=table1[freq[7-i]];
- if (i==2) DIN=1; //加小数点
- }
- else
- {P0=table2[freq[7-i]];
- if (i==6) DIN=1; //加小数点
- }
- temp=temp+1;
- if (i==4)P0=0; //第5位不显
- for(a=10;a>0;a--) //延时
- for(b=248;b>0;b--);
- }
- }
- }
- /*************************************************************
- 设置发射频率
- void SetCH()
- ************************************************************/
- void SetCH()
- {
- FM8000_init();
- if(count<=255)
- write_add(0x00,0x20);
- delay_i2c(100);
- write_add(0x01,count);
- delay_i2c(100);
- /* write_add(0x04,0x32); //是否把F8000内部晶振设为12MHz,自己决定
- delay_i2c(100);*/
- if((count>=256) && (count<=511))
- {
- write_add(0x00,0x21);
- delay_i2c(100);
- write_add(0x01,count-256);
- delay_i2c(100);
- /* write_add(0x04,0x32); //是否把F8000内部晶振设为12MHz,自己决定
- delay_i2c(100);*/
- }
- if(count>=512)
- { write_add(0x00,0x22);
- delay_i2c(100);
- write_add(0x01,count-512);
- delay_i2c(100);
- /* write_add(0x04,0x32); //是否把F8000内部晶振设为12MHz,自己决定
- delay_i2c(100);*/
- }
- ………………余下程序请下载附件……
复制代码
所有资料下载:
FM8000模块(GS1615)制作FM发射机(分享文件).rar
(1.66 MB, 下载次数: 53)
|