找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4661|回复: 7
收起左侧

FM8000模块(GS1615)制作FM发射机 单片机仿真 程序 PPT教程都有

  [复制链接]
ID:166767 发表于 2017-2-26 18:11 | 显示全部楼层 |阅读模式
FM8000B发射模块制作FM发射机,以前做的,为了换其他文件,所以贡献出来,含仿真、单片机程序、PPT
FM8000模块(GS1615)制作FM发射机的单片机仿真原理图:
0.png 0.png

GS1615FM发射机 ppt内容预览:
0.png
模块工作电压:2.4-3.6V
参考时钟:12MHZ
工作温度范围:-20——85摄氏度
调频方式:I2C总线端口选频
0.png 0.png 0.png
至此可知:寄存器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等,程序怎改

单片机源程序:
  1. #include<intrins.h>    //包含 _nop_()
  2. #include<reg51.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. //---------------------------
  6. //-------定义变量端口--------
  7. sbit sda=P2^1;
  8. sbit scl=P2^0;
  9. sbit DIN=P0^5;   //小数点
  10. sbit K1=P2^7;
  11. sbit K2=P2^6;
  12. sbit K3=P2^5;
  13. sbit K4=P2^4;
  14. unsigned long count;
  15. uchar i,j;
  16. uchar a,b;
  17. uchar temp;
  18. unsigned long freq[8];
  19. unsigned long f;
  20. unsigned char  code table1[ ]={0xd7,0x14,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f,0x9F,0xDA,0xC3,0xDC,0xCB,0x8B,0x00};
  21.                /**左边LED四位  "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "A"  "B"  "C"  "D"  "E"  "F" "不亮"
  22.                 共阴数码管段码表 (按图接法的编码)**/
  23. unsigned char  code table2[ ]={0x5F,0x41,0x9D,0xd5,0xC3,0xD6,0xDE,0x45,0xDF,0xD7,0xCF,0xDA,0x1E,0xD9,0x9E,0x8E,0x00};
  24.                /**右边LED四位  "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "A"  "B"  "C"  "D"  "E"  "F" "不亮"
  25.                  共阴数码管段码表 (按图接法的编码)**/

  26. //----- 函数声明-------------
  27. void FM8000_init(); //初始化函数
  28. void start();      //开始函数
  29. void stop();       //终止函数
  30. void respon();    //应答信号
  31. void write_byte(uchar);   //写字节函数
  32. uchar read_byte();        //读字节函数
  33. void write_add(uchar,uchar); //指定地址写一字节数据
  34. uchar read_add(uchar);        //指定地址读一字节数据
  35. void delay();
  36. void delay_i2c(uint x);
  37. void SetCH();
  38. void addfreq();
  39. void decfreq();
  40. void fastadd();
  41. void fastdec();
  42. void delay10ms();
  43. void display();   
  44. //----------------------------------------
  45. //----------------------
  46. void delay()
  47. {
  48. _nop_();
  49. _nop_();
  50. _nop_();
  51. _nop_();
  52. _nop_();
  53. }
  54. //----------------------------------------
  55. void FM8000_init() //初始化函数
  56. {
  57. scl=1;
  58. delay();
  59. sda=1;
  60. delay();
  61. }

  62. //----------------------------

  63. void start(void)     //开始函数
  64. {
  65. sda=1;
  66. scl=1;
  67. delay();
  68. sda=0;       //拉低电平
  69. delay();
  70. scl=0;
  71. }

  72. //--------------------------------
  73. void stop(void)     //终止函数
  74. {
  75. sda=0;
  76. scl=1;
  77. delay();
  78. sda=1;       //拉高电平
  79. delay();
  80. scl=0;
  81. }

  82. //---------------------------------

  83. void respon() //应答
  84. {
  85. uchar i;
  86. scl=1;
  87. delay();
  88. while((sda==1)&&(i<250))i++;
  89. scl=0;
  90. delay();
  91. }

  92. //-------------------------------
  93. void write_byte(uchar dat)    //写字节
  94. {
  95. uchar i,temp;
  96. temp=dat;
  97. for(i=0;i<8;i++)
  98. {
  99.    temp=temp<<1;    //循环右移
  100.    scl=0;
  101.    delay();
  102.    sda=CY;      //CY为进位标志
  103.    delay();
  104.    scl=1;       //拉高SCL
  105.    delay();
  106. }
  107. scl=0;
  108. delay();
  109. sda=1;
  110. delay();
  111. }

  112. //------------------------------------
  113. uchar read_byte()            //读字节
  114. {
  115. uchar i,k;
  116. scl=0;
  117. delay();
  118. sda=1;
  119. delay();
  120. for(i=0;i<8;i++)
  121. {
  122. scl=1;
  123. delay();
  124. k=(k<<1)|sda;
  125. scl=0;
  126. delay();
  127. }
  128. return k;
  129. }

  130. //------------------------------------
  131. //------------------------------------

  132. //-----指定地址写入一字节数据-------
  133. void write_add(uchar add,uchar dat)
  134. {
  135. start();                //开始
  136. write_byte(0x58);       //写 器件地址及写信号
  137. respon();     
  138. write_byte(add);        //写字地址
  139. respon();
  140. write_byte(dat);        //写数据
  141. respon();
  142. stop();                 //终止
  143. }
  144. //---------------------------------

  145. //------指定地址读一字节数据-------
  146. uchar read_add(uchar add)
  147. {
  148. uchar date;
  149. start();
  150. write_byte(0x58);     //写 器件地址
  151. respon();
  152. write_byte(add);   //字节地址
  153. respon();
  154. start();
  155. write_byte(0x59);      
  156. respon();
  157. date=read_byte();
  158. stop();
  159. return date;
  160. }


  161. //------延时函数-------
  162. void delay_i2c(uint x)//延时函数
  163. {
  164. uchar a,b;
  165. for(a=x;a>0;a--);
  166. //for(b=100;b>0;b--);   //速度较慢,去掉加快点
  167. }

  168. void delay10ms(void) //延时10毫秒
  169. {                 
  170.           unsigned char i,j;
  171.           for(i=20;i>0;i--)
  172.           for(j=248;j>0;j--);
  173. }


  174. /***********************************************************

  175.                       0.1增加频率
  176.                   void addfreq()

  177. **********************************************************/
  178. void addfreq()          
  179. {
  180.       
  181.               delay10ms();
  182.                   if(K2==0)                    
  183.           {
  184.                                         count+=2;

  185.                                         if(count==642)  //count=0对应76.0MHz,count=640对应108.0MHz,
  186.                                         {
  187.                                            count=0;
  188.                                         }
  189.                   }
  190.                   P0=0;     //写入时关闭LED,使LED显示亮度一样
  191.                     SetCH();
  192.           do {display();}
  193.                   while(K2==0);   //等松手,此时LED仍显示
  194. }
  195. /****************************************************************

  196.                       0.1减小频率
  197.                   void decfreq()
  198. ******************************************************************/
  199. void decfreq()               
  200. {
  201.      delay10ms();
  202.                 if(K1==0)
  203.           {
  204.                                 if(count==0)
  205.                                         {
  206.                                            count=640;
  207.                                         }       
  208.                                 
  209.                       count-=2;
  210.                   P0=0;     //写入时关闭LED,使LED显示亮度一样
  211.                     SetCH();
  212.           do {display();}
  213.                    while(K1==0);   //等松手,此时LED仍显示
  214.            }
  215. }  


  216. /***********************************************************

  217.                       快速增加频率
  218.                   void fastadd()

  219. **********************************************************/
  220. void fastadd()          
  221. {
  222.       
  223.               delay10ms();
  224.                   if(K4==0)                    
  225.           {
  226.                                         count+=2;

  227.                                         if(count==642)
  228.                                         {
  229.                                            count=0;
  230.                                         }
  231.                   }
  232.                   P0=0;     //写入时关闭LED,使LED显示亮度一样
  233.                     SetCH();
  234.                 //  while(K4==0);   //等松手
  235. }
  236. /****************************************************************

  237.                       快速减小频率
  238.                   void fastdec()
  239. ******************************************************************/
  240. void fastdec()               
  241. {
  242.      delay10ms();
  243.                 if(K3==0)
  244.           {
  245.                                 if(count==0)
  246.                                         {
  247.                                            count=640;
  248.                                         }       
  249.                                 
  250.                       count-=2;
  251.                   P0=0;     //写入时关闭LED,使LED显示亮度一样
  252.                     SetCH();
  253.                  //          while(K3==0);   //等松手
  254.            }
  255. }  


  256. /*********************************************************

  257.                       显示函数
  258.                   void display(void)

  259. *********************************************************/
  260. void display(void)
  261. {
  262.         {
  263.          f = (count*5+7600);               
  264.                    freq[7]=f/10000;
  265.                  freq[6]=(f%10000)/1000;
  266.                  freq[5]=(f%1000)/100;
  267.                  freq[4]=(f%100)/10;
  268.                  freq[3]=f%10;
  269.                  freq[1]=11;
  270.                  freq[2]=10;
  271.                  freq[0]=12;
  272.                  temp=0;
  273.                    for(i=0;i<5;i++)      //后四位不显
  274.                         {
  275.                                 P1=temp;
  276.                                 if (i<4)                               
  277.                                    {P0=table1[freq[7-i]];
  278.                                     if (i==2) DIN=1;  //加小数点
  279.                                     }
  280.                                 else
  281.                                    {P0=table2[freq[7-i]];                               
  282.                                    if (i==6) DIN=1;  //加小数点
  283.                                    }
  284.                                 temp=temp+1;
  285.                                 if (i==4)P0=0;        //第5位不显
  286.                                 for(a=10;a>0;a--)     //延时
  287.                                 for(b=248;b>0;b--);
  288.                           }
  289.         }
  290. }

  291. /*************************************************************

  292.                   设置发射频率
  293.                                   void SetCH()

  294. ************************************************************/
  295. void SetCH()
  296. {
  297.     FM8000_init();         
  298.         if(count<=255)               
  299.                         write_add(0x00,0x20);   
  300.                         delay_i2c(100);
  301.                         write_add(0x01,count);   
  302.                         delay_i2c(100);       
  303.                      /* write_add(0x04,0x32); //是否把F8000内部晶振设为12MHz,自己决定  
  304.                         delay_i2c(100);*/
  305.          if((count>=256) && (count<=511))
  306.                 {               
  307.                         write_add(0x00,0x21);   
  308.                         delay_i2c(100);
  309.                         write_add(0x01,count-256);   
  310.                         delay_i2c(100);
  311.                      /* write_add(0x04,0x32); //是否把F8000内部晶振设为12MHz,自己决定  
  312.                         delay_i2c(100);*/
  313.                 }
  314.         if(count>=512)               
  315.                 {        write_add(0x00,0x22);   
  316.                         delay_i2c(100);
  317.                         write_add(0x01,count-512);   
  318.                         delay_i2c(100);
  319.                      /* write_add(0x04,0x32); //是否把F8000内部晶振设为12MHz,自己决定  
  320.                         delay_i2c(100);*/
  321.                 }

  322. ………………余下程序请下载附件……

复制代码


0.png 0.png

所有资料下载:
FM8000模块(GS1615)制作FM发射机(分享文件).rar (1.66 MB, 下载次数: 53)

评分

参与人数 2黑币 +105 收起 理由
韩笃铭 + 5 赞一个!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:185311 发表于 2017-4-1 11:14 | 显示全部楼层
好资料
回复

使用道具 举报

ID:79034 发表于 2017-4-8 17:28 | 显示全部楼层
正好需要这方面的资料
回复

使用道具 举报

ID:209954 发表于 2017-6-21 18:35 | 显示全部楼层
感谢楼主分享,先收下了。
回复

使用道具 举报

ID:258222 发表于 2018-6-23 10:33 | 显示全部楼层
可以给个下载地址么?没有黑币无法下载
回复

使用道具 举报

ID:375594 发表于 2018-7-20 10:40 | 显示全部楼层
感谢楼主分享,请问该芯片哪有卖的吗
回复

使用道具 举报

ID:678298 发表于 2019-12-31 12:49 | 显示全部楼层
不错哦,能发一份给我吗?
回复

使用道具 举报

ID:708105 发表于 2020-7-9 07:30 | 显示全部楼层
多大发射功率
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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