|
跳一跳物理助手的實(shí)現(xiàn),代碼更加規(guī)范,視頻請(qǐng)參https://v.youku.com/v_show/id_XN ... 42.soresults.dtitle
0.png (8.01 KB, 下載次數(shù): 88)
下載附件
2019-6-2 05:42 上傳
全部資料51hei下載地址:
微信跳一跳物理助手(不含視頻).zip
(664.37 KB, 下載次數(shù): 11)
2019-6-1 20:45 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
算法:
1.數(shù)據(jù)分析:首先通過給定的延時(shí)時(shí)間,測(cè)出小棋子跳的距離,記錄十組左右升序排列,建表,畫出折線圖,如下圖右側(cè):
0.png (94.47 KB, 下載次數(shù): 72)
下載附件
2019-6-2 05:45 上傳
得出的線性回歸方程為:
T = 22.26 * L + 56.44 (T是延時(shí)時(shí)間,L是棋子跳的距離)
若要得到更準(zhǔn)確的方程,可再多測(cè)量幾次數(shù)據(jù),再求方程。
(折線的原因是游戲本身是3D的,所以每次用尺子測(cè)量的距離誤差較大)
2.算法實(shí)現(xiàn):
paramsInit()中初始化結(jié)構(gòu)體:
Jump_Params.L=0;
Jump_Params.m=22.26;
Jump_Params.n=56.44;
main.c中計(jì)算延時(shí)時(shí)間:
Jump_Params.T=Jump_Params.m*Jump_Params.L+Jump_Params.n; //計(jì)算延時(shí)時(shí)間
Rela()中實(shí)現(xiàn)觸屏延時(shí):
RELAY=0;
delay_ms(Jump_Params.T); //延時(shí)時(shí)間T,已由距離——時(shí)間函數(shù)算出
RELAY=1;
while(!K1); //等待按鍵釋放
九、運(yùn)行設(shè)計(jì):
1、硬件運(yùn)行設(shè)計(jì)
可選擇普中科技HC6800-EM3開發(fā)板或使用以下材料參照電路原理圖自行搭建。
單片機(jī)STC89C52RC、74HC138、74HC573、5V繼電器模塊、四腳輕觸開關(guān)、四位數(shù)碼管、晶振、電容、電阻、LED燈、銅箔膠帶等,
2、軟件運(yùn)行設(shè)計(jì):
使用KEIL C51 (8051內(nèi)核的微控制器開發(fā)工具)進(jìn)行程序設(shè)計(jì),使用STC-isp 下載器進(jìn)行程序燒錄。
軟件結(jié)構(gòu)圖
0.png (14.57 KB, 下載次數(shù): 99)
下載附件
2019-6-2 05:42 上傳
0.png (9.07 KB, 下載次數(shù): 78)
下載附件
2019-6-2 05:43 上傳
0.png (3.42 KB, 下載次數(shù): 105)
下載附件
2019-6-2 05:43 上傳
二、邏輯框圖
0.png (10.08 KB, 下載次數(shù): 103)
下載附件
2019-6-2 05:43 上傳
三、功能流程圖:
0.png (7.15 KB, 下載次數(shù): 88)
下載附件
2019-6-2 05:43 上傳
四、軟件總體設(shè)計(jì):
0.png (287.62 KB, 下載次數(shù): 104)
下載附件
2019-6-2 05:44 上傳
五、軟件接口:
1.毫秒延時(shí)函數(shù)
//--------------------------------------------------------------------------------------------
// @brief 毫秒延時(shí)
// @param 延時(shí)毫秒數(shù)值 類型unsigned int
// @return void
// @since v2.0
// Sample usage: delay_ms(10);//延時(shí)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 待顯示的十進(jìn)制數(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
功能:實(shí)現(xiàn)觸屏功能
5、延時(shí)模塊:
Delay_ms.c
Delay_ms.h
功能:延時(shí)
6、結(jié)構(gòu)體參數(shù)頭文件
Params.h
功能:參數(shù)設(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秒后自動(dòng)釋放按鍵
{
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; //第二次按下取得的值作為個(gè)位
Jump_Params.num=0; //清零計(jì)數(shù)標(biāo)志
}
}
}
}
2、
//--------------------------------------------------------------------------------------------
// @brief 外部中斷初始化
// @param void
// @return void
// @since v2.0
// Sample usage: Init0();
//--------------------------------------------------------------------------------------------
void Init0() //外部中斷配置函數(shù)
{
EA=1;
EX0=1;
IT0=0;
}
3、
//--------------------------------------------------------------------------------------------
// @brief 外部中斷服務(wù)函數(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 待顯示的十進(jìn)制數(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 毫秒延時(shí)
// @param 延時(shí)毫秒數(shù)值 類型unsigned int
// @return void
// @since v2.0
// Sample usage: delay_ms(10);//延時(shí)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++);
}
|
評(píng)分
-
查看全部評(píng)分
|