微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机实现测频,T0定时,T1计数,求修改啊,很捉急啊

单片机实现测频,T0定时,T1计数,求修改啊,很捉急啊

时间:10-02 整理:3721RD 点击:
#include<reg51.h>
sbit P2_6=P2^6;
sbit P2_7=P2^7;
char flag; //定时器0 1S到标志位
unsigned char volatile T0count;   //定时器0中断次数
unsigned char volatile T1count;    //定时器1中断次数
unsigned char code table[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,};// 显示段码值0123456789
unsigned long sum;    //1S内脉冲总个数
void delay (unsigned int time)
{
  unsigned int i,j;
  for(i=time;time>0;time--)
  for(j=0;j<100;j++);
}
void xuan(unsigned char a)
{
  P0=a;
  P2_7=0;
  P2_7=1;
}
void xie()
{
  P2_6=0;
  P2_6=1;
  delay(2);
}
///定时器0初始化
void init_t0(void)
{
TMOD=0x01;   //定时器0工作于方式1
TH0=(65536-50000)/256;   //定时50ms
TL0=(65535-50000)%256;
}

// 定时器1初始化
void init_t1(void)
{
TMOD=0x50;   //timer 1 for count
TH1 =0x00;
TL1 =0x00;
}

void main (void)
{
EA=1;      //开总中断
init_t0();    //初始化定时器
init_t1();   
TR0=1;     //定时器开始工作
TR1=1;
ET0=1;   //开T0中断
ET1=1;
while(1)
{
if(flag==1)
{
  flag=0;
  T1count=0;
  TH1=0x00;
  TL1=0x00;
  TR1=1;
  sum=TL1+TH1*256+T1count*65536;   //计算1秒内的脉冲个数
  //以下将数据格式化,转成LED可显示的BCD码
  xuan(0x08);
  P0=table[sum/10];
  sum=sum%10;
  xie();
  xuan(0x04);
  P0=table[sum/10];
  sum=sum%10;
  xie();
  xuan(0x02);
  P0=table[sum/10];
  sum=sum%10;
  xie();
  xuan(0x01);
  P0=table[sum/10];
  sum=sum%10;
  xie();
  xuan(0x10);
  P0=table[sum/10];
  xie();
  xuan(0x20);
  P0=table[sum%10];
  xie();
  


}

}
}
//定时器0中断服务程序
void int_t0(void) interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
T0count++;
if(T0count==20)
{
  TR1=0;
  flag=1;
  T0count=0;
}
}
//定时器1中断服务程序
void int_t1(void) interrupt 3
{
  T1count++;
}  

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

网站地图

Top