小弟写了一个程序,打算用定时器的方法来控制多个步进电机。
下面是程序。这个是在while循环中版本。还有一个,是在中断中的,在while中的步进电机不能转。但是在中断中就可以转了。为什么呢?
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar zheng[]={0x08,0x04,0x02,0x01};
uchar fan[]={0x01,0x02,0x04,0x08}; uchar k=0,i=0,j=0;
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;//设置初值,每个计数周期计时50ms
TL0=(65536-50000)%256;
EA=1; //打开中断开关
ET0=1; //打开定时器中断
TR0=1; //打开定时器0
while(1)
{
if(k%2==0 || k==0)
{
P0=zheng
;
i++;
if(i>=4)
i=0;
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;//设置初值,每个计数周期计时50ms
TL0=(65536-50000)%256;
k++;
if(k>200)
k=0;
}
中断中写法。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar zheng[]={0x08,0x04,0x02,0x01};
uchar fan[]={0x01,0x02,0x04,0x08}; uchar k=0,i=0,j=0;
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;//设置初值,每个计数周期计时50ms
TL0=(65536-50000)%256;
EA=1; //打开中断开关
ET0=1; //打开定时器中断
TR0=1; //打开定时器0
while(1)
{
;
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;//设置初值,每个计数周期计时50ms
TL0=(65536-50000)%256;
if(k%2==0 || k==0)
{
P0=zheng;
i++;
if(i>=4)
i=0;
}
k++;
if(k>200)
k=0;
}
此帖出自小平头技术问答
这一句不对吧,zheng是个数组,你这样写是把数组的地址输出了,是不是应该输出zheng里面的值?
没仔细看,大概觉得是这样
其实LZ写的是P0=zheng[ i ],只是发帖[ i ]会没了,不信你们可以试试(括号内别加空格)
[ 本帖最后由 孤獨の快樂 于 2011-10-29 14:06 编辑 ]因为中断里是100ms改变一次P0的输出吧
主函数里面会一直循环,满足if的条件时,P0几us内就变一次的
一周热门 更多>