找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4645|回复: 1
收起左侧

51单片机入门——计算无刷直流电机旋转圈数(外部中断)

[复制链接]
ID:65608 发表于 2014-9-12 01:03 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit led1=P1^0;
sbit key=P3^2;
uchar code table[]=
{
  0x3f,0x06,0x5b,0x4f,
  0x66,0x6d,0x7d,0x07,
  0x7f,0x6f,0x77,0x7c,
  0x39,0x5e,0x79,0x71
};
void delayms(uint);
void display(uchar,uchar);
uchar num,num1,num2,shi,ge;
void main()
{
  TMOD=0x11;
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%6;
  TH1=(65536-45872)/256;
  TL1=(65536-45872)%6;
  EA=1;
  ET0=1;
  ET1=1;
  TR0=1;
  TR1=1;
  IT0=1;
  EX0=1;
  while(1)
  {
     display(shi,ge);
  }

}

void display(uchar shi,uchar ge)
{
   dula=1;
   P0=table[shi];
   dula=0;
   P0=0xff,
   wela=1;
   P0=0xfe;
   wela=0;
   delayms(5);

   dula=1;
   P0=table[ge];
   dula=0;
   P0=0xff;
   wela=1;
   P0=0xfd;
   wela=0;
   delayms(5);
}
void delayms(uint xms)
{
    uint i,j;
for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
}
void int0()interrupt 0
{
  num2++;
}
void T0_time() interrupt 1
{  TH0=(65536-45872)/256;
   TL0=(65536-45872)%6;

}

void T1_time()interrupt 3
{
   TH1=(65536-45872)/256;
   TL1=(65536-45872)%6;
   if(num2==4)
    {
      num2=0;
   num++;
if(num==100)
num=0;

shi=num/10;
ge=num;
    }
}
注:本次实验结合之前的单片机中定时计数器和捕获两者的程序,简易的测算无刷直流电机的旋转圈数。无刷直流电机每旋转一次,将会有4个高频信号,则单片机捕获到4次高频信号时,计数器内部加1,显示到译码管上。

评分

参与人数 1黑币 +10 收起 理由
xueyunmicheng + 10 赞一个!

查看全部评分

回复

使用道具 举报

ID:63997 发表于 2014-9-12 08:41 | 显示全部楼层
主要问题是 数码管花了 看不到字
然后程序没有注释  我只用过定时器 计数器是怎么回事还没有用过 打算弄个自行车码表 但是苦于不懂计数器怎么弄
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表