[讨论] 关于中断的问题(舵机)

4995155703   2014-10-8 13:55 楼主
//这是一个根据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 (2014-10-8 13:54 上传)

    44.8 KB, 下载次数: 6

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

回复评论 (11)

怎么没人解决啊
点赞  2014-10-17 17:59
n 重复定义了
点赞  2014-10-17 18:17
引用: deweyled 发表于 2014-10-17 18:17
n 重复定义了

重复定义在哪  我找不到  求解答
点赞  2014-10-31 17:52
   while(m)
                      {                        
                              temp1=40-(4*f)/51;
                              f=read_add(adressread1,adressread2);         
                              adressread2++;if(adressread2==0){adressread1++;}            
                              temp0=(4*f/51)+20;
                              while(m);
                       }


这段
点赞  2014-10-31 19:20
还有就是你的定时器0的中断函数里,n=1这句怎么加?
点赞  2014-10-31 19:24
定时器1的中断优先级比定时器0要低,你怎么加啊
点赞  2014-10-31 19:25
引用: 随风暗影 发表于 2014-10-31 19:20
while(m)
                      {                        
                              temp1=4 ...

这段好像没有N啊  哪来的·n重复定义啊
点赞  2014-11-8 14:13
引用: 随风暗影 发表于 2014-10-31 19:24
还有就是你的定时器0的中断函数里,n=1这句怎么加?

这个是我后来改的  之前是n++,N++一跳出中断也马上变0;就算在中断里面是n=1,可是一条除中断N马上变0.不知道为什么你可以仿真下试试,我就是不知道你说的N重复定义了在哪。。那段只有M哪来的N、啊。。求指教
点赞  2014-11-8 14:16
引用: 随风暗影 发表于 2014-10-31 19:25
定时器1的中断优先级比定时器0要低,你怎么加啊

没有吧  我是按顺序开关中断的。。定时中断1开之前一定是TR0=0,TR1=1;定时器0也是同理啊。。。应该不存在你说的优先级的问题吧
点赞  2014-11-8 14:20
你的程序没有注释,我看的也不是很明白,之前的问题,是因为你的程序我感觉写的有点乱
点赞  2014-11-8 21:46
引用: 随风暗影 发表于 2014-11-8 21:46
你的程序没有注释,我看的也不是很明白,之前的问题,是因为你的程序我感觉写的有点乱

额·。。。。好吧。。。。
点赞  2014-11-9 19:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复