急!单片机频率计c语言程序,3位8段数码管显示,显示范围从0.01~9.99,数据每0.5s~1s更新
如题目所示,单片机为AT89C2051,数码管为共阳极,程序如下,应该如何修改,谢谢!#include"reg51.h"//头文件#defineucharunsigned...
如题目所示,单片机为AT89C2051,数码管为共阳极,程序如下,应该如何修改,谢谢!
#include"
reg51.h" //头文件
#define
uchar unsigned char
#define
uint unsigned int
sbit pulse=P3^2;
uchar
code tv[]={0xfe,0xfd,0xfb};
uchar
code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code b
[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uchar
data led[2];
unsigned
long int data f; //定义长整形全局变量f
int s=0;
void delay(void) //延时函数
{
uint
i;
for(i=0;i<100;i++);
}
ledxianshi() //显示函数,也就是数码管驱动
{
uchar k,i;
led[0]=f/1000; //取个位数(可能不够,可加)
led[1]= f/100%10; //取小数点后一位数
led[2]= f/10%10; //取小数点后两位
k=0;
i=led[k];
P1=b[i];
P3=tv[k];
delay();
for(k=1;k<3;k++)
{
i=led[k];
P1=a[i];
P3=tv[k];
delay();
}
}
void kT1( void ) interrupt 3
{s++;
TF1=0; //溢出清零
TH1=0; //寄存器清零
TL1=0; //寄存器清零
}
void
main()
{ EA=1; //CPU开放中断
ET1=1; //允许T1中断
TMOD=0x10; //使T1工作在定时方式,用方式1
TH1=0; //寄存器清零
TL1=0; //寄存器清零
while(1)
{while(pulse==0); //等待一个低电平
while(pulse==1); //等待一个高电平
TR1=1; //允许T1开始定时
while(pulse==0); //等待一个低电平
while(pulse==1); //等待一个高电平
TR1=0; //关定时定时器T1
f=(TH1<<8)+TL1+s*65536; //把T1定时送入变量f\
S=0;
f=100000000/f; //f=1000000L/f; //周期的倒数是频率
while(1) //死循环
{ledxianshi();}
}
} 展开
#include"
reg51.h" //头文件
#define
uchar unsigned char
#define
uint unsigned int
sbit pulse=P3^2;
uchar
code tv[]={0xfe,0xfd,0xfb};
uchar
code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code b
[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uchar
data led[2];
unsigned
long int data f; //定义长整形全局变量f
int s=0;
void delay(void) //延时函数
{
uint
i;
for(i=0;i<100;i++);
}
ledxianshi() //显示函数,也就是数码管驱动
{
uchar k,i;
led[0]=f/1000; //取个位数(可能不够,可加)
led[1]= f/100%10; //取小数点后一位数
led[2]= f/10%10; //取小数点后两位
k=0;
i=led[k];
P1=b[i];
P3=tv[k];
delay();
for(k=1;k<3;k++)
{
i=led[k];
P1=a[i];
P3=tv[k];
delay();
}
}
void kT1( void ) interrupt 3
{s++;
TF1=0; //溢出清零
TH1=0; //寄存器清零
TL1=0; //寄存器清零
}
void
main()
{ EA=1; //CPU开放中断
ET1=1; //允许T1中断
TMOD=0x10; //使T1工作在定时方式,用方式1
TH1=0; //寄存器清零
TL1=0; //寄存器清零
while(1)
{while(pulse==0); //等待一个低电平
while(pulse==1); //等待一个高电平
TR1=1; //允许T1开始定时
while(pulse==0); //等待一个低电平
while(pulse==1); //等待一个高电平
TR1=0; //关定时定时器T1
f=(TH1<<8)+TL1+s*65536; //把T1定时送入变量f\
S=0;
f=100000000/f; //f=1000000L/f; //周期的倒数是频率
while(1) //死循环
{ledxianshi();}
}
} 展开
3个回答
展开全部
常用51单片机频率计有两种方法,一种方法,定时计脉冲个数,如定时100ms,计数器计值是55,则频率为55x10=550hz,另外一种方法,计单个脉冲的周期,可用外部中断,也可不用外部中断,下降沿到来时开定时器,上升沿或另外一个下降沿到来时关闭定时器,读出定时器的值,若脉冲宽度太宽,定时器可能会溢出, 也可以让定时器中断,定时器计时加上中断溢出次数的时间,就是总时间=周期,显然你用的是第二种方法
程序基本没问题,但你的显示程序应该是包括while(1) {while(pulse==0);.....}
这个大偱环内的,不要另起一个偱环,还是真正的死偱环,跳不出来,结果是复位一次,只能测量一次
这种方法测低频比较准,但也有一个缺点,测低频时,更新很慢,测1HZ脉冲,必须要2秒,1S测量计时,另外几ms处理并显示,剩下的近1S空等
测0.5HZ脉冲,理论上要4秒,所以要求0.5-1S更新一次和测量的频率下限是矛盾的
既然用了中断TF1会自动清0,TF1=0是多余的
还有,你若是液晶屏显示还可以,数码管测低频还存在着刷新问题,长时间的等待,数码管会只亮一个,如果把数码管刷新程序放在等待空闲内的话,测高频时会错过脉冲上升和下降沿,测低频也会,只不过几率小些,所以用数码管的话,也只能用静态显示
或者间断显示也可以,即将显示子程序偱环50-100次(持续1.5-3s),然后再次测量,把while(1) {ledxianshi();}死偱环改成FOR偱环
也可以用第一种方法测,若测试低频的话,就要把定时时间设得很长,测0.1HZ信号,你不定时大于10s,测出来就是0
程序基本没问题,但你的显示程序应该是包括while(1) {while(pulse==0);.....}
这个大偱环内的,不要另起一个偱环,还是真正的死偱环,跳不出来,结果是复位一次,只能测量一次
这种方法测低频比较准,但也有一个缺点,测低频时,更新很慢,测1HZ脉冲,必须要2秒,1S测量计时,另外几ms处理并显示,剩下的近1S空等
测0.5HZ脉冲,理论上要4秒,所以要求0.5-1S更新一次和测量的频率下限是矛盾的
既然用了中断TF1会自动清0,TF1=0是多余的
还有,你若是液晶屏显示还可以,数码管测低频还存在着刷新问题,长时间的等待,数码管会只亮一个,如果把数码管刷新程序放在等待空闲内的话,测高频时会错过脉冲上升和下降沿,测低频也会,只不过几率小些,所以用数码管的话,也只能用静态显示
或者间断显示也可以,即将显示子程序偱环50-100次(持续1.5-3s),然后再次测量,把while(1) {ledxianshi();}死偱环改成FOR偱环
也可以用第一种方法测,若测试低频的话,就要把定时时间设得很长,测0.1HZ信号,你不定时大于10s,测出来就是0
追问
显示程序为什么是包括while(1) {while(pulse==0);.....} 这个大偱环内的?
追答
你在这个大循环里套了一个显示的死循环,那麼外面一层大循环还有什麼意义
程序将是 等待--开启计数器-- 等待--关闭计数器--反复显示,不就是只能测量一次了吗,若要再次测量,必须复位,使程序从头开始重新运行
不加那麼循环吧,数码管很长时间刷新一次,并且一闪而过,根本看不见测量结果,所以我建议你间断显示
void
main()
{
EA=1;
ET1=1;
TMOD=0x10;
TH1=0;
TL1=0; //寄存器清零
while(1)
{while(pulse==0); //等待一个低电平
while(pulse==1); //等待一个高电平
TR1=1; //允许T1开始定时
while(pulse==0); //等待一个低电平
while(pulse==1); //等待一个高电平
TR1=0; //关定时定时器T1
f=(TH1<<8)+TL1+s*65536; //把T1定时送入变量f\
S=0;
f=100000000/f; //f=1000000L/f; //周期的倒数是频率
for(i=0;i<500;i++)//循环显示500次,以总时间2-3秒为好
{ ledxianshi();}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询