求教:用串口精灵给89C52发送数据,怎么只能发送一次呢
我通过串口精灵给at89c52发数据 ,可是只是单片机上电后第一次发送成功,再发就不对了,不知道为什么啊。弄了快一周了,课题进度在那 着急啊拜托这里的高人给看看,程序有点长。多谢了!!一定帮我看看啊,我现在没有师兄,导师不在,急死了。程序可能看不清楚,我们再讨论。
#include <reg52.h>
#include <math.h>
#define t0 10
sbit p10=p2^0;//脉冲
sbit p11=p2^1; //方向
sbit p12=p2^2; //细分
sbit p13=p2^3;//等于0时脱机模式
sbit p15=p2^5;//动力
sbit p16=p2^6;//雪地模式
sbit p17=p2^7;//巡航模式
unsigned int code steptim[2][10]={{300,200,100,100,100,100,100,100,100,100},
{500,500,300,300,300,300,300,300,300,300}};
unsigned int idata comword[7];
unsigned int data stepnum,realstep;
char temp;
unsigned char flag=0,speed,targetspeed;
void initialuart(void);
//初始化波特率
void initialuart(void)
{ea=0;
tr2=0;
tmod=0x11; //set timer0/1 operate in mode1 (16-bit timer)
t2con=0x30; //enable timer2 as serial transmit and receive clock
pcon=0; //smod=0
scon=0x50; //|sm0|sm1|sm2|ren|tb8|tb9|ti|ri|
rcap2l=0xb8;
rcap2h=0xff; //reload value----to set baudrate=4800
tl2=0xb8;
th2=0xff;
tr2=1;
ea=1;
}
void timer1(void) interrupt 3 using 3
{unsigned char tim;
static unsigned char i,j, step=0;
tr1=0;
et1=0;
p10=~p10;
if((speed-targetspeed)> 10)
p11=0;
else if((targetspeed-speed)> 10)
p11=1;
else p13=0;
if(p13!=0)
{tim=3000;
tl1=(65536-tim)&0xff;
th1=(65536-tim)/256;
if(step> realstep)
{
tr1=0;
et1=0;
for(j=1;j <=30;j++)
{
for(i=1;i <=30;i++)
{
}
}
p13=0;
}
else
{et1=1;
tr1=1;
step++;}}}
void timer0(void) interrupt 1 using 1
{
unsigned char i,j,tim;
static unsigned char k,step;
tr0=0;/*关计数器*/
et0=0;/*停中断*/
p10=~p10;
if(p15==0)
{if(step <stepnum)
{tim=steptim[0][k];
if(step%3==0)
k++;
}
else if(step> realstep-6&&step <realstep-3)
tim=200;
else tim=300;
}
else if(p16==0)
{tim=steptim[1][k];
if(step%3==0)
k++;
}
else tim=300;
tl0=(unsigned char)((65536-tim)&0xff);
th0=(unsigned char)((65536-tim)/256);/*再次附中断初值*/
if(step> realstep)
{
p10=1;
tr0=0;
et0=0;
for(j=1;j <=30;j++)
{
for(i=1;i <=30;i++)
{
}
}
p13=0;
}
else
{
tr0=1;
et0=1;
step++;
}
}
[color=#dc143c]void com(void) interrupt 4 using 2
{
static unsigned char idata com[11];
static unsigned char idata co=1;
unsigned char data i,j;
if(ri) /*如果ri为1表示已经传入一个数了*/
{
p13=1; //步进电机开始工作
com[co]=sbuf;
if (com[3]!=1 || com[3]!=0) //方向非0和1 时电机停机
{
tr0=0;
et0=0;
p13=0;
}
if(co==10) //不停循环接收9个数
{
comword[1]=com[1]+com[2]*256;/* 步数*/
comword[2]=com[3]; //direction
comword[3]=com[4]+com[5]*256;//speed
comword[4]=com[6]+com[7]*256;//targetspeed
comword[5]=com[8]; //temp
comword[6]=com[9]+com[10]*256;
if(comword[6]!=comword[1]+comword[2]+comword[3]+comword[4]+comword[5]) //串口精灵发出的数com[9]和com[[10]是为了校验用,其中com[9]=(comword[1]+comword[2]+comword[3]+comword[4]+comword[5])mod256,com[10]=(comword[1]+comword[2]+comword[3]+comword[4]+comword[5])/256
{p12=0; //传数不正确,绿灯亮
for(j=1;j <=30;j++)
{
for(i=1;i <=30;i++)
{
}
}
p13=0; //电机停机
}
else
{p12=1;
flag=1; //flag为传数正确标志,等于1时正确
}
}
co=co+1;
ri=0;/*为接受下一个数据做准备*/
}
if(ti)
ti=0;
}[/color]
void motostep(void)
{
if(p15==0)
realstep=stepnum*3/2;
else if(p16==0)
realstep=stepnum*2/3;
else realstep=stepnum;
}
main()
{
unsigned int idata stepdir;/*步进电机方向*/
ip=0x10;//串口高优先级
ie=0x00;/*屏蔽所有中断*/
ea=1;/*开cpu中断*/
es=1;/*开串口中断*/
tcon=0x00;/*时钟控制寄存器初始化*/
initialuart();
p10=1;
p11=1;
p12=1;
p13=0;
p17=1;
while(1)
{
unsigned char tim=300;
if(flag==1) //串口通讯完成并且校验正确,才执行下面的程序
{
p13=1; //电机接通
speed=comword[3];
targetspeed=comword[4];
temp=comword[5];
stepdir=comword[2];
if(stepdir==1)
p11=1;
else
p11=0;
stepnum=comword[1];
motostep();
if(p17==1)
{tl0=(65536-tim)&0xff;
th0=(65536-tim)/256;
p10=0;
tr0=1;/*开定时器0*/
et0=1;
}
else
{if(speed-targetspeed> 10)
p11=0;
else if(targetspeed-speed> 10)
p11=1;
else p13=0;
tl1=(65536-tim)%256;
th1=(65536-tim)/256;
p10=0;
tr1=1;
et1=1;
}
flag=0;
} //if(flag==1)
}//while(1)
}//main()
文字 |
[/color][/color][/color][/size][/size][/size][/face]
发表时间:2006年7月22日16:34:35