www.pudn.com > 2543.rar > 2543.C


/*10.1*/ 
#pragma  small 
#include   
#include   
#include   
#include   
#define   uchar  unsigned char 
#define   uint   unsigned int 
data      uchar  count; 
uint grain,ii; 
 
/*-------2543-------*/ 
sbit      ad43_cs=P1^5; 
sbit      clk43=P1^2; 
sbit      din43=P1^3; 
sbit      dout43=P1^4; 
/*-------2543-------*/ 
 
sbit clk=P2^1;  /*1;*/ 
sbit din=P2^0; 
sbit load=P2^2; 
//sbit dout=P2^0; 
sbit keyre=P2^4; 
sbit led1=P2^5; 
sbit led2=P2^6; 
sbit led3=P2^7; 
sbit led4=P0^7; //p2.4连单独键        p0.3--6  四个连续键 
/*--------------*///5045 
sbit x25_cs=P1^0; 
sbit x25_clk=P3^4; // 5045  6pin 
sbit x25_din=P3^5;   //5045   5pin    //5045 3pin 接vcc  ,4pin 接 gnd  ,7pin 接 reset ,8pin 接 vcc 
sbit x25_dout=P3^3;  //5045   2pin 
/*--------------*/ 
bdata     uchar ab; 
sbit      abit0=ab^0;  sbit abit1=ab^1;  sbit abit2=ab^2;  sbit abit3=ab^3; 
sbit      abit4=ab^4;  sbit abit5=ab^5;  sbit abit6=ab^6;  sbit abit7=ab^7; 
/*----------------------------------------------------------------------*/ 
 
/*void rst_wdog(void) 
{ 
x25_cs=0; 
x25_cs=1; 
} */ 
/*--------------*/ 
void delay(uchar n) 
{ 
data uchar i,j,k; 
for(i=0;i>=4; 
ad43_cs=1; 
//rst_wdog(); 
return u.i; 
} 
/*--------------------------------------------------------*/ 
/*--------------------------------------------------------*/ 
 
        /* 
        outbyt: 
        Sends byte to EEPROM 
        This routine shifts out a byte, starting with the MSB to the EEPROM 
        */ 
//************************************************************************************** 
void outbyt(uchar ib) 
{ 
uchar i; 
ab=ib; 
for(i=0;i<8;i++){ 
        x25_clk=0; 
        x25_din=abit7; 
        ab<<=1; 
        x25_clk=1; 
        } 
x25_din=0; 
} 
 
/* 
inbyt: 
        Receives byte from EEPROM 
        This routine receives a byte MSB first, from the EEPROM 
        Output: received byte 
        */ 
uchar inbyt(void) 
{ 
uchar i; 
x25_dout=1; 
for(i=0;i<8;i++){ 
        x25_clk=1; 
        x25_clk=0; 
        ab<<=1; 
        abit0=x25_dout; 
        } 
return ab; 
 } 
 /* 
byte read: 
Single byte read 
This routine sends the command to read asingle byte from the EEPROM 
memory array 
output : read byte 
*/ 
 
 
uchar byte_read(uint loc) 
{ 
uchar ch; 
union{ 
	uchar ch[2]; 
	uint  i; 
	}u; 
u.i=loc; 
x25_clk=0;x25_cs=0;u.ch[0]=((u.ch[0]&0x01)<<3)|0x03; 
outbyt(u.ch[0]);  /* out read command*/ 
outbyt(u.ch[1]); 
ch=inbyt(); 
x25_clk=0; 
x25_cs=1; 
return ch; 
} 
/* 
	read N bytes from EEPROM 
	*/ 
void read_Nbyte(uchar *str, uint loc,uchar n) 
{ 
uchar i,*p; 
union{ 
	uchar ch[2]; 
	uint  i; 
	}u; 
u.i=loc; 
x25_clk=0;x25_cs=0;u.ch[0]=((u.ch[0]&0x01)<<3)|0x03; 
outbyt(u.ch[0]);  /* out read command*/ 
outbyt(u.ch[1]); 
p=str; 
for(i=0;i=0) 
 { 
  grain=grain-1; 
  //digitally_dis(grain,1); 
   thou=grain/1000; 
  hun= (grain-thou*1000 )/100; 
  ten = (grain-thou*1000- hun* 100)/10; 
  entries= grain-thou*1000- hun* 100-ten*10; 
 
    //6号管 开始显示 
  dis_7219(0x01,thou);    //千位 
  for(tune=0;tune<0xff;tune++){} 
  dis_7219(0x05,hun);   //百位 
  for(tune=0;tune<0xff;tune++){} 
  dis_7219(0x07,ten);   //十位 
  for(tune=0;tune<0xff;tune++){} 
  dis_7219(0x03,entries); 
  for(tune=0;tune<0xff;tune++){} 
  EA=1; 
 } 
 if (grain==0) 
 { 
  count=1; 
 // digitally_dis(10,1); 
 } 
 delay(1); 
} 
/*-----------------------------------------------------------*/ 
void tra_buff(char da) //~~传送数据 
{ 
 bit cf; 
 ACC=da; 
 cf=P; 
 //取校验位 偶校验 
 //abit7=P;  7位数据 
 // cf=~cf; 
 ab=da; 
 abit7=cf; 
 SBUF=ab; 
 //rst_wdog(); 
} 
/*----------------------------------------------------------------------*/ 
/*----------------------------------------------------------------------*/ 
 
 
/*----------------------------------------------------------------------*/ 
/*----------------------------------------------------------------------*/ 
 
/*----------------------------------------------------------------------*/ 
/*-----------------------------------------------------------------------*/ 
void main(void) 
{ 
 
data  uchar  i,addr,channel,j,addrw,key,addrd; 
idata  uchar zzj; 
idata int xx[30],wght ,wghtj; 
long int t; 
bit set,al,read,alarm,flag; 
data union{ 
	uchar ch[2]; 
	uint i; 
	}u; 
zj: 
    while(1){ 
  P1=0; 
  delay(5); 
  P1=1; 
  delay(5);} 
  dis_set(); 
   grain=0x0a; 
   ii=grain;  //记住设定值                //reset  grain initial num 
   dis_7219(0x01,0x00); //initial 1000 grain 
   dis_7219(0x05,0x00); 
   dis_7219(0x07,0x01); 
   dis_7219(0x03,0x00); 
   dis_7219(0x04,0x82); 
   delay(20); 
                //reset 
zzj=0;     //求平均 计数器 
addrd=3;      // 待显示地址 计数器 
addr=2;          //5045内地址 
flag=0;         //系统运行标志 
EA=1; 
EX0=1; 
 
TMOD=0X20; 
SCON=0x50; 
TH1=0xf3; 
SBUF=0; 
TR1=1; 
 
al=1;//+、-控制使能 
channel=0;  //P1&0xf8;/*turn off output*/ 
SP=0xef; 
set=0;   //set  read 转换控制标志 
//wrsr_cmd(0); //1.4s reset  key=5; 
while(1)  //主程序 
{ 
  key=keyscan(); 
 // rst_wdog(); 
  switch(key){ 
 
  case 0: 
 
    // delay(1);    //red light 
    // dis_7219(0x04,0x80);   //green light 
     if ( flag==1){ 
          for(i=0;i<30;i++) 
          { 
           xx[i]=ad_2543(channel); 
          } 
        for(i=0;i<30;i++)            //处理数据  排序 
          { 
            for(j = 0; j < 30- i; j++) 
            { 
             if (xx[j]>xx[j+1]) 
               { 
                  t = xx[j]; 
                  xx[j] = xx[j + 1]; 
                   xx[j+1] = t; 
                } 
            } 
          } 
      t=0; 
      for (i=0;i<30;i++) 
         { 
         t=t+xx[i]; 
         } 
 
      wght=t/30;//1g ->0.44 无物体时wght=44 
      if (wght<50)wght=50; 
 
      wght=wght-50; 
      t=wght/0.44; 
 
      zzj=zzj+1;   //5个t取平均 
      xx[zzj]=t; 
      if (zzj==5) 
        { 
        //zzj=0;////////////实验附值  实验后改之  否则键盘不好使 
        flag=0; //停止采样 
        t=0; 
        for(i=1;i<5;i++) 
        t=t+xx[i]; 
        for(i=0;i<5;i++) 
        xx[i]=0; 
        t=t/4; 
       if (t<0)t=0; 
        digitally_dis(t,6); 
        u.i=t; //存第一组数据 
        addr=addr+1; 
        wrsr_cmd(0); 
        byte_write(addr,u.ch[0]); 
        addr=addr+1; 
        byte_write(addr,u.ch[1]); 
        addrw=addr; 
       } 
      } 
 //报警报警报警报警报警报警报警报警报警报警报警报警报警报警报警报警报警报警报警报警报警报警 
        for(i=0;i<10;i++) 
          { 
           xx[i]=ad_2543(channel); 
          } 
 
          for(i=0;i<10;i++)            //处理数据 
          { 
            for(j = 0; j < 10- i; j++) 
              { 
                 if (xx[j]>xx[j+1]) 
                   { 
                    t = xx[j]; 
                    xx[j]  = xx[j + 1]; 
                    xx[j+1] = t; 
                   } 
              } 
          } 
         t=0; 
         for (i=3;i<8;i++) 
           { 
            t=t+xx[i]; 
           } 
 
        wght=t/5;//1g ->0.44 无物体时wght=44 
        wght=wght-50; 
        t=wght/0.44; 
        if(t>3000) 
           alarm=1; //报警条件报警条件报警条件报警条件报警条件报警条件报警条件报警条件报警条件 
        if (alarm==1) 
            for (j=0;j<2;j++) 
                { 
                  dis_7219(0x04,0x02);    //red light 
                  delay(2); 
                  t=0; 
                  dis_7219(0x04,0x80);   //green light 
                  delay(2); 
                } 
   break; 
 
  case 1:  //读读读读读读读读读读读读读读读读读读读读读读读读读读读读读读读读读读读读读读 
   led1=1; 
   led2=0; 
   led3=0; 
   led4=0; 
   set=~set; 
   al=1;    //使能+-键 
   if(set) 
    { 
    dis_7219(0x04,0x00);    //red light 
    addrd=5; 
    u.ch[0]=byte_read(addr-1); 
    u.ch[1]=byte_read(addr); 
    t=u.i; 
    digitally_dis( t,1); 
    delay(5) ;   //防止两次读键盘   抖动 
     } 
    if (!set) 
     { 
     if (count==1) 
      { 
       count=0;//2次计数开始标志 
       //grain=0x0a; 
      } 
      dis_7219(0x04,0x02);    //red light 
      grain=ii; 
      digitally_dis(ii,1); 
      delay(5) ; 
      EA=1; 
     } 
 
  break; 
 
  case 2: 
  if (al==1) 
  { 
   led1=0; 
   led2=1; 
   led3=0; 
   led4=0; 
     if(set==1) 
     { 
        addrd=addrd-1; 
 
       if( addrd==0) 
          { 
           addrd=5; 
          } 
       switch(addrd) 
            { 
               case 1: wrsr_cmd(0); 
                u.ch[0]=byte_read(9); 
                u.ch[1]=byte_read(10);   break;//no key 
               case 2: wrsr_cmd(0); 
                u.ch[0]=byte_read(7); 
                u.ch[1]=byte_read(8); break; 
               case 3: wrsr_cmd(0); 
                u.ch[0]=byte_read(5); 
                u.ch[1]=byte_read(6); break; 
               case 4: wrsr_cmd(0); 
                u.ch[0]=byte_read(3); 
                u.ch[1]=byte_read(4); break; 
               case 5: wrsr_cmd(0); 
                u.ch[0]=byte_read(1); 
                u.ch[1]=byte_read(2); break; 
               default:break; 
            } 
            t=u.i; 
            delay(5) ; 
            digitally_dis(0x00,1); 
            digitally_dis(t,1); 
      } 
     if(set==0) 
     { 
 
        grain=grain-1; 
        ii=grain; 
         if (ii<=0) 
        { 
          ii=0x0a; 
        } 
 
        digitally_dis( ii,1); 
        delay(5) ; 
        EA=1; 
     } 
   } 
  break; 
 
 
 
  case 3: 
  if (al==1) 
  { 
   led1=0; 
   led2=0; 
   led3=1; 
   led4=0; 
    if (set==1) 
        {      ///地址+/地址+/地址+/地址+/地址+/地址+/地址+/地址+/地址+/地址+/地址+ 
        addrd=addrd+1; 
 
       if( addrd==6) 
         { 
          addrd=1; 
         } 
        switch(addrd) 
         { 
          case 1: wrsr_cmd(0); 
                  u.ch[0]=byte_read(9); 
                  u.ch[1]=byte_read(10);   break;//no key 
          case 2: wrsr_cmd(0); 
                  u.ch[0]=byte_read(7); 
                  u.ch[1]=byte_read(8); break; 
          case 3: wrsr_cmd(0); 
                  u.ch[0]=byte_read(5); 
                  u.ch[1]=byte_read(6); break; 
          case 4: wrsr_cmd(0); 
                  u.ch[0]=byte_read(3); 
                  u.ch[1]=byte_read(4); break; 
          case 5: wrsr_cmd(0); 
                  u.ch[0]=byte_read(1); 
                  u.ch[1]=byte_read(2); break; 
          default:break; 
         } 
 
     t=u.i; 
     delay(5) ; 
     digitally_dis(0x00,1); 
     digitally_dis(t,1); 
    } 
 
     if(set==0) 
      { 
      grain=grain+1; 
      ii=grain; 
      digitally_dis(ii,1); 
      delay(5) ; 
     } 
  } 
 break; 
 //运行//运行//运行//运行//运行//运行//运行//运行//运行//运行//运行//运行//运行//运行//运行//运行//运行//运行 
 
 case 4: 
   al=0; 
   EA=0;//防止程序进中断 
   led1=0; 
   led2=0; 
   led3=0; 
   led4=1; 
     read=0; 
     //set=1; 
     alarm=0; 
     dis_7219(0x04,0x80); 
     digitally_dis(0x00,1); 
     flag=1; 
     zzj=0; 
     if(addr>10)addr=0; 
   break; 
   case 5: 
     //while(1);     wave 对5045 的reset 没反应 
     delay(20); 
     key=keyscan(); 
     if( key==5) 
     goto zj;//reset 
     read_Nbyte(xx,1,10); 
     for(i=10;i>=1;i--) 
     { 
      tra_buff(xx[i-1]); 
 
     } 
   break; 
   default: 
   break; 
  } 
 } 
}