微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大神们看看,这个程序那里有问题,利用两个外部中断测...

大神们看看,这个程序那里有问题,利用两个外部中断测...

时间:10-02 整理:3721RD 点击:
大神们看看,这个程序那里有问题,利用两个外部中断测功率因数
#include <reg51.h>
#include <stdio.h>
#include<math.h>
#define uint unsigned int  
#define uchar unsigned char  
#define PI 3.14
sbit tou1 = P1^7;
sbit tou2 = P1^6;
uint num=0,t2;
float t,t1;
uchar shu1,shu2,shu3,shu4;
uchar code table[]=        {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uint z);//这个是数码管要用的
void display(uchar shu2,uchar shu3,uchar shu4);
void
main()
{
TMOD=0x01;//工作方式1
EA=1;
IT0=1;
IT1=1;//下降沿有效
EX0=1;
EX1=1;
TH1=0x00;
TL1=0x00;
while(1)
{
   display(shu2,shu3,shu4);//数码管显示
   if(t1<0.9)
   {
             tou1 = 0;
                 
   }
}
       
}
/*外部中断1*/
void
exter1() interrupt 2
{
EX0=0;
      TR1 = 0;//打开定时器
          t=255*TH1+TL1;
          
       EX0=1;
}
/*外部中断0*/
void  
exter0() interrupt 0
{
EX1=0;
         
         TH1=0;TL1=0;
   TR1 = 1;//打开定时器  
         EX1=1;
{
        //下面是对时间处理
//读出定时器已经放得值
if(t>=5.0&&t<=10.0)
t=10-t;
else if(t>=10.0&&t<=15.0)
t=t-10;
else if(t>=15.0&&t<=20.0)
t=20.0-t;
t1=(float)t*2*3.14159/20;
t1=cos(t1);
t2=t1*10000;
shu2=t2/1000;
shu3=t2%1000/100;
shu4=t2/10%10;
}
}
void  
display(uchar shu2,uchar shu3,uchar shu4)
{

P2=0xef;//选中第一个数码管
P0=0xbf;
delay(1);

P2=0xdf;//选中第二个数码管
P0=table[shu2];
delay(1);
P2=0xbf;//选中第三个数码管
P0=table[shu3];
delay(1);
P2=0x7f;//选中第四个数码管
P0=table[shu4];
delay(1);
}       

/*延时函数,1ms*/
void  
delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

记不得了,51好久没玩。

中断里居然有大量的运算过程,而且是有浮点数运算的,应该是在中断里先备份数据,在主循环里进行运算。然后是像用51的,时钟频率本就不够快,就应尽量避免浮点数的运算……
像你这用法,估计在中断里运算的时候还没运算完,下一个中断又来了……

中断乃稀缺资源,不能长期占用

小编进中断应该有执行关闭外部中断操作,这样不会使得当前中断被其他中断打断,但是其他中断无法得到执行会不会对功能造成影响?
另外同意楼上几位,一般中段内只执行必要的关键操作,对应的运算还是放在中断外处理。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top