精华内容
下载资源
问答
  • 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外部...
  • 每中断一次,发光二极管依次从左向右点亮,中断8次后,程序结束。
  • STM32F1定时器实验-外部触发脉冲计数 之前我们用外部中断测量了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绘制电路图,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或其他位的值同理,增加段选信号存放区域即可)

    效果图

    在这里插入图片描述

    展开全文
  • /********************************************************************...假设转盘只有一个磁钢,转速低于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:59
    1.外部中断的常用功能外部中断经常用来记录外部脉冲的个数,也就是当我们使用外部中断1时,如果想记录自身单片机的某个引脚的下降沿个数,只需用杜邦线把这个引脚和P3.3连接即可。比如P2.3引脚产生这样的电平无规律...
  • 【单片机】脉冲计数(定时/计数器实验) 一、操作目的 二、操作内容 三、程序框图 四、程序接线图 五、程序清单 六、代码详解 一、操作目的 熟悉单片机内部定时/计数器功能,掌握初始化编程方法。 二、操作内容 把...
  • 实现在1S的时间内对外部输入的脉冲信号(从P3.4输入)计数,并将计数值实时地在四位BCD码数码管上显示。AT89C51中有两个定时/计数器,其中定时/计数器1(T1)作定时器用,定时1S;定时/计数器0(T0)作计数器用;...
  • 实验器材G6W仿真器一台MCS—51实验板一台PC机一台电源 一台信号发生器一台㈢ 实验内容及要求8051内部定时计数器,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数,使用8051的T1作定时器,50ms中断...
  • 用杜邦线讲P1.3口接到P3.4上 利用c51计数功能,脉冲计数,利用定时器1再P1.3口产生脉冲,用定时器0接受脉冲并计数,当计时器0溢出时,P1.4口取反,使P1.4同样产生脉冲,P1.4的周期为P1.3六倍
  • 定时器T0用作频率发生器,输出2.5KHz、50%占空比的频率;定时器T1采样外部脉冲计数到2500个脉冲则使LED灯取反。
  • 用单片机T0的计数功能对自己加上的外部脉冲记1000次数,只能用计数器,并且外部脉冲是自己设置的周期或频率。 就是通过计数模式对外部脉冲记1000次数模拟出租车行驶了1000米,里程数会加1,要求是一定要这么表现出租...
  • ESP32 单片机学习笔记 - 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单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数计数误差不超过±1HZ。1. 电路原理图图4.31....
  • 实验过程实验目的实验内容1、定时器2、计数器方法1方法二外部中断 本实验使用使用c语言在Keil uVision 4软件编程,使用Proteus软件模拟单片机运行,掌握单片机使用定时器、计数器和外部中断的方法。51单片机设置晶振...
  • 利用51单片机设计一个计数显示系统,要求8个数码管显示T1输入脉冲的个数。;最好用汇编语言,加注释,尽量别太复杂。尽量快些哈!;悬赏分:30 | 解决时间:2011-7-20 19:15 |;======================================...
  • 实验外部中断实验

    万次阅读 2019-01-18 11:01:23
    当89C51的CPU正在处理某件事情(如正在执行主程序)时,单片机外部或内部发生的某一事件(如外部设备产生的一个电平变化或脉冲跳沿的变化,或者是片内事件的发生,如计数器的计数溢出等)请求CPU...
  • 1.基本任务 (1)利用单片机定时器/计数器设计一个秒表,由 P0 口连接 LED 灯,采用 ...定时器,0.1s 中断一次,看 T0 内每 0.1s 来了多少脉冲,将其数值按二进制数在 P1 口 驱动 LED 灯上显示出来,5 秒后再次测试。
  • 内容:T0外部计数,T1计时1S,计算1S内外部脉冲个数,并在液晶显示 频率:单位时间内完成振动的次数 ------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,...
  • 英创嵌入式主板ESM335X系列 Linux系统现已实现外部输入脉冲信号的计数、频率、周期、占空比测量功能。主要功能及技术指标如下:1、读取一段时间内的外部输入脉冲信号计数值。2、外部输入脉冲信号周期、有效脉宽测量...
  • DSP eCAP脉冲捕获实验

    千次阅读 2021-12-27 22:41:20
    捕获单元模块(eCAP)能够捕获外部输入引脚的逻辑状态(电平的高或者低、 低电平翻转时的上升沿或下降沿),并利用内部定时器对外部事件或者引脚状态 变化进行处理。典型应用如下: --电机测速。 --测量脉冲电平...
  • 文章目录一、前言二、本次实验的编码器三、编码器与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...
  • 名称:用计数器中断实现 100 以内的按键计数 说明:本例用 T0 计数器中断实现按键技术,由于计数寄存器初值为 1,因此 P3.4 引脚的每次负跳变都会触发 T0 中断,实现计数值累加。计数器的清零用外部中断 0 控制。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,085
精华内容 834
关键字:

外部脉冲计数实验