[求助] 求助关于多次调用子函数的问题!

面包所长   2016-7-12 17:47 楼主
最近做了个锁相环频率合成器,需要用单片机来发送数据,之前都是设置输出一个频点,现在我想设置输出一个频点后,延迟一段时间再输出另外一个频点,改了程序 可还是输出一个单频点,调试了一段时间,没有调出来,来此求助大家了,下面就是部分程序,运行的时候,只运行了子程序fashe2,输出了2500MHz

void delay(int);
void fashe1();
void fashe2();
void main()
{
fashe1();       //调用子函数fashe1
delay(50000);
fashe2();       //调用子函数fashe2
while(1);                               
}

void fashe1()    //子函数fashe1输出2400MHz
{
        unsigned long int registe0,registe1,registe2,registe3,registe4,registe5,temp1;
        int i;
        Init_Device();

        registe5=0x580005;               
        registe4=0x85003C;               
        registe3=0x4B3;               
        registe2=0x4E42;       
        registe1=0x8008009;       
        registe0=0x780000;       
       
        temp1=0x80000000;
        SCLOCK=1;
        DATA=0;
        LE=0;
       
          for(i=0;i<32;i++)               
        {
                if((temp1®iste5)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;
                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
        LE=0;

        for(i=0;i<32;i++)                        //Update C Latch       
        {
                if((temp1®iste4)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;
                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
        LE=0;
       
        for(i=0;i<32;i++)                       
        {
                if((temp1®iste3)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;
                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
        LE=0;
       
        for(i=0;i<32;i++)                       
        {
                if((temp1®iste2)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;
                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
        LE=0;
       
        for(i=0;i<32;i++)                               
        {
                if((temp1®iste1)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;
                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
        LE=0;

        delay(5000);       
       
        for(i=0;i<32;i++)                       
        {
                if((temp1®iste0)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;

                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
}
void fashe2()   //子函数fashe2输出2500MHz
{
        unsigned long int registe0,registe1,registe2,registe3,registe4,registe5,temp1;
        int i;
        Init_Device();

        registe5=0x580005;               
        registe4=0x85003C;               
        registe3=0x4B3;               
        registe2=0x4E42;       
        registe1=0x8008009;       
        registe0=0x7D0000;       
       
        temp1=0x80000000;
        SCLOCK=1;
        DATA=0;
        LE=0;
       
          for(i=0;i<32;i++)               
        {
                if((temp1®iste5)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;
                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
        LE=0;

        for(i=0;i<32;i++)                        //Update C Latch       
        {
                if((temp1®iste4)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;
                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
        LE=0;
       
        for(i=0;i<32;i++)                       
        {
                if((temp1®iste3)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;
                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
        LE=0;
       
        for(i=0;i<32;i++)                       
        {
                if((temp1®iste2)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;
                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
        LE=0;
       
        for(i=0;i<32;i++)                               
        {
                if((temp1®iste1)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;
                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
        LE=0;

        delay(5000);       
       
        for(i=0;i<32;i++)                       
        {
                if((temp1®iste0)==0x0)               
                        DATA=0;
                else
                        DATA=1;
                SCLOCK=0;
                SCLOCK=1;

                temp1=temp1>>1;
        }
        temp1=0x80000000;
        LE=1;
}
void delay(int length)
{
while (length >=0)
    length--;
}

回复评论 (11)

do{
fashe1();       //调用子函数fashe1
delay(50000);
fashe2();       //调用子函数fashe2
delay(50000);
}while(1);      
你想要的结果是这样的吧,应该是一直交替的执行的两个函数。

点赞  2016-7-12 18:07
引用: lcofjp 发表于 2016-7-12 18:07
do{
fashe1();       //调用子函数fashe1
delay(50000);
fashe2();       //调用子函数fashe2
delay(50 ...

首先谢谢你的意见,按照你的方法,可以输出两个频率,一直在两个频率之间跳变切换,但是我想要的是,先执行fashe1,一段时间后再执行fashe2,不需要重复执行两个子程序。每个子程序发送一次就行了,最后的输出,就是fashe2的频率
点赞  2016-7-12 18:28
首先你要说明的你的单片机的大概型号。
如果是8位机或者16位机,那么你的延时函数就是个问题,50000这么大的数是溢出了起不到延时作用,如果确实是这种问题,那么你可以尝试将delay(50000);换成5个delay(10000);试试
点赞  2016-7-12 18:39
引用: lcofjp 发表于 2016-7-12 18:39
首先你要说明的你的单片机的大概型号。
如果是8位机或者16位机,那么你的延时函数就是个问题,50000这么大 ...

C8051F310单片机 ,这个延迟是我随便写的,我还没有考虑你说的问题 谢谢提醒
点赞  2016-7-12 19:03
引用: lcofjp 发表于 2016-7-12 18:39
首先你要说明的你的单片机的大概型号。
如果是8位机或者16位机,那么你的延时函数就是个问题,50000这么大 ...

目前我想的是每个子程序只调用运行一次,几个子程序依次运行,
点赞  2016-7-12 19:21
如果有仿真器的话,打断点,然后借助单步调试这些的,或者设置一个变量,将结果存在变量中debug的时候变量的值,这些都可以。
点赞  2016-7-12 21:12
引用: huaiqiao 发表于 2016-7-12 21:12
如果有仿真器的话,打断点,然后借助单步调试这些的,或者设置一个变量,将结果存在变量中debug的时候变量 ...

什么意思呢??我想烧进去单片机的时候!子程序一次运行
点赞  2016-7-13 17:37
引用: lcofjp 发表于 2016-7-12 18:39
首先你要说明的你的单片机的大概型号。
如果是8位机或者16位机,那么你的延时函数就是个问题,50000这么大 ...

大神 还在吗?主程序我现在改成这样 但是五个子程序好像没有依次运行,有时候同时输出了三个频点
void main()
{
do{
fashe1();      
delay(8000);
fashe2();      
delay(8000);
fashe3();
delay(8000);
fashe4();
delay(8000);
fashe5();
delay(8000);
}while(1);                                  
}
点赞  2016-7-13 17:41
引用: 面包所长 发表于 2016-7-13 17:41
大神 还在吗?主程序我现在改成这样 但是五个子程序好像没有依次运行,有时候同时输出了三个频点
void m ...

你可以连接仿真器单步调试的,这样问题很容易就找到了。要不然光看代码是无能为力的。
点赞  2016-7-13 17:48
主函数逻辑没有问题,每个子函数就不知道了。
你要5个只出来三个应该是这样的:1.第三个或者第四个子函数本身存在问题,跳不出来,内部死循环了。2.子函数本身的功能跟你想要的不一样。建议你每次只运行一个子函数试试,看是不是你要的功能
点赞  2016-7-13 17:56
引用: 面包所长 发表于 2016-7-13 17:37
什么意思呢??我想烧进去单片机的时候!子程序一次运行

意思就是你用仿真器单步调试啊,不用刻意去烧啊。。。。。我想不通你为什么没明白。
点赞  2016-7-13 20:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复