标题:
51单片机0-9999Hz频率计仿真加程序 数码管显示
[打印本页]
作者:
Zoe_007
时间:
2017-6-30 21:09
标题:
51单片机0-9999Hz频率计仿真加程序 数码管显示
51单片机做的数码管显示频率计,0-9999Hz频率的范围.
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
0.png
(21.66 KB, 下载次数: 52)
下载附件
2017-7-1 01:22 上传
高频时仿真很慢很慢的,要有足够的耐心等待!!!
0.png
(45.96 KB, 下载次数: 45)
下载附件
2017-7-1 01:23 上传
单片机源程序如下:
/*一个机器周期采样值为1,下一个机器周期采样为0,则计数器加1*/
/*外部事件的最高计数频率为晶振的1/24,故最高计数为0.9216M;*/
/*目前状态下只是显示0到9999HZ的频率*/
/*原创作者:陈永刚*/
/*优化整理:tiansir*/
/*测频率原理*/
/*定时器T0作为定时装置,编程设定定时1s,定时器T1对外部信号计数,每1S中对计数结果处理*/
#include<reg51.h>
#include<absacc.h>
#define SEG_Q XBYTE[0xfcec]
#define SEG_B XBYTE[0xfced]
#define SEG_S XBYTE[0xfcee]
#define SEG_G XBYTE[0xfcef]
//通用数码管显示函数,传入数据0~9999
void renew_disp(unsigned int number)
{
unsigned char code tab1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char temp,flag=0;
if(number < 10000)
{
//千位数码管
temp = number/1000%10;
if (temp)
{
SEG_Q = tab1[temp];
flag = 1;
}
else
{
SEG_Q = 0xff;//数码管熄灭
flag = 0;
}
//百位数码管
temp = number/100%10;
if(flag | temp)
{
SEG_B = tab1[temp];
flag = 1;
}
else
{
SEG_B = 0xff;//数码管熄灭
flag = 0;
}
//十位数码管
temp = number/10%10;
if(flag | temp) SEG_S = tab1[temp];
else SEG_S = 0xff;//数码管熄灭
//个位数码管
temp = number%10;
SEG_G = tab1[temp];
}
else
{
SEG_Q = 0xbf;
SEG_B = 0xbf;
SEG_S = 0xbf;
SEG_G = 0xbf;
}
}
//T0定时中断,晶振22.1184M
void T0_int(void) interrupt 1
{
static char counter=0;
TH0=(65536-46063)/256;
TL0=(65536-46063)%256;
if(counter++==39)
{
counter=0;
TR1=0;
renew_disp(256*TH1+TL1);
TH1=TL1=0;
TR1=1;
}
}
void main()
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
数码管显示0-9999Hz频率计.rar
(68.52 KB, 下载次数: 50)
2017-6-30 21:08 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2017-7-1 01:25
好资料,51黑有你更精彩!!!
作者:
by64214
时间:
2017-7-1 06:26
谢谢楼主分享 好资料 学习一下
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1