玩单片机也很长时间了,我是以玩为乐趣,属于不求甚解的那种,所以时间长了也有了许多的电路板,但是哪个玩的也不精通,
看到有新功能的总想去学学、去了解,看看是什么原理实现的,了解的差不多了就放一边去了,虽然是这样但是51单片机我始终还是放不下,有时间还是会拿起来玩玩。
想必现在玩STC89C52RC单片机的朋友是最多的吧!我呢
只用STC89C52单片机驱动外设,比如LED,数码管,液晶和键盘,对显示器件情有独钟
,还有那些AD、EEPROM神马的我都不玩的
,就是懒的弄那些通讯总线神马的看到就
,虽然手里有写好的头文件但也还是懒的调用,懒的分析。
在看EEPROM 24C04的时候觉得那种带有记忆的小实验好神奇啊,总想着自己什么时候也能写出一个来,可以自己实在是懒的看24C04的程序啊,什么通讯协议,页,扇区,地址
,想想还是算了吧,我记得我曾经静心好好看了看那个程序,可惜还是没有看懂,不能理解程序的思路,于是乎就放弃了。
等会
,扯了这么多,喝点水去
书归正传,分享一个STC89C52RC EEPROM的程序,
写之前要先擦除呦
- #include <reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- int show[]={0xff,0x00,0xff,0x00,
- 0x81,0x42,0x24,0x18,
- 0x24,0x42,0x81,0xff,
- 0x80,0x40,0x20,0x10,
- 0x08,0x04,0x02,0x01,
- 0x02,0x04,0x08,0x10,
- 0x20,0x40,0x80};
- delay(uint n)
- {
- uint x,y;
- for(x=n;x>0;x--)
- for(y=120;y>0;y--);
- }
- sfr isp_wdt=0xe1;
- sfr isp_data=0xe2;
- sfr isp_addrh=0xe3;
- sfr isp_addrl=0xe4;
- sfr isp_cmd=0xe5;
- sfr isp_trig=0xe6;
- sfr isp_contr=0xe7;
- //EEPROM扇区擦除程序
- void stc89cxx_eeprom_erase(uchar t_addr)
- {
- isp_addrh=t_addr;//
- isp_addrl=0;
- EA=0;
- isp_contr=0x81;
- isp_cmd=3;
- isp_trig=0x46;
- isp_trig=0xb9;
- _nop_();
- _nop_();
- isp_contr=0;
- isp_cmd=0;
- isp_trig=0;
- isp_addrh=0;
- isp_addrl=0;
- EA=1;
- }
- //EEPROM字节写程序
- void stc89cxx_eeprom_char_write(uchar w_addr_h,uchar w_addr_l,uchar w_data)
- {
- isp_data=w_data;
- isp_addrh=w_addr_h;
- isp_addrl=w_addr_l;
- EA=0;
- isp_contr=0x81;
- isp_cmd=2;
- isp_trig=0x46;
- isp_trig=0xb9;
- _nop_();
- _nop_();
- isp_contr=0;
- isp_cmd=0;
- isp_trig=0;
- isp_addrh=0;
- isp_addrl=0;
- EA=1;
- }
- //EEPROM字节度程序
- stc89cxx_eepeom_char_read(uchar r_addr_h,uchar r_addr_l)
- {
- uchar r_isp_data;
- isp_addrh=r_addr_h;
- isp_addrl=r_addr_l;
- EA=0;
- isp_contr=0x81;
- isp_cmd=1;
- isp_trig=0x46;
- isp_trig=0xb9;
- _nop_();
- _nop_();
- isp_contr=0;
- isp_cmd=0;
- isp_trig=0;
- isp_addrh=0;
- isp_addrl=0;
- EA=1;
- r_isp_data=isp_data;
- return(r_isp_data);
- }
- init_rs232()
- {
- SCON=0X50;
- PCON=0X00;
- TH1=0XF3;
- TL1=0XF3;
- TMOD=0X20;
- TR1=1;
- }
- main()
- {
- uint i;
- init_rs232();
- i=stc89cxx_eepeom_char_read(0x20,0x00);
- delay(100);
- stc89cxx_eeprom_erase(0x20);
- while(1)
- {
- for(;i<27;i++)
- {
-
- stc89cxx_eeprom_char_write(0x20,0x00,i);
- SBUF=i;
- delay(100);
- P0=show[i];
- delay(800);
- }
- if(i==27)
- i=0;
- }
-
- }