|
IAP15L2K61S2板子的實(shí)物圖如下:
0.png (416.9 KB, 下載次數(shù): 140)
下載附件
2016-6-20 16:02 上傳
0.png (589.97 KB, 下載次數(shù): 166)
下載附件
2016-6-20 15:57 上傳
該IAP15L2K61S2開(kāi)發(fā)板設(shè)計(jì)資料包括PCB、元件庫(kù),大家可以隨意引用或更改文檔、代碼、PCB,不必等待作者同意。目前完成的資料,希望至少有點(diǎn)STC89C52的基礎(chǔ)看看,當(dāng)然但愿對(duì)于所有的電子愛(ài)好者來(lái)說(shuō),有點(diǎn)參考價(jià)值。
PCB:
0.png (56.79 KB, 下載次數(shù): 157)
下載附件
2016-6-20 15:54 上傳
原理圖:
0.png (54.33 KB, 下載次數(shù): 201)
下載附件
2016-6-20 15:53 上傳
單片機(jī)開(kāi)發(fā)板的測(cè)試程序如下:
- /**************************************************************************************
- 注意事項(xiàng):按ALT+F7 配置->Target->Memory Mode->Large:variables in XDATA,如果需要用到仿真
- Debug中設(shè)置好仿真和串口號(hào);
- 初始化有液晶背光調(diào)節(jié)演示,需要把P19的跳線(xiàn)帽插到上面,使LCD背光引腳與P26相連,使
- 用PWM1來(lái)調(diào)節(jié)液晶背光亮度;
- 使用串口1的1通道發(fā)送數(shù)據(jù)打游戲:在lkb.h中增加了KEYMSG結(jié)構(gòu)體
- mpu6050.c中Accel_x、Accel_y、Accel_z升為全局變量,增加;
- Accel_y = (float)GetData(ACCEL_YOUT_H)/286.0f; //讀取Y軸加速度
- ADC初始化把AD采樣時(shí)間改小了
- // *************************************************************************************
- #include "config0.h"
- #include "delay.h"
- #include "lkb.h"
- #include "timer.h"
- #include "uart.h"
- #include <stdio.h>
- #include "lcd.h"
- #include "adc.h"
- #include "mpu6050.h"
- #include "image0.h"
- #include "pca_pwm.h"
- #include "hmc5883l.h"
- #include "nrf24l01.h"
- #include <math.h>
- #include "int.h"
- unsigned int adc0,adc1,adc2,adc3,adc4;
- float li_voltage=0;
- KEYMSG left;
- KEYMSG right;
- KEYMSG up;
- KEYMSG down;
- KEYMSG kb;
- KEYMSG a_jump; //跳躍
- KEYMSG a_shoot;//射擊
- KEYMSG a_left;
- KEYMSG a_right;
- void Encoder_Task();
- void MPU6050_Task();
- void HMC5883_Task();
- void KEY_Task();
- void ADC_Task();
- void Encoder_Task()
- {
- LCD_Show2Num(0,112,Freq,6);
- printf("%d\n",Cnt_Now);
- }
- void MPU6050_Task()
- {
- static unsigned int j=0;
- Angle_Calcu(); //傾角計(jì)算 將得到下面兩個(gè)全局變量,使用了網(wǎng)上摘抄的卡爾曼濾波
- //float Angle; //最終傾斜角度
- //float Gyro_y; //Y軸角速度
- if(Accel_x >=20 && Accel_x<=90)
- {
- sendMsg(&a_jump, 7, 1);
- }
- else if(Accel_x >=-90 && Accel_x<=-20)
- {
- sendMsg(&a_shoot, 6, 1);
- }
- else
- {
- if(a_jump.msg == 1)
- {
- sendMsg(&a_jump, 7, 0);
- }
- else if(a_shoot.msg == 1)
- {
- sendMsg(&a_shoot, 6, 0);
- }
- }
- if(Accel_y >=20 && Accel_y<=90)
- {
- sendMsg(&a_right, 3, 1);
- }
- else if(Accel_y >=-90 && Accel_y<=-20)
- {
- sendMsg(&a_left, 2, 1);
- }
- else
- {
- if(a_right.msg == 1)
- {
- sendMsg(&a_right, 3, 0);
- }
- else if(a_left.msg == 1)
- {
- sendMsg(&a_left, 2, 0);
- }
- }
- //printf("%.2f,%.2f\n",Angle,Gyro_y);
- j++;
- if(j>=240)
- {
- j=0;
- LCD_Fill(0,140,239,318,Black);
- POINT_COLOR = Red;
- BACK_COLOR=Black;
- LCD_DrawLine(0,229,239,229);
- POINT_COLOR = Green;
- }
- if((int)Angle>-90 && (int)Angle<90 ) //排除初始不穩(wěn)定雜波
- {
- LCD_DrawPoint(j,229-(int)Angle);
- //通過(guò)NRF24L01發(fā)送出去
- if(Angle>=0)
- {
- Tx_Buf[2] = '+';
- Tx_Buf[3] =(unsigned char)Angle;
- }
- else
- {
- Tx_Buf[2] = '-';
- Tx_Buf[3] = (unsigned char)(Angle*(-1));
- }
- Transmit(Tx_Buf); //24L01發(fā)送緩沖數(shù)組
- sta=SPI_Read(READ_REG + STATUS); //讀24L01的狀態(tài)寄存器
- if(TX_DS) //sbit TX_DS =sta^5;數(shù)據(jù)發(fā)送完成中斷,接收到應(yīng)答信號(hào)時(shí)此位置1,寫(xiě)1清除中斷
- {
- //Delay_ms(5);
- SPI_RW_Reg(WRITE_REG + STATUS,sta); //寫(xiě)狀態(tài)寄存器,清除中斷
- }
- if(MAX_RT) //如果是發(fā)送超時(shí) sbit MAX_RT =sta^4;
- { //達(dá)到最多次重發(fā)中斷,MAX_RT中斷產(chǎn)生則必須清除后系統(tǒng)才能進(jìn)行通訊,寫(xiě)1清除中斷
- //Delay_ms(5);
- SPI_RW_Reg(WRITE_REG + STATUS,sta);
- }
- }
-
- }
- void HMC5883_Task()
- {
- //static unsigned int m=0;
- static float Last_HMC5883_Angle=0;
- // float Avg_HMC5883_Angle=0;
- // float Last_Avg_HMC5883_Angle=0;
- // float temp_HMC5883_Angle=0;
- Multiple_Read_HMC5883(); //角度的變化似乎并不是線(xiàn)性的
- LCD_Show2Num(32,80,(int)HMC5883_Angle,3);
- POINT_COLOR=BACK_COLOR; //三角函數(shù)使用弧度而不是度!
- LCD_DrawLine(120,100,120+(int)(28.0*cos((Last_HMC5883_Angle-180.0)/57.3)),100+(int)(28.0*sin((Last_HMC5883_Angle-180.0)/57.3)));
- POINT_COLOR=Yellow;
- LCD_DrawLine(120,100,120+(int)(28.0*cos((HMC5883_Angle-180.0)/57.3)),100+(int)(28.0*sin((HMC5883_Angle-180.0)/57.3)));
- Last_HMC5883_Angle=HMC5883_Angle;
- // //平均值濾波
- // m++;
- // temp_HMC5883_Angle+=HMC5883_Angle;
- // if(m==5)
- // {
- // m=0;
- // Avg_HMC5883_Angle=temp_HMC5883_Angle/5.0; //與前面四個(gè)值相關(guān)聯(lián)
- // //printf("\n\n%.2f\n\n",HMC5883_Angle); //HMC5883_Angle: float型,0~360
- // LCD_Show2Num(32,80,(int)Avg_HMC5883_Angle,3);
- // POINT_COLOR=BACK_COLOR;
- // LCD_DrawLine(120,100,120+28*cos((Last_Avg_HMC5883_Angle-180.0)/57.3),100+28*sin((Last_Avg_HMC5883_Angle-180.0)/57.3));
- // POINT_COLOR=Yellow;
- // LCD_DrawLine(120,100,120+28*cos((Avg_HMC5883_Angle-180.0)/57.3),100+28*sin((Avg_HMC5883_Angle-180.0)/57.3));
- // Last_Avg_HMC5883_Angle=Avg_HMC5883_Angle;
- // }
- }
- void ADC_Task()
- {
- static unsigned int i=0;
- static unsigned int k=0;
- POINT_COLOR= Green;
- i++;
- switch(i)
- {
- case 1: adc0=(int)ADC_GetResult(0);LCD_Show2Num(48,0,adc0,3); break;
- case 2: adc1=(int)ADC_GetResult(1);LCD_Show2Num(48,16,adc1,3); break;
- case 3: adc2=(int)ADC_GetResult(2);LCD_Show2Num(168,0,adc2,3); break;
- case 4: adc3=(int)ADC_GetResult(3);LCD_Show2Num(168,16,adc3,3); break;
- case 5: li_voltage=(float)ADC_GetResult(4)*0.019f; break; //adc4*3.3/256*(6.8+3.3)/6.8=adc4*0.019
- default:
- i=0;
- LCD_Show2Num(96,32,(int)li_voltage,1); //顯示整數(shù)部分
- LCD_Show2Num(112,32,((int)(li_voltage*100))%100,2); //顯示小數(shù)部分
- //printf("%d,%d,%d,%d,%.2f\n",adc0,adc1,adc2,adc3,li_voltage);
- }//switch 結(jié)束
- k++;
- //printf("%d,%d,", adc1, adc0);
- if(k%2)
- {
- if(adc1>=0 && adc1<=80)
- {
- sendMsg(&up, 1, 1);
- }
- else if(adc1>=170 && adc1<=255)
- {
- sendMsg(&down, 4, 1);
- }
- else
- {
- if(up.msg == 1)
- {
- sendMsg(&up, 1, 0);
- }
- else if(down.msg == 1)
- {
- sendMsg(&down, 4, 0);
- }
- }
- }
- else
- {
- if(adc0>=0 && adc0<=80)
- {
- sendMsg(&left, 3, 1);
- }
- else if(adc0>=170 && adc0<=255)
- {
- sendMsg(&right, 2, 1);
- }
- else
- {
- if(left.msg == 1)
- {
- sendMsg(&left, 3, 0);
- }
- else if(right.msg == 1)
- {
- sendMsg(&right, 2, 0);
- }
- }
- }
- }
- //void KEY_Task()
- //{
- // if (key_up==0)
- // {
- // sendMsg(&kb, Key_Num, 1); //sendMsg()函數(shù)里面有printf
- // }
- // else //if(key_up == 1)
- // {
- //
- // if (kb.msg == 1) ;
- // sendMsg(&kb, kb.key, 0);
- // }
- // //printf("%d\n",Key_Num);
- //}
- /*可以使用單步仿真一步步查看效果*/
- void main()
- {
- unsigned int i;
- Delay_ms(10);
- Delay_us(10);
- PWM2=0; //電機(jī)制動(dòng),可以下拉10k設(shè)置引腳為推挽制動(dòng)
- /*2.2寸、320*240分辨率、SPI接口的LCD初始化,使用STC的硬件SPI,LCD驅(qū)動(dòng)芯片為ILI9340C*/
- LCD_LED=0; //LCD背光最亮
- SPI_Init(); //IAP15硬件SPI初始化,切換到了SPI的第二通道:SS/P24、MOSI/P23、MISO/P22、SCK/P21
- LCD_Init(); //LCD初始化,廠家提供
- /*LCD休眠演示*/
- LCD_Sleep(); //LCD進(jìn)入休眠狀態(tài)
- Delay_ms(100);
- LCD_ExitSleep();//LCD退出休眠狀態(tài)
- /*LCD刷屏演示:紅橙黃綠青藍(lán)紫 白黑*/
- LCD_Clear(Red);
- LCD_Clear(Orange);
- LCD_Clear(Yellow);
- LCD_Clear(Green);
- LCD_Clear(Cyan);
- LCD_Clear(Blue);
- LCD_Clear(Purple);
- LCD_Clear(White);
- LCD_Clear(Black);
- /*LCD畫(huà)線(xiàn)、英文、漢字、數(shù)字顯示測(cè)試*/
- /*液晶屏左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(239,319)*/
- POINT_COLOR=Green; //全局變量
- BACK_COLOR=Black; //前景色類(lèi)似于在黑板寫(xiě)字的各種顏色的粉筆,黑板的顏色就是背景色
- LCD_ShowString(0,0,"Hello,world!"); //從(0,0)坐標(biāo)開(kāi)始顯示字符串“Hello,World!”
- POINT_COLOR=Blue; //可以隨時(shí)更改畫(huà)筆顏色,顯示不同顏色的數(shù)字
- LCD_DrawLine(100,0,240,15); //畫(huà)一條線(xiàn)段,起始坐標(biāo)(100,0),終點(diǎn)坐標(biāo)(240,15)
- LCD_Show2Num(0,16,65535,5); //從(0,16)坐標(biāo)開(kāi)始顯示0~65535的數(shù)字,5為數(shù)字位數(shù),即顯示5位數(shù)字
- LCD_ShowNum(100,16,987654321,9); //從(100,16)坐標(biāo)開(kāi)始顯示unsigned long型數(shù)字(0~4294967295),10為數(shù)字位數(shù),即10位數(shù)字
- POINT_COLOR=Yellow;
- for(i=32;i<320;i+=16)
- {
- LCD_ShowString(0,i,"abcdefghijklmnopqrstuvwxyz!");
- }
- LCD_LED=1; //LCD背光關(guān)閉
- Delay_ms(500);
- LCD_LED=0; //LCD背光最亮
- Delay_ms(500);
- LCD_Clear(Black); //清屏:黑色
- //LCD_Fill(120,120,160,160,Yellow); //在矩形區(qū)域填充色塊,在函數(shù)處按F12可以查看函數(shù)原型
- LCD_ShowImage(gImage_musi,80,120,78,80);//顯示彩色圖像: 慕司LOGO
- Delay_ms(2000);
- LCD_Clear(Black);
- POINT_COLOR=Red;
- LCD_DrawRectangle(0,0,239,60); //畫(huà)矩形:對(duì)角坐標(biāo)(左上、右下)為(0,0),(239,60)
- POINT_COLOR=Purple;
- LCD_ShowString(80,2,"慕司"); //顯示16*16漢字
- LCD_ShowString(16,22,"為一線(xiàn)微茫憧憬一意孤行,");
- LCD_ShowString(8,42,"這眾生蕓蕓誰(shuí)不曾如此任性!");
- POINT_COLOR=Cyan;
- LCD_ShowGB3232(80,160,"青春");
- POINT_COLOR=Green;
- LCD_DrawCircle(112,176,48);
- Delay_ms(500);
- PCA_PWM_Init(); //PWM初始化,切換到PWM的第三通道P25/P26/P27,這里僅使用了PWM1(P26,即LCD_LED引腳)
- LCD_LED=0; //LCD背光最亮
- for(i=255;i<=0;i--) //液晶背光256級(jí)亮度調(diào)節(jié)演示:由亮到暗
- {
- CCAP1H = CCAP1L = i; //通過(guò)調(diào)節(jié)占空比來(lái)調(diào)節(jié)屏幕亮度
- Delay_ms(20);
- }
- LCD_LED=1; //LCD背光關(guān)閉
- for(i=0;i<255;i++) //液晶背光256級(jí)亮度調(diào)節(jié)演示:由暗到亮
- {
- CCAP1H = CCAP1L = i; //通過(guò)調(diào)節(jié)占空比來(lái)調(diào)節(jié)屏幕亮度
- Delay_ms(20);
- }
- Delay_ms(1000);
- LCD_Clear(Black);
- LKB_Init(); //LED Key Buzzer:LED、按鍵、蜂鳴器 初始化(設(shè)置蜂鳴器端口為推挽輸出)
- Buzzer_Func(500,1000); //蜂鳴器500Hz@1000ms
- ADC_Init(); //AD初始化:設(shè)置P1的0 1 2 3(搖桿)4(鋰電池電壓)口為AD口,
- POINT_COLOR = Green; //液晶屏畫(huà)筆顏色
- BACK_COLOR=Black; //背景色
- LCD_ShowString(0,0 ,"adc0: ");
- LCD_ShowString(0,16,"adc1: ");
- LCD_ShowString(120,0,"adc2: ");
- LCD_ShowString(120,16,"adc3: ");
- LCD_ShowString(0,32,"li_voltage: V");
- LCD_ShowString(104,32,".");
- NRF24L01_Init();
- TX_Mode(); //發(fā)送模式
- LCD_ShowString(0,48,"NRF24L01_State: Tx_Mode");
- MPU6050_Init();
- Delay_ms(100);
- POINT_COLOR = Red;
- LCD_DrawLine(0,319,239,319);
- LCD_DrawLine(0,139,239,139);
- LCD_DrawLine(0,229,239,229);
- HMC5883_Init();
- Delay_ms(100);
- POINT_COLOR = Green;
- LCD_DrawCircle(120,100,31);
- LCD_ShowString(0,64,"direction:");
- LCD_ShowString(0,96,"speed:");
- Timer_Init(100); //每10ms中斷一次,參數(shù)為百u(mài)s:100*100us = 10ms
- UART_Init(115200); //串口初始化,使用了串口1的第一通道,設(shè)置波特率115200,用于仿真時(shí)可以切換到第二通道P36/P37
- TI=1;
- SBUF=0; //這一句使用printf有時(shí)是必須的
- INT_Init();
- while(1)
- {
- if(LED_flag) //每1s切換一次LED的狀態(tài)
- {LED_flag=0;LED1 = ~LED1;}
- if(ADC_flag)
- {ADC_flag=0;ADC_Task();}
-
- if(adc2 >=80 && Encoder_flag) //使用adc2作開(kāi)關(guān)
- {
- Encoder_flag=0;
- CCAP2H = CCAP2L = (adc3 - 10)*2; //使用搖桿的ADC3調(diào)節(jié)電機(jī)轉(zhuǎn)速
- Encoder_Task();
- }
- else if(adc2 <=70)
- {
- if(MPU6050_flag) //MPU6050的幾個(gè)函數(shù)使用了Delay_us(5)
- {MPU6050_flag=0;MPU6050_Task();}
-
- if(HMC5883_flag)
- {HMC5883_flag=0;HMC5883_Task();}
-
- //interrupt.c中把Key_Scan()改成支持連按
- //uart.c中把串口1切換回P30/P31
- if(KEY_flag)
- {
- // KEY_Task();
- if (key_up==0)
- {
- sendMsg(&kb, Key_Num, 1); //sendMsg()函數(shù)里面有printf
- }
- else //if(key_up == 1)
- {
- KEY_flag=0;
- if (kb.msg == 1) ;
- sendMsg(&kb, kb.key, 0);
- }
- //printf("%d\n",Key_Num);
- }
- }
- else
- {;}
- }
- }
復(fù)制代碼
本開(kāi)發(fā)板的全部資料(壓縮包)下載:
|
|