51单片机用定时器计数器测量频率

51单片机用定时器计数器测量频率,第1张

定时器1对外部脉冲计数时TMOD高4位设置应该是5

因此TMOD=0x51;

以下我的频率计程序:

#include <reg52h>//因没用到STC12C5410专有特殊功能寄存器,此处用52或51的头文件均可

#define unit unsigned int

#define uchar unsigned char

//定义以I/O口的功能

sbit beiguang=P3^2;//液晶屏背光

sbit rs=P1^3;//液晶屏写选择,0命令 1数据

sbit rw=P1^4;//液晶屏读写选择

sbit lcden=P1^5;//液晶屏使能

sbit fm=P1^7;//蜂鸣器

#define db P2 //定义P2为数据输出口,写数据时用db代替P2,增加液晶屏程序的通用性

//更改硬件接线时,只更改此处,而不必去更改液晶屏读写子程序

uchar aa,bb,cc;//变量声明

unit dd,ee;

void Delay1ms(unsigned int i) //1ms延时程序

{

unsigned int j;

for(;i>0;i--)

{

for(j=0;j<125;j++)

{;}

}

}

void init()//初始化设置

{

TMOD=0x15;//定时器0作为计数器,定时器1作为定时器用

TH0=0;//计数器清0

TL0=0;

EA=1;//开总中断

ET1=1;//允许定时器1中断

TH1=0x4c;

TL1=0x5c;

TR0=1;//启动计数器

TR1=1;//启动定时器

aa=0;

}

void write_com(uchar com)//向液晶屏写命令

{

db=com;

rs=0;

rw = 0;

lcden=0;

Delay1ms(1012);

lcden=1;

Delay1ms(1012);

lcden=0;

}

void write_date(uchar date)//向液晶屏写数据

{

db=date;

rs=1;

rw = 0;

lcden=0;

Delay1ms(1012);

lcden=1;

Delay1ms(1012);

lcden=0;

}

void init2()//液晶屏初始化

{

beiguang=0;

rw=0;

write_com(0x38);

Delay1ms(1012);

write_com(0x0f);

Delay1ms(1012);

write_com(0x06);

Delay1ms(1012);

write_com(0x01);

Delay1ms(1012);

}

void display4(unsigned int number) //单行多位显示程序

{

uchar A1,A2,A3,A4,A5;

init2();//液晶屏初始化

A1=number/10000%10;//分离出万,千,百,十,个,对于int型数据,最大不超过65535

A2=number/1000%10;

A3=number/100%10;

A4=number/10%10;

A5=number%10;

write_com(0x80);//第1个数据的位置设定,第1行第1列

Delay1ms(10);

write_date(0x30+A1);//写数据

Delay1ms(10);

write_date(0x30+A2);

Delay1ms(10);

write_date(0x30+A3);

Delay1ms(10);

write_date(0x30+A4);

Delay1ms(10);

write_date(0x30+A5);

Delay1ms(10);

write_com(0x87);//第6个数据'H'的位置,中间空85和86 二格

write_date('H');

Delay1ms(10);

write_date('z');

Delay1ms(10);

}

void main()//主程序很简单

{

init();//初始化

while(1)//循环程序

{

dd=bb256+cc;//05S的计数值

ee=2dd;//换算为1秒钟的计数值

if(aa==1)

{

if(TH0>12)//预判断,50ms内TH0>12,1s内计数值将超过可计数的最大值65535

fm=0;//报警

}

display4(ee);//显示

fm=1;//报警停止

}

}

void timer1()interrupt 3//注意:定时器1的中断序号为3

{

aa++;

TH1=0x4c;//110592Mhz

TL1=0x5c;

if(aa==10)//中断10次,共05S

{

TR0=0;//暂停计数

aa=0;

bb=TH0;//读出计数器数据

cc=TL0;

TL0=0;//计数器清0

TH0=0;

TR0=1;//重新启动

}

}

timer0 做计数器,timer1 做计时器;

void timer0 (void )interrupt 1 using 2 //定时器中断,用与定时计数

{

cou++;

}

void time1(void )interrupt 3 using 1 //计数器中断,用于计数

{

count++;

}

void time0_init() //定时器0初始化

{

TH0=6;

TL0=6; //装载计数器的初值

ET0=1; //开计数器1 中断

TR0=1; //开计数器1

EA=1; //开总中断

}

void time1_init() // 计数器1初始化

{

TMOD |=0x26; // 设置定时器0,和计数器1的模式

TH1=6;

TL1=6; //定时器的初值,用于中断一次计时250us

ET1=1; //开定时器0中断

TR1=1; //开定时器0

}

以上就是关于51单片机用定时器计数器测量频率全部的内容,包括:51单片机用定时器计数器测量频率、89C51使用P3.5检测输入频率程序,如何改成检测为P3.4输入频率检测、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9409922.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存