单片机实现测频,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++;
}
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++;
}
