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

📄 niuju1.c

📁 基于S51单片机的C源码 对学习S51单片机的同学很有帮助 包含了实验室的和多模块程序
💻 C
📖 第 1 页 / 共 3 页
字号:



/*2005.1.15 交流采样 
2004.7.4
在山东发现电压量程系数个位输入不进,原来是在sub_set()中原来有5,6的约束,将其去掉

2004.6.20:
1分钟定时清屏
当转速为50转/分以上时 存储分时
从子屏幕返回时清屏幕
设定键进入时间加长
时间清零改为right key+set key==chk key
查看三相电压改为up key
时间存储单元为:
                time_ptr--0x20--0x2f,  in EEPROM  x25045
                minute----0x21--0x2f
                hour -----0x31--0x3f
time_ptr=byte_read(0x20);
time_ptr++
time_ptr&=0x0f;
byte_write(0x20,time_ptr)
byte_write(time_ptr,minute)
byte_write(time_ptr|0x10,hour)

功率 P=1VA=0.101972KgF.m/s=0.9993256.N.m/s
机械功率 P=w.M
         w=n.PI/30(弧度/秒)  //
         M==扭矩(牛顿。米 )
所以:
      M=(30.P)/PI/n
      其中 P为(瓦) n(转/分)
主显示屏:
         扭矩 10.0 KN.m
         300r/min 10.0 KW
         380V     40.0A
         hh:mm:ss

screen :
1--gnd  2--+5V   3-- 亮度  4---RS P0.0  5--R/W P0.2  6--E  P0.1
x25645:
1--CS P1.4  2--DOUT  P1.5   5--DIN P1.7   6--CLK  P1.6


按键: P1.1  P1.2 P1.3 P0.4(从上到下)
按键-显示-存储的结构设计:
         屏为4行,每行8个汉字(或16个字母数字)
         键为3*3=9个(或2*2=4个)分别为 up down left right ok set check 等
         静态画面:
                      大标题在第一行
                    名称一号 1234  V
                    名称二号 5678  I
                     up down pup ret
         动态画面: 含光标位置
                             〈〈〈〈
                             〈〈〈〈
                    〈 〈   〈   〈
         存储格式:
                   DDDD   DDDD  D  D  B1 B2 共12个字节
                   char str[12]

   动态数据:
             D D D D     D D D D  FUNC  CURSER  B  B  共12个字节



pin:    1--GND  2--+5V  3--NC   4--RS    5--R/W  6--E
        7~14==D0~D7
        15--PSB 16--NC    17--/rst    18--NC
        19--A   20--K (19,20可能是背光)
  1、 initial()在运行前对液晶显示屏初始化

  2、 instruct(uchar x)  将x作为命令送给液晶显示屏
               x==0x01   清屏幕 约1.6ms
               x==0x02   地址和光标归零 HOME
                  0x06   光标右移、地址增加方式
                  0x09   闪烁
                  0x0a   显示光标
                  0x0c   显示内容
                  0x0f   内容、光标、闪烁全显示

 3、  write_abyte(uchar x)
            3.1   显示字母数字1--9a--z
                  地址自动增1
                  可显示四行,分别为1 3 2 4行
            3.2   显示汉字
                  调用两次,如下:

                  p=&"汉";
                  hanzi=*p;   //两个字节
                  ch=hanzi>>8; cl=hanzi;  ch为高字节 cl为低字节
                  write_abyte(ch);
                  write_abyte(cl);

/*
*/
#pragma LARGE
#include <absacc.h>
#include <reg52.h>
#include <string.h>

#define uchar unsigned char
#define uint unsigned int
#define KEYBORD P1  //P1.1--P1.3 P0.4
#define data1   P1
#define clear   0x01  //清屏幕,约1.6ms
#define home    0x02   //光标回零(左上角)/
#define f_set   0x30  //并行、基本指令
#define dis_on  0x0f  //打开显示,光标,闪烁功能
#define in_mode 0x06  //输入方式,地址增1,光标右移
#define panel_num 1
sbit key4=P0^4;
/*-------------screen---------------------*/
sbit P_RS=P0^7;
sbit P_RW=P0^6;
sbit P_E= P0^5;
/*-------------2543----------------------*/
sbit      ad43_cs=P0^3;
sbit      clk43=P0^0;
sbit      din43=P0^1;
sbit      dout43=P0^2;
/*-------------25045----------------------*/
//1--CS P1.4  2--DOUT  P1.5   5--DIN P1.7   6--CLK  P1.6

sbit x25_cs=P1^4;
sbit x25_WP=0xb0^5;
sbit clk=P1^6;  /*1;*/
sbit din=P1^7;
sbit dout25=P1^5;

/*---------------------------------------*/

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;
sbit flag=P1^3;
/*********************************************************/
/*
	12Mhz   1us/time
	T1==100us
	T0==50ms interrupt
	*/
//idata uchar string[50];
data unsigned char T_key,ms_timing,second,second2,minute,minuter,second3;
idata uchar time_delta,hour,old_hour,old_minute,min,n_sub_set,*ptr;
//idata uint ptr,NUM;
idata uchar str1[4];
idata uchar str2[10];
idata uchar chint;  //通信
//data uchar time,time1,tune,time2,tz1,tz2;
data uchar n_filt[6],n_v,time_n;   //,n_value;
data uint viad[5],v380,max2;     //VI[5],v380,torque;
idata uint a_filt[5][5];
idata uchar k_current,k_torque,k2_va,k2_vb,k2_vc,k2_current,k2_power;
bit flag_232C,T_50ms;
bit flag_COM,flag_n;
/*----------------------------------------------------------------------*/
data  uchar key_sfr;
bdata  uchar key_sfr0;
       sbit key_chk             =key_sfr0^0;
       sbit key_stage           =key_sfr0^1;
       sbit key_ok              =key_sfr0^2;
       sbit key_left            =key_sfr0^3;
       sbit key_up              =key_sfr0^4;
       sbit key_right           =key_sfr0^5;
       sbit key_set             =key_sfr0^6;
       sbit key_down            =key_sfr0^7;
bit    key_run;
bit flag_key,flag_cursor;

idata unsigned  char second_k,speed;
//
/*----------------------------------------------------*/
idata struct  v_data{
   uint current;
   uint power;
   uint V[3];
   uint torque;
   uint n_value;
   uchar T[3];
   };
idata struct v_data DA;
/*----------------------------------------------------*/
code struct panel{
      uchar name1[20];
      uchar name2[20];
      };
code struct  panel set_hz[10]={
                  "设置间隔时间(秒\0",
                  "请输入\0\0",

                  "设置间隔时间(秒\0",
                  "请输入\0\0",

                  "电流互感器变比\0",
                  "请输入\0\0",

                  "力矩效率\0\0",
                  "请输入\0\0",

                  "二级设定\0\0",
                  "请输入\0\0",

                  "电压A 相比值\0\0",
                  "请输入\0\0",

                  "电压B 相比值\0\0",
                  "请输入\0\0",

                  "电压C 相比值\0\0",
                  "请输入\0\0",

                  "电流比值\0",
                  "请输入\0",

                  "有功功率比值\0",
                  "请输入\0"
                  };
/*---------------------------------------------------------*/


/*----------------------------------------*/
int AD_2543(uchar n)
{
data uchar i,j;
data union{
	uchar ch[2];   /*0高八位,1低八位*/
	uint i;
	}u;
clk43=0;
ad43_cs=0;
ab=n<<4;
for(j=0;j<10;j++);
for(i=0;i<8;i++){
	din43=abit7;
	ab<<=1;
        abit0=dout43;  /*dout;  dout;*/
	clk43=1;
	for(j=0;j<10;j++);
	clk43=0;
	for(j=0;j<10;j++);
	}
u.ch[0]=ab;
ab=0;
for(i=0;i<4;i++){
	ab<<=1;
        abit0=dout43;
	clk43=1;
	for(j=0;j<10;j++);
	clk43=0;
        for(j=0;j<10;j++);
	}
u.ch[1]=ab<<4;
u.i>>=4;
ad43_cs=1;
return u.i;
}
/*---------------------------------------------------------*/
/*----------------------------------------*/
void VI_collect(uchar j1)
{
data uchar  i,j;
//data uint  a[7];
//data  long int sum1;
data uint sum1,min,max1;
j=j1;
//for(j=0;j<5;j++){
    sum1=0;
    max1=0;
    min=4095;
    AD_2543(j);
    for(i=0;i<5;i++){  /*滑差处理数据*/
         if(j==0){
          a_filt[j][i]=max2;
           }
          else{
           a_filt[j][i]=AD_2543(j);
           }
          if(i==0){max1=a_filt[j][i];min=a_filt[j][i];}
          if(a_filt[j][i]>max1){max1=a_filt[j][i];}
          if(a_filt[j][i]<min){min=a_filt[j][i];}
           sum1=sum1+a_filt[j][i];
          }
       viad[j]=(sum1-max1-min)/3;
   max2=0;
}
/*----------------------------------------*/
void VI_handle(uchar j1)
{
data uchar j;
data uint dw,dp;
data unsigned long  vi;
code uchar v_tbl[5]={0,2,1,0,0};
j=j1;
if((j>=1)&&(j<4)){
//for(i=2;i<5;i++){
    vi=viad[j];
    //vi[i]=vi[i]*57/880;
    vi=vi*57/88;   //380.0V
    /*
    if(j==2)vi=vi*k_va/100;
    if(j==3)vi=vi*k_vb/100;
    if(j==4)vi=vi*k_vc/100;
    */
    DA.V[v_tbl[j]]=vi;
    if(j==3){
            vi=(DA.V[0]+DA.V[1]+DA.V[2]); vi=vi*564/1000; v380=vi;
            }
    }
if(j==0){
    vi=viad[0];
    //vi=vi*tz1/819;        //电流
    vi=vi*k_current*95/10000;
    DA.current=vi;   //*75/10;
    }
if(j==4){
  vi=viad[4];
  //vi=vi*8/10*75/10;  //tz1;       //有功功率 tz1=7.5
  vi=vi*829/1000;       //?805/1000;    //12.3KW
  vi=vi*k_current;   ///100
  dp=vi; //有功功率(瓦)
  vi=vi/10;
  dw=vi%10; if(dw>=5) vi=(vi+10);
  vi=vi/10;
  DA.power=vi; //有功功率(千瓦) //if(DA.power>999)DA.power=999;
//        M=(30.P)/PI/n
//      其中 P为(瓦) n(转/分)
  //vi=9.55*VI[1]/n_value;
  if(DA.n_value==0)DA.n_value=1;
  //DA.n_value=300;
  vi=(long int)955*dp/DA.n_value;   ///100;  //12.3N.m
  DA.torque=vi/100;  //100;
    vi=DA.torque;
    vi=vi*k_torque/100;
    DA.torque=vi;

  if(DA.torque>9000)DA.torque=9000;
  }
}
/*----------------------------------------*/
/*----------------------------------------*/
void VI_range(uchar j1)
{
data uchar j;
data unsigned long  vi;
code uchar v_tbl[5]={0,0,1,0,2};
j=j1;
switch(j){
   case 3:
    vi=DA.V[0];
    DA.V[0]=vi*k2_va/100;   //380.0V
    break;
   case 2:
    vi=DA.V[1];
    DA.V[1]=vi*k2_vb/100;   //380.0V
    break;
   case 4:
    vi=DA.V[2];
    DA.V[2]=vi*k2_vc/100;   //380.0V
    break;
   case 0:
    vi=DA.current;
    vi=vi*k2_current/100;
    DA.current=vi;
    break;
   case 1:
    vi=DA.power;
    vi=vi*k2_power/100;
    DA.power=vi;
    break;
   default:
    break;
   }
}
/*----------------------------------------*/

void Collect_Handle(uchar j1)
{
data uchar j;
j=j1;
VI_collect(j);            /*采集电压电流量*/
VI_handle(j);             /*处理数据*/
VI_range(j);              //量化系数(2级设定)
}
/*----------------------------------------*/

/*----------------------------------------------------*/
void from_sfr_sfr0(void)
{
static data uchar old_key=0xff,count=0;
if(key_sfr==old_key){
	count++;
	if(count>15){
		speed=1; count=15;
		}
	if(second_k>2){
		speed=0; count=0;
		}
	second_k=0;
	}else{
	old_key=key_sfr;
	speed=0;
	count=0;
	second_k=0;
	}
key_sfr0=0;
switch(key_sfr){
	case 0:
		key_set=1;   /*cut=1;*/
                key_ok=1;
		break;

	case 1:
		key_up=1;  /*start=1;*/
		break;

	case 2:
		key_down=1;
		break;

	case 3:
		key_right=1;   /*up=1;*/
		break;

	case 4:
		key_chk=1;   /*up=1;*/
		break;

	case 5:
		key_stage=1;   /*stage key=1; 232C communication */
		break;

	case 6:
		key_ok=1;   /* store flag  data as reference dot */
		break;

	default:
		break;
	}
}
/*----------------------------------------------------*/
/*
getkey0:
	uchar getkey0(uchar i,uchar j)
	i---line
	j---columue
	key_value=i+3*j  i=0,1,2 j=0,1,2,3  key value=0--11  no key down when return 0xff
	*/
/*----------------------------------------------------*/
uchar getkey0(void)
{
data uchar ch,i;
//code uchar line[4]={0xef,0xdf,0xbf};   /*0xf7,0xfb,0xfd,0xfe};*/
code uchar colu[8]={0x0e,0x07,0x0b,0x0d,0x0c,0x0a,0x06,0xff};
//code uchar change[10]={0,3,6,1,4,7,2,5,8,0xff};
//PC8155=0;
KEYBORD=0xff; key4=1;        //key4=p0.4

ab=0;ch=0;
ab=KEYBORD&0x0e;
abit0=key4; ch=0;
ch=ab;
//PC8155=0xff;
if(ch==0x0f)return 0xff;
for(i=0;i<7;i++){
  if(ch==colu[i]) return i;
  }
return 0xff;  //=change[ch];
}
/*----------------------------------------------------*/
void rst_wdog(void);

⌨️ 快捷键说明

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