网站导航: 首页 > 设计参考 > 正文 文章搜索
I2C总线高频头控制程序(PLL芯片为TSA5522系列)
 
文章编号:
090106163243
文章分类: 单片机 51系列
点 击:
...
关 键 词: I2C,高频头,TSA5522,PLL
文章来源:
网络,作者:徐文军
摘 要:

 
  1. /*I2C总线高频头控制Keil C51程序(PLL芯片为TSA5522系列)                       */  
  2. //--------------------------------------------------------------------------//   
  3. //                                源程序大公开                              //   
  4. //                    (c) Copyright 2001-2003 xuwenjun                     //   
  5. //                            All Rights Reserved                           //   
  6. //                                    V1.00                                 //   
  7. //--------------------------------------------------------------------------//   
  8. //标 题: I2C总线高频头控制程序(PLL芯片为TSA5522系列)                       //   
  9. //文件名: xwj_fi1256.c                                                      //   
  10. //版 本: V1.00                                                             //   
  11. //修改人: 徐文军                         E-mail:xuwenjun@21cn.com           //   
  12. //日 期: 06-02-26 首次公开                                                 //   
  13. //描 述: I2C总线高频头控制程序(PLL芯片为TSA5522系列)                       //   
  14. //声 明:                                                                   //   
  15. //        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //   
  16. //        如用于商业用途请与作者联系.    E-mail:xuwenjun@21cn.com           //   
  17. //        有问题请mailto xuwenjun@21cn.com   欢迎与我交流!                  //   
  18. //--------------------------------------------------------------------------//   
  19. //老版本: 无                             老版本文件名:                      //   
  20. //创建人: 徐文军                         E-mail:xuwenjun@21cn.com           //   
  21. //日 期: 06-02-26                                                          //   
  22. //描 述:                                                                   //   
  23. //--------------------------------------------------------------------------//   
  24.   
  25. /* 频率单位为KHz     */  
  26. #define FUENCY 38900                                /* 中频频率          */   
  27. #define PLLdataH(f) ((f+FUENCY)*16/1000/256)        /* 频率数据高 第1字节*/   
  28. #define PLLdataL(f) ((f+FUENCY)*16/1000%256)        /* 频率数据低 第2字节*/   
  29. #define PLLCON1 0x8e                                /* 控制字1    第3字节*/   
  30. /* 控制字2    第4字节*/  
  31. #define PLLCON2(f) (((f)<(168000))?(0xa0):(((f)<(450000))?(0x90):(0x30)))   
  32. #define PLLdata3(fchan) PLLdataH (fchan),PLLdataL (fchan),PLLCON2 (fchan)   
  33.   
  34. unsigned char code ucdataTab[][3]=   
  35. {   
  36.     PLLdata3(49750),        /* 频道DS1 (VL)*/  
  37.         PLLdata3(57750),        /* 频道DS2*/  
  38.         PLLdata3(65750),        /* 频道DS3 */  
  39.         PLLdata3(77250),        /* 频道DS4 */  
  40.         PLLdata3(85250),        /* 频道DS5 */  
  41.         PLLdata3(112250),        /* 频道Z1 */  
  42.         PLLdata3(120250),        /* 频道Z2 */  
  43.         PLLdata3(128250),        /* 频道Z3 */  
  44.         PLLdata3(136250),        /* 频道Z4 */  
  45.         PLLdata3(144250),        /* 频道Z5 */  
  46.         PLLdata3(152250),        /* 频道Z6 */  
  47.         PLLdata3(160250),        /* 频道Z7 */  
  48.            
  49.         PLLdata3(168250),        /* 频道DS6 (VH)*/  
  50.         PLLdata3(176250),        /* 频道DS7 */  
  51.         PLLdata3(184250),        /* 频道DS8 */  
  52.         PLLdata3(192250),        /* 频道DS9 */  
  53.         PLLdata3(200250),        /* 频道DS10 */  
  54.         PLLdata3(208250),        /* 频道DS11 */  
  55.         PLLdata3(216250),        /* 频道DS12 */  
  56.         PLLdata3(224250),        /* 频道Z8 */  
  57.         PLLdata3(232250),        /* 频道Z9 */  
  58.         PLLdata3(240250),        /* 频道Z10 */  
  59.         PLLdata3(248250),        /* 频道Z11 */  
  60.         PLLdata3(256250),        /* 频道Z12 */  
  61.         PLLdata3(264250),        /* 频道Z13 */  
  62.         PLLdata3(272250),        /* 频道Z14 */  
  63.         PLLdata3(280250),        /* 频道Z15 */  
  64.         PLLdata3(288250),        /* 频道Z16 */  
  65.         PLLdata3(296250),        /* 频道Z17 */  
  66.         PLLdata3(304250),        /* 频道Z18 */  
  67.         PLLdata3(312250),        /* 频道Z19 */  
  68.         PLLdata3(320250),        /* 频道Z20 */  
  69.         PLLdata3(328250),        /* 频道Z21 */  
  70.         PLLdata3(336250),        /* 频道Z22 */  
  71.         PLLdata3(344250),        /* 频道Z23 */  
  72.         PLLdata3(352250),        /* 频道Z24 */  
  73.         PLLdata3(360250),        /* 频道Z25 */  
  74.         PLLdata3(368250),        /* 频道Z26 */  
  75.         PLLdata3(376250),        /* 频道Z27 */  
  76.         PLLdata3(384250),        /* 频道Z28 */  
  77.         PLLdata3(392250),        /* 频道Z29 */  
  78.         PLLdata3(400250),        /* 频道Z30 */  
  79.         PLLdata3(408250),        /* 频道Z31 */  
  80.         PLLdata3(416250),        /* 频道Z32 */  
  81.         PLLdata3(424250),        /* 频道Z33 */  
  82.         PLLdata3(432250),        /* 频道Z34 */  
  83.         PLLdata3(440250),        /* 频道Z35 */  
  84.         PLLdata3(448250),        /* 频道Z36 */  
  85.            
  86.         PLLdata3(456250),        /* 频道Z37 (UHF)*/  
  87.         PLLdata3(464250),        /* 频道Z38 */  
  88.         PLLdata3(471250),        /* 频道DS13 */  
  89.         PLLdata3(479250),        /* 频道DS14 */  
  90.         PLLdata3(487250),        /* 频道DS15 */  
  91.         PLLdata3(495250),        /* 频道DS16 */  
  92.         PLLdata3(503250),        /* 频道DS17 */  
  93.         PLLdata3(511250),        /* 频道DS18 */  
  94.         PLLdata3(519250),        /* 频道DS19 */  
  95.         PLLdata3(527250),        /* 频道DS20 */  
  96.         PLLdata3(535250),        /* 频道DS21 */  
  97.         PLLdata3(543250),        /* 频道DS22 */  
  98.         PLLdata3(551250),        /* 频道DS23 */  
  99.         PLLdata3(559250),        /* 频道DS24 */  
  100.         PLLdata3(607250),        /* 频道DS25 */  
  101.         PLLdata3(615250),        /* 频道DS26 */  
  102.         PLLdata3(623250),        /* 频道DS27 */  
  103.         PLLdata3(631250),        /* 频道DS28 */  
  104.         PLLdata3(639250),        /* 频道DS29 */  
  105.         PLLdata3(647250),        /* 频道DS30 */  
  106.         PLLdata3(655250),        /* 频道DS31 */  
  107.         PLLdata3(663250),        /* 频道DS32 */  
  108.         PLLdata3(671250),        /* 频道DS33 */  
  109.         PLLdata3(679250),        /* 频道DS34 */  
  110.         PLLdata3(687250),        /* 频道DS35 */  
  111.         PLLdata3(695250),        /* 频道DS36 */  
  112.         PLLdata3(703250),        /* 频道DS37 */  
  113.         PLLdata3(711250),        /* 频道DS38 */  
  114.         PLLdata3(719250),        /* 频道DS39 */  
  115.         PLLdata3(727250),        /* 频道DS40 */  
  116.         PLLdata3(735250),        /* 频道DS41 */  
  117.         PLLdata3(743250),        /* 频道DS42 */  
  118.         PLLdata3(751250),        /* 频道DS43 */  
  119.         PLLdata3(759250),        /* 频道DS44 */  
  120.         PLLdata3(767250),        /* 频道DS45 */  
  121.         PLLdata3(775250),        /* 频道DS46 */  
  122.         PLLdata3(783250),        /* 频道DS47 */  
  123.         PLLdata3(791250),        /* 频道DS48 */  
  124.         PLLdata3(799250),        /* 频道DS49 */  
  125.         PLLdata3(807250),        /* 频道DS50 */  
  126.         PLLdata3(815250),        /* 频道DS51 */  
  127.         PLLdata3(823250),        /* 频道DS52 */  
  128.         PLLdata3(831250),        /* 频道DS53 */  
  129.         PLLdata3(839250),        /* 频道DS54 */  
  130.         PLLdata3(847250),        /* 频道DS55 */  
  131.         PLLdata3(855250),        /* 频道DS56 */  
  132.         PLLdata3(863250),        /* 频道DS57 */  
  133.            
  134.         PLLdata3(90100-6500),/* 经济台 (调频收音)*/  
  135.         PLLdata3(91000-6500),/* 经济台 */  
  136.         PLLdata3(91800-6500),/* 交通台 */  
  137.         PLLdata3(97500-6500),/* 文艺台 */  
  138.         PLLdata3(100300-6500),/* 交通台 */  
  139.         PLLdata3(103200-6500),/* 新闻台 */  
  140.         PLLdata3(105000-6500),/* 星沙之声 */  
  141.         PLLdata3(106500-6500),/* 音乐台 */  
  142. };    
  143.   
  144. /*  有关I2C变量   */  
  145. #define AddPllWr 0xc2                                 /*TSA5522写地址*/   
  146. #define AddPllRd 0xc3                                 /*TSA5522读地址*/   
  147. sbit         SDA   = P0^4;                            /*串行数据-----------P0.4*/  
  148. sbit         SCL   = P0^5;                            /*串行时钟-----------P0.5*/  
  149.   
  150. /*  I2C相关函数   */  
  151. void Start(void);    
  152. void Stop(void);    
  153. void SendACK(void);    
  154. void SendNoACK(void);    
  155. unsigned char SendByte(unsigned char d);    
  156. unsigned char ReadByte(void);    
  157.   
  158. void SetChan(unsigned char chan);    
  159. unsigned char ReadChan(void);    
  160.   
  161. /*--------选择频道--------------------------------------------*/  
  162. void SetChan(unsigned char chan)   
  163. {   
  164.     Start();                              /* 发送I2C 总线起始条件  */  
  165.     SendByte(AddPllWr);                   /* 发送被控器总线写地址    */  
  166.     SendByte(ucdataTab[chan][0]);         /* 发送频率数据高 第1字节*/  
  167.     SendByte(ucdataTab[chan][1]);         /* 发送频率数据低 第2字节*/  
  168.     SendByte(PLLCON1);                    /* 发送控制字1    第3字节*/  
  169.     SendByte(ucdataTab[chan][2]);         /* 发送控制字1    第4字节*/  
  170.     Stop();                               /*发送I2C 总线停止条件   */  
  171. }   
  172.   
  173. /*-----------读状态----------------------------------------------*/  
  174. unsigned char ReadChan(void)   
  175. {   
  176.     unsigned char i;    
  177.     Start();                                    /* 发送I2C 总线起始条件*/  
  178.     SendByte(AddPllRd);                         /*发送被控器总线读地址*/  
  179.     i = ReadByte();    
  180.     SendNoACK();                                /*最后一个字节,发送非应答信号*/  
  181.     Stop();                                     /*发送I2C 总线停止条件*/  
  182.     return (i);    
  183. }   
  184.   
  185. /*------------字节数据传送子程序发送一个字节数据或地址给被控器---------------*/  
  186. unsigned char SendByte(unsigned char a)   
  187. {   
  188.     unsigned char i,j;    
  189.     for(i = 0;i < 8;i++)   
  190.     {   
  191.         if((a & 0x80) == 0)   
  192.             SDA = 0;    
  193.         else  
  194.             SDA = 1;    
  195.         _nop_();    
  196.         SCL = 1; /*置时钟线为高通知被控器开始*/  
  197.         _nop_();_nop_();/*保证时钟高周期大于4 us*/  
  198.         SCL = 0;    
  199.         _nop_();    
  200.         a = a << 1;    
  201.     }   
  202.     _nop_();    
  203.     SDA = 1;    
  204.     _nop_();    
  205.     SCL = 1;    
  206.     j = 0;    
  207.     while (SDA == 0)    
  208.         if ((++j) == 0) {SCL = 0;return (1);} /*检测256次还未收到应答,返回1*/  
  209.         _nop_();    
  210.         SCL = 0;    
  211.         return (0);  /*成功,返回0*/  
  212. }   
  213.   
  214. /*---------------------------------------------------------------------------*/  
  215. unsigned char ReadByte(void)         /*数据接收子程序从被控器接收一个字节数据*/  
  216. {   
  217.     unsigned char i;    
  218.     unsigned char bdata Sin;    
  219.     SDA = 1;    
  220.     for (i = 0;i < 8;i++)   
  221.     {   
  222.         Sin <<= 1;    
  223.         SCL = 0;    
  224.         _nop_();    
  225.         SCL = 1;    
  226.         if(SDA == 1)   
  227.             Sin|= 0x01;    
  228.         else  
  229.             Sin&= 0xfe;    
  230.         _nop_();    
  231.     }   
  232.     return(Sin);    
  233. }   
  234.   
  235. /*-----------发送应答位--------------------------------------------------*/  
  236. void SendACK()   
  237. {   
  238.     SCL = 0;    
  239.     _nop_();    
  240.     SDA = 0;    
  241.     _nop_();    
  242.     SCL = 1;    
  243.     _nop_();    
  244.     SCL = 0;    
  245. }   
  246.   
  247. /*------------发送非应答位-----------------------------------------------*/  
  248. void SendNoACK()   
  249. {   
  250.     SCL = 0;    
  251.     _nop_();    
  252.     SDA = 1;    
  253.     _nop_();    
  254.     SCL = 1;    
  255.     _nop_();    
  256.     SCL = 0;    
  257. }   
  258.   
  259. /*---------------------------------------------------------------------------*/  
  260. void Start(void)                /*START 启动I2C 总线子程序发送I2C 起始条件*/  
  261. {   
  262.     SDA = 1;                                 /* 发送起始条件的数据信号*/  
  263.     _nop_();    
  264.     SCL = 1;                                 /*发送起始条件的时钟信号*/  
  265.     _nop_();         /*起始条件建立时间大于4.7 s*/  
  266.     SDA = 0;                                 /*发送起始信号*/  
  267.     _nop_();         /*起始条件锁定时间大于4 s*/  
  268.     SCL = 0;                                 /*钳住I2C 总线准备发送或接收数据*/  
  269. }   
  270.   
  271. /*-----------STOP 停止I2C 总线子程序发送I2C 总线停止条件-------------------*/  
  272. void Stop(void)   
  273. {   
  274.     SDA = 0;    
  275.     _nop_();    
  276.     SCL = 1;    
  277.     _nop_();    
  278.     SDA = 1;    
  279.     _nop_();    
  280. }   
  281.   
  282.   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4