uint selfadap
tion()
{
uint num = 0;
while(1)
{
if(count >= base_time)
{
EX0 = 0;
ET0 = 0;
num = a;
a = 0;
count = 0; // 计数器清零
if(num > 1000 && num < 10000) // f=10kHz~100kHz
{
base_time = 1; // 10ms
EA = 1; // 开总中断
EX0 = 1;
ET0 = 1; // 开定时器中断
TR0 = 1;
IT0 = 1; // 边沿触发
// init_51();
}
if(num > 100 && num <= 1000) // f=1kHz~10kHz
break;
if(num > 0 && num < 100) // f=0Hz~1kHz
{
base_time = 100; // 1s
EA = 1; // 开总中断
EX0 = 1;
ET0 = 1; // 开定时器中断
TR0 = 1;
IT0 = 1; // 边沿触发
// init_51();
}
}
}
return num;
}
/********************************************
功能简介:周期信号从单片机的P3.2口输入, *
之后在数码管上显示周期信号的频率。*
********************************************/
#include "1602.h"
uchar cnt[6];
uint count;
uint a;
uint num = 0;
uint base_time = 10; // 初始定时100ms
/* 频率数值分离,为显示做准备 */
void detach(uint fre)
{
uint freq;
freq = fre*1000/base_time;
cnt[0] = freq/100000;
freq %= 100000;
cnt[1] = freq/10000;
freq %= 10000;
cnt[2] = freq/1000;
freq %= 1000;
cnt[3] = freq/100;
freq %= 100;
cnt[4] = freq/10;
cnt[5] = freq%10;
}
void display()
{
int i;
write_com(0x80 + 6);
for(i=0;i<6;i++)
{
write_data(cnt[i] + '0');
}
}
void init_51()
{
TMOD = 0x01; // 定时器0工作在方式1
EA = 1; // 开总中断
EX0 = 1; // 开外部中断0
IT0 = 1; // 边沿触发
ET0 = 1; // 开定时器中断
TR0 = 1; // 启动定时/计数器0
TH0 = (65536 - 10000) / 256; // 12M晶振下定时10ms
TL0 = (65536 - 10000) % 256;
}
uint selfadaption()
{
uint num = 0;
while(1)
{
if(count >= base_time)
{
EX0 = 0;
ET0 = 0;
num = a;
a = 0;
count = 0; // 计数器清零
if(num > 1000 && num < 10000) // f=10kHz~100kHz
{
base_time = 1; // 10ms
EA = 1; // 开总中断
EX0 = 1;
ET0 = 1; // 开定时器中断
TR0 = 1;
IT0 = 1; // 边沿触发
// init_51();
}
if(num > 100 && num <= 1000) // f=1kHz~10kHz
break;
if(num > 0 && num < 100) // f=0Hz~1kHz
{
base_time = 100; // 1s
EA = 1; // 开总中断
EX0 = 1;
ET0 = 1; // 开定时器中断
TR0 = 1;
IT0 = 1; // 边沿触发
// init_51();
}
}
}
return num;
}
void main()
{
uint f;
init_51();
init_1602();
f = selfadaption();
detach(f);
display();
while(1) ;
// {
//
// }
}
void timer() interrupt 1
{
TH0 = (65536 - 10000) / 256; // 重装初值
TL0 = (65536 - 10000) % 256;
count++; // 计数器加1
/* if(count == 20) // 定时1s到
{
count = 0; // 计数器清零
// EA = 0; // 关总中断
num = a;
// a = 0;
detach(num);
ET0 = 0; // 关定时器中断
EX0 = 0; // 关外部中断0
} */
}
void exter0() interrupt 0
{
a++;
}
一周热门 更多>