标题: 基于51单片机频率测量仪的问题 [打印本页]
作者: Afan的单片机 时间: 2018-7-21 11:45
标题: 基于51单片机频率测量仪的问题
我的思路就是t0计数,t1计时,然后在1602显示,但是误差很大,程序应该出现问题,可是我检查不出来,希望大家能帮我看看!!
作者: Afan的单片机 时间: 2018-7-21 11:46
详细代码:
#include<reg51.h>
#define uchar unsigned char
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^2;
uchar k = 0, f;
uchar count;
uchar tab_freq[]={0,0,0,0,0,0,0}; //频率数组
void delay(int x){ //延时
int i;
for(i=x;i>0;i--);
}
void write_com(char com){ //写指令
P0=com;
RS=0;RW=0;EN=1;
delay(200);
EN=0;
}
void write_dat(char dat){ //写数据
P0=dat;
RS=1;RW=0;EN=1;
delay(200);
EN=0;
}
void lcd_init(){ //初始化
write_com(0x01);
write_com(0x38);
write_com(0x0f);
write_com(0x06);
}
void int_count0() interrupt 1{ //T0计数
k++;
}
void int_time1() interrupt 3{ //T1定时中断函数开始{
TH1=0x4c;
TL1=0x00; //50MS
count++;
if(count>=20)
{
count=0;
TR0=0; //到1秒T0停止计数
TR1=0;
f = k;
k=0; //T1停止定时
}
}
void trans_count() //计算出一秒钟收到的脉冲数量
{
unsigned long int z;
int i;
z = f * 65536 + TH0 * 256 + TL0;
if(z>9999999) //最大量程为999999
{z=9999999;}
for(i = 6; i >= 0; i--)
{
tab_freq[i]=z%10+'0';
z /= 10;
}
}
void main(){
uchar i;
TMOD = 0x15; //T0为计数模式:方式1 T1为定时模式:方式1
TH0 = 0; //T0计数初始值
TL0 = 0;
TR0=1;
TH1 = 0x4c; //T1定时初始值
TL1 = 0x00; //50MS
EA = 1;
ET1 = 1; //允许T1定时中断
ET0 = 1; //允许T0计数中断
lcd_init();
trans_count();
for(i=0;i<7;i++)
{
write_dat(tab_freq[i]); //显示频率值
}
write_dat('H');
write_dat('z'); //显示Hz
delay(2000);
write_com(0x02);
while(1);
}
作者: Afan的单片机 时间: 2018-7-21 15:12
顶一下
作者: zl2168 时间: 2018-7-22 10:35
实例73 测量脉冲频率
先Proteus仿真一下,确认有效
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行,可演示,可观测,程序语句条条有注解。
作者: Afan的单片机 时间: 2018-7-22 11:31
您可以先看看我哪里出问题了吗,谢谢
作者: Afan的单片机 时间: 2018-7-22 21:03
希望大家能帮我看看
作者: Afan的单片机 时间: 2018-7-23 10:25
大家一起来看看,交流一下,获取经验
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |