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

📄 max504.c

📁 MAX504 DA 转换,10位,程序简单,易于使用
💻 C
字号:
/*test tempreture and humidity use  LTM8901*/
/*Date 2003.1.2  VER1.0 */
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define schar signed char
#define uint  unsigned int
#define sint  signed  int

#define DSA      XBYTE[0x800a]
#define DSB      XBYTE[0x800b]
#define DSC      XBYTE[0x800c]
#define DSD      XBYTE[0x800d]
#define CHOUR    XBYTE[0x8000+0x04]
#define CMINUTE  XBYTE[0x8000+0x02]
#define CSECOND  XBYTE[0x8000+0x00]

#define DA273    XBYTE[0xa000]
#define DISP273  XBYTE[0xb000]
#define CTRL273  XBYTE[0xc000]
#define KEY373   XBYTE[0xd000]

uint delayl,delay,flashflag,intflag;
sbit PSW_5=PSW^5;
uchar i,j,k;
uchar point,delays;
bdata uchar a,b,sendata,serialdata;
uint ad16data,tensiontest,testuse,testmax,testmin;     /*0~65535*/

sint da16data,da16new,daset1;                /*-32768~32767*/
bdata uchar adword0,adword,ad8data,da8data; 
sbit ad0bit=ad8data^0; sbit adw7bit=adword^7;sbit da7bit=da8data^7;

sbit a_0=a^0;sbit a_7=a^7;
sbit xcs=P1^0 ;sbit xso=P1^1 ;sbit xsck=P1^2;sbit xsi=P1^3;
sbit adck=P3^5; sbit addi=P1^6; sbit addo=P1^5; sbit adcs=P1^4;
sbit P3_1=P3^1;
sbit PC_MC=P1^7;
sbit RTCON=P3^4; /* receive=0;  send=1 */
uchar tempbyte;

uint tempadd;
uchar adddelayl;

sbit sendbit_0=sendata^0;
uchar dispa;
uchar t_hour,t_minute,t_second;
uchar dispbit,disptime,dispcount;

uchar keyvalue;     /*receive key data*/
uchar funkeystatus; /*fun key data*/
uchar keyflag;     /*key flag*/
uchar new,comerror;

sint tvalue,hvalue,tvaluenew;
float tvalueexact;/*exact 0.1 c*/
uchar idata receivedata[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                             0x00,0x00,0x00,0x00,0x00,0x00};
uchar idata receive[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                         0x00,0x00,0x00,0x00,0x00,0x00};

uchar disbuf1[14]={0x01,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                   0x00,0x00,0x00,0x00};  /*old display*/

uchar code disptab[25]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x0b,
                        0x7f,0x0e,0xff,0x80,0xe3,0x44,0x41,0x23,0x11,0x10,
                        0xc3,0x00,0x03,0x2a,0xbc};
/*88H-"0",ebH-"1",4cH-"2",49H-"3",2bH-"4",19H-"5",18H-"6",cbH-"7",08H-"8"*/
/*0bH-"9",7fH-"-",0eH-"P",ffH-" ",2a-"H",bc-"L"  because add not-gat  no-logic */
/*g f a b dp c d e*/
void rst_wdog(void);
void outbyt(void);
void inbyt(void);
void rdsr_cmd(void);
void wren_cmd(void);
void wip_p(void);
void wrsr_cmd(void);
void wreep(uchar value);
void rdeep(void);

void da(void);
void tlc2543(void);
void ad0(void);

void datatowd(void);
void sendchar(void);
void main()
{  EA=0;
   rdsr_cmd();
   if((a&0x30)!=0) wrsr_cmd();
   rst_wdog();
   DSB=0x82;
   DSA=0xA0;
   DSA=0x20;
   DSB=0x06;
   dispcount=0; intflag=0;  CTRL273=0xff;   
   IP=0x01;        /*00000001--INT0 LEVEL high*/
   IE=0x00;        /*ALL INT DISABLE*/
   TCON=0x01;      /*IT0=1 INT0 FOLLOW EDGE*/
   SCON=0x70;  PCON=0x00;    TMOD=0x20; TH1=0xE8;TL1=0xE8;
   TR1=1;
   EX0=1;         /*ENABLE INT0 INTRRUPT*/
   ES=0;  /*close serial int*/
   RTCON=0;       /*FOR 75176 RECEVICE */
   sendchar();
   rst_wdog();
  while(1)
  {/* daset1=510;*/

    dispa=0xff;
    dispa=dispa&0xdf;
    DA273=dispa;                  
    da16data=1023;
    dispa=dispa&0xfe;
    DA273=dispa;
    da();
    dispa=dispa|0x01; 
    DA273=dispa;
  
    dispa=0xff;
    dispa=dispa&0xdf;
    DA273=dispa;                   
    da16data=0;
    dispa=dispa&0xfd;  
    DA273=dispa;
    da();
    dispa=dispa|0x02;  
    DA273=dispa; 
  
    dispa=0xff;
    dispa=dispa&0xdf;
    DA273=dispa;                   
    da16data=1023;
    dispa=dispa&0xfb;  
    DA273=dispa;
    da();
    dispa=dispa|0x04;  
    DA273=dispa; 


    dispa=0xff;
    dispa=dispa&0xdf;
    DA273=dispa;                   
    da16data=0;
    dispa=dispa&0xf7;  
    DA273=dispa;
    da();
    dispa=dispa|0x08;  
    DA273=dispa; 


    dispa=0xff;
    dispa=dispa&0xdf;
    DA273=dispa;                   
    da16data=1023;
    dispa=dispa&0xef;  
    DA273=dispa;
    da();
    dispa=dispa|0x10;  
    DA273=dispa; 
   }
}
void sendchar(void)
 { dispa=0xff;
   dispa=dispa&0xfd;
   DISP273=dispa;
   for(dispbit=0;dispbit<14;dispbit++)
     {sendata=disptab[disbuf1[dispbit]];
      for(disptime=0;disptime<8;disptime++)
       {dispa=dispa&0xfb;
        DISP273=dispa;
        if((sendata&0x01)==0x01)
         { dispa=dispa|0x01;
           DISP273=dispa;
         }
        else
          { dispa=dispa&0xfe;
            DISP273=dispa;
          }
         dispa=dispa|0x04;
         DISP273=dispa;
       sendata=sendata>>1;
      }
     }
     dispa=dispa|0x02;
     DISP273=dispa;
 }
void datatowd(void)
{ disbuf1[12]=dispcount+1;
  disbuf1[13]=10;
    if((receive[dispcount*3+2]&0x08)==0)   /*tempreture>=0*/
     {tvaluenew=(sint)((receive[dispcount*3+2]&0x07)*256+receive[dispcount*3+1]);
      tvalueexact=(float)(tvaluenew*0.625);
      tvaluenew=(sint)(tvalueexact);
      if(tvaluenew>1250) tvaluenew=1250;
      tvalue=tvaluenew;
     }
   else       /*tempreture<0*/
      {tvaluenew=(sint)(-1*((8-(receive[dispcount*3+2]&0x07))*256-receive[dispcount*3+1]));
       tvalueexact=(float)(tvaluenew*0.625);
       tvaluenew=(sint)(tvalueexact);
       if(tvaluenew<=-550) tvaluenew=-550;          /*if <-55 display =-55*/
       tvalue=tvaluenew;
      }
   if(tvalue>=0)
    {disbuf1[8]=(uchar)(tvalue/1000);
     disbuf1[9]=(uchar)((tvalue-disbuf1[8]*1000)/100);
     disbuf1[10]=(uchar)((tvalue-disbuf1[8]*1000-disbuf1[9]*100)/10);
     disbuf1[11]=(uchar)(tvalue-disbuf1[8]*1000-disbuf1[9]*100-disbuf1[10]*10);
     if(disbuf1[8]==0) disbuf1[8]=12;  /*test DISplay " "*/
     if(disbuf1[9]==0) {if(disbuf1[8]==12) disbuf1[9]=12;}
    }
   else    /*tvalue<0*/
    {tvalue=-1*tvalue;
     disbuf1[9]=(uchar)(tvalue/100);
     disbuf1[10]=(uchar)((tvalue-disbuf1[9]*100)/10);
     disbuf1[11]=(uchar)(tvalue-disbuf1[9]*100-disbuf1[10]*10);
     if(disbuf1[9]==0)       /*test display "-"*/
        {disbuf1[8]=12; disbuf1[9]=10;}
     else
         disbuf1[8]=10;
     }
   disbuf1[10]=disbuf1[10]+13;  /*add "."*/

   hvalue=receive[dispcount*3]*5;
   disbuf1[4]=(uchar)(hvalue/1000);
   disbuf1[5]=(uchar)((hvalue-disbuf1[4]*1000)/100);
   disbuf1[6]=(uchar)((hvalue-disbuf1[4]*1000-disbuf1[5]*100)/10);
   disbuf1[7]=(uchar)(hvalue-disbuf1[4]*1000-disbuf1[5]*100-disbuf1[6]*10);
   if(disbuf1[4]==0) disbuf1[4]=12;
   if(disbuf1[5]==0) {if(disbuf1[4]==12) disbuf1[5]=12;}
   disbuf1[6]=disbuf1[6]+13;    

   if((DSA&0x80)==0)
     { t_hour=CHOUR;
       t_minute=CMINUTE;
       t_second=CSECOND;
     }
   disbuf1[0]=(uchar)(t_hour/10);
   disbuf1[1]=(uchar)(t_hour-disbuf1[0]*10);
   disbuf1[2]=(uchar)(t_minute/10);
   disbuf1[3]=(uchar)(t_minute-disbuf1[2]*10);
}


void rst_wdog(void)
{xcs=0;
 PSW_5=0;PSW_5=0;
 xcs=1;
}
void outbyt(void)
{for(i=0;i<8;i++)
  {xsck=0;
   PSW_5=0;
   xsi=a_7;
   a=a<<1;
   PSW_5=0;
   xsck=1;
   PSW_5=0;
  }
 xsi=0;
}
void inbyt(void)
{for(i=0;i<8;i++)
  {xsck=1;
   PSW_5=0;
   xsck=0;
   PSW_5=0;
   a_0=xso;
   PSW_5=a_7;
   a=a<<1;
  }
 a=a>>1;
 a_7=PSW_5;
}
void rdsr_cmd(void)
{xsck=0;
 PSW_5=0;
 xcs=0;
 a=0x05;
 PSW_5=0;
 outbyt();
 PSW_5=0;
 inbyt();
 PSW_5=0;
 xsck=0;
 xcs=1;
}
void wren_cmd(void)
{xsck=0;
 PSW_5=0;
 PSW_5=0;
 xcs=0;
 PSW_5=0;
 a=0x06;
 PSW_5=0;
 outbyt();
 xsck=0;
 xcs=1;
}
void wip_p(void)
{for(i=0;i<0xef;i++)
   {rdsr_cmd();
   if(a_0==0) i=0xef;
   }
}
void wrsr_cmd(void)
{wren_cmd();
 xsck=0;
 xcs=0;
 a=0x01;
 outbyt();
 a=0x00;
 outbyt();
 xsck=0;
 xcs=1;
 wip_p();
}
void rdeep(void)
 { xcs=1;     /*cs to high*/
   PSW_5=0;      /*for delay 1us*/
   PSW_5=0;      /*for delay 1us*/
   xsck=0;    /*BRING SCK LOW */
   xcs=0;    /*BRING /CS LOW */
   a=0x03;    /*READ INSTRUCTION "00000011"*/
   outbyt();  /*SEND READ INSTRUCTION AND MSB OF ADDRESS*/
   a=b;       /*read address*/
   outbyt();  /*SEND 8 LSBS OF ADDRESS */
   inbyt();   /*READ 1ST DATA BYTE*/
   b=a;       /*SAVE READ TO B*/
   xsck=0;    /*BRING SCK LOW*/
   xcs=1;    /*BRING /CS HIGH*/
 }
void wreep(uchar value)
{PSW_5=0; /*NOP*/
 xcs=1;  /*cs*/
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 wren_cmd();
 PSW_5=0; /*NOP*/
 xsck=0;  /*sck*/
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 xcs=0;  /*cs*/
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 a=0x02;
 outbyt();
 a=b;
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 outbyt();
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 a=value;
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 outbyt();
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 xsck=0;  /*sck*/
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 xcs=1;  /*cs*/
 PSW_5=0; /*NOP*/
 PSW_5=0; /*NOP*/
 wip_p();
}
void ad0(void)
{ testmin=4096;  testmax=0;
  adword0=0x00;
  adck=0; /*ck to low*/
  adcs=1; /* cs to high*/
  tlc2543();
  adword0=0x00;
  tlc2543();
  if(testmin>ad16data) testmin=ad16data;
  if(testmax<ad16data) testmax=ad16data;
  tensiontest=ad16data;
  adword0=0x00 ; /*12 bit control word*/
  tlc2543();
  if(testmin>ad16data) testmin=ad16data;
  if(testmax<ad16data) testmax=ad16data;
  tensiontest=tensiontest+ad16data;
  adword0=0x00 ; /*12 bit control word*/
  tlc2543();
  if(testmin>ad16data) testmin=ad16data;
  if(testmax<ad16data) testmax=ad16data;
  tensiontest=tensiontest+ad16data;
  adword0=0x00 ; /*12 bit control word*/
  tlc2543();
  if(testmin>ad16data) testmin=ad16data;
  if(testmax<ad16data) testmax=ad16data;
  tensiontest=tensiontest+ad16data;
  adword0=0x00 ; 
  tlc2543();
  if(testmin>ad16data) testmin=ad16data;
  if(testmax<ad16data) testmax=ad16data;
  tensiontest=tensiontest+ad16data;
  tensiontest=tensiontest-testmin-testmax;
  tensiontest=(uint)(tensiontest/3);
}



void tlc2543(void)
{ adword=adword0; 
  adcs=0;   /*cs*/
  for(j=0;j<7;j++)
      {ad0bit=addo;        /*do*/
       ad8data=ad8data<<1;
       addi=adw7bit;       /*di*/
       adword=adword<<1;
       adck=1;             /*ck high*/
       adck=0;             /*ck low */
      }
  ad0bit=addo;          /*do*/
  addi=adw7bit;
  adck=1;
  adck=0;
  ad16data=(uint)ad8data;
  ad16data=ad16data<<4;    /*get high 8 bit*/
  adword=0x00;
  ad8data=0x00;  /*clear 0*/
  for(j=0;j<3;j++)
      {ad0bit=addo;        /*do*/
       ad8data=ad8data<<1;
       addi=adw7bit;       /*di*/
       adword=adword<<1;
       adck=1;             /*ck high*/
       adck=0;             /*ck low */
      }
  ad0bit=addo;          /*do*/
  addi=adw7bit;
  adck=1;    /*ck*/
  adck=0;
  adcs=1; /*cs to high*/
  ad16data=ad16data|(uint)ad8data;  /*get 12 bit*/
  /*need delay 10 us for A/D conversion,for(delays=0;delays<2;delays++){;}  delay 10us*/
}




void da(void)           /*D/A CHANGE */
{da16new=da16data;
 da16new=da16new<<2;      /*left mov 2 bit */
 da8data=(uchar)(da16new>>8);
 for(i=0;i<8;i++)
   {if(da7bit==0)       /* dain=da7bit; */
     {dispa=dispa&0xbf;
      DA273=dispa;
     }
    else
     {dispa=dispa|0x40;
      DA273=dispa;
     }
    PSW_5=0;             /*NOP*/
    dispa=dispa|0x20;
    DA273=dispa;        /* dack=1; SET SCLK high*/
    PSW_5=0;             /*NOP*/
    PSW_5=0;             /*NOP*/
    dispa=dispa&0xdf;
    DA273=dispa;        /* dack=0;SET SCLK LOW*/ 
    da8data=da8data<<1;
   }
 da8data=(uchar)(da16new&0x00ff);
 for(i=0;i<8;i++)
   {if(da7bit==0)       /* dain=da7bit; */
     {dispa=dispa&0xbf;
      DA273=dispa;
     }
    else
     {dispa=dispa|0x40;
      DA273=dispa;
     }
    PSW_5=0;             /*NOP*/
    dispa=dispa|0x20;
    DA273=dispa;        /* dack=1; SET SCLK high*/
    PSW_5=0;             /*NOP*/
    PSW_5=0;             /*NOP*/
    dispa=dispa&0xdf;
    DA273=dispa;        /* dack=0; SET SCLK low*/
    da8data=da8data<<1;
   }
}
/*void control(void)
{if(autoset<2047)  da16data=(sint)(autoset>>1);
 else da16data=1023;
}*/

⌨️ 快捷键说明

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