找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1689|回复: 0
打印 上一主题 下一主题
收起左侧

rad5820一体机51单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:580527 发表于 2019-7-31 19:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar mode=0,gongneng=0;
  6. bit mute=0; //RDA5820 的寄存器地址
  7. #define RDA5820_READ 0X23 //读 RDA5820
  8. #define RDA5820_WRITE 0X22 //写 RDA5820
  9. uchar code *table[]={"0","1","2","3","4","5","6","7","8","9"};
  10. /*--------- 液晶端口定义 -----*/
  11. sbit LCD_RST = P1^0; //low active
  12. sbit LCD_CE = P1^1; //low active
  13. sbit LCD_DC = P1^2; //0=command,1=data
  14. sbit LCD_DIN = P1^3; //rise edge enable
  15. sbit LCD_CLK = P1^4; //clock
  16. sbit contrl=P2^7;
  17. sbit SDA =P0^0;
  18. sbit SCL =P0^1;
  19. sbit KEYup = P3^3; //按键
  20. sbit KEYdown = P3^4;
  21. sbit KEY3 = P3^5;
  22. sbit KEY4 = P3^6; //按键
  23. sbit KEY = P3^7;
  24. unsigned char code font6x8[][6] =
  25. {
  26. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
  27. { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
  28. { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
  29. { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
  30. { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
  31. { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %
  32. { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
  33. { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
  34. { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
  35. { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
  36. { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
  37. { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
  38. { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,
  39. { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
  40. { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
  41. { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
  42. { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
  43. { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
  44. { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
  45. { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
  46. { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
  47. { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
  48. { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
  49. { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
  50. { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
  51. { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
  52. { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
  53. { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
  54. { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
  55. { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
  56. { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
  57. { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
  58. { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
  59. { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A
  60. { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
  61. { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
  62. { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
  63. { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
  64. { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
  65. { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
  66. { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
  67. { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
  68. { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
  69. { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
  70. { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
  71. { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
  72. { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
  73. { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
  74. { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
  75. { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
  76. { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
  77. { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
  78. { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
  79. { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
  80. { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
  81. { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
  82. { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
  83. { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
  84. { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
  85. { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
  86. { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
  87. { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
  88. { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
  89. { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
  90. { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
  91. { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
  92. { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
  93. { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
  94. { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
  95. { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
  96. { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
  97. { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g
  98. { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
  99. { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
  100. { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j
  101. { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
  102. { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
  103. { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
  104. { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
  105. { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
  106. { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p
  107. { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q
  108. { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
  109. { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
  110. { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
  111. { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
  112. { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
  113. { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
  114. { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
  115. { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y
  116. { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z
  117. { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines
  118. }; /****************************** 汉子字模 *************************************/
  119. unsigned char code hanzi[][16]=
  120. { /*-- 文字 : 收 -*/ 0x00,0xFC,0x00,0x00,0xFF,0x00,0x40,0x20,0xD8,0x17,0x10,0x10,0xF0,0x10,0x10,0x00, //0
  121. 0x00,0x0F,0x04,0x02,0xFF,0x00,0x80,0x40,0x21,0x16,0x08,0x16,0x21,0x40,0x80,0x00, /*-- 文字 : 音 --*/

  122. 0x40,0x40,0x44,0x44,0x54,0x64,0x45,0x46,0x44,0x64,0x54,0x44,0x44,0x40,0x40,0x00, //2
  123. 0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00, /*-- 文字 : 机 --*/
  124. 0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00, //4
  125. 0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00, /*-- 文字 : 发 --*/
  126. 0x00,0x00,0x18,0x16,0x10,0xD0,0xB8,0x97,0x90,0x90,0x90,0x92,0x94,0x10,0x00,0x00, //6
  127. 0x00,0x20,0x10,0x8C,0x83,0x80,0x41,0x46,0x28,0x10,0x28,0x44,0x43,0x80,0x80,0x00, /*-- 文字 : 射 --*/
  128. 0x00,0x00,0xFC,0x56,0x55,0x54,0xFC,0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00, //8
  129. 0x02,0x42,0x23,0x12,0x4A,0x86,0x7F,0x00,0x00,0x01,0x46,0x80,0x7F,0x00,0x00,0x00, /*-- 文字 : 机 --*/
  130. 0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00, //10
  131. 0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,
  132. 0x00,0x00,0x01,0x03,0x07,0x0F,0x1B,0xF3,0xF3,0x1B,0x0F,0x07,0x03,0x01,0x00,0x00, //12 信号强度
  133. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  134. 0x01,0x02,0x04,0x08,0xF0,0x30,0x50,0xF8,0x8C,0x44,0x24,0x14,0xFC,0xFC,0x02,0x01, //14 静音
  135. 0x80,0x40,0x20,0x10,0x0F,0x0C,0x0A,0x1F,0x11,0x2A,0x24,0x28,0x3F,0x3F,0x40,0x80,
  136. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 取消静音符号
  137. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  138. };
  139. void delayms(unsigned int m)
  140. {
  141.         unsigned int i,j;
  142.         for(i=m;i>0;i--)
  143.         for(j=113;j>0;j--);
  144. }
  145. void delayus()
  146. {
  147.         _nop_ () ;
  148. }
  149. /****************************Nokia5110*************************************/
  150. void LCD_write_byte(uchar dat,uchar cmd)
  151. {
  152.         uchar i;
  153.         LCD_CE=0;
  154.         if(cmd==0) LCD_DC=0; //命令
  155.         else LCD_DC=1; //数据
  156.                 for(i=0;i<8;i++)
  157.                 {
  158.                         if(dat&0x80) //高位传起
  159.                         LCD_DIN=1;
  160.                         else
  161.                         LCD_DIN=0;
  162.                         LCD_CLK=0; dat=dat<<1; //移位
  163.                         LCD_CLK=1;
  164.                 }
  165.         LCD_CE=1;
  166. }
  167. /*-------------------- 函数名称: LCD_set_xy 入口参数: x:0-5 行选择 y:0-83 列选择
  168. ---------------------*/
  169. void LCD_set_xy(uchar x,uchar y)
  170. {
  171.         LCD_write_byte(0x40|y,0); //y:0-5
  172.         LCD_write_byte(0x80|x,0); //x:0-83
  173. }
  174. /*------------------------ 函数名称: LCD_clear 功能:清屏,向 ram 内写 0
  175. -------------------------*/
  176. void LCD_clear()
  177. {
  178.         unsigned int i;
  179.         LCD_write_byte(0x0c,0);
  180.         LCD_write_byte(0x80,0);  
  181.         for(i=0;i<504;i++)
  182.         LCD_write_byte(0x00,1);
  183. }
  184. /*------------------ 函数名称: LCD_write_char 功能:写入一个字符 入口参数: c
  185. ------------------*/
  186. void LCD_write_char(uchar c)
  187. {
  188.         uchar line;
  189.         c-=32; //转 ASCII 码
  190.         for(line=0;line<6;line++) //6 列
  191.         LCD_write_byte(font6x8[c][line], 1); //检索
  192. }
  193. /*-------------------------------- 函数名称: LCD_write_english_string 功能:写入字符串 入口参数: x,y:地址 s:地址指针 ---------------------------------*/
  194. void LCD_write_english_string(uchar x,uchar y,char *s)
  195. {
  196.         LCD_set_xy(x,y);
  197.         while(*s)
  198.                 {
  199.                 LCD_write_char(*s);
  200.                 s++;
  201.                 }
  202. }
  203. /*------------------------------------ 函数名称: writehanzi 功能:在 LCD 上显示汉字 入口参数: a:汉字在数组中的位置 X:0-83 列选择 Y:0-5 行选择-------------------------------------*/
  204. void Writehanzi(uchar x,uchar y,uchar a)
  205. {
  206. uchar i,j;
  207. LCD_set_xy(x,y);
  208. for(i=a;i<a+2;i++)
  209.         {
  210.         for(j=0;j<16;j++)
  211.                 {
  212.                 LCD_write_byte(hanzi[i][j],1);
  213.                 }
  214.         LCD_set_xy(x,y+1);
  215.         }
  216. }
  217. /*------------------ 函数名称: LCD_init 功能:初始化 LCD 入口参数:无 出口参数:无
  218. ------------------*/
  219. void LCD_init(void)
  220. {
  221. LCD_RST=0;  //复位
  222. delayus();
  223. LCD_RST=1;
  224. LCD_CE=0;
  225. delayus(); LCD_CE=1; //使能
  226. delayus();
  227. LCD_write_byte(0x21,0);// 使用扩展指令集
  228. LCD_write_byte(0xa0,0);// 设置偏置电压
  229. LCD_write_byte(0x06,0);// 温度矫正
  230. LCD_write_byte(0x13,0);//1:48
  231.   LCD_write_byte(0x20,0);// 使用基本指令集
  232.   LCD_clear(); //清屏
  233.   LCD_write_byte(0x0c,0); //普通显示
  234. LCD_CE=0;
  235. }
  236. void Rxjiemian() //收音机界面
  237. {
  238. Writehanzi(0,0,0); //收
  239. Writehanzi(16,0,2); // 音
  240. Writehanzi(32,0,4); // 机
  241. Writehanzi(48,0,12); //信号强度符号
  242. LCD_write_english_string(66,1," ");
  243. LCD_write_english_string(12,3,"Freq: ");
  244. LCD_write_english_string(12,4," V ol: ");
  245. LCD_write_english_string(12,5,"Bass: No");
  246. }
  247. void Txjiemian() //发射机界面
  248. {
  249. Writehanzi(0,0,6); //发
  250. Writehanzi(16,0,8); // 射
  251. Writehanzi(32,0,10);// 机
  252. Writehanzi(48,0,12); //信号强度符号
  253. LCD_write_english_string(66,1," ");
  254. LCD_write_english_string(12,3,"Freq: ");
  255. LCD_write_english_string(12,4,"Gain: ");
  256. LCD_write_english_string(12,5," Pag: ");
  257. }
  258. void displayrssi(uchar rssi) //显示信号强度
  259. {
  260. uchar A1=0,A2=0,A3=0;
  261. A1=rssi/100;
  262. A2=rssi%100/10;
  263. A3=rssi%10;
  264. LCD_write_english_string(66,1,table[A1]);
  265. LCD_write_english_string(72,1,table[A2]);
  266. LCD_write_english_string(78,1,table[A3]);
  267. }
  268. void displaypinlv(float pinlv) // 显示频率
  269. {
  270. uchar A1=1,A2=1,A3=1,A4=1,A5=1,A6=1;
  271. long int WENDU;
  272. WENDU=pinlv*10;
  273. A1=WENDU/1000;
  274. A2=WENDU%1000/100;
  275. A3=WENDU%100/10;
  276. A4=WENDU%10;
  277. LCD_write_english_string(48,3,table[A1]);
  278. LCD_write_english_string(54,3,table[A2]);
  279. LCD_write_english_string(60,3,table[A3]);
  280. LCD_write_english_string(66,3,".");
  281. LCD_write_english_string(72,3,table[A4]);
  282. }
  283. void displayvol(uchar vol) //显示音量

  284. {uchar A1=1,A2=1;
  285. A1=vol/10;
  286. A2=vol%10;
  287. LCD_write_english_string(48,4,table[A1]);
  288. LCD_write_english_string(54,4,table[A2]);}
  289. void displaygain(uchar gain) //显示输入增益
  290. {
  291. uchar A1=1,A2=1;
  292. A1=gain/10;
  293. A2=gain%10;
  294. LCD_write_english_string(48,4,table[A1]);
  295. LCD_write_english_string(54,4,table[A2]);
  296. }
  297. void displaypag(uchar pag) //显示发射功率
  298. {
  299. uchar A1=1,A2=1;
  300. A1=pag/10;
  301. A2=pag%10;
  302. LCD_write_english_string(48,5,table[A1]);
  303. LCD_write_english_string(54,5,table[A2]);
  304. }
  305. void displaybass(uchar bass) //显示重低音 {
  306. {if(bass)LCD_write_english_string(48,5,"YES");
  307. else LCD_write_english_string(48,5,"No ");
  308. }
  309. void displaymute(uchar mute) //显示静音符号
  310.         {
  311.         if(mute) Writehanzi(67,4,14);  //静音符号
  312.         else Writehanzi(67,4,16); //静音符号消除
  313.         }
  314. void displayguangbiao(uchar wei,uchar flag) //显示光标 {
  315.         {if(flag)
  316.         LCD_write_english_string(0,(2+wei),"->"); //1 箭头
  317.         else LCD_write_english_string(0,(2+wei)," "); //清除 1 箭头          
  318.          }
  319. /*----------------------------------------IIC 通信程序 ---------------------------------------------------*/
  320. void delay_ms(unsigned int m)
  321. {
  322.         unsigned int i,j;
  323.         for(i=m;i>0;i--)
  324.         for(j=113;j>0;j--);
  325. }
  326. void Dela_y(uint c) //延时
  327. {
  328.         int i=0;
  329.         for(i=0;i<c;i++);
  330. }
  331. void OpenIIC()
  332. {
  333.         SDA = 1;
  334.         SCL = 1;
  335.         _nop_();_nop_();_nop_();_nop_();
  336.         SDA = 0;
  337.         _nop_();_nop_();_nop_();_nop_();
  338.         SCL = 0;
  339. }

  340. void CloseIIC()
  341. {
  342.         SCL = 0;
  343.         SDA = 0 ;
  344.         _nop_();_nop_();_nop_();_nop_();
  345.         SCL = 1;
  346.        
  347.         SDA = 1;
  348.         _nop_();_nop_();_nop_();_nop_();
  349.         Dela_y(50); // 防止过快的读取造成 EPPROM 来不及反应 }
  350. }

  351. uchar IIC_Wait_Ack(void) //等待应答信号 1 接受应答失败, 0 成功
  352. {
  353.         uchar ucErrTime=0;
  354.         SDA=1;
  355.         _nop_();
  356.         SCL=1;
  357.         _nop_();
  358. while(SDA)
  359. {
  360.         ucErrTime++;
  361.         if(ucErrTime>250)
  362. {
  363.         CloseIIC();
  364.         return 1;
  365. }
  366. }
  367. SCL=0;
  368. return 0;
  369. }

  370. void IIC_Ack(void) //产生应答信号
  371. {
  372. SCL=0; SDA=0; //0 表示应答
  373. _nop_();_nop_();
  374. SCL=1;
  375. _nop_();_nop_();
  376. SCL=0;
  377. }
  378. void IIC_NAck(void) //产生非应答信号 {
  379. {SCL=0; SDA=1; //1 表示非应答
  380. _nop_();_nop_();
  381. SCL=1;
  382. _nop_();_nop_();
  383. SCL=0;
  384. }
  385. void IICsendByte(uchar txd) //IIC 发送一个字节
  386. {
  387.        
  388.         uchar t;
  389.         SCL=0;
  390.         for(t=0;t<8;t++)
  391.         {
  392.                 SDA=(txd&0x80)>>7;
  393.                 txd<<=1;
  394.                 _nop_();_nop_();
  395.                 SCL=1;
  396.                 _nop_();_nop_();
  397.                 SCL=0;
  398.                 _nop_();_nop_();;
  399.         }
  400. }
  401. uchar IICReadByte(unsigned char ack) //IIC 读一个字节
  402.         {unsigned char i,receive=0;
  403.         SDA = 1;  //51 单片机将引脚拉高则设置为输入模式
  404.         for(i=0;i<8;i++ )
  405.                 { SCL=0;
  406.                 _nop_();_nop_();
  407.                 SCL=1;
  408.                 receive<<=1;
  409.                 if(SDA)receive++;
  410.                 _nop_();
  411.                 }
  412.         if (!ack) IIC_NAck();// 产生非应答信号
  413.          else IIC_Ack(); // 产生应答信号
  414.         return receive;
  415. }
  416. /*---------------------------------RDA5820 程序 --------------------------------------------------------------*/
  417. uint ReadReg(uchar regAddr) //读 RDA5820 指令
  418. {
  419. uint buf;
  420. OpenIIC(); IICsendByte(RDA5820_WRITE);  //发送写命令
  421. IIC_Wait_Ack(); IICsendByte(regAddr); //发送地址
  422. IIC_Wait_Ack();
  423. OpenIIC(); IICsendByte(RDA5820_READ); //发送读命令
  424. IIC_Wait_Ack();

  425. buf = IICReadByte(1);
  426. buf = buf<<8;
  427. buf =buf|IICReadByte(0);
  428. CloseIIC();
  429. return buf;
  430. }
  431. void WriteReg(uchar regAddr,uint val) // 写 RDA5820 指令
  432. {
  433. OpenIIC();
  434. IICsendByte(RDA5820_WRITE);  //发送写命令
  435. IIC_Wait_Ack();
  436. IICsendByte(regAddr); //发送地址
  437. IIC_Wait_Ack();
  438. IICsendByte(val>>8);
  439. IIC_Wait_Ack();
  440. IICsendByte(val&0XFF);
  441. IIC_Wait_Ack();
  442. CloseIIC();
  443. }

  444. void RX_Mode(void) //接收模式
  445. {
  446. uint temp;
  447. temp=ReadReg(0X40);
  448. temp&=0xfff0;
  449. WriteReg(0X40,temp) ;
  450. }

  451. void TX_Mode(void) //发射模式
  452. {
  453. uint temp;
  454. temp=ReadReg(0X40);
  455. temp&=0xfff0;
  456. temp|=0x0001;
  457. WriteReg(0X40,temp) ;}

  458. void Vol_Set(uchar vol) //设置音量 0~15
  459. {
  460. uint temp=0X8845;
  461. temp&=0xfff0;
  462. WriteReg(0x05,vol|=temp) ;
  463. } void Mute_Set(uchar mute) //静音设置 1:静音 0:不静音
  464. {
  465. uint temp=0xd281;
  466. if(!mute)temp|=1<<14;

  467. else temp&=~(1<<14);
  468. WriteReg(0X02,temp) ; }

  469. void Bass_Set(uchar bass) //BASS 设置 1:打开 BASS 0:不打开 BASS
  470.   {
  471. uint temp=0xd281;  
  472. if(bass)temp|=1<<12;
  473. else temp&=~(1<<12);
  474. WriteReg(0X02,temp) ;
  475. }

  476. uchar Rssi_Get(void) //接收信号强度 0~63
  477. {
  478. uint temp=000;
  479. temp=ReadReg(0X0B);
  480. temp=(temp>>9);
  481. return temp;
  482. }

  483. void TxPAG_Set(uchar gain)  //发射功率设置 0~63
  484. {
  485. uint temp;
  486. temp=ReadReg(0X42);
  487. temp&=0XFFC0;
  488. temp|=gain;
  489. WriteReg(0X42,temp) ;
  490. }

  491. void TxPGA_Set(uchar gain)  //输入信号增益 0~7
  492. {
  493. uint temp=0XF8FF;
  494. temp|=gain<<8;
  495. WriteReg(0X42,temp) ;}

  496. void Band_Set(uchar band) //频率带宽设置 0:87-108 1:76-91 2:76-108
  497. {
  498. uint temp;
  499. temp=ReadReg(0X03);
  500. temp&=0XFFF3;
  501. temp|=band<<2;
  502. WriteReg(0X03,temp) ;
  503. }
  504. void Space_Set(uchar spc) //设置步进频率 0:100KHz 1:200KHz 3:50KHZ
  505. {
  506. uint temp;
  507. temp=ReadReg(0X03);

  508. temp&=0XFFFC;
  509. temp|=spc;
  510. WriteReg(0X03,temp) ;
  511. }
  512. void Freq_Set(uint freq) // 频率设置 单位 10KHz 6500~10800
  513.         {
  514.         uint temp;
  515.         uchar spc=0,band=0;
  516.         uint fbtm,chan;
  517.         temp=ReadReg(0X03);
  518.         temp&=0X001F;
  519.         band=(temp>>2)&0x03;  
  520.         spc=temp&0x03;
  521.         if(spc==0)spc=10;
  522.         else if(spc==1)spc=20;
  523.         else spc=5;
  524.         if(band==0)
  525.         fbtm=8700;
  526.         else if(band==1||band==2)
  527.         fbtm=7600;
  528.         else
  529.                 {
  530.                 fbtm=ReadReg(0X53);
  531.                 fbtm*=10;
  532.                 }
  533.         if(freq<fbtm)return;
  534.         chan=(freq-fbtm)/spc;
  535.         chan&=0X3FF;
  536.         temp|=chan<<6;
  537.         temp|=1<<4;
  538.         WriteReg(0X03,temp) ;
  539.         delay_ms(20);  
  540.         }
  541. void RDA5820_Init(void) //RDA5820 初始化
  542. {
  543. WriteReg(2,0xd281); //基本配置
  544. delay_ms(60);  
  545. WriteReg(0x05,0X884F);// 搜索强度 8,lan 1.8ma,vol 最大
  546. }
  547. /*-------------------------------------------------------------------------------------------*/
  548. void modesaomiao() //模式切换按键
  549.         {
  550.         if(KEY==0)
  551.                 {
  552.                 delayms(2);
  553.                 if(KEY==0)

  554.                
  555.                         {
  556.                         mode+=1;
  557.                         if(mode==2)mode=0;
  558.                         while(!KEY);
  559.                         }
  560.                 }
  561.         }
  562. void gongnengsaomiao() //功能切换按键
  563. {
  564.         if(KEY3==0)
  565.         {
  566.         delayms(2);
  567.         if(KEY3==0)
  568.                 {
  569.                         gongneng+=1;
  570.                         if(gongneng==3)gongneng=0;
  571.                         while(!KEY3);
  572.                 }
  573.         }
  574. }
  575. void Mutesaomiao() //静音扫描
  576. {
  577. if(KEY4==0)
  578.         {
  579.         delayms(2);
  580.         if(KEY4==0)
  581.                 {
  582.                 mute=~mute;
  583.                 if(mute==1){Mute_Set(1);displaymute(1);}
  584.                 if(mute==0){Mute_Set(0);displaymute(0);}
  585.                 while(!KEY4);
  586.                 }
  587.         }
  588. }
  589. /*********************************** 主程序 **********************************/
  590. void main(void)
  591. {
  592. uchar Bass=0;
  593. uchar Vol=8,TxPAG=63,Gain=4,Rssi=0;
  594. uint TXFreq=9200,RXFreq=8830;
  595. contrl=1; delayms(2000); //延时,等待系统上电稳定
  596. LCD_init(); //lcd 初始化
  597. LCD_clear(); //清屏
  598. Rxjiemian();
  599. RDA5820_Init(); //RDA 初始化
  600. RX_Mode(); //接收模式
  601. Band_Set(3); //频率带宽 65-108Mhz
  602. Space_Set(0); //频率步进 100Khz
  603. TxPGA_Set(3); //发射模式输入信号增益
  604. TxPAG_Set(63); //发射功率最大
  605. Freq_Set(RXFreq); // 频率设置
  606. while(1)
  607. {
  608. if(mode==0) //接收模式
  609. { RX_Mode(); //接收模式
  610. Rxjiemian();
  611. displayrssi(Rssi_Get()); //显示信号强度
  612. displaypinlv(RXFreq/100.0);// 显示频率
  613. displayvol(Vol); //显示音量
  614. displaybass(Bass); //显示重低音
  615. while(mode==0)
  616. {
  617. displayrssi(Rssi_Get()); //显示信号强度
  618. if((gongneng==0)&&(mode==0)) //Freq 调节 7760~10800
  619. {
  620. displayguangbiao(1,1); //显示光标
  621. while(gongneng==0)
  622.         {
  623.         displayrssi(Rssi_Get()); //显示信号强度
  624.         modesaomiao();
  625.         Mutesaomiao();
  626.         gongnengsaomiao();
  627.         Mutesaomiao();
  628.         if(KEYup==0)
  629.                 {
  630.                 delayms(100);
  631.                 if(RXFreq==10800)RXFreq=10800;
  632.                 else RXFreq+=10; Freq_Set(RXFreq);  //设置频率
  633.                 displaypinlv(RXFreq/100.0);// 显示频率
  634.                 }
  635.         if(KEYdown==0)
  636.                 {
  637.                 delayms(100);
  638.                 if(RXFreq==6500)RXFreq=6500;
  639.                 else RXFreq-=10;
  640.                 Freq_Set(RXFreq);  //设置频率
  641.                 displaypinlv(RXFreq/100.0);// 显示频率
  642.                 }
  643.         if(mode==1)break;
  644.         } displayguangbiao(1,0);  //不显示光标
  645. }
  646. if((gongneng==1)&&(mode==0)) //Vol 调节 0~15
  647. {
  648. displayguangbiao(2,1); //显示光标
  649. while(gongneng==1)
  650.         {
  651.         displayrssi(Rssi_Get()); //显示信号强度
  652.         Mutesaomiao();
  653.         modesaomiao();
  654.         gongnengsaomiao();
  655.         Mutesaomiao();
  656.         if(KEYup==0)
  657.                 {
  658.                 if(Vol==15)
  659.                 Vol=15;
  660.                 else Vol+=1;
  661.                 Vol_Set(Vol); //设置音量
  662.                 displayvol(Vol); //显示音量
  663.                 while(!KEYup);
  664.                 }
  665.         if(KEYdown==0)
  666.                 {
  667.                 if(Vol==0)Vol=0;
  668.                 else Vol-=1;
  669.                 Vol_Set(Vol); //设置音量
  670.                 displayvol(Vol); //显示音量
  671.                 while(!KEYdown);
  672.                 }
  673.         if(mode==1)break;
  674.         }
  675. displayguangbiao(2,0); //不显示光标
  676. }
  677. if((gongneng==2)&&(mode==0)) //Bass 是否打开 0~1
  678.         {
  679.         displayguangbiao(3,1); //显示光标
  680.         while(gongneng==2)
  681.                 {
  682.                 displayrssi(Rssi_Get()); //显示信号强度
  683.                 Mutesaomiao();
  684.                
  685.                 modesaomiao();
  686.                 gongnengsaomiao();
  687.                 Mutesaomiao();
  688.                 if(KEYup==0)
  689.                 {
  690.                         if(Bass==0)Bass=1;
  691.                         Bass_Set(Bass); //设置重低音
  692.                         displaybass(Bass); //显示重低音
  693.                 }
  694.                 if(KEYdown==0)
  695.                 {
  696.                         if(Bass==1)Bass=0;
  697.                         Bass_Set(Bass); //设置重低音
  698.                         displaybass(Bass); //显示重低音
  699.                 }
  700.                 if(mode==1)break;
  701.                 } displayguangbiao(3,0); //不显示光标
  702.         }
  703. }
  704. }
  705. if(mode==1) //发射模式
  706. {
  707. TX_Mode(); //发射模式
  708. Freq_Set(TXFreq);  //设置频率
  709. Txjiemian(); displayrssi(Rssi); //显示信号强度
  710. displaypinlv(TXFreq/100.0);// 显示频率
  711. displaygain(Gain);// 显示输入增益
  712. displaypag(TxPAG); //显示发射功率
  713. while(mode==1)
  714. {
  715. if((gongneng==0)&&(mode==1)) //Freq 调节 7760~10800
  716. {
  717. displayguangbiao(1,1); //显示光标
  718. while(gongneng==0)
  719.         {
  720.         displayrssi(0); // 显示信号强度
  721.         Mutesaomiao();
  722.         modesaomiao();
  723.         gongnengsaomiao();
  724.         if(KEYup==0)
  725.                 {
  726.                 delayms(100);
  727.                
  728.                 if(TXFreq==10800)TXFreq=10800;
  729.                 else TXFreq+=10;
  730.                 Freq_Set(TXFreq);  //设置频率
  731.                  displaypinlv(TXFreq/100.0);// 显示频率
  732.                 }
  733.         if(KEYdown==0)
  734.                 {
  735.                 delayms(100);
  736.                 if(TXFreq==6500)TXFreq=6500;
  737.                 else TXFreq-=10;
  738.                 Freq_Set(TXFreq);  //设置频率
  739.                 displaypinlv(TXFreq/100.0);// 显示频率
  740.                 }
  741.         if(mode==0)break;
  742.         }
  743.         displayguangbiao(1,0); //显示光标
  744. }
  745. if((gongneng==1)&&(mode==1)) //输入增益 0~7
  746. {
  747. displayguangbiao(2,1); //显示光标
  748. while(gongneng==1)
  749.         {
  750.         displayrssi(Rssi_Get()); //显示信号强度
  751.         Mutesaomiao();
  752.         modesaomiao();
  753.         gongnengsaomiao();
  754.         if(KEYup==0)
  755.                 {
  756.                 if(Gain==7)Gain=7;
  757.                 else Gain+=1; TxPGA_Set(Gain); //设置增益
  758.                 displaygain(Gain);// 显示输入增益
  759.                 while(!KEYup);
  760.                 }
  761.         if(KEYdown==0)
  762.                 {
  763.                 if(Gain==0)Gain=0;
  764.                 else Gain-=1;
  765.                 TxPGA_Set(Gain); // 设置增益
  766.                 displaygain(Gain);// 显示输入增益
  767.                 while(!KEYdown);
  768.                 }
  769.         if(mode==0)break;
  770.         }
  771. displayguangbiao(2,0); //显示光标
  772. }
  773. if((gongneng==2)&&(mode==1)) //发射功率调节 0~63
  774.         {
  775.         displayguangbiao(3,1); //显示光标
  776.         while(gongneng==2)
  777.                 {
  778.                 displayrssi(Rssi_Get()); //显示信号强度
  779.                 Mutesaomiao();
  780.                 modesaomiao();
  781.                 gongnengsaomiao();
  782.                 if(KEYup==0)
  783.                         {
  784.                         if(TxPAG==63)TxPAG=63;
  785.                         else TxPAG+=1;
  786.                         TxPAG_Set(TxPAG); //设置发射功率
  787.                         displaypag(TxPAG); //显示发射功率
  788.                          while(!KEYup);
  789.                         }
  790.                 if(KEYdown==0)
  791.                         {
  792.                         if(TxPAG==0)TxPAG=0;
  793.                         else TxPAG-=1;
  794.                         TxPAG_Set(TxPAG); //设置发射功率
  795.                         displaypag(TxPAG); //显示发射功率
  796.                         while(!KEYdown);
  797.                         }
  798.                 if(mode==0)break;
  799.                 }
  800.         displayguangbiao(3,0); //显示光标
  801.         }
  802. }
  803. }
  804. }
  805. }
复制代码

rda5820.zip (71.85 KB, 下载次数: 12)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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