找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机控制直流电机不会加定时器延时程序

[复制链接]
跳转到指定楼层
楼主
ID:908396 发表于 2021-4-29 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机控制直流电机,电机驱动模块为L298N,下面这个程序能控制电机正常变速,想在此基础上加定时器延时程序,不知道怎么加,有没有大神帮我看看,谢谢!

#include<reg52.h>

void uart_init();
void qudong (unsigned int t);
sbit en1=P0^0; //l298nen1
unsigned char str ;

void uart_init()         
{
        SCON = 0x50;//设置串口工作方式1
    TMOD = 0x20;//设置计数器工作方式2         
          PCON = 0x00;//即SMOD=1,波特率不加倍
            TH1 = 0xFD;//计数器初值,波特率是9600,晶振为11.0592MHz
            TL1 = 0xFD;          
            ES = 1;//打开接收中断
            EA = 1;//打开总中断
        TR1 = 1;//打开计数器
}

void delay(unsigned int xms)         //延时函数
{
        unsigned  int t1, t2 ;
        for(t1=0;t1<xms;t1++)
        for(t2=0;t2<110;t2++);
}

void main()
{
        en1=0;
        uart_init();
        while (1)
        {
                if(str==1)                                         
                        qudong(0) ; //停止
                else if(str==2)                        
                        qudong(10) ; //速度1
                else if(str==3)                                 
                        qudong(15) ; //速度2
                else if(str==4)                                 
                        qudong(20) ; //速度3
}
}                                  
void qudong (unsigned int t)
{
        en1=1;
        delay(t);
        en1=0;
        delay(20-t);  
}

void a(void) interrupt 4
{
        if(RI)
        {
                RI=0;
                str=SBUF;
        }
        }

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

使用道具 举报

沙发
ID:908396 发表于 2021-4-29 10:00 | 只看该作者
这是自己改的延时,串口输入1,电机转动,再输入其他没用了

#include<reg52.h>

void uart_init();
void qudong (unsigned int t);
sbit en1=P0^0; //l298nen1
unsigned char str ;
int n=1,t=1;

void uart_init()         
{
        SCON = 0x50;//设置串口工作方式1
    TMOD = 0x20;//设置计数器工作方式2       
        TMOD |= 0x01;
          PCON = 0x00;//即SMOD=1,波特率不加倍
            TH1 = 0xFD;//计数器初值,波特率是9600,晶振为11.0592MHz
            TL1 = 0xFD;         
                ET0=1;  
            ES = 1;//打开接收中断
            EA = 1;//打开总中断
            TR1 = 1;//打开计数器
}

void delay(unsigned int xms)         //延时函数
{
        n=xms;       
    TH0=(65536-1000*n)/256;
        TL0=(65536-1000*n)%256;
        TR0=1;
        while(t);
        TR0=0;
}

void main()
{
        en1=0;
        uart_init();
        while (1)
        {
                if(str==1)                                         
                        qudong(0) ; //停止
                else if(str==2)                        
                        qudong(10) ; //速度1
                else if(str==3)                                 
                        qudong(15) ; //速度2
                else if(str==4)                                 
                        qudong(20) ; //速度3
}
}                                  
void qudong (unsigned int t)
{
        en1=1;
        delay(t);
        en1=0;
        delay(20-t);  
}

void a(void) interrupt 4
{
        if(RI)
        {
                RI=0;
                str=SBUF;
        }
        }
void b(void) interrupt 1
{
        t=0;
}
回复

使用道具 举报

板凳
ID:569384 发表于 2021-4-29 12:04 | 只看该作者
加定时器延时想实现什么功能?
回复

使用道具 举报

地板
ID:908396 发表于 2021-4-29 12:18 | 只看该作者
haokey 发表于 2021-4-29 12:04
加定时器延时想实现什么功能?

用串口通信实现直流电机速度控制,速度等级,和电机开关
回复

使用道具 举报

5#
ID:347059 发表于 2021-4-29 15:24 | 只看该作者
你是想让电机转一会儿,延时到了就停吗?这得用定时器中断,delay不行,执行delay函数时程序在那里循环,此时电机就不转了,用定时器中断,时间到了在中断里关闭电机

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:506248 发表于 2021-4-29 15:38 | 只看该作者
软件延时换成定时器延时,不然程序一直在delay函数里运行,就没时间去处理其他事务了。请给系统运行while(1)内程序以时间,谢谢。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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