单片机计数功能

2023-12-18 16:56:47

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


前言

提示:这里可以添加本文要记录的大概内容:
前面学习了单片机的定时功能,定时可以用来做时钟等对时间有精确要求的场合,定时器的前提是能提供精准的时钟源。如果没有时钟源,时钟来源于外部信号,每来一个信号,计数器加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)
	{

	}
}

先设置为输入,才能读取

总结

文章来源:https://blog.csdn.net/ganhui13000/article/details/135055759
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。