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