3646|11

10

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于中断的问题(舵机) [复制链接]

//这是一个根据AD转换的数值来控制舵机转角的程序用ADC0808,8路AD转换和8路的舵机驱动程序思路是这样的:先AD转换,然后根据这个数值驱动舵机,再把这个数值存到EEPROM里面,之后再把这个数值读出来驱动舵机。 前面都没问题,就是把数值读出来 驱动舵机这里出问题了。问题再readcuncu这个函数中。我搞不明白  求指教。(后面有问题详细说明)
这是主程序  完整的程序我用附近上传  大家下载下来看看讨论下 学习下
#include
#include"zh.h"
#include"ad.h"
int aa=0,n=0,m=1,adress1=0,adress2=0,h=0,i=0,j=0;
unsigned char adressread1=0,adressread2=0;
int code g[8]={1,2,4,8,16,32,64,128};                           //这个数组定义的目的是按照一定顺序和时间分别让不同的IO为1.
void iniit()                                                          //定时中断的初始化
{
  TMOD=0X12;
  EA=1;
  ET0=1;
  ET1=1;
  TH0=206;        //定时器0 方式2定时50us
  TL0=206;
  TH1=0XBD;   //定时器1方式1定时17ms
  TL1=0X98;
}
void delay20ms()                   //去抖动延时
{
    unsigned char a,b;
    for(b=215;b>0;b--)
        for(a=45;a>0;a--);
}


//readcuncu()用来读取EEPROM里面数据的函数,并且产生脉冲(1到2ms内可变高电平脉宽,周期20MS)控制舵机
//利用两个中断一个50us一个17ms,50us用来产生高电平,17ms相当于一个中断的延时,这样中断产生17Ms延时,单片机就可以做其他事情了。
  //这个程序的思路是这样的:初始化——读取EEPROM数据——产生高电平脉冲——利用剩下17MS中断的时间再读取下一个EEPROM里面的数据可以节约时间——
  //————然后再高电平。如此循环。
  void readcuncu()                                                   
{                                                                                          
   int temp0=0,i=0,temp1=0,n=0,m=1;
   unsigned char f;
   init();
   P0=0;
   f=read_add(adressread1,adressread2);       
   temp0=(4*f/51)+20;         //将存储器里面的值经过变换得到一个值来控制舵机转的角度。(存储器里面存的是AD转换过来的值)
   temp1=40-(4*f)/51;   //17ms过后还要多少个50us的低电平
   TR0=1;
   while(k1==1)                                                         //k1是一个按键,它是高电平时才进入while函数。
   {

         while(n              {P1=g[i];P3=n;}                        //问题就在这:按理说应该n是全局变量,执行中断程序(n++;)之后n的值会加一,可是n的值
         if(n>=temp0)                                        //只要一回到while()_这就变成0.。这是为什么 我想不明白(我用keil仿真的)
             {                                     
               TR1=1;P1=0;TR0=0;n=0;
                while(m)
                      {                         
                              temp1=40-(4*f)/51;
                              f=read_add(adressread1,adressread2);         
                              adressread2++;if(adressread2==0){adressread1++;}            
                              temp0=(4*f/51)+20;
                              while(m);
                       }
                m=1;
                TR1=0;TR0=1;
                while(n                 TR0=0;n=0;TR0=1;
              }
   }

}




main()
{
    int t,temp=0;
    iniit();
while(1)
{
    if(k1==1)
    {
         delay20ms();
         n=0;h=0;m=1;aa=0;  //一些标志复位,防止程序逻辑乱掉
         while(k1==1)
         { readcuncu();}
    }
        else                  //后面是先读AD  然后驱动舵机 在存储数据的过程  这边没问题
   {
        P0=0;
        t=addd(aa);
        temp=(4*t)/51+20;
        adress1=0;adress2=0;
        TR0=1;
        while(k1==0)
         {
           if(h==1)
           {
              aa++;h=0;n=0;
              if(aa==8){aa=0;}
              t=addd(aa);         
              temp=(4*t)/51+20;
              TR0=1;
            }
            if(n
            {P0=g[i];}
             else
            {     
                TR0=0;
                P0=0;
                TR1=1;n=0;
                temp=40-(4*t)/51;                             //17ms过后还要多少时间的低电平
                while(m)
               {
                 cuncu(adress1,adress2,t);
                 adress2++;
                 if(adress2==0){adress1++;}                   //程序地址加1
                 while(m);
               }                                              //写进存储器???地址高地位确定后再改
                TR1=0;TR0=1;m=1;
                while(n                    TR0=0;                                                                                       
                   h=1;i++;if(i==8){i=0;}
             }
         }
     }   
}     
}
void pwm0() interrupt 1
{
   n=1;

}
void pwm1() interrupt 3
{

   TH1=0XBD;   //定时器1方式1定时17ms
   TL1=0X98;
   m=0;
}      

TEST5.rar

44.8 KB, 下载次数: 6

这个是编译好的keil文件程序

此帖出自51单片机论坛

最新回复

你的程序没有注释,我看的也不是很明白,之前的问题,是因为你的程序我感觉写的有点乱  详情 回复 发表于 2014-11-8 21:46
点赞 关注
 

回复
举报

10

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
怎么没人解决啊
此帖出自51单片机论坛
 
 
 

回复

755

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
n 重复定义了
此帖出自51单片机论坛

点评

重复定义在哪 我找不到 求解答  详情 回复 发表于 2014-10-31 17:52
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

4
 

重复定义在哪  我找不到  求解答
此帖出自51单片机论坛
 
 
 

回复

105

帖子

1

TA的资源

一粒金砂(中级)

5
 
   while(m)
                      {                        
                              temp1=40-(4*f)/51;
                              f=read_add(adressread1,adressread2);         
                              adressread2++;if(adressread2==0){adressread1++;}            
                              temp0=(4*f/51)+20;
                              while(m);
                       }


这段
此帖出自51单片机论坛

点评

这段好像没有N啊 哪来的·n重复定义啊  详情 回复 发表于 2014-11-8 14:13
 
 
 

回复

105

帖子

1

TA的资源

一粒金砂(中级)

6
 
还有就是你的定时器0的中断函数里,n=1这句怎么加?
此帖出自51单片机论坛

点评

这个是我后来改的 之前是n++,N++一跳出中断也马上变0;就算在中断里面是n=1,可是一条除中断N马上变0.不知道为什么你可以仿真下试试,我就是不知道你说的N重复定义了在哪。。那段只有M哪来的N、啊。。求指教  详情 回复 发表于 2014-11-8 14:16
 
 
 

回复

105

帖子

1

TA的资源

一粒金砂(中级)

7
 
定时器1的中断优先级比定时器0要低,你怎么加啊
此帖出自51单片机论坛

点评

没有吧 我是按顺序开关中断的。。定时中断1开之前一定是TR0=0,TR1=1;定时器0也是同理啊。。。应该不存在你说的优先级的问题吧  详情 回复 发表于 2014-11-8 14:20
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

8
 
随风暗影 发表于 2014-10-31 19:20
while(m)
                      {                        
                              temp1=4 ...

这段好像没有N啊  哪来的·n重复定义啊
此帖出自51单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

9
 
随风暗影 发表于 2014-10-31 19:24
还有就是你的定时器0的中断函数里,n=1这句怎么加?

这个是我后来改的  之前是n++,N++一跳出中断也马上变0;就算在中断里面是n=1,可是一条除中断N马上变0.不知道为什么你可以仿真下试试,我就是不知道你说的N重复定义了在哪。。那段只有M哪来的N、啊。。求指教
此帖出自51单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

10
 
随风暗影 发表于 2014-10-31 19:25
定时器1的中断优先级比定时器0要低,你怎么加啊

没有吧  我是按顺序开关中断的。。定时中断1开之前一定是TR0=0,TR1=1;定时器0也是同理啊。。。应该不存在你说的优先级的问题吧
此帖出自51单片机论坛
 
 
 

回复

105

帖子

1

TA的资源

一粒金砂(中级)

11
 
你的程序没有注释,我看的也不是很明白,之前的问题,是因为你的程序我感觉写的有点乱
此帖出自51单片机论坛

点评

额·。。。。好吧。。。。  详情 回复 发表于 2014-11-9 19:24
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

12
 
随风暗影 发表于 2014-11-8 21:46
你的程序没有注释,我看的也不是很明白,之前的问题,是因为你的程序我感觉写的有点乱

额·。。。。好吧。。。。
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表