[51单片机]

为什么此霍尔测速程序不能1S刷新一次,一直保持一个速度?

[复制链接]
974|3
手机看帖
扫描二维码
随时随地手机跟帖
汨江闲人|  楼主 | 2017-10-17 11:06 | 显示全部楼层 |阅读模式
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit k3=P3^2;                                //脉冲采集端口
uint N=0;
uint i,Z;       
uchar count=0;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
bit flag_1s=0;
uint C_50ms;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管
void delay(uint t)                  //延时函数
{
        uint a;
        for(;t>0;t--)
                for(a=123;a>0;a--);
}       
void Init_INT0() //外部中断0初始化
{                                  
  IT0=1;   //0为电平触发,1为下降沿触发
  EX0=1;        //开外部中断0
  EA=1;                //开启总中断
}
void int0() interrupt 0                 //外部中断0中断函数
{
            TMOD|=0x01;//设置T0位工作方式1——作为16位定时器
            TH0=0X3C;//装入初值
                TL0=0XB0;
        ET0=1;//打开定时器0的中断
        TR0=1;//打开定时器0         
                EA=1;        //开启总中断0
        ++count;
        if(count==2) //两次外部脉冲,电机转一圈。
        {
                Z++;//转圈+1
                count=0;//初始计数值
        }
}                 
void  Timer0() interrupt 1                //定时器0中断函数
{               
        
                TH0=0X3C;//装入初值
                TL0=0XB0;
            /*TR0=1;//打开定时器0       
                ET0=1;//打开定时器0的中断 */
        if(++C_50ms>19)
        {               
                        TR0=0;//关闭定时器0中断
                EX0=0;//关闭外部中断0
                C_50ms=0;//定时1s之后C_50ms清零
                N=60*Z;//计算转速
                            flag_1s=1;//1s标志位置1
                            Z=0;//初始化圈数
                        /*TH0=0X3C;//装入初值
                TL0=0XB0; */              
                EX0=1;//打开外部中断0,开始计数。                               
        }
}                                                                          
void digdisplay()                                         //数码管显示函数
{
           uchar qian,bai,shi,ge,a;
           qian=N/1000;
           bai=N%1000/100;
           shi=N%100/10;
           ge=N%10;
           for(a=3;a>=0;a--)       
           {
                switch(a)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0;
                                 P0=table[qian];
                      delay(5);        break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0;
                                P0=table[bai];
                    delay(5); break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0;
                            P0=table[shi];
                   delay(5); break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0;
                            P0=table[ge];
                    delay(5); break;//显示第3位
                }
                }          
}
void main()                                                          //主函数
{
    Init_INT0();
    P0=0x00;       
        while(1)
        {          
           if(flag_1s==1)
           {
           flag_1s=0;//1s标志位清零
                      digdisplay();
           }                  
        }
}

相关帖子

tjlwl| | 2017-10-17 18:26 | 显示全部楼层
定时器定好就行

使用特权

评论回复
Ketose| | 2017-10-18 13:42 | 显示全部楼层
你应该先学会怎么使用论坛的发贴功能。
代码看起来太乱,懒得看。

使用特权

评论回复
dirtwillfly| | 2017-10-18 14:35 | 显示全部楼层
显示是1秒刷新一次。霍尔传感器的信号采集用的中断方式

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝