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; } } }