📄 tuner.lst
字号:
C51 COMPILER V7.20 TUNER 06/30/2005 14:02:57 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE TUNER
OBJECT MODULE PLACED IN tuner.OBJ
COMPILER INVOKED BY: C:\Keil51\C51\BIN\c51.exe tuner.c DB OE SMALL ROM(LARGE)
line level source
1 #include "reg52.h"
2 #include "intrins.h"
3 #include "..\..\inc\globedef.h"
4 #include "..\..\inc\keydef.h"
5 #include "..\..\inc\keyproc.h"
6 #include "..\..\inc\vfddef.h"
7 #include "..\..\inc\delay.h"
8 #include "..\..\inc\i2c.h"
9 #include "..\..\inc\tuner.h"
10
11
12 /************************************************
13 * MCU向TUNER发送一个字节数据 *
14 * 输入: ucData 要发送的无符号字节 *
15 * 无返回值 *
16 * 注意:是低位选发送 *
17 ************************************************/
18 void SendByte_ToTuner(BYTE ucData)
19 {
20 1 BYTE i;
21 1
22 1 for(i=0; i<8; i++)
23 1 {
24 2 CLEAR_TUNER_CLK;
25 2 if(ucData & 0x01)
26 2 SET_TUNER_DATA;
27 2 else
28 2 CLEAR_TUNER_DATA;
29 2 Delay5US();
30 2 SET_TUNER_CLK; //上升沿发送数据
31 2 ucData >>= 1;
32 2 }
33 1 }
34 /************************************************
35 * MPU自TUNER读一个字节数据职 *
36 * 无输入值 *
37 * 返回值读入的无符号字节 *
38 * 注意:是高位先读入 *
39 ************************************************/
40 BYTE ReadByte_FromTuner(void)
41 {
42 1 BYTE i, ucData = 0;
43 1
44 1 //TRI_TUNER_DATA;
45 1 for(i=0; i<8; i++)
46 1 {
47 2 CLEAR_TUNER_CLK;
48 2 Delay5US();
49 2 SET_TUNER_CLK;
50 2 Delay5US();
51 2 ucData <<= 1;
52 2 if(TUNER_DATA_HIGH)
53 2 ucData++; //高电平置1
54 2 }
55 1 return(ucData);
C51 COMPILER V7.20 TUNER 06/30/2005 14:02:57 PAGE 2
56 1 }
57
58 /****************************************************
59 * MCU向TUNER指定地址发送多个字节数据 *
60 * 输入: *ucData 要发送的无符号字节数据组 *
61 * unN 发送数据个数 *
62 * unAddr CCB地址 *
63 * 无返回值 *
64 * 注意:是低位先发送 *
65 ****************************************************/
66 void SendString_ToTuner(BYTE ucAddr, BYTE ucN, BYTE *ucData)
67 {
68 1 BYTE i;
69 1
70 1 CLEAR_TUNER_CS;
71 1 SendByte_ToTuner(ucAddr);
72 1 SET_TUNER_CS;
73 1 for(i=0; i<ucN; i++)
74 1 SendByte_ToTuner(ucData[i]); //发送数据
75 1 CLEAR_TUNER_CS;
76 1 }
77
78 /************************************************
79 * MPU自CCB指定地址读多个字节数据 *
80 * 输入: unN 要求读入数据个数 *
81 * unAddr CCB地址 *
82 * 返回值 *ucData所读入的无符号字节数据组 *
83 * 注意:每个字节的高位先读入 *
84 ************************************************/
85 void ReadString_FromTuner(BYTE ucAddr, BYTE ucN, BYTE *ucData)
86 {
87 1 BYTE i;
88 1
89 1 CLEAR_TUNER_CS; //准备发送CCB地址
90 1 SendByte_ToTuner(ucAddr); //发送CCB地址
91 1 SET_TUNER_CS;
92 1 for(i=0; i<ucN; i++)
93 1 ucData[i] = ReadByte_FromTuner(); //接收数据
94 1 CLEAR_TUNER_CS; //结束
95 1 }
96
97 /****************************************
98 * 收音模块的初始化 *
99 ucRadioControl[0] 的各位代表值
100
101 ucRadioControl[0].7 = STSW; = 0, MONO; =1, stereo
102 ucRadioControl[0].6 = BDSW1; = 0, AM; =1, FM
103 ucRadioControl[0].5 = B02;
104 ucRadioControl[0].4 = IFSW; =1, MUTED, =0 RECEIVED
105 ucRadioControl[0].3 = B01;
106 ucRadioControl[0].2 = 0;
107 ucRadioControl[0].1 = 1;
108 ucRadioControl[0].0 = 0;
109
110
111 *******************************************/
112 void RadioInit(void)
113 {
114 1
115 1 if(FM_AM_Select == FM_MODE)
116 1 {
117 2 //FM state
C51 COMPILER V7.20 TUNER 06/30/2005 14:02:57 PAGE 3
118 2 ucRadioControl[0]=0xc2;//STEREO, FM MODE
119 2 //设置DEAD BAND WIDTH 为DZC, 检测到立体声Tuner_DATA_OUT变低
120 2 ucRadioControl[1]=0x8c;
121 2
122 2 //一般操做模式,设置中频计数的计算时间为32ms和等待时间为4ms左右
123 2 ucRadioControl[2]=0x17;//
124 2 }
125 1 else
126 1 {
127 2 //AM state
128 2 ucRadioControl[0]=0x02;//MONO, AM mode
129 2 ucRadioControl[1]=0x8c;//81;
130 2 ucRadioControl[2]=0x17;//12;
131 2 }
132 1 SendString_ToTuner(IN2_MODE,3,ucRadioControl);
133 1 }
134
135
136 /****************************************
137 *收音头静音 *
138 ****************************************/
139 void RadioMute(void)
140 {
141 1 if(FM_AM_Select == FM_MODE)
142 1 {
143 2 //FM state ucRadioControl[0].4的IFSW位控制静音
144 2 ucRadioControl[0]=0xd2;//0a;
145 2 ucRadioControl[1]=0x8c;//80;
146 2 ucRadioControl[2]=0x17;//12;
147 2 }
148 1 else
149 1 {
150 2 //AM state
151 2 ucRadioControl[0]=0x12;//62;
152 2 ucRadioControl[1]=0x8c;//81;
153 2 ucRadioControl[2]=0x17;//12;
154 2 }
155 1 SendString_ToTuner(IN2_MODE,3,ucRadioControl);
156 1 }
157
158 /****************************************
159 *STRERO/MONO *
160 ****************************************/
161
162 void SetRadioMono(void)
163 {
164 1 if(FM_AM_Select == FM_MODE)
165 1 {
166 2 //ucRadioControl[0].7控制立体声或者单声道
167 2 ucRadioControl[0]=0x42;//aa;
168 2 ucRadioControl[1]=0x8c;//80;
169 2 ucRadioControl[2]=0x17;//12;
170 2 SendString_ToTuner(IN2_MODE,3,ucRadioControl);
171 2 }
172 1 }
173
174 /****************************************
175 *收音头打开声音, 其实是针对FM的操做 *
176 ****************************************/
177 void RadioOpen(void)
178 {
179 1 if(Mono_Stereo_Select == Tuner_MONO)
C51 COMPILER V7.20 TUNER 06/30/2005 14:02:57 PAGE 4
180 1 SetRadioMono();
181 1 else
182 1 RadioInit();
183 1 }
184
185 /****************************************
186 * 写入收音频率值 (IN1 Mode) *
187 * 输入:uiFreq 要写入的频率值 *
188 ****************************************/
189 void RadioFreq(WORD uiFreq)
190 {
191 1 if(FM_AM_Select == FM_MODE)
192 1 {
193 2 //设置参考频率为25KHZ, 设置PLL的divisor = P[15:0] * 2;
194 2 //reset中频计数
195 2 ucRadioControl[2]=0x2a;
196 2 }
197 1 else
198 1 {
199 2 //设置参考频率为 5KHZ,设置PLL的divisor = P[15:4];
200 2 ucRadioControl[2]=0x98;
201 2 uiFreq<<=4;//移位是因为P[3:0]是被忽略的
202 2 }
203 1 ucRadioControl[0]=(BYTE)(uiFreq&0x00ff);
204 1 ucRadioControl[1]=(BYTE)((uiFreq&0xff00)>>8);
205 1 SendString_ToTuner(IN1_MODE,3,ucRadioControl); //写入CCB总线
206 1 DelayX1ms(60);
207 1
208 1 //GTE = 1; START中频计数
209 1 ucRadioControl[2]|=0x04;
210 1 SendString_ToTuner(IN1_MODE,3,ucRadioControl);
211 1 }
212
213
214 /****************************************
215 *读中频计数和状态 *
216 *返回值为状态字节 *
217 *中频计数值去后4个BIT保存在uiIFCount *
218 ****************************************/
219 void RadioCountIF(void)
220 {
221 1 //BYTE TEMP[3];
222 1 ReadString_FromTuner(OUT_MODE,3,ucRadioControl); //自CCB上读3个字节
223 1 //计算读出的中频值,忽略低4个BIT
224 1 //最高位STINT =1代表立体声, =0代表单声道
225 1 Mono_Stereo_Select = ucRadioControl[0] & 0x80;
226 1 if(Mono_Stereo_Select != 0)
227 1 Mono_Stereo_Select = Tuner_STEREO;
228 1 else
229 1 Mono_Stereo_Select = Tuner_MONO;
230 1 Mono_Stereo_Select = ((ucRadioControl[0] & 0x80) >> 7);
231 1 uiIFCount = (WORD)(ucRadioControl[2] >> 4) + (WORD)(ucRadioControl[1] << 4)
232 1 + (WORD)(ucRadioControl[0] << 12);
233 1
234 1 }
235
236 /****************************************
237 *判断是否锁到台 *
238 *返回:TRUE 锁到 *
239 * FALSE 未锁到 *
240 ****************************************/
241 BYTE RadioLock(void)
C51 COMPILER V7.20 TUNER 06/30/2005 14:02:57 PAGE 5
242 {
243 1 if(Wait_Lock_40ms < Wait_Timer_Out)
244 1 return 0xFF;
245 1 else
246 1 {
247 2 Wait_Lock_40ms = 0;
248 2 RadioCountIF();
249 2 if( FM_AM_Select == FM_MODE )
250 2 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -