📄 tv2.lst
字号:
C51 COMPILER V8.05a TV2 09/03/2008 15:10:22 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE TV2
OBJECT MODULE PLACED IN tv2.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE tv2.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************************************
2 ME300B实验之--控制fi1256搜台并存台
3 作者:fbicia649
4 email:iam.shuang@yahoo.com.cn
5
6 更换晶振请注意时序问题
7 请详细阅读fi1256和24c02的产品手册
8
9 精勤求学,敦笃励志,果毅力行,忠恕任事。
10 *********************************************************************************************/
11 #include<reg52.h>
12 #include<stdio.h>
13 #include<intrins.h>
14 #define OP_READ 0xa1 // 器件地址以及读取操作
15 #define OP_WRITE 0xa0 // 器件地址以及写入操作
16 #define MAX_ADDR 0x7f // AT24C02最大地址
17 #define FHIGH 0x05
18 #define FLOW 0x7c
19 //晶振 12MHz
20 //K1键:+ K2键:- K3键:存储 K4键:选台、跳出
21
22
23
24 sbit K1=P1^0;
25 sbit K2=P1^1;
26 sbit K3=P1^2;
27 sbit K4=P1^3;
28 sbit SDA= P2^1;
29 sbit SCL= P2^0;
30 sbit P24=P2^4;
31 sbit P25=P2^5;
32 sbit P26=P2^6;
33 sbit P27=P2^7;
34
35 unsigned int ADD,DB1,DB2,PB,NDB,address,mode;
36 unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; // 0, 1, 2, 3//
-4, 5, 6, 7, 8, 9, off
37
38 void I2C_Start()
39 {
40 1 /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
41 1 SDA = 1;
42 1 SCL = 1;
43 1 _nop_();
44 1 _nop_();
45 1 _nop_();
46 1 _nop_();
47 1 SDA = 0;
48 1 _nop_();
49 1 _nop_();
50 1 _nop_();
51 1 _nop_();
52 1 SCL = 0;
53 1 }
54 void I2C_Stop()
C51 COMPILER V8.05a TV2 09/03/2008 15:10:22 PAGE 2
55 {
56 1 /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
57 1 SDA=0;
58 1 SCL=1;
59 1 _nop_();
60 1 _nop_();
61 1 _nop_();
62 1 _nop_();
63 1 SDA=1;
64 1 _nop_();
65 1 _nop_();
66 1 _nop_();
67 1 _nop_();
68 1 SCL=0;
69 1
70 1 }
71
72 void delay_ms(int number) //延时函数
73 { //晶振 12Mhz
74 1 unsigned char i;
75 1 unsigned int j;
76 1 for (j=0;j<number;j++)
77 1 {
78 2 for (i=0;i<124;i++); //12Mhz (1ms)
79 2 }
80 1 }
81
82 unsigned char data_in()
83 // 从slave读数据到MCU
84 {
85 1 unsigned char i,read_data;
86 1 for(i = 0; i < 8; i++)
87 1 {
88 2 SCL = 1;
89 2 _nop_();
90 2 _nop_();
91 2 read_data <<= 1;
92 2 read_data |= (unsigned char)SDA;
93 2 SCL = 0;
94 2 _nop_();
95 2 _nop_();
96 2 }
97 1 return(read_data);
98 1 }
99 bit data_out(unsigned char write_data)
100 // 从MCU写数据到slave
101 {
102 1 unsigned char i;
103 1 bit ack;
104 1 for(i = 0; i < 8; i++) // 循环移入8个位
105 1 {
106 2 SDA = (bit)(write_data & 0x80);
107 2 _nop_();
108 2 _nop_();
109 2 _nop_();
110 2 _nop_();
111 2 SCL = 1;
112 2 _nop_();
113 2 _nop_();
114 2 _nop_();
115 2 _nop_();
116 2 SCL = 0;
C51 COMPILER V8.05a TV2 09/03/2008 15:10:22 PAGE 3
117 2 write_data <<= 1;
118 2 }
119 1 SDA = 1; // 读取应答
120 1 _nop_();
121 1 _nop_();
122 1 _nop_();
123 1 _nop_();
124 1 SCL = 1;
125 1 _nop_();
126 1 _nop_();
127 1 _nop_();
128 1 _nop_();
129 1 ack = SDA;
130 1 SCL = 0;
131 1 return ack; // 返回应答位
132 1 }
133
134 void write_byte_eeprom(unsigned char addr, unsigned char write_data)
135 // 在eeprom指定地址addr处写入数据write_data
136 {
137 1 I2C_Start();
138 1 data_out(OP_WRITE);
139 1 data_out(addr);
140 1 data_out(write_data);
141 1 I2C_Stop();
142 1 delay_ms(3); // 写入周期延时
143 1 }
144
145 void fill_byte(unsigned char fill_data)
146 // 填充数据fill_data到EEPROM内
147 {
148 1 unsigned char i;
149 1 for(i = 0; i < MAX_ADDR; i++)
150 1 {
151 2 write_byte_eeprom(i, fill_data);
152 2 }
153 1
154 1 }
155
156 unsigned char read_current()
157 // 在当前地址读取
158 {
159 1 unsigned char read_data;
160 1 I2C_Start();
161 1 data_out(OP_READ);
162 1 read_data = data_in();
163 1 I2C_Stop();
164 1 return read_data;
165 1 }
166
167 unsigned char read_eeprom(unsigned char eeprom_addr)
168 // 在指定地址读取
169 {
170 1 I2C_Start();
171 1 data_out(OP_WRITE);
172 1 data_out(eeprom_addr);
173 1 return(read_current());
174 1 }
175
176 void display() //数码管显示频率 和频道
177 {int ge,shi,bai,x1,p,pbai,pshi,pge;
178 1 unsigned long freq;
C51 COMPILER V8.05a TV2 09/03/2008 15:10:22 PAGE 4
179 1 freq=(DB1*256+DB2)/16-38;
180 1 bai=freq/100;
181 1 shi=(freq-bai*100)/10;
182 1 ge=freq-bai*100-shi*10;
183 1 x1=DB2*10/16-DB2/16*10; //小数位,不可将freq*10,否则溢出.x1只取决于DB2/16
184 1 p=address/2;
185 1 pbai=p/100;
186 1 pshi=(p-pbai*100)/10;
187 1 pge=p-pbai*100-pshi*10;
188 1
189 1 while((K1==1)&&(K2==1)&&(K3==1)&&(K4==1))
190 1 {/*P24=1;
191 2 P25=1;
192 2 P26=1;
193 2 P27=1;*/
194 2 if (bai!=0)
195 2 {P0=dis_code[bai]; //频率
196 3 P24=0;
197 3 delay_ms(5);
198 3 P24=1;
199 3 }
200 2 P0=dis_code[shi];
201 2 P25=0;
202 2 delay_ms(5);
203 2 P25=1;
204 2
205 2 P0=(dis_code[ge]&0x7f); //增加小数点
206 2 P26=0;
207 2 delay_ms(5);
208 2 P26=1;
209 2
210 2 P0=dis_code[x1];
211 2 P27=0;
212 2 delay_ms(5);
213 2 P27=1;
214 2
215 2 P0=0xff;
216 2 P24=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -