单片机测量功率因数

2019-03-24 18:39发布

崭新的新人来求教了。我对单片机C语言不是很了解。只学过C语言和单片机技术。
在仿真的时候,不能正确显示LED数字。一直在变化。功率因数输不出去。。。。
求更改、。。



未命名1.jpg
  1. #include
  2. #include
  3. #include
  4. #define   _TH0_TL0_          65536 - 64536//设置T0的初始值为1MS
  5. #define   _TH1_TL1_          65536 - 64536//设置T1的初始值为1MS
  6. #define PI=3.1415927
  7. unsigned char count1=0;
  8. unsigned char count2=0;
  9. unsigned char g4=0;//功率因数第四位
  10. unsigned char g3=0,g2=0,g1=0;//功率因数第一到三位
  11. float d=0 ;//功率因数角度弧度表示
  12. float i;//电压 和电流 之间的相位差, 即β的大小,角度表示?
  13. char code dis1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
  14. char code dis2[2]=(0x40,0x79);//带小数点0、1
  15. sbit p22=P2^2;//位选
  16. sbit p23=P2^3;//位选
  17. sbit p21=P2^1;//位选
  18. sbit p20=P2^0;//位选
  19. // 延时子程序
  20.         void delay(int ms)
  21.         {
  22.             char k;
  23.                  while(ms--)
  24.            {
  25.                     for(k = 0; k < 100; k++);
  26.            }
  27.         }
  28. //数据处理函数
  29.         void count ()
  30.         {        int g=0;
  31.            i=(count1*2*180/(count1+count2));
  32.                 d=i*PI/180;
  33.                 g=cos(d);
  34.                 if(g==1)
  35.                 {
  36.                 g4=0;
  37.                 g3=0;
  38.                 g2=0;
  39.                 g1=1;
  40. }
  41.                 else
  42.                 {
  43.                 g=(cos(d)*1000);
  44.                 g4=g%100%10;
  45.                 g3=g%100/10;
  46.                 g2=g/100;
  47. g1=0;
  48. }
  49.         }
  50. //显示函数
  51.         void led()
  52.         {
  53.                 P2=0xf1;//显示4位
  54.                 P0=dis1[g4];//显示
  55.                 delay(10);//延时
  56.                 P2=0xf2;//显示3位
  57.                 P0=dis1[g3];
  58.                 delay(10);
  59.                 P2=0xf4;
  60.                 P0=dis1[g2];
  61.                 delay(10);
  62.                 P2=0xf8;
  63.                 P0=dis2[g1];
  64.                 delay(10);
  65. }       
  66. //主函数
  67.         void main()
  68.         {
  69.                 TMOD=0X99;//定时器模式1
  70.                 TCON=0xf4;//定时器控制
  71.                 TH0 = _TH0_TL0_ / 256;          //将10进制转化为16进制
  72.                 TL0 = _TH0_TL0_ % 256;
  73.                 TH1 = _TH1_TL1_ / 256;          //将10进制转化为16进制
  74.                 TL1 = _TH1_TL1_ % 256;       
  75.            EX1=1;
  76.            EX0=1;
  77.                 ET1=1;
  78.            ET0=1;
  79.                 EA=1;
  80.                  p22=p23=p21=p20=1;
  81.            P0=0X00;// 显示口
  82.            P2=0Xff;
  83.                 while(1)

  84.                 {
  85.                      count ();//数据处理
  86.                          led();//显示
  87.         }
  88.         }
  89. //T0中断,M个周期的相位差所对应的时间
  90.         void  T0_1ms() interrupt 1//计算连续对m 个周期中的τ之和,定时器0中断
  91.         {
  92.                 TH0 = _TH0_TL0_ / 256;         
  93.                 TL0 = _TH0_TL0_ % 256;
  94.                 count1++;
  95.         }
  96.        
  97. //T1中断,
  98.         void  T1_1ms() interrupt 3//计算连续对m 个周期中的τ2之和,定时器1中断
  99.         {
  100.                 TH0 = _TH0_TL0_ / 256;         
  101.                 TL0 = _TH0_TL0_ % 256;
  102.                 count2++;
  103.         }       
  104. //外中断0NT1,计算周期数
  105.         void  int0() interrupt 0 //外中断EX0
  106.         {
  107.            static unsigned char m=0;//对连续M个周期进行数据处理
  108.            EX0=0;
  109.            m++;
  110.            if(m==20)
  111.            {
  112.                         m=0;
  113.                     EA=0;
  114.                           }                     
  115.           EX0=1;
  116. }
复制代码 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。