单片机编码器经典测试

合集下载

编码器使用教程与测速原理

编码器使用教程与测速原理

编码器使用教程与测速原理我们将通过这篇教程与大家一起学习编码器的原理,并介绍一些实用的技术。

1.编码器概述编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感器,我们可以通过编码器测量到底位移或者速度信息。

编码器从输出数据类型上分,可以分为增量式编码器和绝对式编码器。

从编码器检测原理上来分,还可以分为光学式、磁式、感应式、电容式。

常见的是光电编码器(光学式)和霍尔编码器(磁式)。

2.编码器原理光电编码器是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。

光电编码器是由光码盘和光电检测装置组成。

光码盘是在一定直径的圆板上等分地开通若干个长方形孔。

由于光电码盘与电动机同轴,电动机旋转时,检测装置检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。

霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。

霍尔编码器是由霍尔码盘和霍尔元件组成。

霍尔码盘是在一定直径的圆板上等分地布置有不同的磁极。

霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。

可以看到两种原理的编码器目的都是获取AB相输出的方波信号,其使用方法也是一样,下面是一个简单的示意图。

3.编码器接线说明具体到我们的编码器电机,我们可以看看电机编码器的实物。

这是一款增量式输出的霍尔编码器。

编码器有AB相输出,所以不仅可以测速,还可以辨别转向。

根据上图的接线说明可以看到,我们只需给编码器电源5V供电,在电机转动的时候即可通过AB相输出方波信号。

编码器自带了上拉电阻,所以无需外部上拉,可以直接连接到单片机IO读取。

4.编码器软件四倍频技术下面我们说一下编码器倍频的原理。

为了提高大家下面学习的兴趣,我们先明确,这是一项实用的技术,可以真正地把编码器的精度提升4倍。

作用可类比于单反相机的光学变焦,而并非牺牲清晰度来放大图像的数码变焦。

基于STM32单片机的增量式编码器模拟装置设计

基于STM32单片机的增量式编码器模拟装置设计

码器旋转角位移 。在单 位时间内对信号 A或 B进行计数 累加 ,
可 得 到 当 前 角 速 度 。 增 量 式 编 码 器 只 有 正 转 和 反 转 两 个 旋 转 方
号落后端 口 A信 号 9 O 。 。当端 口 A信号输出 N步时 , 端 口 Z输
出 复位 有 效 信 号 。检 测 装 置 通 过 捕 获 相 位 信 号 的个 数 和频 率 计 算 得 到 当前 的相 位 和 速 度 值 。
2 系 统硬 件 设计
一 二腓 二 I 耋 I ~ 一 I
Ke y wor ds : i n c r e me nt al en c od er , S TM32 F4 0 7, s er i a l comm u n i c a t i o n

些 自动 化 设 备 的 开 发 调 试 过 程 需 要 相 位 和 速 度 信 号 , 通
其中 , N表示编码器步长 , T安 装 增 量 式 编 码 器 对 机 械 传 动 机 构 的相 位 和 速 度 进 行 精 确获 取 。搭 建 模 拟 现 场 的机 械 传 动装 置需 要较 高 成 本 ,费 时 费 力, 且模拟装置参数固定 , 不能有效模拟并适应各种场合。
本 文 在 增 量 式 编 码 器 信 号 发 生 原 理 深 入 研 究 的基 础 上 , 以 S T M3 2单 片 机 为 控 制 核 心 , 利用单 片机控制方式 灵活 、 响 应 速
关键词 : 增 量 式编 码 器 , S T M 3 2 F 4 0 7 , 串行 通 信
Ab s t r ac t
I n or d er t o i mpr o v e t he d ebu g e fi c i e nc y of a u t omat i o n pr odu c t s , a n i n cr emen t al e nc o der a na l o g de vi c e i s d es i gne d i n t hi s pap er . Mi c r o ch i p p r o ce s s e r S TM32 i s us e d a 8 t h e c o nt r o l k er ne 1 . pa r a me t er s ar e s e t t h r o ugh s e r i al c om mun i c a t i on wi t h PC. 1 O P0 r t s of t h e M i cr oc hi p Pr oc e s s er a r e u s ed t o si mu l a t e t h e s i gn a l s o f i n c r e me n t a l en co de r a n al og. E xp er i men t r e s ul t s

51单片机检测光电旋转编码器每周实际脉冲数

51单片机检测光电旋转编码器每周实际脉冲数

程序代码/**************************************************************** **** 文件名: main.c** 创建人: 飘扬** 日期: 2006.10.04** 修改人:** 日期:** 描述: 本程序使用伟纳300A型实验板,来检测光电旋转编码器的实际每周** 输出脉冲数。

程序中,定时器0用于8位数码管动态扫描定时,时间** 为1ms(12MHZ晶振)。

定时器1工作于模式1,计数器方式,直接测量** 接在T1脚的脉冲个数。

外部中断0,工作于边沿触发方式,接在旋转** 编码器的Z信号输出上,用于检测编码器完整旋转一周。

8位数码管,** 接成动态扫描,接在P0和P2口。

左4位,用来显示上一周的实际脉冲** 数,右4位,用来显示当前周的脉冲数。

**** 实际使用,感觉效果还可以。

程序准确的测量出某牌光电旋转编码** 器(400脉冲),实际工作时,双路信号输出脉冲数量不等,及脉冲** 数与标称值的误差情况。

**** 本程序的显示部分,直接修改于伟纳提供的数码管显示1-8例程。

**----------------------------------------------------------------*/#include <reg51.h>#include <intrins.h>unsigned char data dis_digit;unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 30x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, offunsigned char data dis_buf[8];unsigned char data dis_index;unsigned int counter1,counter2; //左右计数器数值void main(){P0 = 0xff;P2 = 0xff;TMOD = 0x51; //定时器0工作在模式1定时器方式,定时器1工作在模式1计数器方式TH0 = 0xFC;TL0 = 0x17;TH1 = 0;TL1 = 0;IE = 0x83; //开定时器0中断和外部中断0IT0 = 1; //外部中断0为边沿触发方式//显示初始化counter1=0; //右测显示的本周当前脉冲数counter2=0; //左测显示的上一周脉冲数dis_digit = 0xfe;dis_index = 0;TR0 = 1;//主程序TR1 = 1;while(1){counter1=(TH1*0xff)+TL1;dis_buf[0] = dis_code[0x0a];dis_buf[1] = dis_code[counter2/100];dis_buf[2] = dis_code[(counter2%100)/10];dis_buf[3] = dis_code[counter2%10];dis_buf[4] = dis_code[0x0a];dis_buf[5] = dis_code[counter1/100];dis_buf[6] = dis_code[(counter1%100)/10];dis_buf[7] = dis_code[counter1%10];}}//外部中断0void int0() interrupt 0{TL1=0;TH1=0;counter2=counter1;}void timer0() interrupt 1// 定时器0中断服务程序, 用于数码管的动态扫描// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时, // 选通P2.0口数码管// dis_buf --- 显于缓冲区基地址{TH0 = 0xFC;TL0 = 0x17;P2 = 0xff; // 先关闭所有数码管P0 = dis_buf[dis_index]; // 显示代码传送到P0口P2 = dis_digit; //dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管dis_index++; //dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描}。

基于51单片机的光电编码器测速

基于51单片机的光电编码器测速

摘要光电编码器是高精度位置控制系统常用的一种位移检测传感器。

在位置控制系统中,由于电机既可能正转,也可能反转,所以要对与其相连的编码器输出的脉冲进行计数,要求相应的计数器既能实现加计数,又能实现减计数,即进行可逆计数。

其计数的方法有多种,包括纯粹的软件计数和硬件计数。

文中分别对这两种常用的计数方法进行了分析,对其优缺点进行了对比,最后提出了一种新的计数方法,利用80C51单片机内部的计数器实现对光电编码器输出脉冲的加减可逆计数,既节省了硬件资源,又能得到较高的计数频率。

本设计就是由单片机STC89C52RC芯片,光电编码器和1602液晶为核心,辅以必要的电路,构成了一个基于51单片机的光电编码器测速器。

该系统有两个控制按键,分别用于控制每秒的转速和每分钟的转速,并将速度用1602液晶显示出来。

该测速器测速精准,具有实时检测的功能,操作简单。

关键词:光电编码器,51单片机,C语言,1602液晶目录一、设计任务与要求 (3)1.1 设计任务 (3)1.2 设计要求 (3)二、方案总体设计 (4)2.1 方案一 (4)2.2 方案二 (4)2.3 系统采用方案 (4)三、硬件设计 (6)3.1 单片机最小系统 (6)3.2 液晶显示模块 (6)3.3 系统电源 (7)3.4光电编码器电路 (7)3.5 整体电路 (8)四、软件设计 (9)4.1 keil软件介绍 (9)4.2 系统程序流程 (9)五、仿真与实现 (11)5.1 proteus软件介绍 (11)5.2 仿真过程 (11)5.3 实物制作与调试 (12)5.4 使用说明 (13)六、总结 (14)6.1 设计总结 (14)6.2 经验总结 (14)七、参考文献 (15)一、设计任务与要求1.1 设计任务1).对更多小器件的了解2).巩固51单片机和C语言的知识,熟悉单片机和C语言的实际操作运用3).掌握仿真软件的运用和原理图的绘制4).加深焊接的技巧,提高焊接的能力5).熟悉调试方法和技巧,提高解决实际问题的能力6).熟悉设计报告的编写过程1.2 设计要求1).两个按键控制显示每分钟和每秒钟的功能2).74LS74辅助光电编码器测转向3).光电编码器输出脉冲计数4).1602液晶显示转速二、方案总体设计设计一个基于51单片机的光电编码器测测速。

基于单片机的四位BCD编码器电路设计

基于单片机的四位BCD编码器电路设计

基于单片机的四位BCD编码器电路设计1 引言BCD码又称二/十进制码,即二进制编码的十进制码,在设计、测试数字电路硬件过程或是面对带有BCD码接口的集成电路时,常常希望方便、快速地产生BCD码来完成当前的工作,检验硬件电路的正确性,例如锁相频率合成集成电路MC145163P带有4位BCD编码接口,用于设置环路N分频器,通过本文介绍而制作完成后的BCD发生器可以提供4位BCD编码输出,方便地控制每位BCD输出,可以快速地得到BCD编码而完成测试或输出BCD编码接到集成电路的BCD编码接口,无需频繁跳线。

另外,BCD编码有8421码、2421码、余3码等多种形式,本文以常见的8421码为例介绍电路的实现和程序的编写。

如果对程序略加修改则可以很方便地实现其他类型的编码方式(如2421码)。

本电路以AT89C2051为核心设计了4×4的矩阵键盘(S0-S15),这样只需在键盘上按下相应的按键(S0-S9)即可以产生一个对应(十进制0-9)的BCD码,通过设置切换按键(S10-S13)可以随意地控制4位中任意的一位,期间用数码管实时地显示当前BCD码对应的十进制数。

电路功能和特点:4位BCD编码输出,利用单片机口线可以扩展位数。

改变软件中键号0-键号9(即S0-S9对应功能)的程序可以实现其他编码形式(如2421码)。

参见软件部分。

电路以常用的8421码为例,并有数码显示出对应的十进制数(也可以省略)。

完整的4×4的矩阵键盘扫描执行程序,可以移植到其他应用电路中。

BCD编码由锁存器实现信号锁存,并引出接口,方便连接其他电路。

“位”控制和0-9编码输出互不影响,直接按下功能键就可以得到需要的BCD 编码输出和“位数”选择。

2 电路框图电路原理图如图1所示。

3 电路分析AT89C2051的P1口组成4×4矩阵键盘(S0-S15),其中P1.0-P1.3作为行线,P1.4-P1.7作为列线,设计键盘扫描程序可以达到预先设想的功能(见软件设计部分)。

单片机编码器编程实例 -回复

单片机编码器编程实例 -回复

单片机编码器编程实例-回复“单片机编码器编程实例”编码器是一种常用的输入设备,广泛应用于各种电子设备中。

在单片机编程中,编码器常被用于控制和监测电机运动、旋转角度的测量以及用户界面交互等方面。

本文将以编码器编程为主题,一步一步介绍如何在单片机中实现编码器的功能。

第一步:了解编码器的基本原理和工作方式编码器是一种将旋转运动转化为电信号的设备。

常见的编码器有旋转编码器和线性编码器两种。

旋转编码器通常由一对光电传感器和一个带有刻度盘的旋转轴组成。

当旋转轴旋转时,光电传感器会感知到刻度盘的变化,并将其转化为电信号输出。

线性编码器则是通过传感器感知物体的移动,并将其转化为电信号输出。

第二步:了解编码器的输出类型和工作原理编码器的输出类型有两种,一种是增量式编码器,另一种是绝对式编码器。

增量式编码器通常输出两路信号,一路表示方向(A相信号),另一路表示旋转角度(B相信号)。

绝对式编码器则输出更多的信号,可以精确表示旋转位置或线性位移。

第三步:选择合适的编码器类型和接口在单片机编程中,通常会选择增量式编码器,因为其相对简单且较为常用。

选择适合的编码器接口是编程前必须考虑的因素之一。

常见的编码器接口有两种:脉冲计数接口和磁编码接口。

对于脉冲计数接口,编码器输出的脉冲信号通过单片机的IO口进行读取;对于磁编码接口,编码器输出的信号可以通过SPI、I2C等通信协议进行读取。

第四步:编写初始化函数在进行编码器编程之前,首先需要编写初始化函数,对编码器进行初始化设置。

初始化函数主要包括设置IO口的输入输出方向、使能编码器等操作。

第五步:编写中断服务函数编码器的工作是通过中断来实现的。

当编码器发生旋转或位移时,会产生相应的中断信号,通过中断服务函数来处理这些信号。

中断服务函数主要包括读取编码器的脉冲信号、计算旋转角度或位移,以及对应的控制逻辑。

第六步:编写主程序逻辑在编写主程序逻辑时,可以根据需要选择编码器的工作模式和功能。

基于单片机的旋转编码器鉴相方法

基于单片机的旋转编码器鉴相方法

! 旋转编码器简介 !"! 旋 转 编 码 器 的 分 类
根据结 构和 工作原 理不 同 "编 码器可 以分 为光电 式 编 码器 %电磁式 编码 器和机 械接 触式 编码器 $ 其中 "光电 式编码器由于具有较高的精度!抗干扰能力强!接口简 单!使 用方便 等特 点得到 了广 泛应 用 $ 根据测量的参数不同"编码器又可分为旋转式和直 线式编码器$ 旋转式编码器用于测量转角转速"直线式 编码器用于直线位移!运动速度的精密测量$ 旋转编码器又可分为增量式编码器和绝对式编码
读 取 ! !" 点 电 平
图 +
编码器周期内输出波形的 / 种组合
方法 #去掉繁 琐的 判断与 比较#使 得运 行时间 大大 缩短# 从而提高响应速 度" 组成地址的方法是& 设 " 次变化进行 ) 次鉴 相 # 第 # 次 变 化 前 #!!" 电 平 值 分 别 记 为 ! # ! "#
缓冲区满1 电平有变化1
处理点的相位情况根据开始采样检测的时刻不同在种不同的组合情况若两点产生波形的组合不在下列种情况中则表明由于外部干扰或抖动产生了异常的波形通常把这种波形称为毛刺依据单片机工作方式通常有以下两种鉴相方法查询法单片机的45点通过循环采样读取点电平来判断当前旋钮是否旋转以及旋转的方向所示的判断表中行表示当前点电平值组合列表示上一次变化前点电平值组合检测到发生次电平变化即可进行鉴相需要指出的是若两点电平相比上次均发生了变化则无法进行判断这说明检测时遗漏了脉冲或产生了毛刺为了保证采样电平时没有脉冲遗漏对采样频率要求比较高通常需要保证在编码器以最快速度旋次以上的采样以便可以比较最近次的电平去除因为其他外界条件变化产生的抖动试验表明对于常用的编码器采样的时间间隔约为次判断具有倍频的效果但是由于毛刺的存在在不要求倍频的场合通常采用多次检测判断来识别毛刺以增强判断的可靠性通过设立两个缓冲区用来分别存储两点的电平值分别存入各自缓冲区中当检测到电平变化发生通过分别比对正

编码器 实验报告

编码器 实验报告

编码器实验报告编码器实验报告引言编码器是一种重要的数字电路设备,用于将输入的信息转换为特定的编码形式。

在现代科技发展中,编码器广泛应用于通信、计算机、电子设备等领域。

本实验旨在通过设计和实现一个简单的编码器电路,深入了解编码器的原理和应用。

实验目的1. 了解编码器的基本原理和分类;2. 学习编码器的设计方法和实现技巧;3. 掌握编码器的应用场景和使用方法。

实验原理编码器是一种多对一的数字电路设备,通过对输入信号进行编码,将多个输入状态映射为唯一的输出状态。

常见的编码器有优先编码器、旋转编码器、格雷码编码器等。

1. 优先编码器优先编码器是一种将多个输入状态按照优先级进行编码的设备。

当多个输入同时有效时,只有优先级最高的输入被编码输出。

优先编码器常用于优先级译码器和多路选择器中。

2. 旋转编码器旋转编码器是一种通过旋转操作来改变输出状态的设备。

它通常由一个旋转轮和两个感应器组成,感应器用于检测旋转轮的方向和速度。

旋转编码器常用于旋钮、鼠标滚轮等设备中。

3. 格雷码编码器格雷码编码器是一种将二进制输入信号转换为格雷码输出信号的设备。

格雷码是一种特殊的二进制编码形式,相邻的两个码字只有一位不同,避免了二进制编码中的多位错误。

格雷码编码器常用于数字显示器、光电编码器等设备中。

实验过程本实验以优先编码器为例,设计和实现一个4输入优先编码器电路。

1. 确定输入和输出端口根据实验要求,我们需要设计一个4输入优先编码器,因此需要确定4个输入端口和1个输出端口。

2. 绘制逻辑电路图根据优先编码器的原理,我们可以绘制出如下的逻辑电路图:(图略)3. 确定逻辑门类型根据逻辑电路图,我们可以确定每个逻辑门的类型。

在本实验中,我们选择使用与门和或门。

4. 搭建电路实验平台根据逻辑电路图,我们可以搭建实验平台,连接逻辑门和输入输出端口。

5. 进行实验测试将不同输入信号输入到优先编码器中,观察输出信号的变化。

测试不同输入组合下的编码输出结果。

编码器、译码器的功能测试及应用

编码器、译码器的功能测试及应用

学生实验报告学院:课程名称:数字电路实验与设计专业班级:姓名:学号:学生实验报告(一)学生姓名学号同组人: 实验项目编码器、译码器的功能测试及应用■必修□选修□演示性实验■验证性实验□操作性实验□综合性实验实验地点W105 实验仪器台号指导教师实验日期及节次一、实验综述1. 实验目的:(1)了解编码器、译码器和数码管的管脚排列和管脚功能。

(2)掌握编码器、译码器和数码管的性能和使用方法。

2. 实验所用仪器及元器件:(1)示波器、信号源、万用表、数字实验箱和电脑。

(2)集成电路TTL74LS147、TTL74LS148、TTL74LS47、TTL74LS04、电阻和电位器等。

3. 实验原理:(1) 10- 4线优先编码器74HC14774HC147外引线排列如图1所示,逻辑符号如图2所示。

图1 74HC147外引脚排列图图2 74HC147逻辑符号如图74HC147有9路输入信号,4位BCD码输出,因输出端带圈,所以输入输出均为低电平有效。

他将0—9十个十进制数编成4位BCD码,可把输入端的9路输入信号和隐含的不变信号按优先级进行编码,且优先级别高的排斥级别低的。

当输入端都无效时,隐含着对0路信号进行编码(输出采用反码输出)。

74HC147的功能见表1。

表1 10- 4线优先编码器74HC147输入输出I2I3I4I5I6I7I8I9I3Y2Y1Y0Y1H H H H H H H H H H H H H××××××××L L H H L×××××××L H L H H H××××××L H H H L L L×××××L H H H H L L H××××L H H H H H L H L×××L H H H H H H L H H××L H H H H H H H H L L×L H H H H H H H H H L HL H H H H H H H H H H H L (2) 8-3线优先编码器74LS14874LS148是8-3线优先编码器逻辑符号如图3,外引线排列如图4所示。

stm32编码器测速

stm32编码器测速

stm32编码器测速摘要:编码器是⼀种将⾓位移或者⾓速度转换成⼀串电数字脉冲的旋转式传感器。

编码器⼜分为光电编码器和霍尔编码器。

霍尔编码器是有霍尔码盘和霍尔元件组成。

霍尔码盘是在⼀定直径的圆板上等分的布置有不同的磁极。

霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若⼲脉冲信号,为判断转向,⼀般输出两组存在⼀定相位差的⽅波信号。

采集数据⽅式:第⼀种软件技术直接采⽤外部中断进⾏采集,根据AB相位差的不同可以判断正负。

第⼆种硬件技术直接使⽤定时器的编码器模式。

这⾥采⽤第⼆种。

也是⼤家常说的四倍频,提⾼测量精度的⽅法。

其实就是把AB相的上升沿和下降沿都采集⽽已,所以1变4。

⾃⼰使⽤外部中断⽅式实现就⽐较占⽤资源了,所以不建议使⽤。

速度计算⽅法:真实的物理转速:电机转动⼀圈的脉冲数:num1 单位:个单位时间:t 单位:秒单位时间内捕获的脉冲变化数:num2 单位:个(反应电机正反转)电机轮⼦半径:r 单位:m圆周率:pi 单位:⽆速度:speed 单位: mm/s因为半径⽤的是m为单位,速度为mm所以需要乘以1000。

代码:(使⽤TIM2和TIM4两个定时器来测两个轮⼦的速度)将编码器AB相使⽤的引脚设置成定时器的编码器模式,我们根据TIMx->CNT寄存器数据的变化,计算出单位时间内,脉冲的变化值。

然后在定时器中断服务函数中进⾏速度计算。

#include "encoder.h"/**************************************************************************函数功能:把TIM2初始化为编码器接⼝模式⼊⼝参数:⽆返回值:⽆**************************************************************************/void Encoder_Init_TIM2(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端⼝时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //端⼝配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输⼊GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOATIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; //预分频器TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器⾃动重装值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使⽤编码器模式3TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;TIM_ICInit(TIM2, &TIM_ICInitStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除TIM的更新标志位TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//Reset counterTIM_SetCounter(TIM2,0);//===============================================TIM2->CNT = 0x7fff;//===============================================TIM_Cmd(TIM2, ENABLE);}/**************************************************************************函数功能:把TIM4初始化为编码器接⼝模式⼊⼝参数:⽆返回值:⽆**************************************************************************/void Encoder_Init_TIM4(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端⼝时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //端⼝配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输⼊GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOBTIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器⾃动重装值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使⽤编码器模式3 TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;TIM_ICInit(TIM4, &TIM_ICInitStructure);TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除TIM的更新标志位TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//Reset counterTIM_SetCounter(TIM4,0);//===============================================TIM4->CNT = 0x7fff;//===============================================TIM_Cmd(TIM4, ENABLE);}/**************************************************************************函数功能:读取编码器脉冲差值,读取单位时间内的脉冲变化值⼊⼝参数:TIM_TypeDef * TIMx返回值:⽆**************************************************************************/s16 getTIMx_DetaCnt(TIM_TypeDef * TIMx){s16 cnt;cnt = TIMx->CNT-0x7fff;TIMx->CNT = 0x7fff;return cnt;}/**************************************************************************函数功能:计算左右轮速⼊⼝参数:int *leftSpeed,int *rightSpeed返回值:⽆//计算左右车轮线速度,正向速度为正值,反向速度为负值,速度为乘以1000之后的速度 mm/s//⼀定时间内的编码器变化值*转化率(转化为直线上的距离m)*200s(5ms计算⼀次)得到 m/s *1000转化为int数据⼀圈的脉冲数:左:1560右:1560轮⼦半径:0.03m轮⼦周长:2*pi*r⼀个脉冲的距离:左:0.000120830m右:0.000120830m速度分辨率:左: 0.0240m/s右: 0.0240m/s200 5ms的倒数1000 扩⼤分辨率**************************************************************************/void Get_Motor_Speed(int *leftSpeed,int *rightSpeed){//5ms测速 5ms即这⾥说的单位时间*leftSpeed = getTIMx_DetaCnt(TIM4)*1000*200*0.000120830;*rightSpeed = getTIMx_DetaCnt(TIM2)*1000*200*0.000120830;}main.c#include "sys.h"//====================⾃⼰加⼊的头⽂件===============================#include "delay.h"#include "led.h"#include "encoder.h"#include "usart3.h"#include "timer.h"#include <stdio.h>//===================================================================int leftSpeedNow =0;int rightSpeedNow =0;int main(void){GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁⽤JTAG 启⽤ SWDMY_NVIC_PriorityGroupConfig(2); //=====设置中断分组delay_init(); //=====延时函数初始化LED_Init(); //=====LED初始化程序灯usart3_init(9600); //=====串⼝3初始化蓝⽛发送调试信息Encoder_Init_TIM2(); //=====初始化编码器1接⼝Encoder_Init_TIM4(); //=====初始化编码器2接⼝TIM3_Int_Init(50-1,7200-1); //=====定时器初始化 5ms⼀次中断while(1){printf("L=%d,R=%d\r\n",leftSpeedNow,rightSpeedNow);delay_ms(15);}}//5ms 定时器中断服务函数void TIM3_IRQHandler(void) //TIM3中断{if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发⽣与否:TIM 中断源 {TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源Get_Motor_Speed(&leftSpeedNow,&rightSpeedNow);Led_Flash(100);}}。

实验二8线——3线优先编码器74ls148功能测试及应用

实验二8线——3线优先编码器74ls148功能测试及应用
数字电子技术基础实验报告
实验二8线——3线优先编码器74LS148功能测试及应用
专业
班级
姓名
学号
成绩
通信工程
一班
赵建倪
0134
一、实验目的
了解8线——3线优先编码(74LS148)的基本功能;
掌握74LS148的使用方法;
二、实பைடு நூலகம்内容
(1)了解芯片的工作原理
74LS148工作原理:该编码器有8个信号输入端,3个二进制码输出端。此外,电路还设置了输入使能端EI,输出使能端EO和优先编码工作状态标志GS。当EI=0时,编码器工作;而当EI=1时,则不论8个输入端为何种状态,3个输出端均为高电平,且优先标志端和输出使能端均为高电平,编码器处于非工作状态。这种情况被称为输入低电平有效,输出也为低电来有效的情况。当EI为0,且至少有一个输入端有编码请求信号(逻辑0)时,优先编码工作状态标志GS为0。表明编码器处于工作状态,否则为1。
(2)了解芯片的结构,对照着具体的引脚接线
(3)验证优先编码器的真值表
真值表

编码器功能测试实训报告

编码器功能测试实训报告

一、实验背景编码器是一种将输入信号转换为特定编码形式的设备,广泛应用于数字电路、计算机控制等领域。

本次实训旨在通过实际操作,掌握编码器的原理、设计方法以及功能测试方法,提高对数字电路的理解和动手能力。

二、实验目的1. 理解编码器的原理和功能;2. 掌握编码器的设计方法;3. 学会使用Logisim等软件进行编码器的设计与仿真;4. 熟悉编码器的功能测试方法。

三、实验原理编码器将输入信号的某种编码形式转换为另一种编码形式,常见的编码器有二进制编码器、十进制编码器等。

本实训主要研究二进制编码器,其基本原理是将输入信号的0和1转换为二进制编码输出。

四、实验内容1. 编码器设计:使用Logisim软件设计一个5输入、3输出的二进制编码器。

2. 电路仿真:将设计的编码器电路在Logisim中进行仿真,观察输出结果。

3. 功能测试:对编码器进行功能测试,验证其正确性。

五、实验步骤1. 设计编码器电路(1)根据编码器原理,设计输入端和输出端电路,确定输入端和输出端之间的关系。

(2)在Logisim中搭建电路,包括输入端、输出端和中间电路。

(3)将输入信号分别设置为0和1,观察输出结果。

2. 电路仿真(1)在Logisim中运行仿真,观察编码器电路的输出结果。

(2)对比输入信号和输出结果,验证编码器电路的正确性。

3. 功能测试(1)根据真值表,设计测试用例,包括输入信号和预期输出结果。

(2)在Logisim中输入测试用例,观察实际输出结果。

(3)对比实际输出结果和预期输出结果,验证编码器功能。

六、实验结果与分析1. 编码器电路设计根据编码器原理,设计了一个5输入、3输出的二进制编码器电路。

电路中使用了与门、或门、非门等基本逻辑门,实现了输入信号到输出信号的转换。

2. 电路仿真在Logisim中运行仿真,观察编码器电路的输出结果。

当输入信号分别为0和1时,输出结果符合预期,说明编码器电路设计正确。

3. 功能测试根据真值表,设计了测试用例,包括输入信号和预期输出结果。

单片机操作旋转编码器

单片机操作旋转编码器
4脚,5脚是按下功能的两个脚,可以根据需求自己接线。
检查方向时,通常采用两种做法
(1)中断法:获取A或B的上升沿或下跳沿,在中断程序中,检测此时另外一相的电平。例如上图中,A相上跳沿,B相为低电平则为顺时针转动;B相为高电平二者为逆时针方向转动。
(2)电平法:同时检测A相和B相的电平,当出现A,B不相同时,则能判定发生了转动,根据前一时刻A相和B相的电平,则能判断出转动的方向。
同时检测相的电平当出现不相同时则能判定发生了转动根据前一时刻硬件电路本设计在pic16单片机上进行开发采用中断法
最近做了一个关于旋转编码器的项目,在网上查阅了很多资料,然后又是进行了诸多的实验,分享给大家。
1旋转编码器原理
(借用一下别的文档里的图片)
5脚的旋转编码开关具有左转,右转,按下三个功能。2脚接地,1,3脚接上拉电阻。
2硬件电路
本设计在PIC16单片机上进行开发,采用中断法。
旋转编码开关输出上拉,之后采用RC滤波器对信号进行先一步滤波,此处的RC滤波器的元器件大小可以适当调整。中断源采用的是捕捉模块(CCP2)的捕捉中断(外部中断用于别处)。
3 C代码
中断响应函数:
voidinterrupt ISR(void)
{
if(CCP2IF)
{
CCP2IF=0;
Change();
}//程序中CCP2设置成捕捉下跳沿
}
void Change()
{
unsigned int t2=2000;
if(RC3)//高电平
{
while((!RC1)&&(t2--))//等待RC1的低电平持续完
{
Delay();
}
if(!RC3)//判断此时RC3的电平,以确认转动发生

STM8S103F3P单片机正交编码器接口的使用方法

STM8S103F3P单片机正交编码器接口的使用方法

STM8S103F3P单片机正交编码器接口的使用方法时为【摘要】对正交编码信号的解码离不开单片机的硬件和程序.STM8S103F3P单片机除了具有对正交编码信号解码的功能外,还具有价格上的绝对优势,但在具体现场时会遇到一些问题.对此给出硬件实现电路、相关的正交信号解码程序和实际运行结果,实践证明,其性能可靠.【期刊名称】《扬州职业大学学报》【年(卷),期】2017(021)001【总页数】3页(P47-49)【关键词】QEI正交编码器接口;STM8S103F3P;TIM1;旋转编码器【作者】时为【作者单位】扬州职业大学,江苏扬州225009【正文语种】中文【中图分类】TP368.1目前,正交编码接口已经广泛应用于角度测量、距离测量、速度测量以及人机接口等领域。

通常使用单片机对正交编码信号进行解码,并编写相应的程序,从中提取需要的信息。

常用的正交解码的方法有中断分析法和QEI方法,中断分析法利用单片机的外部中断接口,捕捉一路正交信号,进入中断服务程序后,再判断另一路正交信号的逻辑,从而获取正交信号中所需要位置、方向和速度等信息,此时,单片机会工作在不停的中断状态中,导致整个程序无法正常运行。

QEI方法使用专用的QEI芯片或带有QEI的单片机,其QEI硬件模块独立工作,可以响应高速的正交信号输入,并且十分可靠。

但QEI方法成本高,还需要有与其对应的开发手段。

STM公司的STM8S103F3P单片机,价格十分低廉,将其中的高级控制定时器TIM1设置为所需要编码器模式,即可做出一个硬件QEI,实现对正交编码信号的解码功能。

本文就此单片机使用进行探讨,给出实现电路、程序说明和运行结果。

[1]根据STM8S103F3P单片机编程手册,将STM8S103f3P单片机的16位高级控制定时器TIM1设置为编码器接口模式,使用单片机的PC6和PC7引脚输入两路正交信号,此时TIM1会自动识别两路正交信号的方向,并根据识别结果,对其中的一或两路正交信号的边沿进行加法计数或减法计数,计数结果存放在一个16位寄存器TIM1-CNTR中。

单片机实现遥控编码器PT2262的软件解码

单片机实现遥控编码器PT2262的软件解码

基于单片机实现遥控编码器PT2262的软件解码1 引言PT2262是红外遥控编码器,PT2272是其接收解码器,两者常常配对使用,现已广泛用于汽车门控、遥控门锁、门禁管理等领域,也可用于传送数字信息。

PT2262具有19位二进制编码功能;P T2272的解码只有4~6位,这就限制了数据传输的应用。

在此从PT2262接收的信号特征入手,利用8051F330单片机直接对接收到的信号进行解码,解释出PT2262发出的全部19位数据,从而使其应用于数字通信、智能化控制等领域。

2 硬件电路图1是发射装置的原理图,PT2262作为编码器,当按下按键时,设定的地址码和数据码从17引脚串行输出,经红外发射元件IRED发出信号。

通过电阻Rosc凋节发射频率,适当提高PT2262工作电压(2.6 V~15 V),以增大发射距离。

其中A0~A12可设置为高电平、低电平、悬空三种状态,因此可以发送531441种编码组合,完全满足设计需求。

接收装置采用集红外线接收、放大、整形于一体的集成电路TL0038,无需任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,故适用于各种红外线遥控和红外线数据传输。

译码采用8051F330D单片机,11.0592MHz晶体振荡器,接收信号送至I/O端口P1.0进行软件解码。

接收和译码电路如图2所示。

3 解码原理编码器PT2262发送的编码信号是由:地址码、数据码、同步码组成的一个完整码字,最多可以有12位(A0~A11)三态地址端引脚(悬空、高电平、低电平),任意组合可提供531 441个地址码。

将编码器PT2262的A8拉高,D3拉高,D0拉高,D1拉低,其余悬空。

截取一段接收模块信号输出波形如图3所示,PT2262每发射一次,至少发送4组相同编码字码。

每组字码间隔(低电平)约14 ms。

将其截获波形每组字码放大,如图4所示,一组字码有12位A/D码,每个A/D位是由2个脉冲表示:2个窄脉冲则表示“0”;2个宽脉冲表示“1”;1个窄脉冲和1个宽脉冲表示“F”即地址码“悬空”;除此之外,每组字码之间还有1个同步码隔开,所以每组字码共计有25个宽度不同的脉冲。

如何检测编码器是否正常或者损坏?

如何检测编码器是否正常或者损坏?

如何检测编码器是否正常或者损坏?如何检测编码器是否正常或者损坏?随着工业技术的发展编码器的应用随处可见,因为随设备在现场,由于各种原因可能会出现不少编码器的故障,不知道大家是如何检测处理的。

不知道大家是如何检测编码器的好坏的。

用万用表检测编码器是否损坏?检测方法步骤如下:将数字万用表拨至检测二极管档位,黑表笔接蓝色com线,红表笔接棕色线。

此时数字万用表显示为1346为正常值;将万用表的黑表笔接棕色线,红表笔接蓝色线,此时如下图片2所示。

此时万用表显示为无穷大为正常值。

将红表笔接蓝色线不动,用黑表笔分别接白、橙、黑;此时如图片所示。

数字万用表显示为765,并且三种颜色的线阻值完全一样,即为正常;反过来将万用表的黑表笔接蓝色线,红表笔分别接白色、橙色、黑色线,三个电阻值此时为无穷大而显示为。

将编码器采用直流24V 正常供电测试。

用直流电源继续供电,将万用表的红表笔接在棕色线上不动,而黑表笔分别去测是三个输出端的电压,如果三个输出线的变化规律完全一样,则证明编码器为好的。

编码器为NPN输出时:测量电源正极和信号输出线,晶体管置ON时输出电压接近供电电压,晶体管置OFF时输出电压接近0V。

编码器为PNP输出时:测量电源负极和信号输出线,晶体管置ON时输出电压接近供电电压,晶体管置OFF时输出电压接近0V把编码器拆下来,在不断电的情况下,用手转动编码器,同时观察屏幕显示的数据,看有没有变动,如数据不变动,该编码器就是坏的,如有变动,就证明该编码器是好的。

编码器一般情况下都要带电监测。

如果编码器能拆下来最好,上电后用手转动编码器,伺服电机如果能根据编码器数值的变化运动证明是好的,如果上电后用手转动,数值不变化或者变化无规律就是坏的编码器是否正常或者损坏还可以用示波器来进行检查测量判断编码器静止时,可测得A、B相的电压为15V左右或者0V。

1、轻轻转动编码器时,应能轮流得到以上两种电压。

A-、B-相应能得到0V或-15V电压。

编码器性能测试与评估技术研究

编码器性能测试与评估技术研究

编码器性能测试与评估技术研究编码器是一种常用于转换模拟信号为数字信号的设备。

它可以将传感器所接收到的模拟信号转换为数字信号,从而实现对信号的准确测量和处理。

因此,对于各种不同类型的编码器,进行性能测试和评估是至关重要的。

一、编码器性能测试的原理和方法编码器性能测试的原理是将一定范围的输入信号传递给编码器,采集编码器输出的数字信号,然后通过分析和计算来评估编码器的性能。

一般来说,编码器性能测试需要考虑以下几个方面:1. 分辨率:测量编码器输出信号的变化量与输入信号的变化量之间的比率。

分辨率越高,则编码器的输出信号越准确。

2. 精度:测量编码器输出的数字信号与实际位置之间的偏差。

精度越高,则编码器的输出信号越接近实际位置。

3. 值动误差:测量编码器输出的数字信号在连续位置变化时的误差。

值动误差越小,则编码器的输出信号越稳定。

编码器性能测试的方法一般分为两类:仿真测试和实时测试。

仿真测试主要是通过软件仿真来模拟测试环境,从而评估编码器的性能。

实时测试则需要使用硬件设备进行实际测试。

二、编码器性能评估的主要参数1. 分辨率:分辨率是衡量编码器性能的重要指标,它直接影响编码器测量的精度和稳定性。

一般来说,分辨率越高,则编码器的性能越好。

2. 精度:编码器精度是指编码器输出信号与实际位置之间的偏差。

精度越高,则编码器的性能越好。

3. 值动误差:编码器值动误差是指在轴向移动时,编码器输出信号的波动。

值动误差越小,则编码器的性能越好。

4. 环形误差:当编码器旋转一圈时,输出信号是否能回到最初的位置。

可以通过环形误差指标来评估编码器的环形稳定性。

5. 电压输出波纹:对于某些编码器来说,输出信号会受到电噪声的影响。

因此,电压输出波纹也是衡量编码器性能的重要指标。

三、编码器性能测试的技术方法1. 预判性能测试:通过分析编码器工作原理和掌握相应的理论知识,可以推测出编码器在实际应用中可能遇到的问题。

这种方法可以有效地降低错误率,并优化编码器性能。

51单片机360度旋转编码器使用代码

51单片机360度旋转编码器使用代码

51单片机360度旋转编码器使用代码下面是使用51单片机实现360度旋转编码器的代码:```c#include <reg52.h>sbit CLK=P3^0; // CLK引脚定义sbit DT=P3^1; // DT引脚定义unsigned char val = 0; // 表示旋转角度的变量unsigned int i,j;for(j=0;j<150;j++);void mainunsigned char last_state, current_state;unsigned char flag = 0;last_state = (DT<<1) , CLK; // 初始化上一个状态while(1)current_state = (DT<<1) , CLK; // 获取当前状态if (current_state != last_state) // 检测到旋转delay(5); // 延时去抖动if (current_state == ((DT<<1) , CLK)) // 确认旋转方向if (last_state == 0x00) // 顺时针旋转val++;if (val > 255)val = 255;}else // 逆时针旋转if (val > 0)val--;}flag = 1;}while ((DT<<1) , CLK == current_state) //等待旋转结束;}last_state = current_state; // 更新上一个状态if (flag) // 旋转角度变化flag = 0;//执行相应的操作,例如更新液晶显示屏等}//其他需要进行的操作delay(10); // 延时等待下一次旋转检测}```以上是一个简单的示例代码,通过检测旋转编码器的旋转状态变化来实现角度的累加和递减。

具体实现中,可以根据需要进行相应的操作,例如更新液晶显示屏、驱动电机等。

编码器测试程序

编码器测试程序

编码器测试程序芯片为STC89C51RC。

#include //头文件sbit anotherbit = P1^2; //旋转编码器另一脚sbit rotation=P1^0; //旋转编码器中一脚bit oldbit; //上一状态暂存位unsigned char led1,led2,led3,led4,ztj;//LED显示缓存,扫描状态机int xuanzhuanzhi,ctemp;//旋转值unsigned char codeledseg[17]={0x88,0xBE,0xC4,0x94,0xB2,0x91,0x81,0xBC,0x80, 0x90,0xA0,0x83,0xC9,0x86,0xC1,0xE1,0xf7};void init(void){TMOD=0x11; //方式1TR0=1; //启动T0开始扫描数码管ET0=1; //打开中断EA=1;}void ledscan(void) //数码管扫描程序{switch(ztj) //切换状态机{case 0: //分支P2=0xff; //关闭数码管P0=ledseg[led4];//查表得段码数据P2=0x7f; //打开数码管ztj=1; //转移状态break; //分支结束case 1:P2=0xff;P0=ledseg[led3];P2=0xbf;ztj=2;break;case 2:P2=0xff;P0=ledseg[led2];P2=0xdf;ztj=3;break;case 3:P2=0xff;P0=ledseg[led1];P2=0xef;ztj=0;break;default: //没有找到分支ztj=0; //状态机复位break; //分支结束}}void timer0 (void) interrupt 1 using 1 //T0定时器中断程序,定时时间到,自动运行此程序{TH0=(65536-5000)/256; //置定时值,每次时间到都要重新置定时值TL0=(65536-5000)%256; //每5000us产生一次定时器定时中断(12MHz)ledscan(); //每5000us扫描一次LED(12MHz)}void main(void){init(); //是初始化,打开中断及定时器while(1){ctemp=xuanzhuanzhi; //复制计数值if(ctemp<0) //判断符号{ctemp=-ctemp; //如果为负数,取反led4=16; //显示负号led3=ctemp%1000/100; //提取各位数值led2=ctemp%100/10; //提取各位数值led1=ctemp%10; //提取各位数值}else{led4=ctemp/1000; //提取各位数值led3=ctemp%1000/100; //提取各位数值led2=ctemp%100/10; //提取各位数值led1=ctemp%10; //提取各位数值}if(oldbit==1&&rotation==0) //判断前后状态以识别是否发生下降沿 {if(anotherbit) //判断另一相电平{xuanzhuanzhi++; //为高,正转}else{xuanzhuanzhi--; //为低,反转}}oldbit=rotation; //刷新位暂存值 } }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ex67.c
//用LED数码管显示计数器T0的计数值 #include<reg51.h> //包 含51单片机寄存器定义的头文件 sbit S=P3^2 ; //将S位定义为P3.2引脚 unsigned char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 码表 unsigned char x; /****************************************************************** 函数功能: 延时约0.6ms ********************************************************************/ void delay(void) {
{
x--; //编码器反转在数码管上显示数字减少
if(x==0)
//设置的最小值
x=100;
//如果最小后 在重新赋值
}
//如果到
第 2 页
delay();
delay();
delay();
delay();
P2=0xff;
P0=0xff;
delay();
delay();
delay();
delay();
}
/******************************************* 函数功能:主函数 ******************************************/ void main(void)
unsigned char j; for(j=0;j<200;j++) ;
}
//段
/******************************************************************
函数功能:显示计数次数的子程序
入口参数:x
********************************************************************/
void Display(unsigned char x)
{
P2=0xbf;
//P3.6引脚输出低电平,DS6点亮
P0=Tab[x/10]; //显示十位
delay();
delay();
delay();
delay();
P2=0x7f;
//P3.7引脚输出低电平,DS7点亮
P0=Tab[x%10]; //显示个位
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
x++;
//编码器正转态在数码管显示数字增加
if(x==100) //设置的最大值 可以自己修改
x=0;
最大值清0
}
void int1(void) interrupt 2 using 2 //外部中断1 的中断编号 2
{ EA=1; //开放总中断 EX0=1; //外中断0 中断控制位 1 允许外部中断0 中断 0 禁止我不中断0中断 EX1=1; //外中断1 中断控制位 1 允许外部中断1 中断,0禁止外部1中断。 IT0=1; // 外部中断0 触发方式 控制位 0-低电平触发 1选择负跳变来触发外中断 IT1=1; // 外部中断1 触发方式 控制位 0-低电平触发 1选择负跳变来触发外中断
x=0;
while(1) Display(x);
第 1 页
ex67.c
}
/**************************************************************
函数功能:外中断T0的中断服务程序
**************************************************************/
相关文档
最新文档