打印

关于单片机的程序的请教

[复制链接]
1358|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qq124469142|  楼主 | 2011-5-28 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qq124469142 于 2011-5-28 16:32 编辑

#include <AT89X52.H>
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};
unsigned char temp[8];
unsigned char dispcount;
unsigned char T0count;
unsigned char timecount;
bit flag;
unsigned long x;
void main(void)
{

unsigned char i;

TMOD=0x15;

TH0=0;

TL0=0;

TH1=(65536-4000)/256;

TL1=(65536-4000)%256;

TR1=1;

TR0=1;

ET0=1;

ET1=1;

EA=1;

while(1)

{

if(flag==1)

{

flag=0;

x=T0count*65536+TH0*256+TL0;

for(i=0;i<8;i++)

{


temp=0;

}

i=0;

while(x/10)

{

temp=x%10;

x=x/10;

i++;

}

temp=x;

for(i=0;i<6;i++)

{

dispbuf=temp;


}

timecount=0;

T0count=0;

TH0=0;

TL0=0;

TR0=1;

}

}
}
void t0(void) interrupt 1 using 0
{

T0count++;
}
void t1(void) interrupt 3 using 0
{

TH1=(65536-4000)/256;

TL1=(65536-4000)%256;

timecount++;

if(timecount==250)

{

TR0=0;

timecount=0;

flag=1;

}

P0=dispcode[dispbuf[dispcount]];

P2=dispbit[dispcount];

dispcount++;

if(dispcount==8)

{

dispcount=0;

}
}
想利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来,请各位高人,给点意见!!!谢谢!!

相关帖子

沙发
相信哥咯| | 2011-5-28 20:55 | 只看该作者
我是这样想的,不知道对不对。

用t0做1秒定时
t1用做输入信号计数,
每一秒读一下t1结果,与前一次结果之差为频率值

数码管定时扫描显示频率值

使用特权

评论回复
板凳
qq124469142|  楼主 | 2011-5-28 21:11 | 只看该作者
诚如楼上所说,。我的意思是这样的,不过,感觉程序有缺憾,还请各位给我提示。以便帮助修改!!

使用特权

评论回复
地板
gx_huang| | 2011-5-29 08:36 | 只看该作者
很多错误的。
光显示就有错误,扫描计数是0-7,但是你显示的时候引用了0-8。
中断用了2个using 0,应该也是错的。
计数处理的逻辑似乎也有问题。应该在T1中断里直接保存T0的计数值到另外一个临时变量中,主程序直接调用这个变量就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

65

帖子

1

粉丝