//这是一个根据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文件程序
while(m)
{
temp1=40-(4*f)/51;
f=read_add(adressread1,adressread2);
adressread2++;if(adressread2==0){adressread1++;}
temp0=(4*f/51)+20;
while(m);
}
这段
还有就是你的定时器0的中断函数里,n=1这句怎么加?
这个是我后来改的 之前是n++,N++一跳出中断也马上变0;就算在中断里面是n=1,可是一条除中断N马上变0.不知道为什么你可以仿真下试试,我就是不知道你说的N重复定义了在哪。。那段只有M哪来的N、啊。。求指教
没有吧 我是按顺序开关中断的。。定时中断1开之前一定是TR0=0,TR1=1;定时器0也是同理啊。。。应该不存在你说的优先级的问题吧
你的程序没有注释,我看的也不是很明白,之前的问题,是因为你的程序我感觉写的有点乱