单片机计数功能

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、计数器是什么?
    • 1.1 应用
  • 二、计数器原理框图及对输入信号的要求
    • 2.1 原理框图
    • 2.2对输入信号的要求
  • 三、使用步骤
    • 3.1 配置为计数模式
    • 3.2 装初值
    • 3.3 配置中断
    • 3.4 中断服务函数
    • 3.5 读取计数值
    • 3.6 完整程序框架
  • 四、程序测试
    • 4.1 实物连接
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:
前面学习了单片机的定时功能,定时可以用来做时钟等对时间有精确要求的场合,定时器的前提是能提供精准的时钟源。如果没有时钟源,时钟来源于外部信号,每来一个信号,计数器加1,这就是计数功能,只知道几了多少个脉冲。


提示:以下是本篇文章正文内容,下面案例可供参考

一、计数器是什么?

单片机计数器是一种用于统计脉冲数量的电路模块,可以通过外部信号触发计数器进行累加,并在达到设定值时产生中断或其他事件。在嵌入式系统中,计数器常用于频率计数、编码器测量、信号采集等应用场合。
在电子设计竞赛中,曾经用来做频率计。

1.1 应用

单片机计数功能_第1张图片
单片机计数功能_第2张图片

二、计数器原理框图及对输入信号的要求

2.1 原理框图

单片机计数功能_第3张图片
单片机计数功能_第4张图片

2.2对输入信号的要求

计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数值增1。每个机器周期S5P2期间,都对外部输入引脚T0或T1进行采样。如在第1个机器周期中采得值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于确认一次负跳变要花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率1/24。
单片机计数功能_第5张图片

计算公式:
输入脉冲频率=Fosc /24

三、使用步骤

3.1 配置为计数模式

单片机计数功能_第6张图片

单片机计数功能_第7张图片
参考程序

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:按键触发,按一次得一个脉冲

单片机计数功能_第8张图片
单片机计数功能_第9张图片
注意:

P3.3 ->P3.5

P3.3 设置为输入,

sibt P33=P3^3;

main()
{
	P33=1;  //保证 为输入,下管不导通
	while(1)
	{

	}
}

先设置为输入,才能读取

总结

你可能感兴趣的:(单片机,单片机,嵌入式硬件)