提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
前面学习了单片机的定时功能,定时可以用来做时钟等对时间有精确要求的场合,定时器的前提是能提供精准的时钟源。如果没有时钟源,时钟来源于外部信号,每来一个信号,计数器加1,这就是计数功能,只知道几了多少个脉冲。
提示:以下是本篇文章正文内容,下面案例可供参考
单片机计数器是一种用于统计脉冲数量的电路模块,可以通过外部信号触发计数器进行累加,并在达到设定值时产生中断或其他事件。在嵌入式系统中,计数器常用于频率计数、编码器测量、信号采集等应用场合。
在电子设计竞赛中,曾经用来做频率计。
计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数值增1。每个机器周期S5P2期间,都对外部输入引脚T0或T1进行采样。如在第1个机器周期中采得值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于确认一次负跳变要花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率1/24。
计算公式:
输入脉冲频率=Fosc /24
参考程序
TMOD &=0X0F;
TMOD |=0X50;
计数器值不一定从0开始,可以从0-65535任一值开始计数,这时候就需要装在初值了
假设想让计数器计1000个就溢出,通用公式计数x个溢出。
那么:
TH1=(65536-1000)/256
TH0=(65536-1000)%256
TH1=(65536-x)/256
TH0=(65536-x)%256
如果不用中断,那么计数范围就是设定的0-x
如果用中断,溢出后让一个变量自加,那么就可以扩大计算范围,计数器值=numx+ TH1256+TL1
假设变量是num ,进中断自加1
如果用:
ET1=1;
EA=1;
PT1=0;
void timer1()interrupt 3
{
TH1=(65536-1000)/256 //记得装初值
TH0=(65536-1000)%256
num++;
}
计的数在放在哪里?
TL0
TH1
num
怎么读? 主函数查询
程序框架
void main()
{
while(1)
{
count=num*x+ TH1*256+TL1;//当前计数器的值
}
}
...
void main()
{
// 初始化
TMOD &=0X0F;
TMOD |=0X50;
TH1=(65536-1000)/256
TH0=(65536-1000)%256
ET1=1;
EA=1;
PT1=0;
while(1)
{
count=num*x+ TH1*256+TL1;
//display(conut); 显示当前计数值
// LCD1602
//串口发送串口助手,或者自己写的上位机
}
}
void timer1()interrupt 3
{
TH1=(65536-1000)/256
TH0=(65536-1000)%256
num++;
}