单片机课程设计:脉冲计数器实现方案

目录

  • 一、设计题目
  • 要求:
  • 控制功能:
  • 使用的主要元器件:
  • 结果的验证:
  • 二、原理图
  • 仿真图
  • 硬件
  • 键盘和LED
  • 8255电路 数码管驱动电路
  • 三、程序框图
  • 四、部分程序
  • c语言
  • 汇编语言
  • 五、下载资源
  • 一、设计题目

    要求:

    利用单片机对单片机实验箱的按键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
    
    

    五、下载资源

    在文档最后
    https://docs.qq.com/doc/DTllyaElCY0RoVEZk

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机课程设计:脉冲计数器实现方案

    发表评论