学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义

这篇具有很好参考价值的文章主要介绍了学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.计数器的用途

直流有刷的电机,后面两个一正一负的电接上,电机就可以转
学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

到底是转子个几个圈呢?
我们就可以在背后加装这么一个码盘,我们假设这里是有60个这个光电的一个孔对吧
那我们转一圈是不是就可以一个轴上输出60个这样的脉冲,有遮挡就输出1,无遮挡输出0,
两路交替,如果说这圈有60个脉冲,60个高低电平(总共几个脉冲除60就是转的圈数)
本节利用开关,模拟计数器的功能。
编码器也可以实现脉冲输出,输出波形:方波
流过了多少液体,中间有个比例变化。一高一低算一个脉冲。
只要输出信号带这种高低电平变化的,想要计算个数的就可以用计数器的功能
学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

2.计数器的配置

学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

当GATE=O(TMOD.7)时,如TR1=1,则定时器计数。GATE=1时,允许由外部输入INT1控制定时器1,
这样可实现脉宽测量。TR1为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述见上节TCON寄存器的介绍。
当c/T=0时,多路开关连接到系统时钟的分频输出,Tl对内部系统时钟计数,T1工作在定时方式
当C/T=1时,多路开关连接到外部脉冲输入P3.5/T1,即 T1工作在计数方式。
STC单片机的定时器1有两种计数速率:一种是12T模式,每12个时钟加1,与传统8051单片机相同;另外一种是1T模式,每个时钟加1,速度是传统8051单片机的12倍。T1的速率由特殊功能寄存器AUXR中的T1x12决定,如果T1x12=0,T1则工作在12T模式;如果T1x12=1,T1则工作在1T模式定时器1有两个隐藏的寄存器RL_TH1和RL_TL1。RL_TH1与TH1共有同一个地址,RL_TL1与TL1共有同一个地址。当TRI=0即定时器/计数器Ⅰ被禁止工作时,对TLl写入的内容会同时写入RL_TLl,对
TH1写入的内容也会同时写入RL_TH1。当TR1=1即定时器/计数器Ⅰ被允许工作时,对TLl写入内容,实际上不是写入当前寄存器TL1中,而是写入隐藏的寄存器RL_TL1中,对THl 写入内容,实际上也不是写入当前寄存器TH1中,而是写入隐藏的寄存器RL_THl,这样可以巧妙地实现16位重装载定时器。当读THl和TL1的内容时,所读的内容就是TH1和TL1的内容,而不是RL_TH1和RL_TLl的内容。
当定时器1工作在模式1(TMOD[5:4][M1.MO]=00B)时,[THl,TL1l]的溢出不仅置位TF1,而且会自动将[RL_TH1,RL_TL1]的内容重新装入[TH1,TL1]。
当T1CLKO/INT_CLKO.1=1时,P3.4/TO管脚配置为定时器1的时钟输出T1CLKO。输出时钟频率为T1溢出率/2。
如果C/T=0,定时器/计数器T1对内部系统时钟计数,则:
T1工作在1T模式(AUXR.6/T1x12=1)时的输出时钟频率=(SYsclk)(TM1PS+1)(65536-[RL_TH1,RL_TL1])/2T1工作在12T模式(AUXR.6/TIx12=0)时的输出时钟频率=(SYSclk)(TM1PS+1)/12/(65536-[RL_TH1,RL_TLI])/2如果C/T=1,定时器/计数器T1是对外部脉冲输入(P3.5/Tl)计数,则:输出时钟频率=(Tl_Pin_CLK)/(65536-[RL_TH1,RL_TL1])/2

Tl_C/T:Tl_C/T位写1,控制定时器1用作定时器或计数器,清0则用作定时器(对内部系统时钟进行计数),置1用作计数器(对引脚T1/P3.5外部脉冲进行计数)。
Tl_GATE:控制定时器1,置1时只有在INT1脚为高及TRI控制位置1时才可打开定时器/计数器1。此处仅需要TR1计数,故可以将Tl_GATE置0.

官方例程

学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机
学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机
设置TMOD = 0X40 =0100 0000 ,即Tl_C/T置1,用作计数。16位自动重载。
TL1 = 0xff; //1111 1111,65535,相当于再来1个脉冲,就可以进一下中断,给引脚取反。每来一个脉冲,取反一次。
TH1 = 0xff;

开始

用按钮模拟,松开是高电平,然后不断的按下松开按下松开。
选用例程作为参考:
学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

需要打开内部4K的上拉电阻打开,用到端口上拉电阻控制寄存器(PxPU):学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

STC-ISP软件中有这个IO口的一个配置工具:
学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

利用上一节的例程,改名为8.计数器,可以用T1来实现。
将void Timer0_Isr(void) interrupt 1屏蔽,调用T0中断屏蔽,本节不需要。
按手册上的例程顺序编写。

Tips:编译时提示错误FILE DOES NOT EXIST:

学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

C251 FATAL-ERROR -
  ACTION:  OPENING INPUT-FILE
  FILE:    \STC32\8.计势鱘COMM\stc32g.h
  ERROR:   FILE DOES NOT EXIST
C251 TERMINATED.

这里涉及“附录I关于Keil软件中 0xFD问题的说明”。

Keil项目路径名的字符中也不能含有带OxFD编码的汉字,否则Keil软件会无法正确编译此项目。故需要修改本工程的目录名:
改为英文名:8.Count_T1,编译正常通过,按键led循环亮灭。
课后可以试验一下通过改变H1跟TL1的值,实现2下亮灭。
这个值的确定可以使用STC-ISP中的I/O口配置工具,高级配置,设置条件:
学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

得到设置代码: P3PU = 0x20;

3.计数器的应用

见2017年全国大学生电子设计竞赛试题 ——直流电动机测速装置(O题),题目如下
学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

解题思路如下:
学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

M法测速:又叫做频率测量法。这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。设编码器单圈总脉冲数为C, 时间T0内,统计到的编码器脉冲数为M0,则转速n的计算公式为:
学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机

首先我们定义一个变量叫u16 Count_T1 = 0;初值设置为0。
改写中断处理函数:void Timer0_Isr(void) interrupt 1:

void Timer0_Isr(void) interrupt 1 //1ms进来执行一次,无需其他延时,重复赋值
{

	TimCount++; //计算2000次=2s,可以一直运行
	if(TimCount>= 2000)
	{
		TimCount = 0;

		Count_T1 = (TH1 * 256) + TL1; //单位:转/s,

		TH1 = 0;
		TL1 = 0;

		Show_Tab[4] = TimCount/1000%10;
		Show_Tab[5] = TimCount/100%10+10;
		Show_Tab[6] = TimCount/10%10;
		Show_Tab[7] = TimCount/1%10;		//取10位

	}

	SEG_Fre();		//计算得到结果后,数码管刷新

}

本例完整代码:

#include "COMM/stc.h"		//调用头文件
#include "COMM/usb.h"

#define KEY1 P32		//定义一个按键 引脚选择P32
#define KEY2 P33		//定义一个按键 引脚选择P33

#define BEEP P54		//定义一个按键 引脚选择P54

#define SEG_Delay  1	//延时多少ms

#define MAIN_Fosc 24000000UL	//定义主时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
	
u8 SEG_Tab[21] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff};	//0-9段码,0-9带小数点
u8 COM_Tab[8] = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe };	//0-7的位码数组
u8 Show_Tab[8] = {20,20,20,20,0,0,0,0};

u32 TimCount = 0;		//计数单位1ms
bit RUN_State = 0;		//开始运行/结束运行
u8 num = 0;

u16 Count_T1 = 0;

void sys_init();	//函数声明
void delay_ms(u16 ms);	//unsigned int 

void SEG_Fre( void ) 
{
	//位码选择第一位,段码选择0  
	P7 = COM_Tab[num];			//位码的选择
	P6 = SEG_Tab[Show_Tab[num]];//需要显示的数字的内码 赋给 P6   NUM =0 -> Show_Tab[num]] = 1 -> p6 = oxF9 
	//delay_ms(SEG_Delay);

	num++;
	if( num >7 )
		num = 0;	
}

//========================================================================
// 函数名称: Timer0_Init
// 函数功能: 定时器0初始化
// 入口参数: 无
// 函数返回: 无
// 当前版本: VER1.0
// 修改日期: 2023
// 当前作者: 
// 其他备注: 
//========================================================================
void Timer0_Init(void)		//1毫秒@24.000MHz
{
	AUXR &= 0x7F;			//定时器时钟12T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x30;				//设置定时初始值
	TH0 = 0xF8;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
}




void main()					//程序开始运行的入口
{
	
	sys_init();				//USB功能+IO口初始化
	usb_init();				//usb库初始化

	TMOD = 0x50;			//设置计数器模式   
	TL1 = 0x00;				//设置计数初始值
	TH1 = 0x00;				//设置计数初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	ET1 = 1;				//使能定时器1中断
	    
	P3PU = 0x20; 			//打开内部上拉4.1K

	Timer0_Init();
	
	EA = 1;					//CPU开放中断,打开总中断。
	
	while(1)		//死循环
	{
		if( DeviceState != DEVSTATE_CONFIGURED ) 	//
			continue;
		if( bUsbOutReady )								
		{
			usb_OUT_done();

		}

	
		
	}
}


void Timer0_Isr(void) interrupt 1
{
	
	
	TimCount++;			//每隔1ms+1		//	计数到2000 = 2s
	if( TimCount>=2000 )		//2秒定时时间到了
	{
		TimCount = 0;
		
		Count_T1 = (TH1 *256 )+ TL1;		// 转/2s  转/min
		TH1 = 0;
		TL1 = 0;
		
		Show_Tab[4] = Count_T1/1000%10;
		Show_Tab[5] = Count_T1/100%10;	
		Show_Tab[6] = Count_T1/10%10;		
		Show_Tab[7] = Count_T1/1%10;		//取10位 
	}
	SEG_Fre();		//数码管刷新的
}

void Timer1_Isr(void) interrupt 3
{
	
}

/*
 11111110 0XFE
 11111101 0XFD
 11111011 0XFB
 11110111 0XF7
 11101111 0XEF
 11011111 0XDF
 10111111 0XBF
 01111111 0X7F
*/

void sys_init()		//函数定义
{
    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

	P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
	
    P3M0 = 0x00;
    P3M1 = 0x00;
    
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定

    USBCLK = 0x00;	//使用CDC功能需要使用这两行,HID功能禁用这两行。
    USBCON = 0x90;
}


void delay_ms(u16 ms)	//unsigned int 
{
	u16 i;
	do
	{
		i = MAIN_Fosc/6000;
		while(--i);
	}while(--ms);
}

总结

了解计数器的使用方法和应用场景

课后练习:

尝试实现T法测速:又叫做周期测量法。这种方法是建立一个已知频率的高频脉冲并对其计数,计数时间由捕获到的编码器相邻两个脉冲的间隔时间TE决定, 计数值为M1。设编码器单圈总脉冲数为C,高频脉冲的频率为F0,则转速n的计算公式为:
学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义,STC32,学习,笔记,单片机文章来源地址https://www.toymoban.com/news/detail-697197.html

到了这里,关于学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++笔记之rolling counter(滚动计数器)

    一个 rolling counter(滚动计数器)是一个计数器,可以在给定的范围内不断增加,当达到最大值时会从最小值重新开始。 code review! 在上面的代码中, RollingCounter 类用于实现滚动计数器。它接受三个参数:最小值、最大值和起始值(默认为0)。 increment 函数用于增加计数器的值

    2024年02月11日
    浏览(35)
  • (数字逻辑笔记)用Verilog实现4位计数器。(时序逻辑)

    实验描述: 输入: Clock:如果计数器enable信号为1,那么在时钟上升沿,count加1 Enable:如果enable为1,那么在时钟上升沿,count加1;如果enable为0,count保持不变 Reset:重置信号,如果reset为0,count重置为0 输出: Count[3:0]:4位计数信号,范围:4‘b0000 – 4’b1111 实现代码: Tes

    2024年02月11日
    浏览(42)
  • 【鸿蒙软件开发】ArkUI之容器组件Counter(计数器组件)、Flex(弹性布局)

    Counter容器组件:计数器组件,提供相应的增加或者减少的计数操作。 Flex容器组件:以弹性方式布局子组件的容器组件。 计数器组件,提供相应的增加或者减少的计数操作。 说明 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本

    2024年02月06日
    浏览(43)
  • 【FPGA零基础学习之旅#7】BCD计数器设计

    🎉欢迎来到FPGA专栏~BCD计数器设计 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 顶层模块中的BCD模块级联: Verilog实现

    2024年02月08日
    浏览(48)
  • 【FPGA零基础学习之旅#6】ip核基础知识之计数器

    🎉欢迎来到FPGA专栏~ip核基础知识之计数器 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ LPM_COUNTER IP核 的RTL视图: IP核

    2024年02月09日
    浏览(43)
  • 蓝桥杯单片机学习6——定时器/计数器&定时器实现秒表功能

    上一期我们学习了外部中断的相关内容,现在我接着来学习定时器。 定时器/计数器是一种能够对内部时钟信号或者外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断请求,从而实现定时或计数功能的外设。定时器的基本工作原理是进行计数。 举个栗子 :你可

    2024年02月04日
    浏览(45)
  • 【FPGA】Verilog:计数器 | 异步计数器 | 同步计数器 | 2位二进制计数器的实现 | 4位十进制计数器的实现

    目录 Ⅰ. 实践说明 0x00 计数器(Counter) 0x01 异步计数器(Asynchronous Counter)

    2024年02月05日
    浏览(54)
  • 【FPGA】Verilog:升降计数器 | 波纹计数器 | 约翰逊计数器 | 实现 4-bit 升降计数器的 UP/DOWN

    目录 Ⅰ. 理论部分 0x00 升降计数器(UP DOWN Counter) 0x01 波纹计数器(Ripple Counter)

    2024年02月05日
    浏览(49)
  • go限流、计数器固定窗口算法/计数器滑动窗口算法

    问题1:后端接口只能支撑每10秒1w个请求,要怎么来保护它呢? 问题2:发短信的接口,不超过100次/时,1000次/24小时,要怎么实现? 所谓固定窗口,就是只设置了一个时间段,给这个时间段加上一个计数器。 常见的就是统计每秒钟的请求量。 这里就是一个QPS计数器。 在这一

    2024年04月26日
    浏览(39)
  • FPGA拾忆_(3):调用IP 计数器&BCD计数器

    调用IP计数器: 每来一个cin(进位输入)信号,计数器输出值加一,当计数值为9且cin为1时,输出一个时钟长度的cout(进位输出)信号。 首先采用调用quartus种IP的方式,具体步骤: Tools----IP Catalog: 然后会调出IP目录窗口: 通过搜索counter来添加计数器模块,需要设置的内容

    2024年02月03日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包