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, 下載次數: 55)
2017-2-26 18:10 上傳
點擊文件名下載附件
|