资讯详情

24C04扩展存储器C和汇编程序

程序功能:统计单片机的开机次数。 #include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit sda=P1^1; sbit scl=P1^0; uchar temp=0; uchar data_h,data_l; uchar state; const uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delayic(uint i) { uchar j; while(i--) { for(j=0;j<120;j++); } } void delaym(uchar t) { uchar i; for(i=0;i<t;i++); } void Start_I2c() { sda=1; _nop_(); scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); sda=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); scl=0; _nop_(); _nop_(); } void Stop_I2c() { sda=0; _nop_(); scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); sda=1; _nop_(); _nop_(); _nop_(); _nop_(); } void cack(void) { sda=0; _nop_(); _nop_(); _nop_(); scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); scl=0; _nop_(); _nop_(); } void mnack(void) { sda=1; _nop_(); _nop_(); _nop_(); scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); scl=0; sda=0; _nop_(); _nop_(); } void wrbyt(uchar date) { uchar i,j; j=0x80; for(i=0;i<8;i++) { if((date&j)==0) { sda=0; scl=1; delaym(1); scl=0; } else { sda=1; scl=1; delaym(1); scl=0; sda=0; } j=j>>1; } } uchar rdbyt(void) { uchar a,c; scl=0; delaym(1); sda=1; delaym(1); for(c=0;c<8;c++) { scl=1; delaym(1); a=(a<<1)|sda; scl=0; delaym(1); } return a; } void read_data() { Start_I2c(); wrbyt(0xa0); cack(); wrbyt(1); cack(); Start_I2c(); wrbyt(0xa1); cack(); temp=rdbyt(); mnack(); Stop_I2c(); delayic(50); } void write_data() { if(temp<=10) { state=temp; state++; Start_I2c(); wrbyt(0xa0); cack(); wrbyt(1); cack(); Stop_I2c(); delayic(50); } else { temp=0; state=temp; Start_I2c(); wrbyt(0xa0); cack(); wrbyt(1); cack(); wrbyt(state); cack(); Stop_I2c(); delayic(50); } } void dispaly(uchar count) { uchar num; num=count; if(num>=5) { P2=0x00; delayic(400); } data_l=num%10; data_h=num/10; P2=0x01; P0=tab[data_h]; delayic(150); P2=0x02; P0=tab[data_l]; delayic(150); } void main() { read_data(); write_data(); while(1) { dispaly(temp); } } 汇编程序: ;24c02的开机 ,系统复位一次 加1 SDA24 EQU P1.1 SCLK24 EQU P1.0 ORG 0000H AJMP MAIN ORG 0030H MAIN: CLR P3.7 ;打开写保护 MOV D ,#TAB MOV A,#00H ;读地址 LCALL RD24 CJNE A,#10, TT: JNC TT1 AJMP TT2 TT1: MOV A,#00 TT2: MOV 30H,A MOVC A,@A+ TR SETB P2.0 ;开数码管 MOV P0,A ;送显示 MOV A,30H INC A MOV B,A MOV A,#00H LCALL WT24 AJMP $ TAB: 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H RD24: PUSH ACC ;读24C02子程序。 SETB SDA24 CLR SCLK24 CALL ART24 MOV A,#0A0H CALL SHIFT8 CALL ACK POP ACC CALL SHIFT8 CALL ACK CALL START24 MOV A,#0A1H CALL SHIFT8 CALL ACK SETB SDA24 MOV R7,#8 CLR A SETB SDA24 RD000: RL A SETB SCLK24 MOV C,SDA24 MOV ACC.0,C CLR SCLK24 DJNZ R7,RD000 RET ;------------------------------- ;写入24C02程序: WT24: PUSH ACC SETB SDA24 CLR SCLK24 CALL START24 MOV A,#0A0H CALL SHIFT8 CALL ACK POP ACC CALL SHIFT8 CALL ACK MOV A,B CALL SHIFT8 CALL ACK CALL STOP CALL DELAY2 RET ; ------------------------------- ;开始条件 START24:CLR SDA24 SETB SDA24 SETB SCLK24 CLR SDA24 CLR SCLK24 RET ;停止条件 STOP: CLR SDA24 SETB SCLK24 SETB SDA24 RET ;应答信号 ACK: SETB SCLK24 CLR SCLK24 RET ;读、写数据 SHIFT8: MOV R7,#8 SH01: RLC A MOV SDA24,C SETB SCLK24 CLR SCLK24 DJNZ R7,SH01 RET DELAY2: NOP NOP NOP NOP RET END -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台