|
FM8000B發(fā)射模塊制作FM發(fā)射機(jī),以前做的,為了換其他文件,所以貢獻(xiàn)出來,含仿真、單片機(jī)程序、PPT
FM8000模塊(GS1615)制作FM發(fā)射機(jī)的單片機(jī)仿真原理圖:
GS1615FM發(fā)射機(jī) ppt內(nèi)容預(yù)覽:
模塊工作電壓:2.4-3.6V
參考時(shí)鐘:12MHZ
工作溫度范圍:-20——85攝氏度
調(diào)頻方式:I2C總線端口選頻
至此可知:寄存器0x00的bit1 bit0是頻率參數(shù)的最高兩位,+寄存器0x01的8位,共十位為頻率參數(shù)
模塊頻率范圍76MHz-108MHz,中間為92MHz,本人想開機(jī)即為此值。根據(jù)頻率計(jì)算公式freq=CH*0.05+76可知,要求CH=01 0100 0000(即320),因?yàn)閒req = 320*0.05 + 76 = 92MHz。
在設(shè)置FM8000時(shí)應(yīng)首先使寄存器0x00設(shè)置為00100001(即0x21,第一個(gè)1是進(jìn)入發(fā)射狀態(tài),最后01是CH高位)
再設(shè)置寄存器0x01為01000000(即0x40)
此時(shí)CH=01 0100 0000(即320)。
注:計(jì)算知,76MHz-108MHz對(duì)應(yīng)CH值000-640。
FM8000模塊(GS1615)制作FM發(fā)射機(jī)源程序中的SETCH()函數(shù)的講解:
根據(jù)頻率計(jì)算公式:freq=CH*0.05+76
模塊可發(fā)射的頻率范圍為76MHz-108MHz,對(duì)應(yīng)CH的范圍為000-640
按二進(jìn)制則為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(分別對(duì)應(yīng)值0、256、512),存入寄存器00h中。上面藍(lán)色的要存入寄存器01h中,你該理解為什么程序中有count-256、 count-512 語句了。
思考與改進(jìn)
按鍵長(zhǎng)按時(shí)頻率變化的能否更快?并且仍可以區(qū)別是長(zhǎng)按或是短按。
按鍵長(zhǎng)按時(shí)數(shù)碼管顯示的能否更穩(wěn)定?
增加一個(gè)記憶功能,開機(jī)時(shí)自動(dòng)調(diào)整到上次關(guān)機(jī)時(shí)的頻率,加24C01等,程序怎改
單片機(jī)源程序:
- #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; //小數(shù)點(diǎn)
- 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" "不亮"
- 共陰數(shù)碼管段碼表 (按圖接法的編碼)**/
- 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" "不亮"
- 共陰數(shù)碼管段碼表 (按圖接法的編碼)**/
- //----- 函數(shù)聲明-------------
- void FM8000_init(); //初始化函數(shù)
- void start(); //開始函數(shù)
- void stop(); //終止函數(shù)
- void respon(); //應(yīng)答信號(hào)
- void write_byte(uchar); //寫字節(jié)函數(shù)
- uchar read_byte(); //讀字節(jié)函數(shù)
- void write_add(uchar,uchar); //指定地址寫一字節(jié)數(shù)據(jù)
- uchar read_add(uchar); //指定地址讀一字節(jié)數(shù)據(jù)
- 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() //初始化函數(shù)
- {
- scl=1;
- delay();
- sda=1;
- delay();
- }
- //----------------------------
- void start(void) //開始函數(shù)
- {
- sda=1;
- scl=1;
- delay();
- sda=0; //拉低電平
- delay();
- scl=0;
- }
- //--------------------------------
- void stop(void) //終止函數(shù)
- {
- sda=0;
- scl=1;
- delay();
- sda=1; //拉高電平
- delay();
- scl=0;
- }
- //---------------------------------
- void respon() //應(yīng)答
- {
- uchar i;
- scl=1;
- delay();
- while((sda==1)&&(i<250))i++;
- scl=0;
- delay();
- }
- //-------------------------------
- void write_byte(uchar dat) //寫字節(jié)
- {
- uchar i,temp;
- temp=dat;
- for(i=0;i<8;i++)
- {
- temp=temp<<1; //循環(huán)右移
- scl=0;
- delay();
- sda=CY; //CY為進(jìn)位標(biāo)志
- delay();
- scl=1; //拉高SCL
- delay();
- }
- scl=0;
- delay();
- sda=1;
- delay();
- }
- //------------------------------------
- uchar read_byte() //讀字節(jié)
- {
- 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;
- }
- //------------------------------------
- //------------------------------------
- //-----指定地址寫入一字節(jié)數(shù)據(jù)-------
- void write_add(uchar add,uchar dat)
- {
- start(); //開始
- write_byte(0x58); //寫 器件地址及寫信號(hào)
- respon();
- write_byte(add); //寫字地址
- respon();
- write_byte(dat); //寫數(shù)據(jù)
- respon();
- stop(); //終止
- }
- //---------------------------------
- //------指定地址讀一字節(jié)數(shù)據(jù)-------
- uchar read_add(uchar add)
- {
- uchar date;
- start();
- write_byte(0x58); //寫 器件地址
- respon();
- write_byte(add); //字節(jié)地址
- respon();
- start();
- write_byte(0x59);
- respon();
- date=read_byte();
- stop();
- return date;
- }
- //------延時(shí)函數(shù)-------
- void delay_i2c(uint x)//延時(shí)函數(shù)
- {
- uchar a,b;
- for(a=x;a>0;a--);
- //for(b=100;b>0;b--); //速度較慢,去掉加快點(diǎn)
- }
- void delay10ms(void) //延時(shí)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對(duì)應(yīng)76.0MHz,count=640對(duì)應(yīng)108.0MHz,
- {
- count=0;
- }
- }
- P0=0; //寫入時(shí)關(guān)閉LED,使LED顯示亮度一樣
- SetCH();
- do {display();}
- while(K2==0); //等松手,此時(shí)LED仍顯示
- }
- /****************************************************************
- 0.1減小頻率
- void decfreq()
- ******************************************************************/
- void decfreq()
- {
- delay10ms();
- if(K1==0)
- {
- if(count==0)
- {
- count=640;
- }
-
- count-=2;
- P0=0; //寫入時(shí)關(guān)閉LED,使LED顯示亮度一樣
- SetCH();
- do {display();}
- while(K1==0); //等松手,此時(shí)LED仍顯示
- }
- }
- /***********************************************************
- 快速增加頻率
- void fastadd()
- **********************************************************/
- void fastadd()
- {
-
- delay10ms();
- if(K4==0)
- {
- count+=2;
- if(count==642)
- {
- count=0;
- }
- }
- P0=0; //寫入時(shí)關(guān)閉LED,使LED顯示亮度一樣
- SetCH();
- // while(K4==0); //等松手
- }
- /****************************************************************
- 快速減小頻率
- void fastdec()
- ******************************************************************/
- void fastdec()
- {
- delay10ms();
- if(K3==0)
- {
- if(count==0)
- {
- count=640;
- }
-
- count-=2;
- P0=0; //寫入時(shí)關(guān)閉LED,使LED顯示亮度一樣
- SetCH();
- // while(K3==0); //等松手
- }
- }
-
-
- /*********************************************************
- 顯示函數(shù)
- 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; //加小數(shù)點(diǎn)
- }
- else
- {P0=table2[freq[7-i]];
- if (i==6) DIN=1; //加小數(shù)點(diǎn)
- }
- temp=temp+1;
- if (i==4)P0=0; //第5位不顯
- for(a=10;a>0;a--) //延時(shí)
- for(b=248;b>0;b--);
- }
- }
- }
- /*************************************************************
- 設(shè)置發(fā)射頻率
- 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內(nèi)部晶振設(shè)為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內(nèi)部晶振設(shè)為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內(nèi)部晶振設(shè)為12MHz,自己決定
- delay_i2c(100);*/
- }
- ………………余下程序請(qǐng)下載附件……
復(fù)制代碼
所有資料下載:
FM8000模塊(GS1615)制作FM發(fā)射機(jī)(分享文件).rar
(1.66 MB, 下載次數(shù): 55)
2017-2-26 18:10 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|