QQ登录

只需一步,快速开始

[DIY咨询] 探索基于LX200制作goto和导星--GM导星大师 ok!

  [复制链接]
 楼主| 角落里的烟嘴 发表于 2013-3-4 20:02 | 显示全部楼层 来自: 中国–江苏–苏州 联通
本帖最后由 角落里的烟嘴 于 2013-3-4 20:03 编辑

单片机程序  抄袭  cygnushan 的  双轴电跟自动导星接口的制作(基于LX200协议) http://www.astronomy.com.cn/bbs/ ... ewthread&tid=147169
。。。。。。。。。。。。。。。。。。。。。。。。。。。
#include <string.h>
#include <reg52.h>



char sdata;
char CommandBuff[16]; //命了缓冲区  
char *Command;
unsigned char CommandCome=0;    //是否收到命了,收到命令是1
unsigned char InRec=0; // 不为 0 命了接收中
char s[12];

//  LX200命令格式#:Ms##n##s#



void init_rs232()
{
        ES=0;
        TR1=0;
        IP=0x10;
        TMOD=0x20;
        PCON=0x80;//SMOD=1
        TH1=250;
        TL1=250;
        TI=0;
        RI=0;
        
        SCON=0x50;//工作方式1,波特率9600,允许接收
        IE=0x90;
        TR1=1;
}

void COM_send(void)
{
    unsigned char point = 0;
    for(point=0;point<11;point++)                                      
   {
    SBUF=s[point];
        while(!TI);
    TI=0;
   
    }
}

void main()
{
        P2=0x00;
        init_rs232();
        Command=  &CommandBuff[0];
        while (1)
        {
                if (CommandCome==1) //下面是命令解析
                {
                        CommandCome=0;
                        if (strncmp(Command,"GR",2)==0)     //  
                        {
                                  // RAnow
                                  s[0]='0';
                                  s[1]='1';
                                  s[2]=':';
                                  s[3]='0';
                                  s[4]='9';
                                  s[5]=':';
                                  s[6]='4';
                                  s[7]='4';
                                  s[8]='#';
                                COM_send();  
                                       
                        }
                        
                        else if (strncmp(Command,"GD",2)==0)     //   
                        {
                                
                           // DECnow
                              s[0]='+';
                                  s[1]='8';
                                  s[2]='9';
                                  s[3]='*';
                                  s[4]='1';
                                  s[5]='0';
                                  s[6]='#';
                                  s[7]='0';
                                  s[8]='0';
                                 COM_send();  
                        }
                        
                  
                }
        }


}


void UartInt(void) interrupt 4
{
        if (RI==1)
        {
                ES=0;
                sdata=SBUF;
                RI=0;

                if ((sdata==':')&&(CommandCome==0)&&(InRec==0)) //收到冒号 并且 命令缓冲区为空
                {                                
                        InRec=1;  //命令接收中
                }
                else if ((InRec>0)&&(sdata!='#'))      // 如果命了接收中 并且没有收到 #
                {                        
                        CommandBuff[InRec-1]=sdata;
                        //if (isprint(sdata)==1 )
                                InRec=InRec+1;                        
                }  
                else if ((sdata=='#')&&(InRec>0))  //收到命了结束表示
                {  
                        CommandBuff[InRec-1]=0;
                        InRec=0;  //接收空闲中
                        CommandCome=1; //收到命了
                }                 
                else if (InRec>4)      //命了长度超过4 还没有收到命了结束符号        
                {                  
                        InRec=0 ;                         //接收为空
                        CommandCome=0;                    //忽略命令     
                }

                ES=1;

        }

}
。。。。。。。。。。。。。。。。。。。。。。。。。。。
stellarium 工作日志出错


15768, 11:53:28.437500Z: Connection::performWriting: writeNonblocking(5) returned 5; #:GR#
15768, 11:53:28.500000Z: Connection::performReading: readNonblocking returned 11; 01:09:44#  
15768, 11:53:28.500000Z: Lx200CommandGetRa::readAnswerFromBuffer: RA = 01:09:44
15768, 11:53:28.500000Z: Lx200Connection::writeFrontCommandToBuffer(Lx200CommandGetDec): queued
15768, 11:53:28.640625Z: Connection::performWriting: writeNonblocking(5) returned 5; #:GD#
15768, 11:53:28.687500Z: Connection::performReading: readNonblocking returned 11; +89*10#00  
15768, 11:53:28.687500Z: Lx200CommandGetDec::readAnswerFromBuffer: error: '+' or '-' expected
15768, 11:53:28.687500Z: Lx200Connection::resetCommunication
15768, 11:53:28.750000Z: Lx200Connection::sendCommand(Lx200CommandGetRa)
15768, 11:53:28.750000Z: Lx200Connection::sendCommand(Lx200CommandGetDec)


但是用串口调试工具发送相同的回复值,stellarium就能认出,用单片机通信发送同样的字符串就不人DEC
这是为什么 有大神在看帖子么。。。。。。谁能指导一下呢
回复 顶~ 砸~

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2013-3-4 20:57 | 显示全部楼层 来自: 中国–江苏–苏州 联通
@tbb1  单片机的代码来了,根据下面的继续修改你就可以 做一个 基于LX200 协议的 goto啦
上位机就用stellarium 就可以啦


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <reg52.h>


char sdata;
char CommandBuff[16]; //命了缓冲区  
char *Command;
unsigned char CommandCome=0;    //是否收到命了,收到命令是1
unsigned char InRec=0; // 不为 0 命了接收中
char s[12];
int rahh,ramm,rass,decdd,decmm;
char decs;
//  LX200命令格式#:Ms##n##s#

void Uart_Printf()
{
SBUF=0;
printf("串口初始化完毕\n");
}

void init_rs232()
{
        ES=0;
        TR1=0;
        IP=0x10;
        TMOD=0x20;
        PCON=0x80;//SMOD=1
        TH1=250;
        TL1=250;
        TI=0;
        RI=0;
       
        SCON=0x50;//工作方式1,波特率9600,允许接收
        IE=0x90;
        TR1=1;
        Uart_Printf();
}



void main()
{
         
        init_rs232();
        Command=  &CommandBuff[0];
        while (1)
        {
                if (CommandCome==1) //下面是命令解析
                {
                        CommandCome=0;
                        if (strncmp(Command,"GR",2)==0)     // 向东移动  
                        {
                                  // RAnow 02:31:45#
                                   rahh=12;
                                   ramm=31;
                                   rass=45;
                                  
                         printf("%d:%d:%d#",rahh,ramm,rass);
                                   
                                       
                        }
                       
                        else if (strncmp(Command,"GD",2)==0)     // 向西移动  
                        {
                               
                           // DECnow +89*10#
                               decs='+';
                               decdd=89;
                                   decmm=10;
                          printf("%c%d:%d#",decs,decdd,decmm);
                        }
                       
         
                       
                       
                 
                       
                 
                       
                 
                       
                 
                       
                       
                       
                        else if (strncmp(Command,"Q",1)==0)
                        {
                               
                         
                        }
                    // 非能解析命令不执行 否则 无法解析命令将会变成停止命令
                       

                }
        }


}


void UartInt(void) interrupt 4
{
        if (RI==1)
        {
                ES=0;
                sdata=SBUF;
                RI=0;

                if ((sdata==':')&&(CommandCome==0)&&(InRec==0)) //收到冒号 并且 命令缓冲区为空
                {                                
                        InRec=1;  //命令接收中
                }
                else if ((InRec>0)&&(sdata!='#'))      // 如果命了接收中 并且没有收到 #
                {                        
                        CommandBuff[InRec-1]=sdata;
                        //if (isprint(sdata)==1 )
                                InRec=InRec+1;                       
                }  
                else if ((sdata=='#')&&(InRec>0))  //收到命了结束表示
                {  
                        CommandBuff[InRec-1]=0;
                        InRec=0;  //接收空闲中
                        CommandCome=1; //收到命了
                }                
                else if (InRec>4)      //命了长度超过4 还没有收到命了结束符号       
                {                  
                        InRec=0 ;                         //接收为空
                        CommandCome=0;                    //忽略命令     
                }

                ES=1;

        }

}

点评

楼主是个好同志啊, 我前两天还在怀疑楼主藏着私货啊。。。 特别支持! 特别感动啊! 能不能先把双电跟的代码发一个啊,我先把步进整动起来才能想着GOTO啊。。。 谢谢了!  详情 回复 发表于 2013-3-4 21:19
回复 顶~ 砸~

使用道具 举报

tbb1 发表于 2013-3-4 21:19 | 显示全部楼层 来自: 中国–上海–上海–浦东新区 电信

楼主是个好同志啊,
我前两天还在怀疑楼主藏着私货啊。。。
特别支持!
特别感动啊!
能不能先把双电跟的代码发一个啊,我先把步进整动起来才能想着GOTO啊。。。

谢谢了!

点评

驱动步进电机的程序真的 不老少了 没法说你了  详情 回复 发表于 2013-3-4 22:22
回复 顶~ 砸~

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2013-3-4 22:22 来自手机 | 显示全部楼层 来自: 中国–江苏–南京 联通
tbb1 发表于 2013-3-4 21:19
楼主是个好同志啊,
我前两天还在怀疑楼主藏着私货啊。。。
特别支持!

驱动步进电机的程序真的 不老少了 没法说你了

点评

哎,你不知道俺任务多重啊: 1、学习CAD,画图 2、学习单片机编程 3、折腾牛反光轴 4、学习找星软件,那个stelll。。。。。啥来着。。。。到现在还有个该死的三角标记去不掉啊。。。 别的不说,光单片机和电脑之间  详情 回复 发表于 2013-3-4 22:32
回复 顶~ 砸~

使用道具 举报

tbb1 发表于 2013-3-4 22:32 | 显示全部楼层 来自: 中国–上海–上海–浦东新区 电信
角落里的烟嘴 发表于 2013-3-4 22:22
驱动步进电机的程序真的 不老少了 没法说你了

哎,你不知道俺任务多重啊:
1、学习CAD,画图
2、学习单片机编程
3、折腾牛反光轴
4、学习找星软件,那个stelll。。。。。啥来着。。。。到现在还有个该死的三角标记去不掉啊。。。

别的不说,光单片机和电脑之间的串口线,我就折腾了一个多礼拜,最后才发现是USB转串口线兼容性不行,重新买了根线才搞定。。。
DIY苦啊。。。。

点评

我要磨镜,做牛反,还要做goto 细节全是自己动手做的  详情 回复 发表于 2013-3-16 15:04
苦就别diy了  详情 回复 发表于 2013-3-4 22:46
回复 顶~ 砸~

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2013-3-4 22:46 | 显示全部楼层 来自: 中国–江苏–苏州 电信
tbb1 发表于 2013-3-4 22:32
哎,你不知道俺任务多重啊:
1、学习CAD,画图
2、学习单片机编程

苦就别diy了

回复 顶~ 砸~

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2013-3-11 13:03 | 显示全部楼层 来自: 中国–江苏–苏州 联通
为什么   :Sd +76?24:55# :Ms# 这两个命令会 和在一起发送出来
为什么我会连续回复两个1 我xxx

点评

emc
Sd命令设置目标星的赤纬地址,回复1代表确认,ms命令意思是可以goto了吗?回复1代表ok。 楼主挺执着啊,鼓捣好久了。  详情 回复 发表于 2013-3-18 22:24
回复 顶~ 砸~

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2013-3-11 13:03 | 显示全部楼层 来自: 中国–江苏–苏州 联通
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <reg52.h>


char sdata;
char CommandBuff[16]; //命了缓冲区  
char *Command;
unsigned char CommandCome=0;    //是否收到命了,收到命令是1
unsigned char InRec=0; // 不为 0 命了接收中
char s[12];
int rahh,ramm,rass,decdd,decmm;
char decs;
//  LX200命令格式#:Ms##n##s#

void Uart_Printf()
{
SBUF=0;
printf("串口初始化完毕\n");
}

void init_rs232()
{
        ES=0;
        TR1=0;
        IP=0x10;
        TMOD=0x20;
        PCON=0x80;//SMOD=1
        TH1=250;
        TL1=250;
        TI=0;
        RI=0;
       
        SCON=0x50;//工作方式1,波特率9600,允许接收
        IE=0x90;
        TR1=1;
        Uart_Printf();
}



void main()
{
         
        init_rs232();
        Command=  &CommandBuff[0];
                       rahh=22;
                                   ramm=31;
                                   rass=45;
                                   decs='+';
                               decdd=85;
                                   decmm=10;
        while (1)
        {
                if (CommandCome==1) //下面是命令解析
                {
                        CommandCome=0;
                        if (strncmp(Command,"GR",2)==0)     // 向东移动  
                        {
                                  // RAnow 02:31:45#
                                  
                                     
                         
                                 
                                 printf("%d%d:%d%d:%d%d#",rahh/10,rahh%10,ramm/10,ramm%10,rass/10,rass%10);
                                       
                        }
                       
                        else if (strncmp(Command,"GD",2)==0)     // 向西移动  
                        {
                               
                           // DECnow +89*10#
                                  
                               
                                  printf("%c%d%d:%d%d#",decs,decdd/10,decdd%10,decmm/10,decmm%10);
                                  
                        }
               
                 //Q
                         else if (strncmp(Command,"Q",1)==0)
                        {
                            printf("0");       
                         
                        }
                       
                        //##:Sr 14:50:42#
                        //     012345678910    CommandBuff
                       
                        else if (strncmp(Command,"Sr",2)==0)
                        {
                            printf("1");
                    rahh=(CommandBuff[3]-0x30)*10+(CommandBuff[4]-0x30);
                ramm=(CommandBuff[6]-0x30)*10+(CommandBuff[7]-0x30);
                                rass=(CommandBuff[9]-0x30)*10+(CommandBuff[10]-0x30);
                          
                        }
                         //Sd +16?30:33#       
                        //:Sd +74:09:20#
                        // 0123456789012
                        else if (strncmp(Command,"Sd",2)==0)
                        {
                            printf("1");
                    decs= CommandBuff[3] ;
                decdd=(CommandBuff[4]-0x30)*10+(CommandBuff[5]-0x30);
                                decmm=(CommandBuff[7]-0x30)*10+(CommandBuff[8]-0x30);


                         
                        }

                        else if (strncmp(Command,"MS",2)==0)
                        {
                             

                         
                        }

                    // 非能解析命令不执行 否则 无法解析命令将会变成停止命令
                       

                }
        }


}


void UartInt(void) interrupt 4
{
        if (RI==1)
        {
                ES=0;
                sdata=SBUF;
                RI=0;

                if ((sdata==':')&&(CommandCome==0)&&(InRec==0)) //收到冒号 并且 命令缓冲区为空
                {                                
                        InRec=1;  //命令接收中
                }
                else if ((InRec>0)&&(sdata!='#'))      // 如果命了接收中 并且没有收到 #   
                {                        
                        CommandBuff[InRec-1]=sdata;
                  
                                InRec=InRec+1;       
                                         
                }
        
           
        else if ((sdata=='#')&&(InRec>0))  //收到命了结束表示
                {  
                        CommandBuff[InRec-1]=0;
                    InRec=0 ;
                        CommandCome=1; //收到命了
                }                

                ES=1;

        }

}
回复 顶~ 砸~

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2013-3-16 13:17 | 显示全部楼层 来自: 中国–江苏–苏州 联通
下面列出 51单片机的C语言程序 代码 ,完美接受lx200 协议命令,在扩展一下导星的lx200命令就能用来导星了
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <reg52.h>


char sdata;
char CommandBuff[16]; //命了缓冲区  
char *Command;
unsigned char CommandCome=0;    //是否收到命了,收到命令是1
unsigned char InRec=0; // 不为 0 命了接收中
char s[12];
int rahh,ramm,rass,decdd,decmm;
char decs;
//  LX200命令格式#:Ms##n##s#

void Uart_Printf()
{
SBUF=0;
printf("串口初始化完毕\n");
}

void init_rs232()
{
        ES=0;
        TR1=0;
        IP=0x10;
        TMOD=0x20;
        PCON=0x80;//SMOD=1
        TH1=250;
        TL1=250;
        TI=0;
        RI=0;
       
        SCON=0x50;//工作方式1,波特率9600,允许接收
        IE=0x90;
        TR1=1;
        Uart_Printf();
}


void commandin(void)
        {
                CommandCome=0;
                if (strncmp(Command,"GR",2)==0)     // 向东移动  
                        {
                      // RAnow 02:31:45#
                     printf("%d%d:%d%d:%d%d#",rahh/10,rahh%10,ramm/10,ramm%10,rass/10,rass%10);
                    }

       else if (strncmp(Command,"GD",2)==0)     // 向西移动  
            {
                        // DECnow +89*10#
                        printf("%c%d%d:%d%d#",decs,decdd/10,decdd%10,decmm/10,decmm%10);
                       
                        }

            //Q
       else if (strncmp(Command,"Q",1)==0)
                        {
                 
                        }

           //##:Sr 14:50:42#
            //     012345678910    CommandBuff

       else if (strncmp(Command,"Sr",2)==0)
           {
                        printf("1");
                        rahh=(CommandBuff[3]-0x30)*10+(CommandBuff[4]-0x30);
                        ramm=(CommandBuff[6]-0x30)*10+(CommandBuff[7]-0x30);
                        rass=(CommandBuff[9]-0x30)*10+(CommandBuff[10]-0x30);
                        }
                        //Sd +16?30:33#       
                        //:Sd +74:09:20#
                        // 0123456789012
           else if (strncmp(Command,"Sd",2)==0)
                        {
                        printf("1");
                        decs= CommandBuff[3] ;
                        decdd=(CommandBuff[4]-0x30)*10+(CommandBuff[5]-0x30);
                        decmm=(CommandBuff[7]-0x30)*10+(CommandBuff[8]-0x30);
                        }

           else if (strncmp(Command,"MS",2)==0)
                    {
                       
                        }

    }

void main()
{
         
        init_rs232();
        Command=  &CommandBuff[0];
                       rahh=22;
                                   ramm=31;
                                   rass=45;
                                   decs='+';
                               decdd=85;
                                   decmm=10;
        while (1)
        {
       
        }


}


void UartInt(void) interrupt 4
{
        if (RI==1)
        {
                ES=0;
                sdata=SBUF;
                RI=0;

                if ((sdata==':')&&(CommandCome==0)&&(InRec==0)) //收到冒号 并且 命令缓冲区为空
                {                                
                        InRec=1;  //命令接收中
                }
                else if ((InRec>0)&&(sdata!='#'))      // 如果命了接收中 并且没有收到 #   
                {                        
                        CommandBuff[InRec-1]=sdata;
                  
                                InRec=InRec+1;       
                                         
                }
        
           
        else if ((sdata=='#')&&(InRec>0))  //收到命了结束表示
                {  
                        CommandBuff[InRec-1]=0;
                    InRec=0 ;
                        CommandCome=1; //收到命了
            commandin();

                }                

                ES=1;

        }

}
回复 顶~ 砸~

使用道具 举报

醒悟人生 发表于 2013-3-16 15:04 | 显示全部楼层 来自: 中国–河南–许昌 联通
tbb1 发表于 2013-3-4 22:32
哎,你不知道俺任务多重啊:
1、学习CAD,画图
2、学习单片机编程

我要磨镜,做牛反,还要做goto  细节全是自己动手做的

点评

good!  详情 回复 发表于 2013-3-18 14:55
磨多简单啊,时间就可以了。 CAD和单片机,那是问题出了你都很难找出来在哪里  详情 回复 发表于 2013-3-16 18:00
回复 顶~ 砸~

使用道具 举报

tbb1 发表于 2013-3-16 18:00 | 显示全部楼层 来自: 中国–香港 电讯盈科有限公司
醒悟人生 发表于 2013-3-16 15:04
我要磨镜,做牛反,还要做goto  细节全是自己动手做的

磨多简单啊,时间就可以了。
CAD和单片机,那是问题出了你都很难找出来在哪里
回复 顶~ 砸~

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2013-3-18 14:55 | 显示全部楼层 来自: 中国–江苏–苏州 联通
醒悟人生 发表于 2013-3-16 15:04
我要磨镜,做牛反,还要做goto  细节全是自己动手做的

good!
回复 顶~ 砸~

使用道具 举报

emc 发表于 2013-3-18 22:24 | 显示全部楼层 来自: 中国–北京–北京–海淀区 联通
角落里的烟嘴 发表于 2013-3-11 13:03
为什么   :Sd +76?24:55# :Ms# 这两个命令会 和在一起发送出来
为什么我会连续回复两个1 我xxx ...

Sd命令设置目标星的赤纬地址,回复1代表确认,ms命令意思是可以goto了吗?回复1代表ok。
楼主挺执着啊,鼓捣好久了。

点评

我最后把判断放 接受中断的代码里面了,相当于 对上危机 发送的命令进行了分段 ,所以就ok了  发表于 2013-3-18 22:46
发送 sr sd 回复 1 表示 目标地址 在地平线以上 可以 slew 发送 ms 就是 move scrop 的意思了  详情 回复 发表于 2013-3-18 22:44
回复 顶~ 砸~

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2013-3-18 22:44 | 显示全部楼层 来自: 中国–江苏–苏州–昆山市 电信
emc 发表于 2013-3-18 22:24
Sd命令设置目标星的赤纬地址,回复1代表确认,ms命令意思是可以goto了吗?回复1代表ok。
楼主挺执着啊, ...

发送 sr sd 回复 1 表示 目标地址 在地平线以上 可以 slew  发送
ms 就是 move scrop 的意思了
回复 顶~ 砸~

使用道具 举报

CLEO 发表于 2013-3-21 14:39 | 显示全部楼层 来自: 中国–广东–珠海 电信
强大啊!!但我不知道步进电机怎样带动望远镜转动的??是在没见过呀,不知哪里有图给我看看??

点评

哦,原来是用赤道仪做基础,换上步进电机,所以最大的前提是有赤道仪....,唉,现在买不起赤道仪,否则我也做一个!!  详情 回复 发表于 2013-3-22 12:28
http://www.astronomy.com.cn/bbs/thread-260157-1-1.html  发表于 2013-3-22 12:14
回复 顶~ 砸~

使用道具 举报

CLEO 发表于 2013-3-22 12:28 | 显示全部楼层 来自: 中国–广东–珠海 电信
CLEO 发表于 2013-3-21 14:39
强大啊!!但我不知道步进电机怎样带动望远镜转动的??是在没见过呀,不知哪里有图给我看看?? ...

哦,原来是用赤道仪做基础,换上步进电机,所以最大的前提是有赤道仪....,唉,现在买不起赤道仪,否则我也做一个!!
回复 顶~ 砸~

使用道具 举报

星云射线 发表于 2013-4-10 18:49 来自手机 | 显示全部楼层 来自: 中国–香港 电讯盈科流动通讯
学习了,虽然看不懂。。。来自: Android客户端
回复 顶~ 砸~

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2013-4-26 23:14 | 显示全部楼层 来自: 中国–江苏–苏州 电信
@tbb1    各位看看 我下面的程序   为什么 当我发送 “:RS# ” 之后 ,定时器0   里的代码 只 运行了一次
找不到哪里不对, 给诊断一下呗


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <reg52.h>

char sdata;
char CommandBuff[16]; //命了缓冲区  
char *Command;
unsigned char CommandCome=0;    //是否收到命了,收到命令是1
unsigned char InRec=0; // 不为 0 命了接收中
char s[12];
int rahh,ramm,rass,decdd,decmm;
char decs;
unsigned char slewspeed;

//  LX200命令格式#:Ms##n##s#
void Uart_Printf()
{
SBUF=0;
printf("串口初始化完毕\n");
}
void init_rs232()
{
        ES=0;
        TR1=0;
      
        TMOD=0x21;
        PCON=0x80;//SMOD=1
  SCON=0x50;//工作方式1,波特率9600,允许接收
        TH1=0xfA; //设置波特率 9600
        TL1=0xfA;
        TR1=1;     // 定时器1启动
        TI=0;  //发送中断标志位清零
        RI=0; //接收中断标志位清零
        
         
        PS=1;
        IE|=0x90;   // 开串行中断 及 总中断
      
        Uart_Printf();
}

void main()
{
        P0=1;   
        init_rs232();

        Command=  &CommandBuff[0];
        while (1)
        {
                if (CommandCome==1) //下面是命令解析
                {
                        CommandCome=0;
                        if (strncmp(Command,"GR",2)==0)     //   get ra , 发送 RA 值
                        {
                                  // RAnow 02:31:45#
                                   rahh=12;
                                   ramm=31;
                                   rass=45;
                                 
                         printf("%d:%d:%d#",rahh,ramm,rass);
                                   
                                       
                        }
                        
                        else if (strncmp(Command,"GD",2)==0)     //  get dec ,发送 DEC 值
                        {
                                
                           // DECnow +89*10#
                               decs='+';
                               decdd=89;
                                   decmm=10;
                          printf("%c%d:%d#",decs,decdd,decmm);
                        }
               
                        else if (strncmp(Command,"Q",1)==0)    //   halt all current slewing returns:nothings 停止一切运动
                        {
                                
                        
                        }

//   :Me#     东    move scope east current slew rate     returns nothings
//   :Mn#     北
//   :Ms#     南
//   :Mw#     西
                        
                       else if (strncmp(Command,"RS",2)==0)    //    设置 slew 速度   "#:RS#"
                        {
                                
                            slewspeed = 6000;
       printf("maxslow",slewspeed);
                             
       ET0=1;//计时器0允许
       TR0=1;//启动计时器0
                            TH0= (65535-slewspeed)/256;
       TL0=(65535-slewspeed)%256;
                        }
                                                     
                        
                }
        }

}

void UartInt(void) interrupt 4  using 3
{
        if (RI==1)
        {
                ES=0;
                sdata=SBUF;
                RI=0;
                if ((sdata==':')&&(CommandCome==0)&&(InRec==0)) //收到冒号 并且 命令缓冲区为空
                {                                
                        InRec=1;  //命令接收中
                }
                else if ((InRec>0)&&(sdata!='#'))      // 如果命了接收中 并且没有收到 #
                {                        
                        CommandBuff[InRec-1]=sdata;
                        //if (isprint(sdata)==1 )
                                InRec=InRec+1;                        
                }  
                else if ((sdata=='#')&&(InRec>0))  //收到命了结束表示
                {  
                        CommandBuff[InRec-1]=0;
                        InRec=0;  //接收空闲中
                        CommandCome=1; //收到命了
                }  
               
                else if (InRec>4)      //命了长度超过4 还没有收到命了结束符号        
                {                  
                        InRec=0 ;                         //接收为空
                        CommandCome=0;                    //忽略命令     
                }
                ES=1;
        }
}

  void Timer0(void) interrupt 1   using 1
{  
  
     TH0=(65536- 6000)/256;
  TL0=(65536- 6000)%256;
     P0=!P0;
}
回复 顶~ 砸~

使用道具 举报

maxchen 发表于 2013-4-27 00:09 | 显示全部楼层 来自: 中国–广东–佛山 电信
你的输出不是接在P0^0脚?
P0=!P0这个写法不太对吧,系统复位后,P0=0xFF,收到RS命令后,第一次进入中断,P0=0,第二次进入中断,P0=0x01,第三次进入中断,P0=0,如此类推,所以,只有在P0^0上才有方波输出。试试把P0=!P0修改为P0=~P0.

!是逻辑非,~是按位取反,差异很大

点评

这里的确不对, 我没有明白这两个符号,马上改正 但是我这段程序, 进入 定时器 0 的中断之后, 只运行一次 啊, 这是为什么啊 ?  详情 回复 发表于 2013-4-27 09:42
回复 顶~ 砸~

使用道具 举报

 楼主| 角落里的烟嘴 发表于 2013-4-27 09:42 | 显示全部楼层 来自: 中国–江苏–苏州 联通
maxchen 发表于 2013-4-27 00:09
你的输出不是接在P0^0脚?
P0=!P0这个写法不太对吧,系统复位后,P0=0xFF,收到RS命令后,第一次进入中断 ...

这里的确不对, 我没有明白这两个符号,马上改正

但是我这段程序, 进入 定时器 0  的中断之后, 只运行一次 啊, 这是为什么啊 ?
回复 顶~ 砸~

使用道具 举报

本版积分规则

APP下載|手机版|爱牧夫天文淘宝店|牧夫天文网 ( 公安备案号21021102000967 )|网站地图|辽ICP备19018387号

GMT+8, 2024-11-16 01:56 , Processed in 0.302081 second(s), 16 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表