找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1713|回复: 2
打印 上一主题 下一主题
收起左侧

大神能讲一下这个单片机里程计数中断程序原理吗

[复制链接]
跳转到指定楼层
楼主
ID:725584 发表于 2020-5-8 13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*************************************************************
                      单片机中断头文件

实现功能:单片机中断的控制控制

补充说明:
***************************************************************/
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include<reg52.h>
#include<LCD1602.h>

#define uchar unsigned char
#define uint unsigned int

/**********************引脚定义************************/
sbit key_z=P3^2;         //霍尔输入引脚
sbit moto =P3^7;         //电机控制引脚
/**********************变量定义************************/
uchar T0_num;                 //定时器0计数变量
uint T1_num;                 //定时器1计数变量
uint ii=0;                         //用于控制电机PWM输出
extern uint Wait;         //等待时间
extern uint mil;         //行驶里程
extern bit strat_f;         //初始界面显示标志,=0显示初始界面,=1可能计价、设置、总价显示
extern bit start;         //开始计价标志,=0非计价模式,=1计价模式
bit f;                                 //回到初始界面标志,=0非首次回到初始界面,=1首次回到初始界面

uchar vs=5;          //转速等级,4~9;
uint numss;                         //记录两次霍尔感应的间隔
bit mil_f=0;                 //=1,检测到霍尔信号标志
bit wait_f=1;                 //=0,等待1S标志
/********************************************************
函数名称:void delayms(uint ms)
函数作用:毫秒延时函数
参数说明:
********************************************************/
void delayms(uint ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}
/*********************************************************
函数名称:void T0_init()
函数作用:定时器0初始化函数
参数说明:
*********************************************************/
void T0_init()
{
        EA=1;                  //开总中断
        ET0=1;                 //定时器T0中断允许         
        TMOD=0x11;             //使用定时器T0、T1的模式1
        TH0=(65536-50000)/256; //定时器T0的高8位赋初值
        TL0=(65536-50000)%256; //定时器T0的低8位赋初值
        TR0=0;                                   //关闭定时器0

        ET1=1;                 //定时器T1中断允许                                                                                                                                                                                                                                                                                                                                                                                             
        TH1=(65536-1500)/256;  //定时器T1的高8位赋初值
        TL1=(65536-1500)%256;  //定时器T1的低8位赋初值
        TR1=0;                                   //关闭定时器1
}
/*********************************************************
函数名称:void Int0_init()
函数作用:外部中断0初始化函数
参数说明:
*********************************************************/
void Int0_init()
{
        EA=1;                  //开放总中断         
           IT0=1;                 //下降沿触发
        EX0=0;                 //关闭外部中断0
}
/*********************************************************
函数名称:void T0_interrupt(void) interrupt 1 using 0
函数作用:定时器0中断处理函数
参数说明:定时50ms中断一次
*********************************************************/
void T0_interrupt(void) interrupt 1 using 0
{                  
        TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值
        TL0=(65536-50000)%256; //定时器T0的低8位重新赋初值

        T0_num++;                           //计数变量+1
        if(T0_num==20)                   //定时20*50ms=1s
        {
                T0_num=0;                   //重置计数变量
                if(Wait<5999)
                        Wait++;                           //等待时间+1s
                wait_f=1;                   //标记1S完成
        }                                                
}

/*********************************************************
函数名称:void T1_interrupt(void) interrupt 3
函数作用:定时器1中断处理函数
参数说明:定时15ms中断一次
转速等级:转速等级vs越大,一个PWM周期内输出低电平时间越长,
         转速越快;vs变小,一个PWM周期内输出低电平时间减
                 短,转速变慢。
*********************************************************/
void T1_interrupt(void) interrupt 3
{                  
        TH1=(65536-1500)/256; //定时器T1的高8位重新赋初值
        TL1=(65536-1500)%256; //定时器T1的低8位重新赋初值
        if(start==0)                  //处于非计价模式
        {
                T1_num++;                  //计数变量+1
                if(T1_num==13000) //定时13000*15ms=19.5s
                {
                        T1_num=0;          //重置计数变量
                        strat_f=0;          //恢复到初始界面
                        f=1;                  //标记首次恢复到初始界面
                        TR1=0;                  //关闭定时器1
                }
        }
        else                                  //计价模式下
        {                                          //PWM控制电机转速
                if(ii>vs)                  //计数变量ii大于转速等级
                        moto=1;                  //输出高电平,电机停止
                else                          
                        moto=0;                  //输出低电平,电机转动
                ii++;                          //计数变量+1
                if(ii>9)                  //计数变量【大于9】
                        ii=0;                  //重置计数变量
        }                                          
        numss++;                          //两次霍尔感应间隔时间计数+1               
}
/*********************************************************
函数名称:void init0(void) interrupt 0
函数作用:外部中断0中断处理函数
参数说明:
*********************************************************/
void init0(void) interrupt 0
{
        if(key_z==0&&numss>200)//再次确认霍尔感应,并且距上一次感应的时间足够长,如果过短认为是波动放弃处理
        {
                if(mil<999)
                    mil++;                           //行驶里程+0.1km
                numss=0;                   //重置两次霍尔感应间隔时间
                mil_f=1;                   //标记检测到霍尔信号
        }
}
#endif

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:584814 发表于 2020-5-8 15:00 | 只看该作者
这么详细的注释几乎每句一注你是想请家教么
回复

使用道具 举报

板凳
ID:236035 发表于 2020-5-8 15:06 | 只看该作者
key_z==0&&numss>200 //表示收到了两次霍尔信号,且间隔大于3秒,则进行里程计数和相关处理。
if(mil<999)                   //如果里程计数值没超过99.9KM
         mil++;                 //则行驶里程+0.1km
numss=0;                     //重置两次霍尔感应间隔时间
mil_f=1;                       //标记检测到两次霍尔信号
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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