新手上路
- 积分
- 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);
}
}
}
|
|