原创 频率计

2009-4-9 14:20 4960 7 11 分类: MCU/ 嵌入式

zip简单频率计


用LCD1602显示


/*--------------------------------------------------------------*/
//简单频率计
//单片机: STC89C52RC
//时钟模式: 6T/双倍数
//晶振:  24MHz
//最高频率: 1.9MHz
//最大误差: 1Hz
//由于误差成线性,所以采用软件处理提高精度
//采用74HC393分频后,可以测量最高频率40MHz左右,最大误差为32Hz
//数据选择用74HC151


 


 


/*--------------------------------------------------------------*/
#include <at89x52.h>
#include "LCD1602_8A.H"
sbit Key = P1^3; //按键
sfr  sel = 0x80;


/*--------------------------------------------------------------*/
unsigned char dat[8];  //显示数据
unsigned char i, counter; //循环变量和计数变量
unsigned int  num;   //定时变量
unsigned long x, y;   //计算频率变量
unsigned char k_val;  //按键变量



/*--------------------------------------------------------------*/
//变量初始化
void counter_data_init(void)
{
 counter = 0;
 num = 0;
 for(i = 0; i < 8; i++) dat = 0;
 i = 0;
}



/*--------------------------------------------------------------*/
//延时1.25s 函数定义
void delay1_25s(void)
{
 unsigned char i, j, k;
 for(i = 189; i > 0; i--)
 for(j = 68;  j > 0; j--)
 for(k = 193; k > 0; k--);
}



/*--------------------------------------------------------------*/
//延时5ms 函数定义
void delay5ms(void)
{
    unsigned char i, j;
    for(i = 215; i > 0; i--)
    for(j = 45; j > 0; j--);
}



/*--------------------------------------------------------------*/
//按键处理
void key_pro(void)
{
 if(Key == 0)
 {
  delay5ms();
  if(Key == 0)
  {
   k_val++;
   if(k_val > 5) k_val = 0;
   LCD_printc(15, 1, k_val+48);
  }
  while(Key == 0);
 }
 sel = k_val;
}



/*--------------------------------------------------------------*/
//计数定时器初始化
void ct_mode_init(void)
{
 TMOD = 0x25;    // T0计数,T1定时


 TH0 = 0x00;  TL0 = 0x00;
 TH1 = 0x06;  TL1 = 0x06;
 ET0 = 1;  ET1 = 1;
 EA  = 1;
 TR0 = 1;  TR1 = 1;
}



/*--------------------------------------------------------------*/
//主函数
void main(void)
{
 LCD_init();
 LCD_prints(2, 0, "System is");
 LCD_prints(0, 1, "Initializing...");
 delay1_25s();
 LCD_clr();
 LCD_prints(0,  0, "T:");
 LCD_prints(12, 0, "ns");
 LCD_prints(0,  1, "F:");
 LCD_prints(12, 1, "Hz");


 while(1)
 {
  counter_data_init();
  ct_mode_init();
  delay1_25s();    //延时1.25s,等待计数结束
  x = ((unsigned long)(counter) << 16) + TH0 * 256 + TL0; //计算频率f
  x <<= k_val;
  y = x;      //保存频率f
  
  while(x / 10)    //频率f拆位
  {
   dat = x % 10;
   x /= 10;
   i++;
  }
  dat = x;
  LCD_printd(4, 1, dat, 8); //显示频率f
  
  counter_data_init();  //数据初始化
  if(y == 0);
  else y = 1000000000 / y; //计算周期T
  while(y / 10)    //频率T拆位
  {
   dat = y % 10;
   y /= 10;
   i++;
  }
  dat = y;
  LCD_printd(4, 0, dat, 8); //显示周期T
  key_pro();
 }
}



/*--------------------------------------------------------------*/
//计数器T0中断服务程序
void T0_counter(void) interrupt 1 using 1
{
 counter++;
}



/*--------------------------------------------------------------*/
//定时器T1中断服务程序
void T1_timer(void) interrupt 3 using 3
{
 num++;
 if(num == 15598) {TH1 = 0x05;}  //软件处理
 if(num == 16000) {TR0 = 0; TR1 = 0;}
}

文章评论4条评论)

登录后参与讨论

用户306004 2011-1-31 11:29

哎,怎么基于STM32F103单片机的频率计固件啊,头疼死我了

用户149863 2009-5-9 09:16

O(∩_∩)O~,看器件手册

用户194190 2009-5-6 16:53

,请教你一个问题,74hc393怎么连接?

tengjingshu_112148725 2009-4-9 17:42

学习了,特别是分频处理
相关推荐阅读
用户149863 2010-05-22 22:40
LCD简单菜单显示
LCD简单菜单显示显示器件为图形型LCD12864(主控芯片KS0108)什么都不带!包含以下文件:LCD菜单(测试)LCD菜单(简单)LCD菜单(界面)LCD菜单(遥控器)希望对大家有用^_^感兴趣...
用户149863 2010-05-22 14:33
LCD12864(KS0108)液晶演示程序
LCD12864(KS0108)液晶演示程序LCD12864(KS0108)液晶演示程序视频: LCD12864演示程序(什么都不带的液晶) 视频演示网址:http://v.youku.com/v_s...
用户149863 2009-10-22 18:27
AVR代码
AVR单片机程序代码集,给需要的朋友们参考呵呵,都是自己一边学一边写的,一个一个字符从键盘敲出来的^_^希望对大家有用:-)呵呵,编译软件为:  ICCAVR V6.31A版本一共七个压缩包,呵呵,分...
用户149863 2009-10-22 15:18
VGA相关资料
VGA相关资料呵呵^_^如果你想玩的就请下载,有很多东西,都是花了我好几个夜晚才搜到的都是网上的资料:-)有兴趣的可以做做哦 包含以下文件夹:├─VGA+2051│  │  共享-----国外优秀电子...
用户149863 2009-10-10 14:46
PS/2 键盘与单片机
程序打包PS/2 键盘与单片机接口用LCD1602显示调试成功所以拿出来给大家分享,希望对大家有用,呵呵^_^用PS/2键盘做系统输入部分蛮方便的哦!可以使用Backspace/Esc/Tab/Cap...
用户149863 2009-08-17 19:54
AVR端口操作宏定义,便于移植
AVR端口操作宏定义头文件(ICCAVRIO.H),便于移植(ICCAVR编译环境) 压缩包里面有网上的相关资料,把它看完,相信你会更加了解红宏定义的^_^还有头文件在ICCAVRIO.H在Inclu...
我要评论
4
7
关闭 站长推荐上一条 /2 下一条