大佬们帮我看看,想做一个可以10秒钟测量T0口脉冲数量并显示的程序,T0口脉冲用按键控制,可是程序上出了问题,定时器T1定时时间不对,数码管显示计数器次数也不对。
单片机源程序如下:
#include<reg51.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char code a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示数组//
unsigned char b[8];
void display();
void init();
unsigned char c=0; //用来存放要显示的脉冲数
unsigned long TimeCount; //用于计算1分钟的
void main()
{
init();
while(1)
{
if(TR1 == 0) //当定时器停下的时候,表明计数完毕
{
/*Freq = Freq + TL1;*/ //读取TL的值
c=TL0+(TH0 * 256); //读取脉冲的值
//--求脉冲的个十百千万十万位--//
b[0]=a[c%1000000/100000];
b[1]=a[c%100000/10000];
b[2]=a[c%10000/1000];
b[3]=a[c%1000/100];
b[4]=a[c%100/10];
b[5]=a[c%10];
//--显示完,重新计算下一次频率。--//
c=0;//将计算的脉冲清零
TH0 = 0; //将计数器的值清零
TL0 = 0;
TR1 = 1; //开启定时器
TR0 = 1; //开启计数器
}
//--显示求得的数值--//
display();
}
}
void init()//初始化
{
//--定时器T0做计数器,工作方式1(16位定时器),只由TRx打开计数器--//
//--定时器T1做定时器,工作方式1(16位定时器),只由TRx打开定时器--//
TMOD=0x15;
//--设置定时器晶振为12MHZ时定时50ms--//
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
//--打开中断-//
ET1=1;
ET0=1;
EA=1;
//--打开定时器*/
TR1=1;
TR0=1;
}
void Timer0() interrupt 1
{
TimeCount++;
if(TimeCount==200)//计时到10s
{
TR1=0;//定时器停止
TR0=0;//计数器停止
TimeCount=0;
}
//--12MHZ设置定时50ms的初值--//
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}
void display()
{
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):LSA=0;LSB=0;LSC=0; break;//显示数码管第0位
case(1):LSA=1;LSB=0;LSC=0; break;//显示数码管第1位
case(2):LSA=0;LSB=1;LSC=0; break;//显示数码管第2位
case(3):LSA=1;LSB=1;LSC=0; break;//显示数码管第3位
case(4):LSA=0;LSB=0;LSC=1; break;//显示数码管第4位
case(5):LSA=1;LSB=0;LSC=1; break;//显示数码管第5位
case(6):LSA=0;LSB=1;LSC=1; break;//显示数码管第6位
case(7):LSA=1;LSB=1;LSC=1; break;//显示数码管第7位
}
P1=b[ i];//发送段码
j=50;//扫描间隔时间设定
while(j--);
P1=0x00;//消影
}
}
原理图
|