標題: 微信跳一跳物理助手制作,多文件工程,代碼規(guī)范性和可讀性相比上一帖有很大提升 [打印本頁]

作者: 1254333071    時間: 2019-6-1 20:45
標題: 微信跳一跳物理助手制作,多文件工程,代碼規(guī)范性和可讀性相比上一帖有很大提升
跳一跳物理助手的實現(xiàn),代碼更加規(guī)范,視頻請參https://v.youku.com/v_show/id_XN ... 42.soresults.dtitle



全部資料51hei下載地址:
微信跳一跳物理助手(不含視頻).zip (664.37 KB, 下載次數(shù): 11)


算法:

1.數(shù)據(jù)分析:首先通過給定的延時時間,測出小棋子跳的距離,記錄十組左右升序排列,建表,畫出折線圖,如下圖右側:


得出的線性回歸方程為:
T = 22.26 * L + 56.44 (T是延時時間,L是棋子跳的距離)
若要得到更準確的方程,可再多測量幾次數(shù)據(jù),再求方程。
(折線的原因是游戲本身是3D的,所以每次用尺子測量的距離誤差較大)

2.算法實現(xiàn):
paramsInit()中初始化結構體:
Jump_Params.L=0;
    Jump_Params.m=22.26;
    Jump_Params.n=56.44;

main.c中計算延時時間:
Jump_Params.T=Jump_Params.m*Jump_Params.L+Jump_Params.n; //計算延時時間

Rela()中實現(xiàn)觸屏延時:
                RELAY=0;
                delay_ms(Jump_Params.T); //延時時間T,已由距離——時間函數(shù)算出
                RELAY=1;
                while(!K1);                 //等待按鍵釋放


九、運行設計:
1、硬件運行設計
可選擇普中科技HC6800-EM3開發(fā)板或使用以下材料參照電路原理圖自行搭建。

單片機STC89C52RC、74HC138、74HC573、5V繼電器模塊、四腳輕觸開關、四位數(shù)碼管、晶振、電容、電阻、LED燈、銅箔膠帶等,

2、軟件運行設計:
使用KEIL C51 (8051內(nèi)核的微控制器開發(fā)工具)進行程序設計,使用STC-isp 下載器進行程序燒錄。

軟件結構圖



二、邏輯框圖


三、功能流程圖:


四、軟件總體設計:



五、軟件接口:

1.毫秒延時函數(shù)
//--------------------------------------------------------------------------------------------
// @brief 毫秒延時
// @param 延時毫秒數(shù)值 類型unsigned int
// @return void                        
// @since v2.0
// Sample usage:       delay_ms(10);//延時10ms   
//--------------------------------------------------------------------------------------------
void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}

2、數(shù)值拆分函數(shù)
//-------------------------------------------------------------------------------------------------------------------
// @brief 數(shù)值拆分
// @param  待顯示的十進制數(shù) 類型uchar
// @return void                        
// @since v2.0
// Sample usage:       DisplayData(90);   
//-------------------------------------------------------------------------------------------------------------------
void DisplayData(uchar c)       //數(shù)值拆分函數(shù)
{
    dig[0]=smgduan[c/1000];
    dig[1]=smgduan[(c-(c/1000)*1000)/100];
    dig[2]=smgduan[(c%100)/10];
    dig[3]=smgduan[c%10];
}




六、模塊名稱功能:

以下為模塊化編程中各模塊名稱及功能的介紹
1、按鍵模塊
key.c
key.h
功能:按鍵輸入

2、外部中斷模塊
EXIT.c
EXIT.h
功能:中斷按鍵觸發(fā),清零距離與數(shù)碼管數(shù)值

3、顯示模塊:
Display.c
Display.h
功能:數(shù)碼管顯示

4、繼電器控制模塊:
RelayControl.c
RelayControl.h
功能:實現(xiàn)觸屏功能
5、延時模塊:
Delay_ms.c
Delay_ms.h
功能:延時

6、結構體參數(shù)頭文件
Params.h
功能:參數(shù)設定

7、工程整合頭文件
common.h
功能:包含工程中的所有頭文件




七、函數(shù)名稱功能介紹:

1、
//--------------------------------------------------------------------------------------------
// @brief 按鍵掃描
// @param void
// @return void                        
// @since v2.0
// Sample usage:       keyscan();  
//--------------------------------------------------------------------------------------------
void keyscan()              //按鍵掃描函數(shù)
{
    uint a=0;
    uchar KeyValue;
    GPIO_SEG1=0x0f;
    if(GPIO_SEG1!=0x0f)
    {
        delay_ms(10);
        if(GPIO_SEG1!=0x0f)
        {   
            GPIO_SEG1=0x0f;
            switch(GPIO_SEG1)
            {
                case(0x07):
                KeyValue=0;break;
                case(0x0b):
                KeyValue=1;break;
                case(0x0d):
                KeyValue=2;break;
                case(0x0e):
                KeyValue=3;break;
            }
                GPIO_SEG1=0xf0;
            switch(GPIO_SEG1)
            {
                case(0x70):
                KeyValue=KeyValue;break;
                case(0xb0):
                KeyValue=KeyValue+4;break;
                case(0xd0):
                KeyValue=KeyValue+8;break;
                case(0xe0):
                KeyValue=KeyValue+12;break;
            }
            while(a<500&&(GPIO_SEG1!=0xf0))         //0.5秒后自動釋放按鍵
            {
                delay_ms(1);
                a++;
            }
            Jump_Params.num++;
            if(Jump_Params.num==1)
            {
                Jump_Params.L=KeyValue*10.0;            //第一次按下取得的值作十位
            }
            if(Jump_Params.num==2)
            {
                Jump_Params.L=Jump_Params.L+KeyValue*1.0;           //第二次按下取得的值作為個位
                Jump_Params.num=0;                              //清零計數(shù)標志
            }
        }
    }
}


2、
//--------------------------------------------------------------------------------------------
// @brief 外部中斷初始化
// @param void
// @return void                        
// @since v2.0
// Sample usage:       Init0();   
//--------------------------------------------------------------------------------------------


void Init0()    //外部中斷配置函數(shù)
{
    EA=1;
    EX0=1;
    IT0=0;
}

3、

//--------------------------------------------------------------------------------------------
// @brief 外部中斷服務函數(shù)
// @param void
// @return void                        
// @since v2.0
// Sample usage:       內(nèi)部調(diào)用,用戶無需調(diào)用
//--------------------------------------------------------------------------------------------

void Int0() interrupt 0         //中斷按鍵觸發(fā),清零距離L與數(shù)碼管數(shù)值num
{
    delay_ms(10);
    if(Kt==0)
    {
        Jump_Params.L=0;
        Jump_Params.num=0;
    }   
}

4、
//-------------------------------------------------------------------------------------------------------------------
// @brief 數(shù)碼管顯示
// @param void
// @return void                        
// @since v2.0
// Sample usage:       DigDisplay();   
//-------------------------------------------------------------------------------------------------------------------

void DigDisplay()           //數(shù)碼管顯示函數(shù)
{
        uchar i;
        for(i=0;i<4;i++)
        {
            switch(i)
            {
                case 0:
                LsC=0;LsB=0;LsA=0;break;
                case 1:
                LsC=0;LsB=0;LsA=1;break;
                case 2:
                LsC=0;LsB=1;LsA=0;break;
                case 3:
                LsC=0;LsB=1;LsA=1;break;
            
            }
            P1=dig[ i];
            delay_ms(1);
            P1=0x00; //數(shù)碼管消隱
        }
   
}

5、
//-------------------------------------------------------------------------------------------------------------------
// @brief 數(shù)值拆分
// @param  待顯示的十進制數(shù) 類型uchar
// @return void                        
// @since v2.0
// Sample usage:       DisplayData(90);   
//-------------------------------------------------------------------------------------------------------------------
void DisplayData(uchar c)       //數(shù)值拆分函數(shù)
{
    dig[0]=smgduan[c/1000];
    dig[1]=smgduan[(c-(c/1000)*1000)/100];
    dig[2]=smgduan[(c%100)/10];
    dig[3]=smgduan[c%10];
}

6、
//-------------------------------------------------------------------------------------------------------------------
// @brief 繼電器模擬觸屏控制
// @param void
// @return void                        
// @since v2.0
// Sample usage:       Rela();
//-------------------------------------------------------------------------------------------------------------------
void Rela()         //繼電器控制函數(shù)
{
        if(K1==0)
        {
            delay_ms(10);
            if(K1==0)
            {
                RELAY=0;
                delay_ms(Jump_Params.T);
                RELAY=1;
                while(!K1);
                Jump_Params.num=0;
                Jump_Params.L=0;
            }
        }
        else
        {
            RELAY=1;
        }   
}

7、
//-------------------------------------------------------------------------------------------------------------------
// @brief 毫秒延時
// @param 延時毫秒數(shù)值 類型unsigned int
// @return void                        
// @since v2.0
// Sample usage:       delay_ms(10);//延時10ms   
//-------------------------------------------------------------------------------------------------------------------
void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1