找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请大家看看我这个C程序有什么错误。是用来控制舵机的,但现在舵机不动。

[复制链接]
跳转到指定楼层
楼主
ID:85201 发表于 2015-7-15 22:43 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uint unsigned int
sbit pwm=P2^0;//定义P2.0口为PWM输出口
uint num,end,jd;//定义高电平、总时间、角度标识
void main()//主程序
{
        TMOD=17;//设置定时器T0、T1工作在方式一
        TH0=(65535-92)/256;//T0定时为0.1MS
        TL0=(65535-92)%256;
        TH1=(65535-18349)/256;//T1定时为20MS
        TL1=(65535-18349)%256;
        EA=1;
        ET0=1;
        ET1=1;
        TR0=1;
        TR1=1;
        jd=10;
        num=0;
          if(end>3000)//如果T1定时器中断次数达到3000次,也就是1分钟,程序将停止运行
            {
                   EA=0;
                   while(1);
            }
}
void time1()interrupt 1
{
TH0=(65535-92)/256;
TL0=(65535-92)%256;
        num++;//T0每中断一次,高电平标识加1,当大于角度标识时,PWM置于低电平,同时关掉T0中断
          if(num>jd)
          {
                  pwm=0;
                  num=0;
                  TR0=0;
          }
}
void time3()interrupt 3
{
        TH1=(65535-18349)/256;
        TL1=(65535-18349)%256;
        jd++;
        end++;
        TR0=1;
        pwm=1;//T1每中断一次,将PWM重新置为高电平
          if(jd>22)//当角度标识大于22时,也就是高电平时间大于2.2MS时,将角度标识重新置为10,也就是1MS
                {
                        jd=10;
                }
}

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

使用道具 举报

沙发
ID:85201 发表于 2015-7-16 14:25 | 显示全部楼层
moyuqilin 发表于 2015-7-16 00:35
你的大循环呢?没有大循环,这程序不是一直在初始化嘛?而且就是个舵机程序,怎么写的那么复杂啊,我是没看 ...

一语惊醒梦中人啊,的确是把大循环忘了。非常感谢。我回家改正一下试试。我这个程序是想实现舵机左右摆动,持续一分钟后程序停止。

评分

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

查看全部评分

回复

使用道具 举报

板凳
ID:85201 发表于 2015-7-17 00:45 | 显示全部楼层
moyuqilin 发表于 2015-7-17 00:33
一个定时器不行嘛。用两个有点浪费了吧

反正资源够用,也是想用两个试试。还有一个问题,我加了大循环后,还是不行,我真搞不懂是哪的问题了。给你再贴一下程序,麻烦帮忙看一下:
#include<reg52.h>
#define uint unsigned int
sbit pwm=P2^0;
uint num,end,jd;  //定义高电平时间标识、程序运行时间和角度标识
void main()  //主函数
{
        TMOD=17;  //定时器0和1工作在方式1
        TH0=(65535-459)/256;  //定时器1定时时间为0.5ms,11.0592晶振
        TL0=(65535-459)%256;
        TH1=(65535-18349)/256;  //定时器2定时时间为20ms,11.0592晶振
        TL1=(65535-18349)%256;
        EA=1;  //打开中断总开关
        ET0=1;  //打开TO定时开关
        ET1=1;  //打开T1定时开关
        TR0=1;  //T0定时器开始
        TR1=1;  //T1定时器开始
        jd=1;  //为角度标识赋一个初值
        num=0;  //为高电平标识赋一个初值
        while(1)  //大循环等待
        {
          if(end==3000)  //如果时间到达一分钟,则程序停止
            {
                   EA=0;
                   while(1);
            }
  }
}       
void time1()interrupt 1   //T0中断程序
{
TH0=(65535-459)/256;  //重新赋值
TL0=(65535-459)%256;
        num++;  //每中断一次,NUM加1,大于角度标识后将输出设为低电平,NUM数值清零,同时关闭此中断
          if(num>jd)
          {
                  pwm=0;
                  num=(num+1);
                  TR0=0;
          }
}
void time3()interrupt 3   //T1中断程序
{
        TH1=(65535-18349)/256;  //重新赋值
        TL1=(65535-18349)%256;
        jd=(jd+1);
        end=(end+1);
        TR0=1;  //重新打开T0中断
        pwm=1;  //每次T1中断后,IO口电平重新设为高电平
          if(jd>4)  //每当角度标识大于4,也就是高电平时间大于2MS时,重新设置为0.5MS
                {
                        jd=1;
                }
}

评分

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

查看全部评分

回复

使用道具 举报

地板
ID:85201 发表于 2015-7-17 00:47 | 显示全部楼层
moyuqilin 发表于 2015-7-17 00:33
一个定时器不行嘛。用两个有点浪费了吧

原以为是T0定时太短,造成中断冲突,所以把T0的中断时间改长了,还是不行。
回复

使用道具 举报

5#
ID:85201 发表于 2015-7-17 00:50 | 显示全部楼层
moyuqilin 发表于 2015-7-17 00:33
一个定时器不行嘛。用两个有点浪费了吧

还有,舵机用的是银燕的ES08A,难道这个舵机的周期不是20MS或者高电平周期不是0.5--2.5MS?真有点搞不懂了。
回复

使用道具 举报

6#
ID:85201 发表于 2015-7-17 15:55 | 显示全部楼层
xtitxjg 发表于 2015-7-17 14:24
左右摆要不了这么复杂吧

请问您有什么更简单的办法?还望赐教啊。
回复

使用道具 举报

7#
ID:85201 发表于 2015-7-18 21:42 | 显示全部楼层
xtitxjg 发表于 2015-7-18 20:36
楼主要得可是这个效果

整个程序从头文件到尾,加上大大小小的文件各种括号47行,左右摆18行,当然没写停 ...

没错,就是要这种效果。
回复

使用道具 举报

8#
ID:85201 发表于 2015-7-19 01:21 | 显示全部楼层
xtitxjg 发表于 2015-7-18 22:28
程序就不给你了,给你点思路,也许这样对你帮助更大,先看波形图。
+90度波形图
-90度波形图

我现在刚看完中断这段教程。后面的还没有学到。你讲的道理很明白,但现在我还不知道用什么方法能让它顺序加、顺序减,等于是闭门造车啊。如果不是时间紧的话,我就按部就班的学了,但现在我需要尽快把小装置做出来给别人,所以我想还是给我看看你的程序吧,我作为一个参考,也能更快的掌握这方面的知识。万分感谢。
回复

使用道具 举报

9#
ID:85201 发表于 2015-7-19 23:57 | 显示全部楼层
xtitxjg 发表于 2015-7-18 22:28
程序就不给你了,给你点思路,也许这样对你帮助更大,先看波形图。
+90度波形图
-90度波形图

我今天又抽空研究了一下,还是没有头绪,就期待您的程序发布出来了。不然我这个坎看来是短期内不好过去了。
回复

使用道具 举报

10#
ID:85201 发表于 2015-7-20 12:48 | 显示全部楼层

谢谢,这个我后面加上了。
回复

使用道具 举报

11#
ID:85201 发表于 2015-7-20 23:33 | 显示全部楼层
xtitxjg 发表于 2015-7-20 00:50
加减循环

if(变量1)

没太看明白,if后面括号里面不应该是表达式吗?只写变量1的话,不算是表达式吧。
回复

使用道具 举报

12#
ID:85201 发表于 2015-7-21 23:49 | 显示全部楼层
xtitxjg 发表于 2015-7-21 08:27
IF只判断真假,与是否表达式无关
其实你那个程序不需要每次加减,直接给最大或最小

见笑,虽然我明白你讲的逻辑,但我到现在还是写不出正常的程序来。我可能还欠缺一些基本知识。您还是把您的程序给我看看吧,没有成功的案例参考,要走不少弯路呢。还有,我也没多少时间可用了,再做不出来,我就得失信于人了。拜托了。
回复

使用道具 举报

13#
ID:85201 发表于 2015-7-23 14:49 | 显示全部楼层
xtitxjg 发表于 2015-7-23 14:38
给你吧,写好了1秒一次,60次

不胜感激,真的是不胜感激。若不介意,能留个QQ吗?我们也算是志趣相同,你在这方面也是高手了,所以我想今后有疑难的地方还要向你多请教。
回复

使用道具 举报

14#
ID:85201 发表于 2015-7-23 17:15 | 显示全部楼层
xtitxjg 发表于 2015-7-23 15:00
我高手的很反正幼儿园一般的小盆友还是整不赢我滴QQ一般一上了,微信吧33136583

谦虚了,我现在在单片机和C语言这块,也就是幼儿园水平而已。
回复

使用道具 举报

15#
ID:85201 发表于 2015-7-28 11:59 | 显示全部楼层
xtitxjg 发表于 2015-7-23 14:38
给你吧,写好了1秒一次,60次

你最后给我的那个程序,我稍微改动了一下(因为我用的是89C52单片机,所以头文件改成了reg52.h),下载到单片机后,还是没有反映,我买了四个舵机,都逐一试过,单片机更换过两个,也是不行。这是什么原因啊?
回复

使用道具 举报

16#
ID:85201 发表于 2015-7-28 12:01 | 显示全部楼层
腾飞的龙 发表于 2015-7-23 19:43
这个是我用的舵机程序 按键可以当传感器用。

谢谢援助,虽然我想要的是不用按键自己就动的,但你的程序对于我今后的学习会有帮助,所以再次感谢 。
回复

使用道具 举报

17#
ID:85201 发表于 2015-8-3 13:44 | 显示全部楼层
xtitxjg 发表于 2015-8-1 11:24
亡了告诉你,我用的是24M时钟,5152不是问题,如果你是其他时钟自己改下定时器就行了

明白了。我回去试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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