找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3089|回复: 3
打印 上一主题 下一主题
收起左侧

单片机测功率因数

[复制链接]
跳转到指定楼层
楼主
ID:64326 发表于 2014-8-7 22:15 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我利用外部中断测单片机功率因数,分别检测上升沿,第一个中断打开时,打开定时器,第二中断触发时,关闭定时器。计算出定时器的时间差,利用余弦求出来,LCD显示就可以了。但是数值显示的根本不对啊,我有分开侧,就相当于只用一个中断,测一路方波的频率,也不对。请大家指导一下
谢谢,下面是我程序
#include<reg51.h>
#include<math.h>
#include"lcd.h"
#define uint unsigned int
#define uchar unsigned char
#define ucharc unsigned char code
int c=0;
uint flag1=0,flag2=0;
long int t;
float g;
bit text1=1,text2=1;
sbit Vin=P3^2;
sbit Iin=P3^3;
uchar ENCHAR_PuZh[16]=" pinlv Factor ";
void Disp(long int a);
void Interconfiguration();
void Timerconfiguration();
void Delay(unsigned int b);
void main()
{
uchar j=0;
LCD1602_Init();
Interconfiguration();
Timerconfiguration();
for(;j<16;j++)
{
  LCD1602_WriteCom(0x80+j);
  LCD1602_WriteData(ENCHAR_PuZh[j]);
}
while(1)
{
//  while(Vin);
//  while(!Vin);
//  ET0=1;//开启定时器中断(设置ET0或ET1)
//  while(Iin);
//  while(!Iin);
//  ET0=0;
//  t=c*65536+TH0*256+TL0;//有问题,不太懂咋么
//     g=cos(t);
//  TR0=0;
//  TH0=0;
//  TL0=0;
//  TR0=1;
//   ;;;;;;;;;;;;;;
//  TR0=0;
  if(flag2==0)
  {
//   t=(1000/(c*65536+TH0*256+TL0));
//   EX1=0;
//   ET1=0;
//   ET0=0;
   TR0=0;
   Disp((c*65536+TH0*256+TL0));
   TH0=0;
   TL0=0;
   c=0;
//   flag1=0;
//   flag2=0;
   Delay(5000);
   TR0=1;
//   ET0=1;
//   EX1=1;
   
  }
  
}
}
void Timerconfiguration()
{
TMOD=0x01;
EA=1;
// TH0=0x3c;
// TL0=0xb0;
TR0=1;//启动定时器0
// ET0=1;//启动定时器0中断
}
void Timer0() interrupt 1
{
// TH0=0x3c;
// TL0=0xb0;
c++;
}
void Interconfiguration()
{
EA=1;
// IT0=1;
// EX0=1;
IT1=1;
EX1=1;
}
void Inter0() interrupt 0
{
// flag1=1;
// ET0=text1;
// text1=~text1;
// flag1=~flag1;
}
void Inter1() interrupt 2
{
ET0=text2;
text2=~text2;
flag2=~flag2;
// flag2=1;
}
void Disp(long int a)
{
//a=TH0*1000+TL0;
LCD1602_WriteCom(0xc0);
LCD1602_WriteData(a/1000000000%10+'0');
LCD1602_WriteData(a/100000000%10+'0');
LCD1602_WriteData(a/10000000%10+'0');
LCD1602_WriteData(a/1000000%10+'0');
LCD1602_WriteData(a/100000%10+'0');
LCD1602_WriteData(a/10000%10+'0');
LCD1602_WriteData(a/1000%10+'0');
LCD1602_WriteData(a/100%10+'0');
LCD1602_WriteData(a/10%10+'0');
LCD1602_WriteData(a%10+'0');
//// LCD1602_WriteData('0');
//// LCD1602_WriteData('.');
// LCD1602_WriteData((a*1000)/100+'0');
// LCD1602_WriteData(((a*1000)%100)/10+'0'); //需要显示的小数
// LCD1602_WriteData((a*1000)%10+'0');
}
//void Inter1() interrupt 2
//{
// Delay(5000);
// if(k2==0)
// c=1;
//}
void Delay(unsigned int b)
{
unsigned char d;
for(;b>0;b--)
{
  for(d=110;d>0;d--);
}
}
大家可以只看中断和主函数里面的,东西,请大家多多批评,谢谢。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

地板
ID:64326 发表于 2014-8-8 14:14 | 只看该作者
是不是我的c 和显示函数的类型定义错了,
回复

使用道具 举报

板凳
ID:64326 发表于 2014-8-8 09:49 | 只看该作者
显示的是周期,只是用的一路中断来进行测试,就是P3^3接收上升沿,接收第一个上升沿打开定时器,当接受到第二个中断时关闭中断,这时候就开始显示,只是显示周期,显示的数值一定都不准确
void Inter1() interrupt 2
{
ET0=text2;
text2=~text2;
flag2=~flag2;
// flag2=1;
}
这个地方时定时器的开,开了之后有一个控制变量,当另一个上升沿到来时,关闭定时器,同时flag2也变换两次,作为标志位惊醒显示。
if(flag2==0)
  {
   TR0=0;
   Disp((c*65536+TH0*256+TL0));
   TH0=0;
   TL0=0;
   c=0;
   Delay(5000);
   TR0=1;
   
  }
就是不知道为什么不能准确的显示,请您帮忙看看,问题出在那里,谢谢。非常感谢
回复

使用道具 举报

沙发
ID:1 发表于 2014-8-8 01:21 来自手机 | 只看该作者
现在显示的什么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表