导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→求教:用串口精灵给89C52发送数据,怎么只能发送一次呢

* 95892: 求教:用串口精灵给89C52发送数据,怎么只能发送一次呢

   nankang 
nankang发表的帖子 

 求教:用串口精灵给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

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  95937.[详细]找到原因了
摘要:已经找到原因了 co是静态变量,每次接收完成要重新赋值 谢谢大家......(60字)
- [nankang][889次] 2006年7月24日

[上一篇帖子]:求PT100热电阻资料[fly][fly][fly]那位朋友有PT100热电阻的资料,最好包括原理、
[下一篇帖子]:谁能研究出防反光辐射技术?我公司是研发单位,人人用计算机,敞亮大窗户的窗帘不能拉开,全天开着灯工作,