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

📄 niuju1.c

📁 基于S51单片机的C源码 对学习S51单片机的同学很有帮助 包含了实验室的和多模块程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	*p use 10 units
	results in p1 all only 2 data
	*/
void sub_get_parameter(void)
{
data uchar *p1;
p1=str2;
get_buff(p1,1);
time_delta=(*p1&0x0f)*10+(*(p1+1)&0x0f);  //存数的时间间隔
get_buff(p1,2);
k_current=(*p1&0x0f)*10+(*(p1+1)&0x0f);  //电流互感系数75:5
get_buff(p1,3);
k_torque=(*p1&0x0f)*100+(*(p1+1)&0x0f)*10+(*(p1+2)&0x0f);
get_buff(p1,5);
k2_va=(*p1&0x0f)*100+(*(p1+1)&0x0f)*10+(*(p1+2)&0x0f);
get_buff(p1,6);
k2_vb=(*p1&0x0f)*100+(*(p1+1)&0x0f)*10+(*(p1+2)&0x0f);
get_buff(p1,7);
k2_vc=(*p1&0x0f)*100+(*(p1+1)&0x0f)*10+(*(p1+2)&0x0f);
get_buff(p1,8);
k2_current=(*p1&0x0f)*100+(*(p1+1)&0x0f)*10+(*(p1+2)&0x0f);
get_buff(p1,9);
k2_power=(*p1&0x0f)*100+(*(p1+1)&0x0f)*10+(*(p1+2)&0x0f);
}

/*----------------------------------------------------*/
/*---------------------------------------*/
void dis_str(uchar x, uchar y, uchar *str) ;
/*---------------------------------------*/


void   disp_chk1(char *p,uchar n1)
{
static data uchar csor;
data uchar *p1;
data char *p2,n;
//code uchar wei[10]={0,1,2,4,6,7,8,10,0,0};
p2=p; n=n1;
//*(p2+2)=0; *(p2+5)=0; *(p2+8)=0;
csor=*(p2+n);  //str[wei[n]];
if(flag_cursor){
      flag_cursor=0;
      //p1=&str[0];
      *(p2+n)=csor;
      if(*p2&0x80){
             *p2&=0x7f; *p2='-'; //为err=-2--+2而设计
             }
      dis_str(2,8,p2);
      dis_str(4,16," ");
      }else{
      flag_cursor=1;
      p1=p2;   //&str[0];
      *(p1+n)=' ';
      if(*p1&0x80){
             *p1&=0x7f; *p1='-';  //为err=-2--+2而设计
             }
      dis_str(2,8,p1);
      dis_str(4,16," ");
      }
*(p2+n)=csor;  //恢复闪烁位数据
}

/*---------------------------------------------------------*/
void itoa(int x,unsigned char *str);
/*---------------------------------------*/
/*---------------------------------------*/
/*----------------------------------------------------*/
uchar is_left_right_key(uchar n1)
{
data uchar n;
n=n1;
if(key_right)n++;
	else n--;
while(key_sfr!=0xff)getkey();
key_sfr0=0;
return n;
}
/*----------------------------------------------------*/
void is_up_down_key(char *buff,uchar n)
{
data char *p1;
//n=n1;
p1=buff;
if(key_up){
	*(p1+n)+=1;
	if(speed==1) *(p1+n)+=10;
	}else{

	*(p1+n)-=1;
	if(speed==1) *(p1+n)-=10;
	}
while(key_sfr!=0xff)getkey();
key_sfr0=0;
}
/*----------------------------------------------------*/
/*---------------------------------------------------------*/
void   disp_set_static_panel(uchar n1)
{
data uchar n;
n=n1;
//idata uchar str2[6];
//dis_hz_str(1,3,"设定\0"); str2[0]=n+'0'; str2[1]=0; str2[2]=0;
//dis_str(1,10,str2);
dis_str(1,1,"                \0");
dis_hz_str(1,1,set_hz[n].name1);
dis_str(2,1,"          \0");
dis_hz_str(2,1,set_hz[n].name2);
dis_str(2,8,"           \0");
dis_str(4,16," "); //将光标调到右下角
}
/*-----------------------------------------------------------------*/
/*---------------------------------------*/
void  sub_set(uchar n1)   /*n=1---7*/        //?
{
data uint count;
data char edit_buff[16];
data	uchar i,n;
bit bt=0,bl;       // s I M 2 a b c I P
code uchar lth[10]={2,2,2,3,4,3,3,3,3,3}; /*set value lest to 99*/
data unsigned char trap_set=0,trap_set1=0;
        n=n1;
	get_buff(edit_buff,n);
	for(i=lth[n];i<14;i++)edit_buff[i]=0;
        edit_buff[15]=0x55;
	trap_set1=edit_buff[14];
        if(trap_set1>lth[n])trap_set1=0;
	trap_set=trap_set1;   //iptr[trap_set1];
        disp_set_static_panel(n);
        disp_chk1(edit_buff,trap_set);
	key_sfr=0;flag_key=0;

while(trap_set1!=13){
	getkey();
        /*
        count=T_50ms=0;
        while(T_50ms<5){
             if(T_50ms!=count){count=T_50ms; getkey(); }
            }
        T_50ms=0; while(T_50ms<2);
        */
        if(minuter>1)return ;
	if(key_left || key_right){
		bl=key_left;
		trap_set1=is_left_right_key(trap_set1);
		if(trap_set1==0xff)trap_set1=lth[n];
		if(trap_set1>=lth[n])trap_set1=0;
		trap_set=trap_set1;   //iptr[trap_set1];
		}
	 if( key_up | key_down){
	 	bt=1;  /*the data have edited*/ //trap_set=1;
		is_up_down_key(edit_buff,trap_set);
		if((edit_buff[trap_set]&0x7f)>'9')edit_buff[trap_set]='0';
		if(edit_buff[trap_set]<'0')edit_buff[trap_set]='9';
                /*
                if(n==5){
                    if(edit_buff[2]>'1')edit_buff[2]='0';
                    if(edit_buff[2]=='1'){
                          if(edit_buff[3]>'2')edit_buff[3]='0';
                          }
                    if(edit_buff[4]>'3')edit_buff[4]='0';
                    }
                if(n==6){
                    if(edit_buff[0]>'2')edit_buff[0]='0';
                    if(edit_buff[0]=='2'){
                          if(edit_buff[1]>'3')edit_buff[1]='0';
                          }
                    if(edit_buff[2]>'5')edit_buff[2]='0';
                    if(edit_buff[4]>'5')edit_buff[4]='0';
                    }
                  */
		}
	 if(key_ok){
                if((n==3)&&(trap_set1<8)){
                       for(i=8;i<11;i++)edit_buff[i]=0;
                       }
                edit_buff[14]=trap_set1;  //trap_set1 从buff[12]进入
                if(bt) save_buff(edit_buff,n);   //trap_set1,n);
		trap_set1=13;
		}
	  rst_wdog();  //dis_7219(6,n,0);
          count++; if(count>3500)count=0;
          if(count==0){
                 disp_chk1(edit_buff,trap_set);
                 }
	  }
  rst_wdog();
  while(key_sfr!=0xff){getkey();flag_key=0;}
  key_sfr0=key_sfr=0;

  return ;
  }

/*********************************************************/
//void   disp_cut_panel(void);
void   disp_static_panel(void)
{
dis_hz_str(1,1,"扭矩\0");   // 10.0 KN.m
dis_str(1,6,"      N.m\0");
dis_str(2,1,"   r/min      KW\0");
dis_str(3,1,"     V         A\0");
dis_str(4,1,"  :   :   \0");
}
/*----------------------------------------------------*/
/*
chl=1,2,3 select display the LED view window

void display_set_data(int x,uchar n,uchar chl)
{
dis_str(chl,10,set.dat1);
dis_str(chl,10,set.dat1);
} */
void display_run_data(char locx1,char locy1,int x1)
{
data uchar str2[6],i,L,locx,locy;
data int x;
bit flag_neg;
x=x1; locx=locx1; locy=locy1;
//p=str;
 i=1;
if(x<0){flag_neg=1; x=-x;}else flag_neg=0;
if(x>50000)x=50000;
itoa(x,str2);
L=strlen(str2);
switch(L){
   case 1:
        str2[4]=str2[0]; str2[3]='.';str2[2]='0'; str2[1]=' '; str2[0]=' ';
        break;
   case 2:
        str2[4]=str2[1]; str2[3]='.';str2[2]=str2[0]; str2[1]=' '; str2[0]=' ';
        break;
   case 3:
        str2[4]=str2[2]; str2[3]='.';str2[2]=str2[1]; str2[1]=str2[0]; str2[0]=' ';
        break;
   case 4:
        str2[4]=str2[3]; str2[3]='.';
        break;
   }
   if(flag_neg){  //负数处理
       switch(L){
           case 1:
           case 2:
                str2[1]='-';
                break;
           case 3:
                str2[0]='-';
                break;
           case 4:
           case 5:
                for(i=4;i>0;i--)str2[i]=str2[i-1]; str2[0]='-';
                break;
           }
        }
   str2[5]=0;  //字符串结束
   dis_str(locx,locy,"     ");
   dis_str(locx,locy,str2);
}

/*---------------------------------------------------------*/
void   disp_data(void)
{
//display_run_data(1,6,DA.torque);
itoa(DA.torque,str2);
dis_str(1,6,"    ");
dis_str(1,6,str2);

if(DA.n_value>999)DA.n_value=999;
itoa(DA.n_value,str2);
dis_str(2,1,"   ");
dis_str(2,1,str2);
display_run_data(2,10,DA.power);  //power
display_run_data(3,1,v380);
display_run_data(3,11,DA.current); //current
itoa(hour,str2);
dis_str(4,1,"  ");
dis_str(4,1,str2);
itoa(minute,str2);
dis_str(4,5,"  ");
dis_str(4,5,str2);
itoa(second,str2);
dis_str(4,9,"  ");
dis_str(4,9,str2);
DA.T[0]=second;
DA.T[1]=minute;
DA.T[2]=hour;
dis_str(4,16," ");
}
/*----------------------------------------------------*/
/*---------------------------------------------------------*/
void   disp_v_data(void)
{
dis_str(1,1,"Va=\0");
dis_str(2,1,"Vb=\0");
dis_str(3,1,"Vc=\0");
dis_str(4,1,"I=\0");
display_run_data(1,4,DA.V[0]); //current
display_run_data(2,4,DA.V[1]);
display_run_data(3,4,DA.V[2]);
display_run_data(4,4,DA.current);
}

/*---------------------------------------*/
void main(void)
{
data uchar i,ad_j,n_ptr,ch,crect,work,old_second,count_key;  //,*ptr;
data uint xch,max3,xch1;
//bit flag_err24,flag_store_data,flag_err_GPS;
for(xch=0;xch<0x500;xch++){ ch=0; rst_wdog(); }
//for(xch=0;xch<0xfff0;xch++) { i=0; rst_wdog(); }
//getkey();
P0=0xff; P1=0xff; P2=0xff;
i=0;
P_RS=0;
SP=0xef;
initial();
init_t2();
initial_screen();
instruct(0x0c); //关闭
//AD_2543(3);
//xch=AD_2543(3);
/*
strcpy(str2,"扭矩测量系统\0");
dis_hz_str(1,1,str2);
dis_str(4,16," ");
*/
sub_get_parameter();
ch=byte_read(0x20);           //get time_ptr
xch=ch;
minute=byte_read(xch);        //get minute from eeprom
hour=byte_read(xch|0x0010);     //get hour from eeprom
ch=0;
ES=0;
EA=1;
flag_COM=1;
P_RS=0;
work=ms_timing;
instruct(clear);
//sub_set(3);
disp_static_panel();  //
//disp_data();
for(i=0;i<10;i++) str2[i]=0;
EA=1; ET0=1; TR0=1; //flag_store_data=0; flag_err_GPS=0;
count_key=0; //set key time delay
while(1){
   while(work==ms_timing){   //second){
        getkey();
        rst_wdog();
        }
   EA=1; ET0=1; TR0=1;
   work=ms_timing;    //second;
   T_50ms=0;
   while(T_50ms)T_50ms=0;
   AD_2543(0);
   while(!T_50ms){
   max3=AD_2543(0);
   if(max2<max3)max2=max3;
   }
   Collect_Handle(ad_j);
   ad_j++; if(ad_j>=5)ad_j=0;
   if(flag_n){
          flag_n=0;
          n_filt[n_ptr++]=n_v;  //每10秒存储一个数据,共有6个数据n_v是在T0中断时赋值
          if(n_ptr>=6)n_ptr=0; xch1=0;
          for(i=0;i<6;i++)xch1=xch1+n_filt[i];
          if(time_n==1){xch=n_v*6;DA.n_value=xch; }
          else if(time_n==2){xch=n_v*6;DA.n_value=xch; }
          else if(time_n>=6){DA.n_value=xch1; }
          //DA.n_value=xch; //扭矩
          //disp_static_panel();  //
          }
   if(old_second!=second){
          old_second=second;
          disp_data();
          }
   if(old_minute!=minute){
          old_minute=minute;
          count_key=0;
          ch=byte_read(0x20);
          ch&=0x0f;
          xch=ch;
          byte_write(xch,minute);     //write into  20h--2fh
          //定时清屏幕
           instruct(clear);
           disp_static_panel();  //
           disp_data();
          }
   if(old_hour!=hour){
          old_hour=hour;
           ch=byte_read(0x20);
           ch&=0x0f;
           xch=ch;
           byte_write(xch|0x10,hour);  //write into 30--3fh
          }
   if(second3>=time_delta){    //通信
          second3=0;
          TI=1; ch=0; crect=0;
          ptr=&DA;
          for(i=0;i<17;i++){
               while(!TI);
               ch=*ptr++; SBUF=ch; crect+=ch;
               TI=0;
               rst_wdog();
               }
           while(!TI);
           SBUF=crect;  //send correct code
           TI=0;
          }
   ch=0xff;
//   if(flag_COM)ch=receive_GPS();

   getkey();
   if(key_set){
          count_key++;
          count_key&=0x07;
          if(count_key==0x07){
              count_key=0;
              instruct(clear);
              key_sfr0=0;
              while(key_sfr!=0xff){getkey();flag_key=0; rst_wdog();}
              minuter=0;
              for(i=1;i<5;i++){
                 sub_set(i);
                 if(minuter>1)break;
                 }
              get_buff(str2,4);
              if(str2[0]=='1'&&str2[1]=='2'&&str2[2]=='3'&&str2[3]=='4'){
                 for(i=5;i<=9;i++){
                     sub_set(i);
                     if(minuter>1)break;
                     }
                 }
              sub_get_parameter();
              instruct(clear);
              disp_static_panel();  //
              disp_data();
              while(key_sfr!=0xff){getkey();flag_key=0;}
              }
	   key_sfr0=0;
           key_sfr=0x1f;
           rst_wdog();
          }
   if(key_chk){     //chk key==right key + set key    //ok key==up key+ set key
           hour=minute=second=0; count_key=0;
           ch=byte_read(0x20);
           ch++;
           ch&=0x0f;
           xch=ch;
           byte_write(0x20,xch);
           byte_write(xch,minute);     //write into  20h--2fh
           byte_write(xch|0x10,hour);  //write into 30--3fh
           }
   if(key_up){    //查看三相电压和电流
         key_chk=0; while(key_sfr!=0xff){getkey();flag_key=0;}
         count_key=0;
         instruct(clear);
         second2=0;;
         while(second2<5){
            getkey();
            disp_v_data();
            if(key_chk) break;
            key_sfr0=0;
            rst_wdog();
            }
         instruct(clear);
         disp_static_panel();  //
         disp_data();
         while(key_sfr!=0xff){getkey();}
         flag_key=0; key_sfr0=0;
         }
   rst_wdog();
   }
}

⌨️ 快捷键说明

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