📄 temp.lst
字号:
177 1 Tcount=Tcount+1;
178 1 }
179
180
181 //短延时函数
182 void delay(void)
183 {
184 1 unsigned int i=1200;
185 1 while(i--);
186 1 }
187 //这里,延时30可以使数码管闪烁
188 void Delay(int time)
189 {
190 1 while(time--)
191 1 delay();
192 1 }
193
194 /*----------------------------------------------------------------------------
195 调用方式:write_8bit(unsigned char ch) ﹫2001/03/23
196 函数说明:内函数,私有,用户不直接调用。
197 -------------------------------------------------------------------------------
198 */
199 void write_8bit(unsigned char ch)
200 {
201 1 unsigned char i=8;
202 1 SCL=0;
203 1 _nop_();_nop_();_nop_();_nop_();_nop_();
204 1 while (i--)
205 1 {
206 2 SDA=(bit)(ch&0x80);
207 2 _nop_();_nop_();_nop_();_nop_();_nop_();
208 2 ch<<=1;
209 2 SCL=1;
210 2 _nop_();_nop_();_nop_();_nop_();_nop_();
211 2 SCL=0;
212 2 _nop_();_nop_();_nop_();_nop_();_nop_();
213 2 }
214 1 _nop_();_nop_();_nop_();_nop_();_nop_();
215 1 _nop_();_nop_();_nop_();_nop_();_nop_();
216 1 }
217
218 /*------------------------------------------------------------------------------
219 调用方式:void ACK(void) ﹫2001/03/23
220 函数说明:内函数,私有,用户不直接调用。
221 -------------------------------------------------------------------------------
222 */
223 void ACK(void)
224 {
225 1 unsigned char time_1;
226 1 SDA=1;
227 1 SCL=0;
228 1 _nop_();_nop_();_nop_();_nop_();_nop_();
229 1 SCL=1;
230 1 time_1=5;
231 1 while(SDA) {if (!time_1) break;} //ACK
232 1 SCL=0;
233 1 _nop_();_nop_();_nop_();_nop_();_nop_();
234 1 }
235
236
237 unsigned char ReadIIC_24C01(unsigned char address)
238 {
C51 COMPILER V7.02b TEMP 09/10/2005 10:01:41 PAGE 5
239 1 unsigned char ddata=0;
240 1 unsigned char i=8;
241 1
242 1 SCL=1;
243 1 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA
244 1 SDA=0;
245 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
246 1 SCL=0; //START
247 1
248 1 write_8bit( (address<<1) | 0x01); //写页地址和操作方式
249 1 ACK();
250 1
251 1 while (i--)
252 1 {
253 2 SDA=1;
254 2 ddata<<=1;
255 2 SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
256 2 if (SDA) ddata|=0x01;
257 2 }
258 1
259 1 SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
260 1 SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
261 1 SDA=1; //STOP
262 1 delay();
263 1 return ddata;
264 1
265 1 }
266 void WriteIIC_24C01(unsigned char address,unsigned char ddata)
267 {
268 1
269 1 SCL=1;
270 1 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA
271 1 SDA=0;
272 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
273 1 SCL=0; //START
274 1
275 1 write_8bit( (address<<1) & 0xfe); //写页地址和操作方式,对于24C32-24C256,page不起作用
276 1
277 1 ACK();
278 1 write_8bit(ddata); //发送数据
279 1 ACK();
280 1 SDA=0;
281 1 _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
282 1 SDA=1; //STOP
283 1 delay();
284 1 }
285 //芯片初始化
286 void init(void)
287 {
288 1 uchar i=10;
289 1 Tcount=0; //用来产生长延时的标志
290 1 KeyCount=0; //Ok_Key键所处状态标志
291 1 Write=0; //修改后的数据是否写入EEPROM标志
292 1
293 1 b=ReadIIC_24C01(0x00); //从EEPROM里读取百位数据
294 1 s=ReadIIC_24C01(0x01); //从EEPROM里读取十位数据
295 1 g=ReadIIC_24C01(0x02); //从EEPROM里读取个位数据
296 1
297 1 TimeSet=b*100+s*10+g; //根据从EEPROM里读取的数据,计算出预设的时间初值
298 1 TimeCount=TimeSet; //所要定时的标志
299 1
300 1 while(i--) //开机后,将原来所存初始值取出,闪烁10次
C51 COMPILER V7.02b TEMP 09/10/2005 10:01:41 PAGE 6
301 1 {
302 2 P0=tab[b];
303 2 P2=tab[s];
304 2 P1=tab[g];
305 2 Delay(50);
306 2 P0=0x80;
307 2 P2=0x80;
308 2 P1=0x80;
309 2 Delay(50);
310 2 }
311 1
312 1 EA=1; //开全局中断
313 1 ET0=1;//开定时器中断
314 1 TR0=1;//开定时器0中断
315 1
316 1 EX0=1;//开外部中断
317 1 IT0=1;//开INTO中断
318 1 TH0=(65536-50000)/256; //设置定时器高8位初值
319 1 TL0=(65536-50000)%256; //设置定时器低8位初值
320 1
321 1 }
322
323 main()
324 {
325 1 init();
326 1 while(1)
327 1 {
328 2 if(Write) //如果向EEPROM写标志使能,将调整后的数据写入EEPROM内
329 2 {
330 3 WriteIIC_24C01(0x00,b);
331 3 WriteIIC_24C01(0x01,s);
332 3 WriteIIC_24C01(0x02,g);
333 3 TimeSet=b*100+s*10+g; //根据设定值来计算出设定值
334 3 TimeCount=TimeSet; //将设定值赋给定时标志
335 3
336 3 ET0=1; //定时器中断使能
337 3 TR0=1;
338 3 TH0=(65536-50000)/256; //设置定时器高8位初值
339 3 TL0=(65536-50000)%256; //设置定时器低8位初值*/
340 3 Write=!Write;
341 3 }
342 2 if(TimeCount==0)
343 2 {
344 3 TimeCount=TimeSet; //如果定时完成,重新开始
345 3 }
346 2 }
347 1 }
348
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1042 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 ----
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 + -