📄 fm.lst
字号:
C51 COMPILER V7.06 FM 11/05/2008 12:07:01 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE FM
OBJECT MODULE PLACED IN fm.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE fm.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include "uart.h"
6 #include "I2C.h"
7
8 sbit s1=P3^4; //手动减小键
9 sbit s2=P3^5; //手动增加键
10 sbit s3=P3^6; //自动减小键
11 sbit s4=P3^7; //自动增加键
12
13 #define max_freq 108000
14 #define min_freq 87500
15
16 unsigned int max_pll=0x339b; //108MHz时的pll,
17 unsigned int min_pll=0x299d; //87.5MHz时的pll.
18
19 unsigned char radio_write_data[5]={0x2a,0xb6,0x40,0x11,0x40}; //要写入TEA5767的数据
20 unsigned char radio_read_data[5]; //TEA5767读出的状态
21
22 unsigned long frequency;
23 unsigned int pll;
24
25 void delay_ms(unsigned int i) //us延时函数
26 {
27 1 unsigned int j,k;
28 1 for(j=i;j>0;j--)
29 1 for(k=125;k>0;k--);
30 1 }
31
32 void radio_write(void)
33 {
34 1 unsigned char i;
35 1 iic_start();
36 1 iic_write8bit(0xc0); //TEA5767写地址
37 1 if(!iic_testack())
38 1 {
39 2 for(i=0;i<5;i++)
40 2 {
41 3 iic_write8bit(radio_write_data[i]);
42 3 iic_ack();
43 3 }
44 2 }
45 1 iic_stop();
46 1 }
47
48 //由频率计算PLL
49 void get_pll(void)
50 {
51 1 unsigned char hlsi;
52 1 unsigned int twpll=0;
53 1 hlsi=radio_write_data[2]&0x10;
54 1 if (hlsi)
55 1 pll=(unsigned int)((float)((frequency+225)*4)/(float)32.768); //频率单位:k
C51 COMPILER V7.06 FM 11/05/2008 12:07:01 PAGE 2
56 1 else
57 1 pll=(unsigned int)((float)((frequency-225)*4)/(float)32.768); //频率单位:k
58 1 }
59
60
61 //由PLL计算频率
62 void get_frequency(void)
63 {
64 1 unsigned char hlsi;
65 1 unsigned int npll=0;
66 1 npll=pll;
67 1 hlsi=radio_write_data[2]&0x10;
68 1 if (hlsi)
69 1 frequency=(unsigned long)((float)(npll)*(float)8.192-225); //频率单位:KHz
70 1 else
71 1 frequency=(unsigned long)((float)(npll)*(float)8.192+225); //频率单位:KHz
72 1 }
73
74 //读TEA5767状态,并转换成频率
75 void radio_read(void)
76 {
77 1 unsigned char i;
78 1 unsigned char temp_l,temp_h;
79 1 pll=0;
80 1 iic_start();
81 1 iic_write8bit(0xc1); //TEA5767读地址
82 1 if(!iic_testack())
83 1 {
84 2 for(i=0;i<5;i++)
85 2 {
86 3 radio_read_data[i]=iic_read8bit();
87 3 iic_ack();
88 3 }
89 2 }
90 1 iic_stop();
91 1 temp_l=radio_read_data[1];
92 1 temp_h=radio_read_data[0];
93 1 temp_h&=0x3f;
94 1 pll=temp_h*256+temp_l;
95 1 get_frequency();
96 1 }
97
98
99
100 //手动设置频率,mode=1,+0.01MHz; mode=0:-0.01MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD
101 void search(bit mode)
102 {
103 1 radio_read();
104 1 if(mode)
105 1 {
106 2 frequency+=10;
107 2 if(frequency>max_freq)
108 2 frequency=min_freq;
109 2 }
110 1 else
111 1 {
112 2 frequency-=10;
113 2 if(frequency<min_freq)
114 2 frequency=max_freq;
115 2 }
116 1 get_pll();
117 1 radio_write_data[0]=pll/256;
C51 COMPILER V7.06 FM 11/05/2008 12:07:01 PAGE 3
118 1 radio_write_data[1]=pll%256;
119 1 radio_write_data[2]=0x41;
120 1 radio_write_data[3]=0x11;
121 1 radio_write_data[4]=0x40;
122 1 radio_write();
123 1 }
124
125 //自动搜台,mode=1,频率增加搜台; mode=0:频率减小搜台,不过这个好像不能循环搜台
126 void auto_search(bit mode)
127 {
128 1 radio_read();
129 1 if(mode)
130 1 {
131 2 radio_write_data[2]=0xb1;
132 2 frequency+=20;
133 2 if(frequency>max_freq)
134 2 frequency=min_freq;
135 2 }
136 1 else
137 1 {
138 2 radio_write_data[2]=0x41;
139 2 frequency-=20;
140 2 if(frequency<min_freq)
141 2 frequency=max_freq;
142 2 }
143 1 get_pll();
144 1
145 1 radio_write_data[0]=pll/256+0x40; //加0x40是将SM置为1 为自动搜索模式
146 1 radio_write_data[1]=pll%256;
147 1 radio_write_data[3]=0x11; //SSL1和SSL0控制搜索停止条件
148 1 radio_write_data[4]=0x40;
149 1 radio_write();
150 1 radio_read();
151 1 while(!(radio_read_data[0]&0x80)) //搜台成功标志
152 1 {
153 2 radio_read();
154 2 }
155 1 }
156
157
158 void main()
159 {
160 1 P3=0xff;
161 1 UART_Init();
162 1 comm("WWW.TXMCU.COM \r\n\0");
163 1 comm("HELLO FM \r\n\0");
164 1
165 1 radio_write();
166 1
167 1 while(1)
168 1 {
169 2
170 2
171 2 if(s1==0)
172 2 {delay_ms(1);
173 3 if(s1==0)
174 3 {
175 4 while(s1==0);
176 4 search(0); send_fre(frequency);
177 4 }
178 3 }
179 2
C51 COMPILER V7.06 FM 11/05/2008 12:07:01 PAGE 4
180 2 if(s2==0)
181 2 {delay_ms(1);
182 3 if(s2==0)
183 3 {
184 4 while(s2==0);
185 4 search(1); send_fre(frequency);
186 4 }
187 3 }
188 2
189 2 if(s3==0)
190 2 {delay_ms(1);
191 3 if(s3==0)
192 3 {
193 4 auto_search(0); send_fre(frequency);
194 4 }
195 3 }
196 2
197 2 if(s4==0)
198 2 {delay_ms(1);
199 3 if(s4==0)
200 3 {
201 4 auto_search(1); send_fre(frequency);
202 4 }
203 3 }
204 2
205 2 }
206 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1002 ----
CONSTANT SIZE = 42 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 20 27
IDATA SIZE = ---- ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -