脉冲计数器 单片机课程设计

一、设计题目

要求:

利用单片机对单片机实验箱的按键S29发出的负脉冲个数进行加/减计数,计数结果(0~255)在8个LED数码管中的3位进行显示(使用8255进行动态驱动)。

控制功能:

利用拨动开关S26来选择计数的方式。S26接高电平时,进行加法计数。S26接低电平时,进行减法计数;利用拨动开关S27控制计数器的计数。当S27接高电平时,计数器停止计数,同时保持当时的计数结果。当S27接低电平时,计数器处于连续计数工作状态,这时按动S29则进行加/减计数;利用拨动开关S28来控制计数器的复位。当S28接高电平时,计数器处于复位状态,同时将计数结果清零。当S28接低电平时,计数器处于正常计数状态。

使用的主要元器件:

89C51、11.0592MHz晶振、74LS373、74LS138、8255、74LS240、74LS244、共阴极LED数码管LG4042AH、拨动开关S26~S28、按键S29等。

结果的验证:

按动单片机实验系统的按键S29,观察三位数码管的显示是否正确。拨动S26、S27和S28,查看其功能是否正确。分析该计数器的最高工作频率是多少?若要对不同幅值的非方波进行计数,电路应如何改进?

二、原理图

仿真图

在这里插入图片描述

硬件

键盘和LED

在这里插入图片描述
A: 按键的列线
B: 数码管段码
C: 数码管选择脚
D: 按键的行线

8255电路 数码管驱动电路

在这里插入图片描述

CS: 片选信号,低电平有效; A0、A1: 地址信号。
JP52: PC口(键盘行); JP53: PB口;
JP56: PA口(键盘列); JP75: 数码管段码
JP79: 数码管段选
在这里插入图片描述

设计中用到的命令字为80H(将A、B、C口设为基本输出模式)

三、程序框图

在这里插入图片描述

四、部分程序

c语言

#include <REG51.H>
#include<absacc.h>
#define uint unsigned int
#define uchar unsigned char
#define PA XBYTE[0Xf000]  
#define PB XBYTE[0Xf001]    
#define com XBYTE[0Xf003]   
sbit sw26=P1^0;
sbit sw27=P1^1;
sbit sw28=P1^2;
sbit sw29=P3^5;
uchar m,count;
uint u=1;
uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar chocode[]={0xfe,0xfd,0xfb};
void delay(uint n)
{
	uint v;
	for(;n>0;n--)
	{
		for(v=0;v<110;v++) ;
	}
}
void display(uchar g)
{
	uchar i;
	uint j,k;
	j=(int)g; 
	com=0x80;	
	for(i=0;i<3;i++)
	{
		PB=chocode[i];
		k=j%10;
		PA=~codevalue [k];
		j=j/10;
		delay(2);
	}
}
void main()
{

}

汇编语言

;===========================================================
;这是一个脉冲计数器的主控程序,单片机晶振频率11.0592MHz。
;开关S26(P1.0)用来设定计数器的加/减计数。
;开关S27(P1.1)用来设定计数器的启动/停止。
;开关S28(P1.2)用来设定计数器的复位/正常计数。
;按钮S29用来输入计数脉冲。
;显示采用8个LED数码管中的3个,动态驱动方式。
;-----------------------------------------------------------
COM8255	EQU	8003H		;8255命令口
PA_8255	EQU	8000H		;8255的A口
PB_8255	EQU	8001H		;8255的B口
COUNT	EQU	20H		;计数单元
BUFFER	EQU	21H		;显示缓冲区占用2个字节,21H-22H
A_S	BIT	P1.0		;高电平为加法计数
R_S	BIT	P1.1		;高定平为启动计数,低电平为停止计数
R_N	BIT	P1.2		;高电平为复位,低电平为正常计数
	ORG	0
	LJMP	START
	ORG	0BH
	LJMP	T0S		;转计时处理
	ORG	1BH
	LJMP	T1S
	ORG	30H
START:	MOV	SP,#60H
	MOV	DPTR,#COM8255	;指向8255命令口
	MOV	A,#80H		;PA、PB、PC设为基本输出模式
	MOVX	@DPTR,A
	MOV	TMOD,#16H	;设T0计数器,方式2;T1为定时器,方式1
	MOV	TH0,#0FFH	
	MOV	TL0,#0FFH
	MOV	TH1,#0DCH	;T1定时10ms,晶振频率11.0592MHz
	MOV	TL1,#00H
	SETB	PT0		;T0为高级中断
	SETB 	ET0		;允许T0中断
	SETB 	ET1		;允许T1中断
	SETB	EA		;开中断
	SETB	TR1		;启动T1定时
	MOV	BUFFER,#0A0H	;显缓区初始化,熄灭千位
	MOV	BUFFER+1,#0

;====================================================
;T0中断服务程序
;根据S26的电平进行加/减计数
;---------------------------------------------------
T0S:	PUSH	PSW
	SETB	A_S
	JNB	A_S,T0S1	;减法计数则转移
	INC	COUNT
	SJMP	T0S2
T0S1:	DEC	COUNT
T0S2:	POP	PSW
	RETI
;

;===========================================
;这是一个将16进制数转换为BCD码的程序
;待转换的16进制数在R6中,转换完的结果在R2R3中
;使用的寄存器A,B,R6,R2,R3
;--------------------------------------------
BTOD:	MOV	A,R6
	MOV	B,#100
	DIV	AB
	MOV	R2,A
	MOV	A,B
	MOV	B,#10
	DIV	AB
	SWAP	A
	ADD	A,B
	MOV	R3,A
	RET
;=====================================================
;动态显示子程序
;使用寄存器:R0,R2,R3,A,DPTR
;-----------------------------------------------------
DISP:	MOV	DPTR,#PB_8255	;消隐数码管,实际实验箱上不需要
	MOV	A,#0FFH		;消隐数码管,实际实验箱上不需要
	MOVX	@DPTR,A		;消隐数码管,实际实验箱上不需要
	MOV	R0,#BUFFER+1	;指向显缓区最后一个字节
	MOV	R3,#2		;显示字节数为2字节
	MOV	R2,#0FEH	;位码初值,点亮最右边的数码管
LOOP:	MOV	A,@R0
	ANL	A,#0FH		;取出低4位
	MOV	DPTR,#TAB
	MOVC	A,@A+DPTR
	MOV	DPTR,#PA_8255
	MOVX	@DPTR,A		;段码送8255的A口
	MOV	A,R2
	INC	DPTR		;指向8255的B口
	MOVX	@DPTR,A		;位码送8255的B口
	RL	A		;位码左移
	MOV	R2,A		;存位码
	LCALL	DELAY2MS	;延时2ms
	MOV	DPTR,#PB_8255	;消隐数码管,实际实验箱上不需要
	MOV	A,#0FFH		;消隐数码管,实际实验箱上不需要
	MOVX	@DPTR,A		;消隐数码管,实际实验箱上不需要
	MOV	A,@R0
	ANL	A,#0F0H		;取出高4位
	SWAP	A
	MOV	DPTR,#TAB
	MOVC	A,@A+DPTR
	MOV	DPTR,#PA_8255
	MOVX	@DPTR,A		;段码送8255的A口
	MOV	A,R2
	INC	DPTR		;指向8255的B口
	MOVX	@DPTR,A		;位码送8255的B口
	RL	A		;位码左移
	MOV	R2,A		;存位码
	LCALL	DELAY2MS	;延时2ms	
	MOV	DPTR,#PB_8255	;消隐数码管,实际实验箱上不需要
	MOV	A,#0FFH		;消隐数码管,实际实验箱上不需要
	MOVX	@DPTR,A		;消隐数码管,实际实验箱上不需要	
	DEC	R0
	DJNZ	R3,LOOP
	MOV	A,#0FFH
	MOVX	@DPTR,A		;熄灭所有数码管
	RET
TAB:	DB	0C0H,0F9H,0A4H,0B0H, 99H, 92H
	DB	82H, 0F8H, 80H, 90H, 0FFH
;==============================================
;2ms延时子程序
;使用寄存器:R7
;对于11.0592MHz晶振,实际延时2174微秒=2.174ms
;在主程序中调用,被T0中断打断后实际延时大约为10.87ms左右
;----------------------------------------------
DELAY2MS:
	MOV	R7,#250
DD1:	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DJNZ	R7,DD1
	RET
	END

五、资源获取

微信公众号:而为若的宇宙
微信号:lazyjualay

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基于STM32的脉冲计数器是一种能够对输入脉冲进行计数和测量的硬件或软件模块。STM32是STMicroelectronics公司推出的32位单片机系列,具有高性能、低功耗和丰富的外设资源。 脉冲计数器通常用于测量旋转速度、频率、周期以及脉冲数量等。基于STM32的脉冲计数器通过使用外部中断或者计数器模块,可以轻松地实现对外部脉冲计数功能。 在使用外部中断的方式下,STM32的GPIO引脚被配置为中断输入模式。当外部脉冲到来时,会触发中断,并在中断服务函数中进行脉冲计数的操作。中断服务函数可以很方便地对计数值进行增加或者减少,并在需要的时候读取计数值。 在使用计数器模块的方式下,STM32的TIM(定时器)模块可以被用作脉冲计数器。通过配置计数器的模式和时钟源,可以将计数器模块用于脉冲计数功能。计数器模块可以实现精确的计数和测量,同时可以通过定时器的自动重装载功能实现连续计数。 基于STM32的脉冲计数器可以应用于很多领域,比如工业自动化、电机控制、位置测量等。通过结合STM32的丰富外设和强大的计算能力,脉冲计数器可以实现更复杂的功能,比如测量脉冲频率并输出PWM信号、实现高速脉冲计数等。 总结来说,基于STM32的脉冲计数器具有灵活性、精确性和可扩展性,能够满足各种脉冲计数应用需求,并结合其他功能实现更高级的控制和测量功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值