找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么主函数里的循环是空的

[复制链接]
跳转到指定楼层
楼主
ID:213280 发表于 2018-10-19 21:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在网上看到的一个PWM控制双舵机的程序,为什么主函数里的循环是空的?程序是对的吗?求解
sbit SEV_PWM = P0^0;  //上下舵机信号位
sbit SEH_PWM = P0^1;  //左右舵机信号位
unsigned char count = 0;
unsigned char SEV_count = 15;
unsigned char SEH_count = 15;
/* 串口初始化、定时器T0T1初始化 */
void Com_Init()
{
    IP = 0x08;
    PCON &= 0x7F;
    TMOD &= 0x00;
    TMOD |= 0x21; //定时器0设置为16为定时器方式1,定时器1配置波特率为自动重载方式2
    SCON= 0x50;   //串口工作在方式1,8位异步通信
    TH1 = 0xfd;   //定时器1设置为在11.0592下波特率为9600
    TL1 = 0xfd;
    ES = 1;       //打开串口中断
    ET1 = 0;      //关闭定时器1中断
    TR1 = 1;      //打开定时器1
TH0 = 0xff;   //配置定时器0初值,溢出时间为0.1ms
    TL0 = 0xa4;
    ET0 = 1;      //打开定时器0中断
    TR0 = 1;      //开启定时器0
}
/* 定时器0中断服务程序 */
void Time0_Int() interrupt 1
{
    TR0 = 0;      //关闭定时器0
    TH0 = 0xff;   //重装初值0.1ms
    TL0 = 0xa4;
    //舵机1
    if(count <= SEH_count) //控制占空比左右
    {
        //如果count的计数小于(5-25)也就是0.5ms-2.5ms则这段小t周期持续高电平。产生方波
        SEH_PWM = 1;
    }
    else
    {
        SEH_PWM = 0;
    }
//舵机2
    if(count <= SEV_count) //控制占空比上下
    {
        SEV_PWM = 1;
    }
    else
    {
        SEV_PWM = 0;
    }
    count++;
    if (count >= 200) //T = 20ms则定时器计数变量清0
    {
        count = 0;
    }
    TR0 = 1; //开启定时器0
}
void main()
{
    Com_Init();
    while(1)
    {
        ;
    }
}
/* 串口中断函数 */
void uart_ser() interrupt 4
{
    if (RI == 0)
    {
        return;
    }
    ES = 0;
    RI = 0;
    command = SBUF; //将接收到的数据传给command
    switchcommand
    {
         case 'f': //舵机向上转
        {
            SEV_count++;
            if(SEV_count >= 25)
            {
SEV_count = 25;
            }
            count = 0; //占空比参数t改变,让定时器重新计数
            break;
        }   
        case 'g':
        {
            SEV_count--;
            if(SEV_count <= 5)
            {
                SEV_count = 5;
            }
            count = 0;
            break;
        }   
        case 'h':
        {
            SEH_count++;
            if(SEH_count >= 25)
            {
                SEH_count = 25; //保持角度180度。
            }
            count = 0;
            break;
        }   
case 'i':
        {
            SEH_count--;
            if(SEH_count <= 5) //保持角度0
            {
                SEH_count = 5;
            }
            count = 0;
            break;
        }
        case 'k':  //舵机复位
        {
            SEH_count = 15;
            SEV_count = 15;
            count = 0;
            break;
        }
        default
        {
            break;
        }
    }
    ES = 1; //打开串口
}

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

使用道具 举报

沙发
ID:387733 发表于 2018-10-20 08:56 | 只看该作者
因为主函数只有一个任务就是初始化定时器,完成初始化以后,就把所有的任务派发给定时器中断了,只需悠闲的打空转消磨时间,而定时器中断则会忠诚地按时完成各自的任务。
回复

使用道具 举报

板凳
ID:413154 发表于 2018-10-21 16:50 | 只看该作者
他是起一个控制作用的
回复

使用道具 举报

地板
ID:213280 发表于 2018-10-23 10:51 | 只看该作者
sxhwdz 发表于 2018-10-20 08:56
因为主函数只有一个任务就是初始化定时器,完成初始化以后,就把所有的任务派发给定时器中断了,只需悠闲的 ...

了解,谢谢了
回复

使用道具 举报

5#
ID:328668 发表于 2018-10-24 13:17 | 只看该作者
初始化
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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