在STC89C58RD中可以用三角函数吗?

2019-03-24 18:07发布

比如:Angle_AB = cos(WA*Rad)*cos(WB*Rad)*cos(JB*Rad-JA*Rad)+sin(WA*Rad)*sin(WB*Rad); 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
bobo2021
1楼-- · 2019-03-25 04:40
 精彩回答 2  元偷偷看……
zqjqq88
2楼-- · 2019-03-25 10:03
计算太慢了,最好是根据精度查表吧~
bobo2021
3楼-- · 2019-03-25 12:21
查表没搞过,不会.请指点一二,谢谢了
jiamswei
4楼-- · 2019-03-25 16:02
 精彩回答 2  元偷偷看……
bobo2021
5楼-- · 2019-03-25 19:56
昨天我试了一下,计算到这一步是对的: Angle_AB = cos(WA*Rad)*cos(WB*Rad)*cos(JB*Rad-JA*Rad)+sin(WA*Rad)*sin(WB*Rad);

就是下面的反三角函数(Distance = (float)R*acos(Angle_AB)*Rad;)就出问题了,也不知为什么.
时间还是可以的,我这个东西对时间要求不高的.
bobo2021
6楼-- · 2019-03-25 23:08
经过两天的奋斗,程序OK了,用STC89C58算起来也不算慢,还是可以的.这是我改过的程序.
void main()
{
        uint i;
        uint  D = 0,M_AB = 0,M_BA = 0;                //D指AB两点距离,A到B的方位角,B到A的方位角.
        Lcd_Init();
        Disp_Wellcom();
        Delay(2000);
        Disp_Input_A();
        Lcd_Writecom(0x92);
        while(1)
        {       
                num=20;       
                i=Keyscan();
                switch(i)
                {
                        case 1:  
                                if (times<26)
                                {
                                        times++;Key_Input(num,times);
                                }
                                break;
                        case 2:  
                                if (times<26)
                                {
                                        times++;Key_Input(num,times);
                                }
                                break;
                        case 3:  
                                if (times<26)
                                {
                                        times++;Key_Input(num,times);
                                }
                                break;
                        case 4:  
                                if (times<26)
                                {
                                        times++;Key_Input(num,times);
                                }
                                break;
                        case 5:  
                                if (times<26)
                                {
                                        times++;Key_Input(num,times);
                                }
                                break;
                        case 6:  
                                if (times<26)
                                {
                                        times++;Key_Input(num,times);
                                }
                                break;
                        case 7:  
                                if (times<26)
                                {
                                        times++;Key_Input(num,times);
                                }
                                break;
                        case 8:  
                                if (times<26)
                                {
                                        times++;Key_Input(num,times);
                                }
                                break;
                        case 9:  
                                if (times<26)
                                {
                                        times++;Key_Input(num,times);
                                }
                                break;
                        case 0:  
                                if (times<26)
                                {
                                        times++;Key_Input(num,times);
                                }
                                break;
                        case 11:                                                                                        //功能键*:复位
                                ISP_CONTR = 0X20;
                                break;
                        case 12:                                                                                 //功能键#:翻页
                                if (flag_page == 0)
                                {
                                        Disp_Input_B();
                                        times = times + 13;
                                        flag_page = 1;
                                }
                                else if(flag_page == 1)
                                {
                                        Disp_Input_A();
                                        times = times - 13;
                                        flag_page = 0;
                                }
                                break;
                        case 13:                                                                               //功能键A:左右移
                                switch (key_l_r)
                                {
                                        case 0:
                                                if (0<=times<4)
                                                {
                                                        Lcd_Writecom(0x94);
                                                        key_l_r = 1;
                                                        times = 3;       
                                                }
                                                else if (13<=times<17)
                                                {
                                                        Lcd_Writecom(0x94);
                                                        key_l_r = 1;
                                                        times = 16;
                                                }
                                                else if (7<=times<10)
                                                {
                                                        Lcd_Writecom(0x9c);
                                                        key_l_r = 1;
                                                        times = 9;
                                                }
                                                else if (20<=times<23)
                                                {
                                                        Lcd_Writecom(0x9c);
                                                        key_l_r = 1;
                                                        times = 22;
                                                }
                                                break;
                                        case 1:
                                                if (3<times<6)
                                                {
                                                        Lcd_Writecom(0x96);
                                                        key_l_r = 2;
                                                        times = 5;       
                                                }
                                                else if (16<times<19)
                                                {
                                                        Lcd_Writecom(0x96);
                                                        key_l_r = 2;
                                                        times = 18;
                                                }
                                                else if (9<times<12)
                                                {
                                                        Lcd_Writecom(0x9c);
                                                        key_l_r = 2;
                                                        times = 11;
                                                }
                                                else if (22<times<25)
                                                {
                                                        Lcd_Writecom(0x9c);
                                                        key_l_r = 2;
                                                        times = 24;
                                                }
                                                break;
                                        case 2:
                                                if (5<times<8)
                                                {
                                                        Lcd_Writecom(0x92);
                                                        key_l_r = 0;
                                                        times = 0;       
                                                }
                                                else if (18<times<21)
                                                {
                                                        Lcd_Writecom(0x92);
                                                        key_l_r = 0;
                                                        times = 13;
                                                }
                                                else if (11<times<14)
                                                {
                                                        Lcd_Writecom(0x99);
                                                        key_l_r = 0;
                                                        times = 7;
                                                }
                                                else if (24<times<27)
                                                {
                                                        Lcd_Writecom(0x99);
                                                        key_l_r = 0;
                                                        times = 20;
                                                }
                                                break;       
                                        default:
                                                break;
                                }
                                break;
                        case 14:                                                                            //功能键B:
                               
                                break;
                        case 15:                                                                            //功能键C:返回
                                Lcd_Init();
                                Delay(10);
                                Disp_Input_A();
                                times=0;flag_page=0;
                                LonA_D = 0;LonA_F = 0;LonA_M = 0;LatA_D = 0;LatA_F = 0;LatA_M = 0;
                                LonB_D = 0;LonB_F = 0;LonB_M = 0;LatB_D = 0;LatB_F = 0;LatB_M = 0;
                                break;
                        case 16:                                                                            //功能键D:确定
                                if (times == 26)
                                {
                                        LonA_D = max(AJD_1,AJD_2,AJD_3);
                                        LonA_F = max(AJF_1,AJF_2,temp_val);
                                        LonA_M = max(AJM_1,AJM_2,temp_val);
                                        LatA_D = max(AWD_1,AWD_2,AWD_3);
                                        LatA_F = max(AWF_1,AWF_2,temp_val);
                                        LatA_M = max(AWM_1,AWM_2,temp_val);
                                        LonB_D = max(BJD_1,BJD_2,BJD_3);
                                        LonB_F = max(BJF_1,BJF_2,temp_val);
                                        LonB_M = max(BJM_1,BJM_2,temp_val);
                                        LatB_D = max(BWD_1,BWD_2,BWD_3);
                                        LatB_F = max(BWF_1,BWF_2,temp_val);
                                        LatB_M = max(BWM_1,BWM_2,temp_val);
                                       
                                        JA = (float)LonA_D+(float)LonA_F/60+(float)LonA_M/3600;        //
                                        WA = (float)LatA_D+(float)LatA_F/60+(float)LatA_M/3600;        // 35.06666>0.818484
                                        JB = (float)LonB_D+(float)LonB_F/60+(float)LonB_M/3600;        //118.93333-118.83333>0.999998
                                        WB = (float)LatB_D+(float)LatB_F/60+(float)LatB_M/3600;        // 35.03333>0.818818
                                       
                                        Angle_AB = cos(WA*Rad)*cos(WB*Rad)*cos((JB-JA)*Rad)+sin(WA*Rad)*sin(WB*Rad);

                                        Distance = R*acos(Angle_AB);
                                        D = Distance*1000;
                                       
                                        M_AC = R*Rad*cos(WA*Rad)*0.1;
                                        M = acos(M_AC/Distance)*3000/3.1415926;
                                        if (WA > WB)                //如果A点纬度高,结果要加1500
                                        {
                                                M_AB = 1500 + M;
                                                M_BA = 4500 + M;
                                        }
                                        else if(WA < WB)                //如果A点纬度低,结果要用1500减
                                        {
                                                M_AB = 1500 - M;
                                                M_BA = 4500 - M;
                                        }
                                       
                                        Disp_Output(D,M_AB,M_BA);
                                        times = 30;flag_page = 5;
                                }

                                break;
                        default: break;
                }       
        }
}

一周热门 更多>