2020-02-04 09:09发布
$A}75~EYH~T)BBYRQJ`M_TK.jpg (516.44 KB, 下载次数: 0)
下载附件
2012-4-20 11:06 上传
最多设置5个标签!
$A}75~EYH~T)BBYRQJ`M_TK.jpg (516.44 KB, 下载次数: 0)
下载附件
2012-4-20 11:06 上传
//数码管显示频率计
#include <REG52.h> //标准定义头文件
#include <intrins.h> // 使用_nop_()
#define uchar unsigned char
#define uint unsigned int
#define RELOADH 0xD8 //
#define RELOADL 0xFC //1T=0.5uS,周期5MS
#define LED_PORT P0
sbit LED_HZ =P3^2;
sbit LED_KHZ =P3^3;
sbit LED_MHZ =P3^4;
//**********************常量定义***************************
unsigned char code DISP_CODE[]= //*************定义各数字的显示码*********** 0-9,-,
{ 0xa0, 0xbb, 0x62, 0x2a, 0x39, 0x2c, 0x24, 0xba, 0x20, 0x28,0x7f};
unsigned char code DISP_CS[]={0x7F,0xBF,0xEF,0xDF,0xFF};
#define DOT 0xDF //点
//**********************变量定义***************************
unsigned char tick_count,tick_5ms,tick_1s,tick_1min; //时钟节拍
unsigned char frq_buf[10],disp_buf[4],disp_cnt;
unsigned int fre_khz,fre_hz;
unsigned int fre_cnt1,fre_cnt2;
//**********************定义***************************
//*************************************************
//*****************************
//**** 显示程序 ****
//*****************************
void display(void)
{
P2=P2|0xF0; //关闭输出,防止余辉
LED_PORT=disp_buf[disp_cnt]; //送显示码
P2=P2&DISP_CS[disp_cnt]; //确定显示第几位
if(disp_cnt<3) disp_cnt++; //判断是否全部显示完
else
{disp_cnt=0; //显示完则从头开始
}
}
//*********************显示内容计算******************
void disp_data(void)
{
fre_hz=fre_cnt1%1000; //计算频率HZ数
fre_khz=fre_cnt1/1000; //计算频率KHZ数
fre_cnt1=0;
while(1) //频率计算器高位是否有数?就是计数值超过65535
{
if(fre_cnt2==0)break;
fre_khz=fre_khz+65;
fre_cnt1=fre_cnt1+536;
fre_cnt2--;
}
fre_cnt1=fre_cnt1+fre_hz; //重新计算频率HZ数
fre_hz=fre_cnt1%1000;
fre_khz=fre_khz+(fre_cnt1/1000); //重新计算频率KHZ数
frq_buf[6]=fre_khz/1000; //频率百万位
frq_buf[5]=fre_khz%1000/100; //频率十万位
frq_buf[4]=fre_khz%1000%100/10; //频率万位
frq_buf[3]=fre_khz%1000%100%10; //频率千位
frq_buf[2]=fre_hz/100; //频率百位
frq_buf[1]=fre_hz%100/10; //频率十位
frq_buf[0]=fre_hz%100%10; //频率个位
LED_MHZ=1;
LED_KHZ=1;
LED_HZ=1;
if(fre_khz>9999) //>9.999MHZ显示"----"
{
disp_buf[0]=DISP_CODE[10];
disp_buf[1]=DISP_CODE[10];
disp_buf[2]=DISP_CODE[10];
disp_buf[3]=DISP_CODE[10];
}
else
if(fre_khz>999) //1.000M--9.999M
{
disp_buf[3]=DISP_CODE[frq_buf[6]]&DOT;
disp_buf[2]=DISP_CODE[frq_buf[5]];
disp_buf[1]=DISP_CODE[frq_buf[4]];
disp_buf[0]=DISP_CODE[frq_buf[3]];
LED_MHZ=0;
}
else
if(fre_khz>99) //100.0K-999.0K
{
disp_buf[3]=DISP_CODE[frq_buf[5]];
disp_buf[2]=DISP_CODE[frq_buf[4]];
disp_buf[1]=DISP_CODE[frq_buf[3]]&DOT;
disp_buf[0]=DISP_CODE[frq_buf[2]];
LED_KHZ=0;
}
else
if(fre_khz>9) //10.00K-99.00K
{
disp_buf[3]=DISP_CODE[frq_buf[4]];
disp_buf[2]=DISP_CODE[frq_buf[3]]&DOT;
disp_buf[1]=DISP_CODE[frq_buf[2]];
disp_buf[0]=DISP_CODE[frq_buf[1]];
LED_KHZ=0;
}
else
{
disp_buf[0]=DISP_CODE[frq_buf[0]];
disp_buf[1]=DISP_CODE[frq_buf[1]];
disp_buf[2]=DISP_CODE[frq_buf[2]];
disp_buf[3]=DISP_CODE[frq_buf[3]];
LED_HZ=0;
}
}
//*****************************
//**** 主程序 ****
//*****************************
void main(void)
{
TMOD=0x51; //设置定时器模式,T1外部输入计数
TCON=0x00;
// IE=0x82; //开中断
TH0=RELOADH;
TL0=RELOADL; //装入初值
ET1=1;
ET0=1;
EA=1;
TR0=1; // 启动T0
TR1=1; // 启动T1
while(1)
{
if(tick_count>0) //有时钟节拍
{
tick_count--; //节拍数清零
// disp_data();
display();
if(tick_1s==0) disp_data();
}
}
}
//*****************************
//**** 定时器0中断 ****
//*****************************
void timer1(void) interrupt 3 using 0
{
fre_cnt2++; //计数器溢出了,高位加1
}
//*****************************
//**** 定时器1中断 ****
//*****************************
void timer0(void) interrupt 1 using 1
{
TR0=0; // 停止定时器0
TH0=RELOADH; // 设定溢出时间
TL0=RELOADL;
TR0=1; // 启动T0
tick_count++; // 时间计数器加1
tick_1s++;
if(tick_1s==200) //时间到了1秒,保存频率值
{
TR1=0;
fre_cnt1=(TH1<<8)+TL1;
TH1=0;
TL1=0;
TR1=1;
tick_1s=0;
}
}
一周热门 更多>