-
2021-05-21 07:56:00
sbit P2_0 = P2^0;//数码管选定位
sbit P2_1 = P2^1;//数码管选定位
sbit P2_2 = P2^2;//数码管选定位
sbit P2_3 = P2^3;//数码管选定位
//共阳极数码管
unsigned char code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
unsigned int motorspeed = 0;
unsigned char GE, SHI, BAI, QIAN;
unsigned int counter = 0;//脉冲数
unsigned int calsp;//设定多长时间计数一次
void display();//数码管显示
void delay();//延迟函数
void calspeed();
void main()
{
EA = 1;//开启总中断
EX0 = 1;//开启外部中断0
IT0 = 1;//设置成下降沿触发方式
TMOD = 0x01;//设置定时器0为模式1,即16位计数模式
TH0 = (65536-10000)/256;//计数时间为10ms
TL0 = (65536-10000)%256;
ET0 = 1;//开启定时器0中断
TR0 = 1;//启动定时器0
P2 = P2&0xf0;//将P2的1~4置1
while(1)
{
display();
calspeed();
}
return ;
}
void calspeed()
{
if (calsp == 100)//100*10=1s计算1次
{
motorspeed = motorspeed + counter;
counter = 0;//清零脉冲数
calsp = 0;//清零标志
}
}
//数码管显示函数,依次点亮数码管
void display()
{
GE = motorspeed%10;
SHI = motorspeed/10%10;
BAI = motorspeed/100%10;
QIAN = motorspeed/1000%10;
P2_0 = 1;
P0 = table[QIAN];
delay();
P2_0 = 0;
P2_1 = 1;
P0 = table[BAI];
delay();
P2_1 = 0;
P2_2 = 1;
P0 = table[SHI];
delay();
P2_2 = 0;
P2_3 = 1;
P0 = table[GE];
delay();
P2_3 = 0;
}
//延迟函数
void delay()
{
unsigned char i = 10;
while(i--)
;
}
void _TIMER0() interrupt 1
{
TH0 = (65536-10000)/256;//重新装入初值,计数时间为10ms
TL0 = (65536-10000)%256;
calsp++;
}
//INT0输入
void _INT0() interrupt 0
{
counter++;
}
更多相关内容 -
脉冲计数实验
2018-05-16 20:11:35熟悉计数器实现脉冲计数的方法。 3. 掌握用Keil实现单片机系统仿真的方法。 4. 掌握用Proteus实现单片机系统仿真的方法。 二、实验预备知识 定时器/计数器工作于计数方式时,定时器0外部输入端(P3.4)或定时器1外部... -
外部中断----脉冲计数实验
2013-11-16 12:33:52每中断一次,发光二极管依次从左向右点亮,中断8次后,程序结束。 -
STM32F1基本定时器实验-外部触发脉冲计数
2021-08-25 22:13:30STM32F1定时器实验-外部触发脉冲计数 之前我们用外部中断测量了PWM的频率,而外部触发是设置2个定时器,利用按键触发,一个定时器2用来接受外部触发信号并计数,另一个定时器6实时检测按键。 按照这样的思路,我们的...STM32F1定时器实验-外部触发脉冲计数
之前我们用外部中断测量了PWM的频率,而外部触发是设置2个定时器,利用按键触发,一个定时器2用来接受外部触发信号并计数,另一个定时器6实时检测按键。
按照这样的思路,我们的按键读取用状态机思想去读取,使定时器6产生10ms的定时中断来实时检测按键并利用状态机设计思想处理按键信号,将PA1设置成输出引脚,设置定时器2的PA0引脚来接收信号,通过按键触发改变标志位来发送电平信号,再定义全局数存放PA0接收脉冲信号次数,最后串口配置。
什么?你不知道状态机思想?送你学习状态机
说实话,状态机思想可以清晰把你的代码逻辑弄清楚,这个是我自己写按键时画的草图:
画的只要你自己可以看懂就行代码讲解
首先我们需要按键的状态,它的状态分为检测,按下,释放,所以定义枚举类型的结构体
/* USER CODE BEGIN PTD */ typedef enum { KEY_CHECK=0, KEY_CONFRIM, KEY_RELAESE }KEY_STATE; /* USER CODE END PTD */
状态变量的定义以及标志位,计数值
/* USER CODE BEGIN PV */ KEY_STATE keyState=KEY_CHECK; int Result=0; uint8_t keyvalue=0; /* USER CODE END PV */
对于按键检测,是在TIM6里处理的,选用KEY1即PE3
而之间的状态转移是通过判断电平实现的,按下时为低电平,未按下为高电平,根据我们按下的一个完整过程,我们可以通过switch语句实现我们的整个过程
/* USER CODE BEGIN 4 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance==TIM6)//判断是否为TIM6中断 { switch(keyState) { case KEY_CHECK://检测状态下 { if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_RESET)//检测按键为低电平 { keyState=KEY_CONFRIM;//确认按下状态 } break; } case KEY_CONFRIM://确认按下状态下 { if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_RESET)//再次判断 { keyvalue=1;//改变标志位用于触发脉冲信号 keyState=KEY_RELAESE;//按下后释放 } else { keyState=KEY_CHECK;//排除抖动干扰或者误判,回到检测 } break; } case KEY_RELAESE://释放状态下 { if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_SET) //判断按键未按下 { keyState=KEY_CHECK;//回到检测状态 // keyvalue=1; } break; } default: break; } } } /* USER CODE END 4 */
主函数内
/* USER CODE BEGIN 2 */ HAL_TIM_Base_Start(&htim2);//开启TIM2用于计数 HAL_TIM_Base_Start_IT(&htim6);//开启TIM6用于按键检测 printf("Timer counter founction test: \n");//串口起始提示 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(keyvalue==1)//如果为按下状态 { keyvalue=0; HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET); HAL_Delay(1); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET); HAL_Delay(1);//发出周期为2ms的脉冲 Result=__HAL_TIM_GET_COUNTER(&htim2);//读取计数值 printf("Counter:%d.\n",Result); } } /* USER CODE END 3 */
CUBEMX配置
1.时钟配置外部晶振,主时钟为72MHz
2.GPIO:选择PA1输出,PE3输入
3.TIM:
TIM2:Clock Source:外部触发
这时PA0为你的触发引脚
TIM6:激活并生成10ms中断
4.usart设置
5.Project的设置,
还有一个之前没注意,就是在Code Generator一栏中第一个方框里选择第二个:Copy only the necessary library files,要不一个工程就是百八十MB,占内存。
最后生成代码 -
C51单片机实验——脉冲计数显示(proteus+asm)
2022-05-10 20:15:04微机原理的C51单片机实验——脉冲计数显示,Proteus绘制电路图,keil5编写asm代码前言
- 脉冲信号输入进2级74LS14整形
T1接收脉冲信号并计数,显示在LED - 外部中断0控制计数器的启动/停止
外部中断1控制计数器的清零复位 - P1.0控制LED的段选口使能信号
P1.1控制LED的位选口使能信号
Proteus电路图
asm代码
ORG 0000H LJMP INIT ORG 0003H //外部中断0 LJMP INT0SUB ORG 0013H //外部中断1 LJMP INT1SUB ORG 0100H INIT: CLR P1.0 //控制端复位 CLR P1.1 MOV DPTR,#TABLE //指向表头 MOV R0,#03H //循环次数 MOV R1,#7FH //位选信号 MOV TMOD,#50H //工作模式 MOV TL1,#00H //初始化 SETB EA //启动总中断 SETB EX0 //启动外部中断0 SETB EX1 //启动外部中断1 SETB TR1 //启动计数器1 TRANS: SETB TR1 //启动计数器1 MOV A,TL1 //16进制转10进制 MOV B,#10 DIV AB MOV 40H,B //个位 MOV B,#10 DIV AB MOV 41H,B //十位 MOV 42H,A //百位 MAIN: MOV A,R1 //位选信号 MOV P0,A //输出位信号 SETB P1.1 //上升沿 CLR P1.1 MOV A,40H //段选信号 MOVC A,@A+DPTR MOV P0,A //输出段信号 SETB P1.0 //上升沿 CLR P1.0 MOV 40H,41H //改变段选信号 MOV 41H,42H MOV A,R1 RR A //位选右移 MOV R1,A LCALL DELAY //延时1ms DJNZ R0,MAIN //循环3次 MOV R0,#03H //循环次数复位 MOV R1,#7FH //位选信号复位 SJMP TRANS INT0SUB:CLR TR1 //启动/停止 RETI INT1SUB:MOV TL1,#00H //清0 RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH //段选表 DELAY: MOV 30H,#2 //延时1ms MOV 31H,#234 NEXT: DJNZ 31H,NEXT DJNZ 30H,NEXT RET END
注:本例程只编写了TL1值的显示,上限255
(显示TH1或其他位的值同理,增加段选信号存放区域即可)效果图
- 脉冲信号输入进2级74LS14整形
-
51单片机计数测速(外部脉冲频率)proteus仿真加源码
2021-05-22 08:53:03/********************************************************************...假设转盘只有一个磁钢,转速低于10r/S则显示0,高于655360r/s则计数溢出(一般应用不会超出此限)***************************************.../*********************************************************************
功能:霍尔传感器测速,霍尔传感器的信号输出脚接T1(P3.5)引脚
测量范围;假设转盘只有一个磁钢,转速低于10r/S则显示0,高于655360r/s则计数溢出(一般应用不会超出此限)
*******************************************************************/
#include
#define N 1//转盘上所安装的磁钢个数
sbit DLed1=P2^0;//定义第一位数码管"位选"控制线的别名
sbit DLed2=P2^1;//定义第二位数码管"位选"控制线的别名
sbit DLed3=P2^2;
sbit DLed4=P2^3;
unsigned int speed=0;//最后的转速值
unsigned int count=0;//在指定时间内记到的外部脉冲数
unsigned char k=0;
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void disp(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4);//子函数前向声明
/*********************************
函数名称:void delay1ms(unsigned int k)
功能:延时子函数
入口参数:延时时长
返回值:无
**********************************/
void delay1ms(unsigned int k)
{
unsigned char n,m;
for(m=0;m
{for(n=0;n<115;n++);}
}
//===================主函数
void main()
{
unsigned char n;
//EA=0;
TMOD=0x51;//0101 0001,T1纯软件启动,计数模式,工作方式1;T0纯软件启动,定时模式,工作方式1
TH0=0x3c;//12M晶振,定时50ms
TL0=0xb0;
ET0=1;//开启定时0中断
EA=1;//开启总中断
TR0=1;//同时启动定时与计数
TR1=1;
while(1)
{
speed=count/N;//结果为:x转/s,注意防止其越界
for(n=20;n>0;n--)//稳定显示一阵
{
disp(speed/1000,speed%1000/100,speed%100/10,speed%10);
}
TR0=1;//再次启动定时和计数功能,为下一次的测量作准备
TR1=1;
}
}
/*********************************
函数名称:
功能:T0中断处理函数
说明:定时时间到,则关闭定时器,取出计数值
入口参数:
返回值:
**********************************/
void int0_fun() interrupt 1
{
k++;
TH0=0x3c;//重载定时器T0初值
TL0=0xb0;
if(k>=20)//100ms的定时时间到
{
TR0=0;
TR1=0;
count=TH1*256+TL1;
TH1=0x00;//清除计数值
TL1=0x00;
k=0; //清除标志变量
}
}
/********************************
功能:显示函数
四位数码管的显示函数
段选:P1
位选:P20-P23
注意:采用的共阳数码管
***************************/
void disp(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4)
{
DLed1=1;DLed2=0;DLed3=0;DLed4=0;//送位码,只让第一位数码管显示
P1=tab[x1];//送段码
delay1ms(10);//延时
P1=0xff;//关闭
//----扫描显示第二位数码管------
DLed1=0;DLed2=1;DLed3=0;DLed4=0;
P1=tab[x2];
delay1ms(10);
P1=0xff;
//----扫描显示第三位数码管------
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
-
外部中断测脉冲个数
2021-05-21 07:56:591.外部中断的常用功能外部中断经常用来记录外部脉冲的个数,也就是当我们使用外部中断1时,如果想记录自身单片机的某个引脚的下降沿个数,只需用杜邦线把这个引脚和P3.3连接即可。比如P2.3引脚产生这样的电平无规律... -
【单片机】脉冲计数(定时/计数器实验)
2021-04-27 13:43:48【单片机】脉冲计数(定时/计数器实验) 一、操作目的 二、操作内容 三、程序框图 四、程序接线图 五、程序清单 六、代码详解 一、操作目的 熟悉单片机内部定时/计数器功能,掌握初始化编程方法。 二、操作内容 把... -
实验6_单片机定时计数实验_单片机定时器_外部计数器_
2021-09-28 21:45:40实现在1S的时间内对外部输入的脉冲信号(从P3.4输入)计数,并将计数值实时地在四位BCD码数码管上显示。AT89C51中有两个定时/计数器,其中定时/计数器1(T1)作定时器用,定时1S;定时/计数器0(T0)作计数器用;... -
单片机计数器实验报告.doc
2021-05-21 02:22:58㈡ 实验器材G6W仿真器一台MCS—51实验板一台PC机一台电源 一台信号发生器一台㈢ 实验内容及要求8051内部定时计数器,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数,使用8051的T1作定时器,50ms中断... -
c51计数功能的实现、脉冲计数
2012-04-22 20:00:30用杜邦线讲P1.3口接到P3.4上 利用c51计数功能,脉冲计数,利用定时器1再P1.3口产生脉冲,用定时器0接受脉冲并计数,当计时器0溢出时,P1.4口取反,使P1.4同样产生脉冲,P1.4的周期为P1.3六倍 -
T0用作频率发生器;T1采样外部脉冲
2019-09-11 16:14:24定时器T0用作频率发生器,输出2.5KHz、50%占空比的频率;定时器T1采样外部脉冲,计数到2500个脉冲则使LED灯取反。 -
用单片机T0的计数功能对外部脉冲进行1000次计数
2022-03-16 22:28:54用单片机T0的计数功能对自己加上的外部脉冲记1000次数,只能用计数器,并且外部脉冲是自己设置的周期或频率。 就是通过计数模式对外部脉冲记1000次数模拟出租车行驶了1000米,里程数会加1,要求是一定要这么表现出租... -
ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数
2021-05-13 17:06:55ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数 前言,继续上一篇的内容。因为上一篇刚好实验了iic和spi,形成一对。接下来讲pwm另起一篇。 一、电机PWM输出 - MCPWM 官方例程: esp-idf/examples/... -
stm32通用定时器用做外部脉冲计数器的例程
2018-07-05 14:21:42原文: https://blog.csdn.net/sdutkqb/article/details/39100971最近几天要用到stm32对外部输入脉冲进行计数,很自然想到定时器,可是手上资料没有讲解stm32定时器如何用作外部计数器的,在网上找例程,也没找到几... -
基于AT89S51单片机实现信号频率计数功能的设计
2021-05-23 04:32:32利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。1. 电路原理图图4.31.... -
c语言控制51单片机模拟实验 定时器/计数器、外部中断实验
2021-04-07 15:58:54实验过程实验目的实验内容1、定时器2、计数器方法1方法二外部中断 本实验使用使用c语言在Keil uVision 4软件编程,使用Proteus软件模拟单片机运行,掌握单片机使用定时器、计数器和外部中断的方法。51单片机设置晶振... -
利用51单片机统计脉冲个数,即时输出显示
2021-05-23 01:34:41利用51单片机设计一个计数显示系统,要求8个数码管显示T1输入脉冲的个数。;最好用汇编语言,加注释,尽量别太复杂。尽量快些哈!;悬赏分:30 | 解决时间:2011-7-20 19:15 |;======================================... -
实验一 外部中断实验
2019-01-18 11:01:23当89C51的CPU正在处理某件事情(如正在执行主程序)时,单片机外部或内部发生的某一事件(如外部设备产生的一个电平变化或脉冲跳沿的变化,或者是片内事件的发生,如计数器的计数溢出等)请求CPU... -
基于Proteus仿真51单片机定时器、计数器应用实验
2020-06-23 20:14:261.基本任务 (1)利用单片机定时器/计数器设计一个秒表,由 P0 口连接 LED 灯,采用 ...定时器,0.1s 中断一次,看 T0 内每 0.1s 来了多少脉冲,将其数值按二进制数在 P1 口 驱动 LED 灯上显示出来,5 秒后再次测试。 -
频率计-外部频率测试LCD1602显示实验例程C51单片机KEIL工程源码文件.zip
2021-11-17 13:33:50内容:T0外部计数,T1计时1S,计算1S内外部脉冲个数,并在液晶显示 频率:单位时间内完成振动的次数 ------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,... -
英创信息技术脉冲计数功能在ESM335x-Linux主板上的实现
2021-05-17 13:03:19英创嵌入式主板ESM335X系列 Linux系统现已实现外部输入脉冲信号的计数、频率、周期、占空比测量功能。主要功能及技术指标如下:1、读取一段时间内的外部输入脉冲信号计数值。2、外部输入脉冲信号周期、有效脉宽测量... -
DSP eCAP脉冲捕获实验
2021-12-27 22:41:20捕获单元模块(eCAP)能够捕获外部输入引脚的逻辑状态(电平的高或者低、 低电平翻转时的上升沿或下降沿),并利用内部定时器对外部事件或者引脚状态 变化进行处理。典型应用如下: --电机测速。 --测量脉冲电平... -
STM32F407+CubeMX-使用TIM计算编码器的脉冲总数,并计算脉冲方向
2021-07-15 21:00:13文章目录一、前言二、本次实验的编码器三、编码器与STM32的连接四、CubeMX的配置4.1、RCC4.2、Clock Configuration4.3、TIM24.4、生成代码五、Keil5.1、Target5.2、C/C++5.3、Debug六、代码6.1、main.c七、DEBUG7.1... -
单片机C语言程序设计:用计数器中断实现100以内的按键计数
2020-08-28 19:26:09名称:用计数器中断实现 100 以内的按键计数 说明:本例用 T0 计数器中断实现按键技术,由于计数寄存器初值为 1,因此 P3.4 引脚的每次负跳变都会触发 T0 中断,实现计数值累加。计数器的清零用外部中断 0 控制。