简单C51电机控制

[复制链接]
查看658 | 回复3 | 2020-3-25 13:48:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
#include<reg51.h>
#define YC 10       //闭合延迟时间
#define QDTIME 60   //工作时间
#define u8 unsigned char
#define u16 unsigned int
sbit K1a=P1^0;      //开关引脚a
sbit K1b=P1^1;      //开关引脚b
sbit OUT=P2^0;      //输出引脚
u8 Tm=0;            //状态检测,0位初始状态,1为延迟状态,2为输出状态,3为待复位状态
u16 i=0,j=0;        //计时变量
void Tim_init()     //定时器0初始化函数
{
        TMOD = 0x01;  //定时器0设置16位计时器
        TH0 = 0x0FC;  //高值1ms
        TL0 = 0x18;   //低值1ms
        EA = 1;       //开总中断
        ET0 = 1;      //开定时器中断   
}

void Tim() interrupt 1//计时器中断
{
        TH0 = 0x0FC;  //重装初始值
        TL0 = 0x18;
        i++;          //ms计时累加
}
   
void S1()
{
    if(K1b==0&&Tm==0)//启动状态判断,必须是复位状态,且开关闭合。
    {
        TR0=1;        //定时器开始工作
        Tm=1;       //进入状态1开始延迟
    }
    if(K1b==1&&Tm==3)//复位状态判断,条件必须打开开关,且一次任务完成。
    {
        Tm=0;      //复位状态值
    }
}

void main()
{
    K1a=0;    //开关一端低电平
    OUT=0;  //输出低电平,电机停止
    Tim_init();     //定时器初始化
    while(1)       //主循环
    {
        S1();      //按键检测
        if(i==1000)//1S计时
        {
            j++;   //秒计时累加
            i=0;
        }
        if(j>YC&&Tm==1)  //如果检测到j大于10则进入输出状态
        {
            OUT=1;      //进入输出状态
            Tm=2;       //设置输出状态为2,即输出状态
            j=0;        //秒计时清零
        }
        if(j>QDTIME&&Tm==2)//如果检测到j大于60则且在输出状态,则停止输出进入待复位状态
        {
            OUT=0;      //停止输出
            Tm=3;       //进入待复位状态
            j=0;        //秒计时清零
            i=0;       //ms计时清零
            TR0=0;      //关闭计时器
        }
    }        
}
   
回复

使用道具 举报

szy123 | 2020-3-25 17:49:05 | 显示全部楼层
回复

使用道具 举报

清心如水 | 2020-3-26 08:31:45 | 显示全部楼层
回复

使用道具 举报

armstm32 | 2020-3-26 09:17:31 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则