提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、计数器是什么?
- 1.1 应用
- 二、计数器原理框图及对输入信号的要求
- 2.1 原理框图
- 2.2对输入信号的要求
- 三、使用步骤
- 3.1 配置为计数模式
- 3.2 装初值
- 3.3 配置中断
- 3.4 中断服务函数
- 3.5 读取计数值
- 3.6 完整程序框架
- 四、程序测试
- 4.1 实物连接
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
前面学习了单片机的定时功能,定时可以用来做时钟等对时间有精确要求的场合,定时器的前提是能提供精准的时钟源。如果没有时钟源,时钟来源于外部信号,每来一个信号,计数器加1,这就是计数功能,只知道几了多少个脉冲。
提示:以下是本篇文章正文内容,下面案例可供参考
一、计数器是什么?
单片机计数器是一种用于统计脉冲数量的电路模块,可以通过外部信号触发计数器进行累加,并在达到设定值时产生中断或其他事件。在嵌入式系统中,计数器常用于频率计数、编码器测量、信号采集等应用场合。
在电子设计竞赛中,曾经用来做频率计。
1.1 应用
二、计数器原理框图及对输入信号的要求
2.1 原理框图
2.2对输入信号的要求
计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数值增1。每个机器周期S5P2期间,都对外部输入引脚T0或T1进行采样。如在第1个机器周期中采得值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于确认一次负跳变要花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率1/24。
计算公式:
输入脉冲频率=Fosc /24
三、使用步骤
3.1 配置为计数模式
参考程序
TMOD &=0X0F;
TMOD |=0X50;
3.2 装初值
计数器值不一定从0开始,可以从0-65535任一值开始计数,这时候就需要装在初值了
假设想让计数器计1000个就溢出,通用公式计数x个溢出。
那么:
TH1=(65536-1000)/256
TH0=(65536-1000)%256
TH1=(65536-x)/256
TH0=(65536-x)%256
3.3 配置中断
如果不用中断,那么计数范围就是设定的0-x
如果用中断,溢出后让一个变量自加,那么就可以扩大计算范围,计数器值=numx+ TH1256+TL1
假设变量是num ,进中断自加1
如果用:
ET1=1;
EA=1;
PT1=0;
3.4 中断服务函数
void timer1()interrupt 3
{
TH1=(65536-1000)/256 //记得装初值
TH0=(65536-1000)%256
num++;
}
3.5 读取计数值
计的数在放在哪里?
TL0
TH1
num
怎么读? 主函数查询
程序框架
void main()
{
while(1)
{
count=num*x+ TH1*256+TL1;//当前计数器的值
}
}
3.6 完整程序框架
...
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++;
}
四、程序测试
4.1 实物连接
必须P3.5引脚输入脉冲
方法1: 一个引脚产生八个脉冲
void maichong8()
{
for(i=0;i<8;i++)
{
P10=0;
P10=1;
}
}
P10->P3.5
测试框架
...
void main()
{
// 初始化
TMOD &=0X0F;
TMOD |=0X50;
TH1=(65536-1000)/256
TH0=(65536-1000)%256
ET1=1;
EA=1;
PT1=0;
while(1)
{
if(key0==0)
{
while(key0==0);
maichong8();
}
count=num*x+ TH1*256+TL1;
//display(conut); 显示当前计数值
// LCD1602
//串口发送串口助手,或者自己写的上位机
}
}
void timer1()interrupt 3
{
TH1=(65536-1000)/256
TH0=(65536-1000)%256
num++;
}
方法2:按键触发,按一次得一个脉冲
注意:
P3.3 ->P3.5
P3.3 设置为输入,
sibt P33=P3^3;
main()
{
P33=1; //保证 为输入,下管不导通
while(1)
{
}
}
先设置为输入,才能读取