#include<reg52.h>
#include<stdio.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint n;
uchar a;
unsigned long num,fre;
//float fre;
//float p;
//sbit LED=P1^2;
//打开定时器一的主要目的是为了设置串行口发送的波特率
//并没有让们发生中断,发送中断标志位TI我们软件置位为0
//即没有发生串行口中断
void init_ck()
{
SCON=0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x21; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
// EA=1; // 打开总中断
//ES = 1; // 打开串口中断
}
//外部中断初始化函数
void Init_interrupt1()
{
IE1=1;//外部中断0请求源控制位
IT1=1;//外部中断0触发方式控制位,边沿触发方式
// EA=1; //总中断打开
EX1=1;//外部中断0中断允许位
}
void Init_timer0()
{
TMOD=0x21;//确定定时器0的工作方式
// EA=1;//总中断打开
ET0=1;//定时器0中断打开
// TR0=1;//定时器0置位,定时器开始工作
}
main()
{
Init_timer0();
init_ck();
Init_interrupt1();
EA=1;//总中断打开
// SendStr("程序开始执行\n");
while(1)
{
}
}
//定时器工作于方式1,每触发一次中断有时间浪费,推荐用方式2
void timer0() interrupt 1
{
TH0=0;//定时器赋初值
TL0=0;
n++;
}
void interrupt0() interrupt 2
{
if(a==1)
{
TR0=0;//定时器0关闭
num=n*65535+TL0+TH0*256;
TI=1;//格式化输出时,TI一定要置1
printf("num=%ld\n",num);
fre=1200000000000/(110592*num);
printf("fre=%ld Hz\n",fre);
a=0;
}
else
{
TH0=0;//定时器赋初值
TL0=0;
TR0=1;//定时器0置位,定时器开始工作
a=1;
n=0;
}
} |