单片机频率测量实验程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十六频率测量实验
一、实验目的
掌握PCF8563的功能特点,频率测量的原理,测量程序的编写
二、实验电路
如图所示,将被测信号PCF8563的CLKOUT脚与单片机的P35(T1)相连,作为外部计数信号,将JP1的2脚与4*1脚相连,构成独立式键盘。
将JP2短接,JP3、JP4断开,选择LED显示器。
三、实验内容
编写频率测量程序,测量PCF8563实时时钟芯片所产生的时钟CLKOUT的频率,用四个按键控制PCF8563产生不同的频率,数码管的显示应分别为32.76K和1024、32、1HZ。
四、参考程序
#include <reg51.h> /*头文件的包含*/
#include <intrins.h>
#define uchar unsigned char /*宏定义*/
#define uint unsigned int
#define PCF8563 0XA2
#define WRADDR 0X00
#define RDADDR 0X02
sbit KEY13=P2^4;
sbit KEY14=P2^5;
sbit KEY15=P2^6;
sbit KEY16=P2^7;
extern bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
extern bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);
uchar code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x 89,0x8c};
uchar dbuf[4]={0,0,0,0};
uint count;//定时器溢出中断次数
bit ok; //1秒钟时间到
void disp(void)
{ uchar i,n,bsel;
bsel=0xfe;
for(n=0;n<4;n++)
{ P2=bsel;
P0=segtab[dbuf[n]&0x7f];
if(dbuf[n]>=0x80) P0=P0&0x7f;//如果有小数点,则点亮小数点
bsel=(bsel<<1)+1;
for(i=1;i<250;i++);
P0=0xff;
}
}
void timer0(void) interrupt 1
{
count++; //中断计数器加1
if (count==4006) //4006次中断近似1S
{ ok=1; //设置时间到标志
count=0; //计数器清0
TR0=0; //停止T0、T1定时、计数
TR1=0;
}
}
void main(void)
{ uint fre;
uchar ctr=0x80; //8563的控制字
uchar temp=0x80;
bit dp; //小数点标志
ISendStr(PCF8563,0x0d,&ctr,0x01);//将控制字写入8563从地址为0DH的单元TMOD=0x52; // T0工作于定时方式2,T1工作于计数方式1
ET0=1;
EA=1;
while(1)
{
TH0=-230;//当fosc=11.0592时,T0定时时间为250us
TL0=-230;
TH1=0; //T1工作于计数方式,初值为0
TL1=0;
TR0=1; //启动T0定时
TR1=1; //T1开始对8563的CLKOUT计数
while(ok==0) //当1秒的闸时间未到时
{ if((P2&0xf0)!=0xf0) //检测是否有键被按下
{ disp(); //去抖动
if(KEY13==0) temp=0x80; //根据键值设定8563时钟输出控制字
if(KEY14==0) temp=0x81; //产生频率分别为32768/1024/32/1HZ
if(KEY15==0) temp=0x82;
if(KEY16==0) temp=0x83;
}
disp();//保证显示器能正常显示当前频率
}
ok=0; //清除时间到标志,为下次测量作准备
fre=TH1*256+TL1;//从T1读取频率值
if(fre>=10000) //如果频率为5位数,舍去未位数,加上小数点,单位为KHZ { fre=fre/10;
dp=1; //小数点标志有效
}
else dp=0;
dbuf[3]=fre/1000; //将频率值的千位\百位\十位\个位求出
fre=fre%1000;
dbuf[2]=fre/100;
if(dp==1) dbuf[2]=dbuf[2]|0x80;//如果有小数点标志,则在百位加上小数点fre=fre%100;
dbuf[1]=fre/10;
dbuf[0]=fre%10;
if(temp!=ctr) //如果控制字发生变化
{ ctr=temp; //更新当前控制字
ISendStr(PCF8563,0x0d,&ctr,0x01);//将新控制字写入8563的 0DH的单元
}
}
}。