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) //数值显示函数
{
sta
tic 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);
}
}
一周热门 更多>