打印

功率因数测量单片机程序问题

[复制链接]
2062|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Drake|  楼主 | 2017-6-9 21:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
Drake|  楼主 | 2017-6-9 21:14 | 只看该作者
#include<reg51.h>
   #include <stdio.h>
   #include <math.h>
   #include <intrins.h>
   sbit  SCL=P0^3;     //移位
   sbit  RCL1=P0^1;    //RCL1,RCL2位锁存
   sbit  RCL2=P0^2;   
   sbit  SDATA=P0^0;   //数据位
unsigned char code        led1[ ]={0xc0,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x38,0x39};      //0~9,r,l,c
unsigned char code led2[ ]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,
0xb8,0xb9};      //
   unsigned char   a1,a2,a3,a4,a5;                   //a1~a5
   unsigned char   Data_595;                    
   unsigned int    n_LED,yy;               
   unsigned int    count_zheng,zheng;        
   unsigned int    count_yu,yu;                    
   float                      shijiancha=0;
   float                      xiangjiao,gonglvyinshu;
   bit                              data test_begin=0;
   bit                          bit_v1=0;
   bit                          bit_v2=0;
   #define k00  0x8000
   #define k01  0x4000
   #define k02  0x2000
   #define k03  0x1000
   #define k10  0x0800
   #define k11  0x0400
   #define k12  0x0200
   #define k13  0x0100
   #define k20  0x0080
   #define k21  0x0040
   #define k22  0x0020
   #define k23  0x0010
  void timecha( )
{     
                yu=TL1;
                count_zheng=zheng;
                count_yu=yu;
            shijiancha=(count_zheng*200+(count_yu-56))*12/11.0592;
}
void xiangweicha( )
{
         if(shijiancha<=5000)
           {                  
                 if(shijiancha==0)
                                  a5=10;    //阻性
                 else
                                  a5=11;    //感性
                xiangjiao=shijiancha*18/1000;
                        xiangjiao=(xiangjiao/180)*3.1415926;
                        if (xiangjiao<=0.04)                       
                        gonglvyinshu=1;
                        else                               
                                  gonglvyinshu=cos(xiangjiao);
                                   }
         else
          {   
                          if ((shijiancha>15000)&&(shijiancha<=20000))
                        {
                                       a5=12;              //容性     
                       xiangjiao=(20000-shijiancha)*18/1000;
                                xiangjiao=(xiangjiao/180)*3.1415926;
                                if (xiangjiao<=0.04)
                                 {
                                        gonglvyinshu=1;
                                 }
                                else
                                 {
                                            gonglvyinshu=cos(xiangjiao);
                                 }
                                        }
            }
                  gonglvyinshu=gonglvyinshu*1000;
}
void part( )       
{
         unsigned int zhongjian;
         zhongjian=gonglvyinshu;
                 if(zhongjian<1000)
         {
          a1=0;
          a2=zhongjian/100;
          a3=(zhongjian/10)%10;
          a4=zhongjian%10;
          }
         if(zhongjian==1000)
          {
          a1=1;
          a2=0;
          a3=0;
          a4=0;
      a5=10;
          }
      }
void Dtat_Out(unsigned int n_LED,unsigned char Data_595)  
{  
  unsigned char y;
  RCL2=1;                // 输出锁存时钟
  RCL1=1;
  RCL2=0;                  //段码清零
  for(y=0;y<8;y++)                               
  {
        SCL=0; //        数据输入时钟
                SDATA=0;
                SCL=1;
  }
  RCL2=1;
  RCL1=0;                 //发送位选信号
  for(y=0;y<16;y++)
  {
        SCL=0;
        if((n_LED&0x0001)==0x0001) { SDATA=1; }
        if((n_LED&0x0001)!=0x0001) { SDATA=0; }
        n_LED>>=1;
        SCL=1;
  }
  RCL1=1;
  RCL2=0;                    //发送段选
  for(y=0;y<8;y++)
  {
    SCL=0;
        if((Data_595&0x80)==0x80) { SDATA=1; }
        if((Data_595&0x80)!=0x80) { SDATA=0; }
        Data_595<<=1;
        SCL=1;
  }
  RCL2=1;
  for(yy=0;yy<500;yy++);  //延时

}
void xianshi()
{
           Dtat_Out(k10,led1[a5]);    //r,l,c;
           Dtat_Out(k20,led1[a4]);   
           Dtat_Out(k21,led1[a3]);
           Dtat_Out(k22,led1[a2]);
           Dtat_Out(k23,led2[a1]);
}
void exint0( ) interrupt 0
{
        bit_v1=1;
}
void exint1( ) interrupt 2
{
        bit_v2=1;
}

void int_t1( ) interrupt 3
{
        zheng++;
}
void        initial( )
{
    TH1=56;
    TL1=56;
    TMOD=0X20; // 8位自动重装
    ET1=1;    // 允许T1中断
        IT0=0;
        IT1=0;
        EX0=1;
        EX1=1;
    EA=1;     //CPU开中断
}                         
  void main(void)
{  
                   initial( );
    while(1)
                   {        
         if (bit_v1&&!test_begin)
                 {       
                           TR1=1;                //允许T1开始计数
                       test_begin=1;
                     }   
             if(test_begin&&bit_v2)
               {
                                TR1=0;// T1停止级数
                                 timecha( );   
                        xiangweicha( );
                        part( );
                        xianshi();
                                 initial( );
                    test_begin=0;
                                 zheng=0;   
               yu=0;
           }     
             }
}

使用特权

评论回复
板凳
Drake|  楼主 | 2017-6-9 21:14 | 只看该作者
求指导

使用特权

评论回复
地板
yddjz| | 2017-6-10 00:40 | 只看该作者
来学习

使用特权

评论回复
5
elec921| | 2017-6-12 11:27 | 只看该作者
功率因数不单单是相位的关系

使用特权

评论回复
6
Drake|  楼主 | 2017-6-12 16:10 | 只看该作者
elec921 发表于 2017-6-12 11:27
功率因数不单单是相位的关系

交流电路中,电压与电流之间的相位差 φ的余弦就是功率因数,在数值上,功率因数是有功功率和视在功率的比值。

使用特权

评论回复
7
Drake|  楼主 | 2017-6-12 21:26 | 只看该作者
数码管显示乱码,不知为何,求赐教

#include<reg51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit W=P2^7;
sbit D=P2^6;
sbit D1=P1^0;
sbit D2=P1^1;
sbit D3=P1^2;
uchar code table1[]=//数码管显示字符
{0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef};
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar i,b,c1,d1,e1;
uchar tt;
uint tx;
int  tl,th;
void delay(int);//延时函数
void output(float);//输出功率因数函数
void main()
{
float f,number;
double ty;
TMOD=0x01;
TH0=255;
TL0=255;
EX1=1;// Int1 中断
IT1=1;

ET0=0;//打开定时器0
TR0=0;
TF0=0;
EX0=1;
IT0=1;

EA=1;//int0中断
D1=1;
D3=1;
while(1)
{
  if(tt==1)//如果定时器未溢出,计算时间
  {
tx=th*256+tl;
ty=tx*0.01;//微妙换成毫秒应该*0.001的 但是数码管就第一个一直闪0 疑问,*0.01是可以出现正常数字的
  }
D1=1;
D3=1;
f=50;
f=(1/f)*1000;//输入电压和电流频率转换为周期                                                                         //gg
number=(2*3.1415926*ty)/f;                                                                                                 
number=cos(number);//求出功率因数
output(number);//输出功率因数
}
}
void timer2() interrupt 2
{
D1=0;
TH0=255;
TL0=255;
th=TH0;
tl=TL0;
tt=1;
}
void timer1() interrupt 1//T0定时器
{

D2=0;
TH0=255;
TL0=255;
tt=0;
}


void timer0() interrupt 0//INT0中断求间隔时间
{


th=th-TH0;
tl=tl-TL0;
ET0=0;
TR0=0;
tt=1;
D3=0;
}//我总觉得是这上面有问题

void output(float num)//输出函数
{
float a=num,c,d,e;//定义浮点型变量
W=1;//开启数码管位选择器
P0=0xfe;
W=0;
D=1;//分别在数码管上显示功率因数的每个位数
b=a/1;
for(i=0;i<10;i++)//通过相除与i比较,相同的将个位数从数组中选择表达出来
{
  if(b==i)
  {
   P0=table1;
   delay(200);
  }
}
D=0;
//以下小数点后三位数显示同理,先乘以10在减去原来的个位数,除以一分别显示
W=1;
P0=0xfd;
W=0;
D=1;
c=a-b;
c=c*10;
c1=c/1;
for(i=0;i<10;i++)
{
  if(c1==i)
  {
   P0=table;
   delay(200);
  }
}
D=0;
W=1;
P0=0xfb;
W=0;
D=1;
d=c-c1;
d=d*10;
d1=d/1;
for(i=0;i<10;i++)
{
  if(d1==i)
  {
   P0=table;
   delay(200);
  }
}
D=0;
W=1;
P0=0xf7;
W=0;

  D=1;
e=d-d1;
e=e*10;
e1=e/1;
for(i=0;i<10;i++)
{
  if(e1==i)
  {P0=table;
   delay(200);}
}
D=0;
}
void delay(uint detime)//延时函数
{
uint x,y;
for(x=detime;x>0;x--)
  for(y=detime;y>0;y--);
}

使用特权

评论回复
8
dirtwillfly| | 2017-6-13 14:40 | 只看该作者
Drake 发表于 2017-6-12 21:26
数码管显示乱码,不知为何,求赐教

#include

单独调试数码管部分的代码,调试没问题了再和其他代码一块调试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:One for all,all for one.

13

主题

226

帖子

1

粉丝