历史上的今天
今天是:2025年01月20日(星期一)
2021年01月20日 | 基于AT89S51的6位数显频率计数器
2021-01-20 来源:eefocus
简介:利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。
1.电路原理图

2.系统板上硬件连线
(1).把“单片机系统”区域中的P0.0-P0.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。
(2).把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。
(3).把“单片机系统”区域中的P3.4(T0)端子用导线连接到“频率产生器”区域中的WAVE端子上。
3.程序设计内容
(1).定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。
(2).T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。
4.C语言源程序
#include
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)%6;
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[i]=0;
}
i=0;
while(x/10)
{
temp[i]=x;
x=x/10;
i++;
}
temp[i]=x;
for(i=0;i<6;i++)
{
dispbuf[i]=temp[i];
}
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)%6;
timecount++;
if(timecount==250)
{
TR0=0;
timecount=0;
flag=1;
}
P0=dispcode[dispbuf[dispcount]];
P2=dispbit[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
上一篇:单片机系统软件抗干扰方法
下一篇:四种扩展51单片机中断的方法总结
史海拾趣
|
之前见到有人发帖“lpc1343之三:通过USB接口控制开发板LED闪烁速度并读取AD转换结果”,详见https://bbs.eeworld.com.cn/thread-106706-1-2.html,作者很牛很有实力,1343的C源码至今我还没有完全看懂,但鄙人用VB做软件,最近挤出点时间解决了VB ...… 查看全部问答> |
|
我的电路板用一个1085-5V芯片转换成5V,用一个1085-3.3V转换成3.3V,5V给AD等外围芯片供电,3.3主要给核心板供电,我的程序运行一会,核心板,电源芯片就会很烫,电源芯片带的底板也很烫。功率也满足要求。请问各位高手该如何解决发热问题?… 查看全部问答> |
|
将内存单元1000-1030H中的内容复制到3000-3030H单元中去,原地址清0 我的代码在下面,下载地址1000H,自修改代码,他说改下载地址,自己内存放点东西,他要看到结果,不放东西全部是0,复制过去也没效果。老师很BT,要求十分严格。EMBESTIDE环境 ...… 查看全部问答> |
|
请问:在嵌入式(wince)下如何通过GPRS模块利用手机卡提供的GPRS上网 各位前辈大家好。 请问:在嵌入式(wince)下如何通过GPRS模块利用手机卡提供的GPRS上网,我买了个嵌入式开发板utu-s3c2440-s和GSM/GPRS/CDMA-MODEM模块,现在连接上之后,可以实现给其他手机发送信息和拨打电话,但不知怎么实现通过它实现无线上 ...… 查看全部问答> |
|
本人的工作是将ucgui移植到nucleus系统上,nucleus系统时间的获取是通过将时钟节拍转化而来的,但本人对时钟节拍不怎么熟悉,按照自己的思路问题主要是出在到时钟节拍超出时钟节拍临界值时(其实本人也不清楚时钟节拍复位为0是怎么处理的),时 ...… 查看全部问答> |
|
为什么程序加while(1),运行起来程序还是会跳出while执行上面的初始化呢? 为什么程序加while(1),运行起来程序还是会跳出while执行它上面的初始化呢? 我是触摸屏加ADC采样,触摸屏是GPIO低电平产生中断,ADC是定时器触发中断。两个一起用,触摸液晶屏总是会死掉,没一点反应,还有就是会跳出while(1),执行上面的ADC初 ...… 查看全部问答> |




