⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dp51e.c

📁 用汇编编写的PC主机读写24C02外部ROM的程序
💻 C
字号:
#include <reg52.h>
#include<intrins.h>
#include"IIC.h"


#define CSI24WC02  0xa0

#define MAX  20

extern bit ack;

uchar xdata DATA_BUF[MAX];   /*由于寄存器的动态的,不能放在rom区,所以不能声明为code*/
void main(void)
{
  uchar n;
  TMOD=0x20;
  TH1=0xfd;
  TL1=0xfd;
  TR1=1;
  SCON=0x50;
  PCON=0x00;
  ES=1;
  EA=1;
  for(n=0;n<MAX;n++)
  {
     DATA_BUF[n]=0;
  }
  while(1);
}
//将DATA_BUF的数据发送回上位机;发送的数据个数n中
void send_pc(uchar *p,uchar n)
{
  uchar i;
  for(i=0;i<n;i++)
  {
    SBUF=p[i];
	while(TI==0);
	TI=0;
   }
 }
/*接收一字节串口上的数据*/
uchar rcv_data(void)
{
  uchar buf;
  uint  m=500;
  RI=0;
  while(!RI)
  {
    m--;
	if(m==0) 
	{
	  m=500;
	  buf=0x00;
	 
	return buf;
	}
 }
  RI=0;
  buf=SBUF;
  return  buf;
}

/*接收命令出错,返回出错码00H*/
void int_err(void)
{
        DATA_BUF[0]=0x12;
		DATA_BUF[1]=0xa1;
		DATA_BUF[2]=0x022;
		DATA_BUF[3]=0x00;
		DATA_BUF[4]=0xb1;
		send_pc(DATA_BUF,5);
        TI=0;
        RI=0;
}

/*读CSI24WC02的指定单元,并将数据返回给上位机  
;若读CSI24WC02无应答,则返回操作失败帧
*/
bit IRcvStr(uchar sla,uchar suba,uchar no)
{
   uchar i;
    uchar  xrl;           /*异或校验位*/
    Start_I2c();               /*启动总线*/
   SendByte(sla);            /*发送器件地址*/
     if(ack==0)return(0);
   SendByte(suba);            /*发送器件子地址*/
     if(ack==0)return(0);

   Start_I2c();
   SendByte(sla+1);
      if(ack==0)
	  {
	    DATA_BUF[0]=0x12;
		DATA_BUF[1]=0xa1;
		DATA_BUF[2]=2;
		DATA_BUF[3]=0x01;
		DATA_BUF[4]=0xb1;
		send_pc(DATA_BUF,5);
	    return(0);
       }
   DATA_BUF[0]=0x12;
   DATA_BUF[1]=0xa0;
   DATA_BUF[2]=no;   //no=N+1   N位数据位1位奇偶校验位//
   xrl=no^0xb2;
   for(i=3;i<no+2;i++)
    {   
     DATA_BUF[i]=RcvByte();               /*发送数据*/
      Ack_I2c(0);                /*发送就答位*/  
     xrl=xrl^DATA_BUF[i];
    } 
	 DATA_BUF[no+2]=xrl;
    send_pc(DATA_BUF,no+3);
     Ack_I2c(1);                 /*发送非应位*/
 Stop_I2c();                    /*结束总线*/ 
  return(1);
}

/*写CSI24WC02的指定单元
;操作成功则返回操作成功回应帧*/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
   uchar i;

   Start_I2c();               /*启动总线*/
   SendByte(sla);            /*发送器件地址*/
     if(ack==0)return(0);
   SendByte(suba);            /*发送器件子地址*/
     if(ack==0)
	 {
       DATA_BUF[0]=0x12;
	   DATA_BUF[1]=0xa1;
	   DATA_BUF[2]=3;
	   DATA_BUF[3]=suba;
	   DATA_BUF[4]=0x00;
	   DATA_BUF[5]=suba^0xb0;
	   send_pc(DATA_BUF,6);
	 return(0);
      }
	  DATA_BUF[0]=0x12;
	   DATA_BUF[1]=0xa0;
	   DATA_BUF[2]=1;
	   DATA_BUF[3]=0xb3;
       send_pc(DATA_BUF,4);
	   s=s+4;
   for(i=0;i<no-2;i++)
    {   
     SendByte(*s);               /*发送数据???*/
       if(ack==0)return(0);
     s++;
    } 
 Stop_I2c();                 /*结束总线*/ 
  return(1);
}

void ser_int(void) interrupt 4 
{
  uchar  rd;     //接收桢头
  uchar   i;
  uchar  xrl;    //异或参数
  uchar  n;     //参数个数
  uchar  ord;   //命令字参数
  bit  err;    //发送接收正确标志位
  while(TI==0)
  {
    rd=SBUF;
	if(rd!=0x12)  break;
    DATA_BUF[0]=rd;
	xrl=rd;
	rd=rcv_data();     //接收命令字
	if(rd==0x00) break;
    DATA_BUF[1]=rd;    
	rd=rcv_data();    //接收参数个数
    if(rd==0x00) break;
    DATA_BUF[2]=rd;
	n=rd;
	for(i=3;i<n+2;i++)
	{
	   rd=rcv_data();
	   if(rd==0x00)
	   {
	     int_err();
         break;
		 }
	   DATA_BUF[i]=rd;
	 }
	 rd=rcv_data();    //接收参数个数
    if(rd==0x00) break;
    DATA_BUF[n+2]=rd;
	for(i=1;i<n+2;i++)
	{
	  xrl=xrl^DATA_BUF[i];
	 }
	 if(xrl!=DATA_BUF[n+2])  int_err();
     ord=DATA_BUF[1];
	 if(ord==20)
	 {
	   err=IRcvStr(CSI24WC02,DATA_BUF[3],n);
	   if(err==0)  int_err();
	   break;
	   }
	   else if(ord==21)
	   {
	     err=ISendStr(CSI24WC02,DATA_BUF[3],DATA_BUF,n);
		 if(err==0)  int_err();
		 break;
		 }
		 else break;
  }
  TI=0;
  RI=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -