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, 3

0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off

unsigned 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中断和外部中断0

IT0 = 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];

}

}

//外部中断0

void 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个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描

}

程序代码

/******************************************************************

** 文件名: 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, 3

0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off

unsigned 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中断和外部中断0

IT0 = 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];

}

}

//外部中断0

void 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个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描

}


相关文章

  • 光电编码器输出脉冲的几种计数方法
  • 第30卷第8期 电子工程师 2004年8月 ELECTRONICENGINEER Vol.30No.8 Aug.2004 光电编码器输出脉冲的几种计数方法 潘明东 (华东理工大学机械工程学院,上海市200237) =摘 要> 光电编码 ...查看


  • 编码器原理
  • 实用光电编码器技术 编著 陈先锋 第1章 光电编码器基础 1.1 概述 光电编码器是一种集光.机.电为一体的数字化检测装置,它具有分辨率高.精度高.结构简单.体积小.使用可靠.易于维护.性价比高等优点.近10几年来,发展为一种成熟的多规格. ...查看


  • 机械智能小车毕业论文doc
  • 智能循迹小汽车控制系统设计 摘要: 关键词:智能车控制系统 目录: 总述: 第一部分:智能车控制系统概述 设计方案模块组成:控制器模块 速度检测模块 电源电压检测模块 路径识别模块 数据显示模块 电动机驱动模块 每个模块都由硬件,软件两部分 ...查看


  • 步进和直流电机小车浅谈
  • 步进电机小车和直流电机小车浅浅谈 写在前面: 可能是亿学通电子做了不少竞赛车体,在高校竞赛圈中也有些小名气,每届电子竞赛前夕,几位客服同事都会接到或收到客户打来或发来咨询小车的电话和mail.而其中又以咨询"步进电机小车" ...查看


  • 位移测量系统的设计
  • 摘 要 在现代工业生产过程中,常常需要测量很多不同的位移量.与此同时对位移量进行较为精确地检测,是提高控制精度的基础.因此之前所普遍采用的传统位移测量装置已经不能适应时代发展的潮流.在此情况下通过科研人员的不断努力终于研制出了数字式光电编码 ...查看


  • 案例3毕业论文
  • 本科毕业设计 题目 学院 专业 班级 学号 学生姓名 指导教师 完成日期 (2012届) 2012年6月 摘要 摘要 本毕业设计主要设计自主研发的激光打靶系统的信号处理过程,继而实现整个打靶系统.激光打靶系统主要包括半导体激光枪.光电探测器 ...查看


  • 光电编码器的工作原理
  • 器工作原理,光电编码器的工作原理分析 编码器工作原理 绝对脉冲编码器:APC 增量脉冲编码器:SPC 两者一般都应用于速度控制或位置控制系统的检测元件. 旋转编码器是用来测量转速的装置.它分为单路输出和双路输出两种.技术参数主要有每转脉冲数 ...查看


  • 基于激光传感器的智能车循迹系统
  • 装 订 线 河北大学工商学院 本科生毕业论文(设计) 题目: 学 部 信息科学与工程学部 学科门类 工学 专 业 电气工程及自动化 学 号 姓 名 指导教师 2013年5月16日 基于激光传感器的智能车循迹系统 摘 要 智能汽车是未来汽车发 ...查看


  • 基于霍尔传感器的电机测速装置设计
  • 基于霍尔传感器的电机测速装置设计 丁芝琴 (榆林学院能源工程学院,陕西榆林 719000) 摘 要:利用霍尔传感器和8051单片机,采用M/T测量方法,设计了一种温室机器人的电机转速测量装置并提出了相应的测速算法.该电机测速装置具有线路简单 ...查看


热门内容