新手上路 
 
	- 积分
 - 38
 
        - 金钱
 - 38 
 
       - 注册时间
 - 2016-5-16
 
      - 在线时间
 - 7 小时
 
 
 
 | 
 
下面为我用中断写的一个频率计,实物测试时显示不稳定。因此想采用平均处理,每测试100次取平均值后显示一次,该怎么改 
#include<STC12.h>    
#include<math.h> 
#define uint unsigned int 
#define uchar unsigned char 
uchar m=0; 
uchar u; 
uint i; 
uint x;  
uint c;                
float t0,f; 
uint a[]={70,61,48,48,48,48,72,90}; 
 
sbit RW=P2^6; 
sbit RS=P2^5; 
sbit EN=P2^7; 
/////////////////LCD1602的设置////////////////////////////////// 
void delay(uint s)//延时1MS 
 {  
  uint r,g; 
   for(r=s;r>0;r--) 
     for(g=200;g>0;g--);  
 } 
void write_com(uchar com) // 写指令 
{   
delay(1); 
RS=0; 
RW=0; 
EN=0; 
P0=com; 
delay(1); 
EN=1; 
delay(1); 
EN=0;        
} 
void write_data(uchar date) // 写数据 
{   
  delay(1);; 
RS=1; 
RW=0; 
EN=0; 
P0=date; 
delay(1); 
EN=1; 
delay(1); 
EN=0;       
} 
 void display(unsigned char *p)//显示// 
{ 
  while(*p!='\0') 
{ 
   write_data(*p); 
   p++; 
   delay(1); 
} 
} 
 
void initlcd()//初始化 
 { 
  delay(15); 
write_com(0x38); 
delay(5); 
write_com(0x08);delay(5); 
write_com(0x01);delay(5); 
write_com(0x06);delay(5); 
write_com(0x0c);delay(5); 
 } 
 
 ////////////LCD1602设置/////////////// 
///////////定时器的设置////////////// 
 void CT_init()     //定时计数器初始化 
{        TMOD=0x99; //GATE=1,T0工作在方式1,定时方式 
          TH0=0;    //定时计数器初值清零 
          TL0=0; 
          TR0=1;    //TR0置位,此时定时计数器的启动有INT0引脚电平决定 
          ET0=1;    //开中断 
} 
void ITC0() interrupt 0   //外部中断0服务程序 
{ 
        u=m;//读定时计数器0溢出次数 
        m=0;//溢出次数清零 
        x=TH0*256+TL0; //读定时计数器0当前值 
        TH0=0;  //定时计数器0清零 
        TL0=0; 
} 
void TIME0() interrupt 1  //定时计数器0溢出中断 
{ 
        m++;  //溢出次数加1 
} 
 
void main() 
{ 
   delay(1000); 
   initlcd();  //液晶显示初始化 
          CT_init();//定时计数器初始化 
     EA=1;//开总中断 
     EX0=1;//允许外部中断 
     IT0=1;//设置外部中断方式为下降沿触发 
     P3=0xff;      
 while(1)  
{          
        t0=u*65536+x;//计算脉冲时间宽度 
        f=22100000/(t0*12*2); //计算频率 
                c=f; 
                a[5]=c%10+48; 
                a[4]=(c/10)%10+48; 
                a[3]=(c/100)%10+48; 
                a[2]=(c/1000)%10+48;         
        write_com(0xc0); 
 for(i=0;i<=7;i++) 
{ 
        write_data(a[i]); 
        delay(10); 
} 
} 
}                         
 
 
 |   
 
 
 
 |