4641|14

39

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

在STC89C58RD中可以用三角函数吗? [复制链接]

比如:Angle_AB = cos(WA*Rad)*cos(WB*Rad)*cos(JB*Rad-JA*Rad)+sin(WA*Rad)*sin(WB*Rad);
此帖出自51单片机论坛

最新回复

可以看看其数据手册了解  详情 回复 发表于 2015-1-28 15:46
点赞 关注
 

回复
举报

2856

帖子

260

TA的资源

五彩晶圆(高级)

沙发
 
可以。只是精度和速度差了点。
此帖出自51单片机论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
我把程序发上来请版主看看,算的不对,不知哪里错了.

main.zip

3.76 KB, 下载次数: 5

此帖出自51单片机论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

4
 
主要是后面三角函数计算的问题,搞晕掉了.
此帖出自51单片机论坛
 
 
 

回复

1万

帖子

24

TA的资源

版主

5
 
代码太长,你就把问题说出来吧。
此帖出自51单片机论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

6
 
算的不对,结果和图上量 的不一样,
此帖出自51单片机论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

7
 
公式我感觉应该是对的.
此帖出自51单片机论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

8
 
主要是看一下计算代码: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;
                                        JB = (float)LonB_D+(float)LonB_F/60+(float)LonB_M/3600;
                                        WB = (float)LatB_D+(float)LatB_F/60+(float)LatB_M/3600;
                                       
                                        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;
                                        D = (int)(Distance*1000);
                                       
                                        COS_WB = cos((90-WB)*Rad);
                                        COS_WA = cos((90-WA)*Rad);
                                        A_North = R*sqrt(2-2*COS_WA);
                                        B_North = R*sqrt(2-2*COS_WB);
                                       
                                        if (A_North > B_North)
                                        {
                                                COS_A_T_B = A_North/2*Distance+Distance/2*A_North-(B_North/2*Distance)*(B_North/A_North);
                                                A_T_B = (int)((50*acos(COS_A_T_B))/3);
                                                B_T_A = 3000 - A_T_B;
                                        }
                                        else if(A_North < B_North)
                                        {
                                                COS_B_T_A = B_North/2*Distance+Distance/2*B_North-(A_North/2*Distance)*(A_North/B_North);
                                                B_T_A = 6000 - (int)(50*acos(COS_B_T_A)/3);
                                                A_T_B = 3000 - (int)(50*acos(COS_B_T_A)/3);
                                        }
                                       
                                        Disp_Output(D,A_T_B,B_T_A);
                                        times = 30;flag_page = 5;
                                }
此帖出自51单片机论坛
 
 
 

回复

1149

帖子

3

TA的资源

五彩晶圆(初级)

9
 
计算太慢了,最好是根据精度查表吧~
此帖出自51单片机论坛
 
个人签名construction complete!
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

10
 
查表没搞过,不会.请指点一二,谢谢了
此帖出自51单片机论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

11
 
不错,谢谢楼主
此帖出自51单片机论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

12
 
昨天我试了一下,计算到这一步是对的: 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;)就出问题了,也不知为什么.
时间还是可以的,我这个东西对时间要求不高的.
此帖出自51单片机论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

13
 
经过两天的奋斗,程序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                                                 {
                                                        Lcd_Writecom(0x96);
                                                        key_l_r = 2;
                                                        times = 5;       
                                                }
                                                else if (16                                                 {
                                                        Lcd_Writecom(0x96);
                                                        key_l_r = 2;
                                                        times = 18;
                                                }
                                                else if (9                                                 {
                                                        Lcd_Writecom(0x9c);
                                                        key_l_r = 2;
                                                        times = 11;
                                                }
                                                else if (22                                                 {
                                                        Lcd_Writecom(0x9c);
                                                        key_l_r = 2;
                                                        times = 24;
                                                }
                                                break;
                                        case 2:
                                                if (5                                                 {
                                                        Lcd_Writecom(0x92);
                                                        key_l_r = 0;
                                                        times = 0;       
                                                }
                                                else if (18                                                 {
                                                        Lcd_Writecom(0x92);
                                                        key_l_r = 0;
                                                        times = 13;
                                                }
                                                else if (11                                                 {
                                                        Lcd_Writecom(0x99);
                                                        key_l_r = 0;
                                                        times = 7;
                                                }
                                                else if (24                                                 {
                                                        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;
                }       
        }
}
此帖出自51单片机论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

14
 
谢谢版主关心,也谢谢大家关注,
一开始程序的主要问题是:在51中的反三角函数,计算的结果是弧度,经过测试才知道.把经验给大家分享一下.
此帖出自51单片机论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

15
 
可以看看其数据手册了解
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表