历史上的今天
今天是:2025年01月02日(星期四)
2018年01月02日 | DIY 6位数显频率计
2018-01-02 来源:eefocus
1.实验任务
利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHz的信号频率进行准确计数,计数误差不超过±1HZ。
2.电路原理图
图4.31.1
3.系统板上硬件连线
(1).把“单片机系统”区域中的P0.0-P0.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。
(2).把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。
(3).把“单片机系统”区域中的P3.4(T0)端子用导线连接到“频率产生器”区域中的WAVE端子上。
4.程序设计内容
(1).定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。
(2).T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。
5.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;
}
}
史海拾趣
|
IBM日前在上海举行典礼,与合作伙伴和各界代表共同见证了全球首个Power架构专用协作创新平台——IBM Power架构应用中心的启用。该中心将围绕IBM Power架构处理器技术,通过与Power.org全球及本地的合作伙伴及研究机构等多方进行共同协作,帮助客户 ...… 查看全部问答> |
|
Streaming Minidriver中如何使用中断的延迟过程调用 初学驱动开发,在testcap例子的基础上针对硬件做修改。中断服务程序已经能正常响应了,但是不知道怎样设置延迟过程调用。在DeviceExtension中定义DPC对象指针,初始化设备时初始化DPC,然后在ISR中调用IoRequestDpc。结果每次运行到这里就蓝屏了。 ...… 查看全部问答> |
|
刚开始用evc,弱弱的问下:在evc中为什么把setwindowpos这个函数放在oncreate函数中就不起作用,而放在oninit函数中就好用呢?我再vc6.0中写再oncreate函数中也起作用啊? 求高手指点1~2~… 查看全部问答> |
|
MFC requires WINVER to be #defined to 0x0400 or greater MFC requires WINVER to be #defined to 0x0400 or greater… 查看全部问答> |
|
我使用vivi的load flash wince u命令,将wince烧写到板上的flash时,格式化的时候出现几个error, 然后也正常格式化完毕,刚刚把wince烧写到板上时,wince正常启动,因为我没有断过电, 重启之后flash上刚刚烧写的wince就不见了,不能正常启动 ...… 查看全部问答> |
|
在看手册时看到说STM32中,中等密度器件的flash分成了128个page,每个128K,但是中等密度器件的最大Flash也只有128K,那么如果小于128K的那些是怎么分配的吗?另外,这些分配之后Information block和Flash memory interface&nb ...… 查看全部问答> |
|
今年用现成的stm32f103的系统做双串口通讯的程序,一直是工作不正常。问题也比较奇怪: 1、串口2为remap,并且转485;串口1、串口2分别和PC通讯,收发都正常。 2、PD7控制485方向,当PD7置位时,串口1不能正常接收数据。一直不知道为什么会这样? ...… 查看全部问答> |




