📄 final-all.c
字号:
#include <reg52.h>
sbit rect_wave=P1^2; //在P1.2脚上输出周期为2MS即500H方波的
unsigned long fre_in,fre_out;
unsigned char count2;
unsigned char fre_in_bit[4]; //依次存放要求产生的频率值的百位,十位,各位
unsigned char count;
unsigned char Read0,Read1,Read2,N0,N1;
unsigned int N;
unsigned char THH0;
void delay(unsigned char m)
{
unsigned char i,j;
for(;m>0;m--)
{
for(i=0;i<10;i++)
for(j=0;j<10;j++);
}
}
void display(void)
{
unsigned char fre_out_bit[4]; //依次存放测量得到的频率值的百位,十位,各位
//显示数码管的字型码的常数表,在ROM区,只读不可写(共阴数码管)
unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char i; //显示第i个数码管
unsigned int j;
//刷新测量频率值
j++;
if (j == 100)
{ j = 0;
EA = 0;
fre_out = Read2;
fre_out <<= 8;
fre_out += Read1;
fre_out <<= 8;
fre_out += Read0;
EA = 1;
fre_out =(unsigned long)( 921600 / (fre_out+5));
fre_out_bit[3]=(fre_out/1000); //计算千位
fre_out_bit[2]=(fre_out/100)%10; //计算百位
fre_out_bit[1]=(fre_out/10)%10; //计算十位
fre_out_bit[0]=(fre_out)%10; //计算个位
}
for(i=0;i<4;i++)//显示输入频率值
{
P0=table[fre_in_bit[i]];
P2=(0x7f>>i)|(0x7f<<(8-i));
delay(5);
}
for(i=0;i<4;i++)//显示测量频率值
{
P0=table[fre_out_bit[i]];
P2=(0xf7>>i)|(0xf7<<(8-i));
delay(5);
}
}
//产生方波
void time0(void) interrupt 1
{
count++;
TH0=N1;
TL0=N0;
if(count==10)
{ count=0;
rect_wave=~rect_wave;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
/************************************************ 测频模块 *********************************/
////////////////////////////////////////////////////////////////////////////////////////////
//采用测周的方式测量频率.将方波信号接至外部中断INT0,利用外部中断每来一个下降沿执行?
//一次中断程序来实现在一个方波周期内测量计数器T2总计了多少个机器周期的办法来实现
void testfre(void) interrupt 0
{
TR1=0; //关闭定时器T2,以读取计数器的值
Read2 = count2;
Read1 = TH1;
Read0 = TL1;
TH1=0; //计数器初值请零
TL1=0;
count2=0; //溢出次数请零
TR1=1; //启动定时器2
}
////////////////////////////////////////////////////////////////////////////////////////////
/************************************** 显示模块 ***************************************/
////////////////////////////////////////////////////////////////////////////////////////////
//用8位LED共阴数码关显示,其中PO口输出段码数据,P2.7~P2.0口作为位选,即扫描控制,每个数码管亮1ms
//动态显示
///////////// //////////////////// 延时 ? ms函数 ///////////////////////////////////
void T2_ISR(void) interrupt 3
{
count2++; //每溢出依次count2加1
TH1=0;
TL1=0;
}
unsigned char Key_scan(void)//用查询方式扫描键盘,返回键值
{
unsigned char key_value;
unsigned char reread_key;
key_value=P1&0xf0;
if(key_value!=0xf0)
{
delay(30); //延时10ms
reread_key=P1&0xf0; //再读P1高4位
if(reread_key==key_value)
{
delay(30);
while(reread_key&P1!=0xf0);
return key_value;
}
}
//P1|=0xf0;
}
////////////////////////////////////////////////////////////////////////////////////////////
/************************************** 主程序 ***************************************/
////////////////////////////////////////////////////////////////////////////////////////////
void main(void)
{
unsigned char key_value;
IE=0x00;
P2=0xff; //启动状态数码管全灭
fre_out=0;
fre_in=500;
N=65536-(46080/fre_in)+15;
TMOD=0x11;
count=0;
N1=(N>>8)%256;
N0=N%256;
TH0=N1;
TL0=N0;
TH1=TL1=0;
fre_in_bit[3]=(fre_in/1000); //计算千位
fre_in_bit[2]=(fre_in/100)%10; //计算百位
fre_in_bit[1]=(fre_in/10)%10; //计算十位
fre_in_bit[0]=(fre_in)%10; //计算个位
IP=0x03; //置T0中断的优先级最高
EA=1;
ET0=1;
ET1=1;
EX0=1; //开放定时器T0 T1中断、外部中断0
TR0=1; //启动定时器T0启动定时器T1
TR1=1;
IT0=1;
do{
key_value=Key_scan();
switch(key_value)
{
case 0xe0: fre_in++; break;
case 0xd0: fre_in+=10; break;
case 0xb0: fre_in+=100; break;
case 0x70: fre_in+=1000; break;
default:break;
}
//刷新输入频率值的各个位
if(fre_in>9999)
{
fre_in-=10000;
fre_in_bit[0]=0;
}
else
fre_in_bit[3]=(fre_in/1000); //计算千位
fre_in_bit[2]=(fre_in/100)%10; //计算百位
fre_in_bit[1]=(fre_in/10)%10; //计算十位
fre_in_bit[0]=(fre_in)%10; //计算个位
N=65536-(46080/fre_in)+15;
count=0;
N1=(N>>8)%256;
N0=N%256;
display();
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -