微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机做频率计问题。

51单片机做频率计问题。

时间:10-02 整理:3721RD 点击:
51单片机做频率计,当T1为检测到脉冲时,数码管个位怎么显示0.怎么去掉?求解,下面是程序。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint ff;   //接受频率值
uchar start=1;   //定时器,计数模式启动变量
code uchar seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0x88,0x83,0xc6,0xa1,0x86,0x8e};
code uchar tab[]={0x80,0x40,0x20,0x10};//{0x7f,0xbf,0xdf,0xef};//0xf7,0xfb,0xfd,0xfe};
void delay(uint k)  //延时函数
{
while(k--);      
}
void show(uint k)  //数值显示函数
{
  static uchar i,j;
  uint ss[4];
  i=0;
// P1=0xff;
  // P2=0x00;
  //delay(10);
  do
  {
   ss[i]=k%10;
   i++;
  }
  while(k/=10);
  for(j=0;j<i;j++)
  {
   P1=0xff;
   P2=0x00;
   delay(10);
   P1=seg[ss[j]];
   P2=tab[j];
   delay(10);
   P1=0xff;
   P2=0x00;
   delay(10);
   //P1=0xff;
   //P2=0x00;
  }  
}
void time0_init()
{
TMOD|=0x01;  //定时器0 定时模式 计数范围65536
TH0=0x3c;         //定时初值50ms
TL0=0xb0;
TR0=0;     //暂停定时器0
}
void time1_init()
{
TMOD|=0x50;     //定时器1  计数模式,计数范围65536
TH1=0;      //计数初值0
TL1=0;
TR1=0;    //暂停计数器
}
void str_init()    //定时器中断
{
EA=1;
ET0=1;
}
void time0_event() interrupt 1
{
  static uchar i;
  i++;
  TH0=0x3c;         //定时初值50ms
  TL0=0xb0;
if(i==20)
{
  i=0;
  TR1=0;    //停止计数
  TR0=0;          //停止定时
  ff=(TH1*256+TL1);   //求出频率值   就是1秒内脉冲次数
  TH1=0;          //计数值清零
  TL1=0;
  TH0=0x3c;         //定时初值50ms
  TL0=0xb0;
  start=1;               //启动定时器开启变量
}
}
void main()
{
time0_init();
time1_init();
str_init();
while(1)
{
       
  if(start==1)
  {
   TR0=1;  //启动定时器
   TR1=1;  //启动计数器
   start=0;  //关闭启动变量位 保证1秒时间
  }
  show(ff);
}
}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top