找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7594|回复: 2
打印 上一主题 下一主题
收起左侧

IAP15L2K61S2单片机开发板 PCB+源代码+电路原理图

[复制链接]
跳转到指定楼层
楼主
IAP15L2K61S2板子的实物图如下:




  该IAP15L2K61S2开发板设计资料包括PCB、元件库,大家可以随意引用或更改文档、代码、PCB,不必等待作者同意。目前完成的资料,希望至少有点STC89C52的基础看看,当然但愿对于所有的电子爱好者来说,有点参考价值。
PCB:



原理图:





单片机开发板的测试程序如下:
  1. /**************************************************************************************
  2. 注意事项:按ALT+F7 配置->Target->Memory Mode->Large:variables in XDATA,如果需要用到仿真
  3.                   Debug中设置好仿真和串口号;
  4.                   初始化有液晶背光调节演示,需要把P19的跳线帽插到上面,使LCD背光引脚与P26相连,使
  5.                   用PWM1来调节液晶背光亮度;
  6.                   使用串口1的1通道发送数据打游戏:在lkb.h中增加了KEYMSG结构体
  7.                   mpu6050.c中Accel_x、Accel_y、Accel_z升为全局变量,增加;
  8.                   Accel_y  = (float)GetData(ACCEL_YOUT_H)/286.0f;          //读取Y轴加速度
  9.                   ADC初始化把AD采样时间改小了
  10. // *************************************************************************************
  11. #include "config0.h"
  12. #include "delay.h"
  13. #include "lkb.h"
  14. #include "timer.h"
  15. #include "uart.h"
  16. #include <stdio.h>                                                                                 
  17. #include "lcd.h"
  18. #include "adc.h"
  19. #include "mpu6050.h"
  20. #include "image0.h"
  21. #include "pca_pwm.h"
  22. #include "hmc5883l.h"
  23. #include "nrf24l01.h"
  24. #include <math.h>
  25. #include "int.h"

  26. unsigned int adc0,adc1,adc2,adc3,adc4;
  27. float li_voltage=0;

  28. KEYMSG left;
  29. KEYMSG right;
  30. KEYMSG up;
  31. KEYMSG down;
  32. KEYMSG kb;

  33. KEYMSG a_jump; //跳跃
  34. KEYMSG a_shoot;//射击
  35. KEYMSG a_left;
  36. KEYMSG a_right;

  37. void Encoder_Task();
  38. void MPU6050_Task();
  39. void HMC5883_Task();
  40. void KEY_Task();
  41. void ADC_Task();

  42. void Encoder_Task()
  43. {
  44.         LCD_Show2Num(0,112,Freq,6);
  45.         printf("%d\n",Cnt_Now);        
  46. }

  47. void MPU6050_Task()
  48. {
  49.         static unsigned int j=0;
  50.         Angle_Calcu();                //倾角计算 将得到下面两个全局变量,使用了网上摘抄的卡尔曼滤波
  51.                                                 //float Angle;   //最终倾斜角度
  52.                                                 //float Gyro_y;  //Y轴角速度
  53.         if(Accel_x >=20 && Accel_x<=90)        
  54.         {
  55.                 sendMsg(&a_jump, 7, 1);
  56.         }
  57.         else if(Accel_x >=-90 && Accel_x<=-20)        
  58.         {
  59.                 sendMsg(&a_shoot, 6, 1);                                         
  60.         }
  61.         else
  62.         {
  63.                 if(a_jump.msg == 1)
  64.                 {
  65.                         sendMsg(&a_jump, 7, 0);
  66.                 }
  67.                 else if(a_shoot.msg == 1)
  68.                 {
  69.                         sendMsg(&a_shoot, 6, 0);
  70.                 }
  71.         }

  72.         if(Accel_y >=20 && Accel_y<=90)        
  73.         {
  74.                 sendMsg(&a_right, 3, 1);
  75.         }
  76.         else if(Accel_y >=-90 && Accel_y<=-20)        
  77.         {
  78.                 sendMsg(&a_left, 2, 1);                                         
  79.         }
  80.         else
  81.         {
  82.                 if(a_right.msg == 1)
  83.                 {
  84.                         sendMsg(&a_right, 3, 0);
  85.                 }
  86.                 else if(a_left.msg == 1)
  87.                 {
  88.                         sendMsg(&a_left, 2, 0);
  89.                 }
  90.         }



  91.         //printf("%.2f,%.2f\n",Angle,Gyro_y);
  92.         j++;
  93.         if(j>=240)
  94.         {
  95.                 j=0;
  96.                 LCD_Fill(0,140,239,318,Black);
  97.                 POINT_COLOR = Red;
  98.                 BACK_COLOR=Black;
  99.                 LCD_DrawLine(0,229,239,229);
  100.                 POINT_COLOR = Green;
  101.         }
  102.         if((int)Angle>-90 && (int)Angle<90 )          //排除初始不稳定杂波
  103.         {
  104.                 LCD_DrawPoint(j,229-(int)Angle);
  105.                 //通过NRF24L01发送出去
  106.                 if(Angle>=0)
  107.                 {
  108.                         Tx_Buf[2] = '+';
  109.                         Tx_Buf[3] =(unsigned char)Angle;        
  110.                 }
  111.                 else
  112.                 {
  113.                         Tx_Buf[2] = '-';
  114.                         Tx_Buf[3] = (unsigned char)(Angle*(-1));
  115.                 }               
  116.                   Transmit(Tx_Buf);                        //24L01发送缓冲数组
  117.                   sta=SPI_Read(READ_REG +  STATUS);        //读24L01的状态寄存器
  118.                   if(TX_DS)        //sbit TX_DS =sta^5;数据发送完成中断,接收到应答信号时此位置1,写1清除中断
  119.                   {  
  120.                            //Delay_ms(5);
  121.                            SPI_RW_Reg(WRITE_REG + STATUS,sta);  //写状态寄存器,清除中断
  122.                   }
  123.                 if(MAX_RT)  //如果是发送超时  sbit MAX_RT =sta^4;
  124.                   {                        //达到最多次重发中断,MAX_RT中断产生则必须清除后系统才能进行通讯,写1清除中断
  125.                            //Delay_ms(5);  
  126.                            SPI_RW_Reg(WRITE_REG + STATUS,sta);
  127.                   }
  128.         }
  129.         
  130. }

  131. void HMC5883_Task()
  132. {
  133.         //static unsigned int m=0;
  134.         static float Last_HMC5883_Angle=0;
  135. //        float Avg_HMC5883_Angle=0;
  136. //        float Last_Avg_HMC5883_Angle=0;
  137. //        float temp_HMC5883_Angle=0;

  138.         Multiple_Read_HMC5883();                                  //角度的变化似乎并不是线性的
  139.         LCD_Show2Num(32,80,(int)HMC5883_Angle,3);
  140.         POINT_COLOR=BACK_COLOR;                                           //三角函数使用弧度而不是度!
  141.         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)));
  142.         POINT_COLOR=Yellow;
  143.         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)));
  144.         Last_HMC5883_Angle=HMC5883_Angle;
  145. //                        //平均值滤波
  146. //                        m++;
  147. //                        temp_HMC5883_Angle+=HMC5883_Angle;        
  148. //                        if(m==5)
  149. //                        {
  150. //                                m=0;
  151. //                                Avg_HMC5883_Angle=temp_HMC5883_Angle/5.0;         //与前面四个值相关联
  152. //                                //printf("\n\n%.2f\n\n",HMC5883_Angle);          //HMC5883_Angle: float型,0~360
  153. //                                LCD_Show2Num(32,80,(int)Avg_HMC5883_Angle,3);
  154. //                                POINT_COLOR=BACK_COLOR;
  155. //                                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));
  156. //                                POINT_COLOR=Yellow;
  157. //                                LCD_DrawLine(120,100,120+28*cos((Avg_HMC5883_Angle-180.0)/57.3),100+28*sin((Avg_HMC5883_Angle-180.0)/57.3));
  158. //                                Last_Avg_HMC5883_Angle=Avg_HMC5883_Angle;
  159. //                        }
  160. }

  161. void ADC_Task()
  162. {
  163.         static unsigned int i=0;
  164.         static unsigned int k=0;

  165.         POINT_COLOR= Green;
  166.         i++;
  167.         switch(i)
  168.         {
  169.                 case 1: adc0=(int)ADC_GetResult(0);LCD_Show2Num(48,0,adc0,3); break;
  170.                 case 2:        adc1=(int)ADC_GetResult(1);LCD_Show2Num(48,16,adc1,3); break;
  171.                 case 3:        adc2=(int)ADC_GetResult(2);LCD_Show2Num(168,0,adc2,3); break;
  172.                 case 4:        adc3=(int)ADC_GetResult(3);LCD_Show2Num(168,16,adc3,3); break;
  173.                 case 5:        li_voltage=(float)ADC_GetResult(4)*0.019f; break; //adc4*3.3/256*(6.8+3.3)/6.8=adc4*0.019
  174.                 default:
  175.                         i=0;
  176.                         LCD_Show2Num(96,32,(int)li_voltage,1);                                 //显示整数部分
  177.                         LCD_Show2Num(112,32,((int)(li_voltage*100))%100,2); //显示小数部分
  178.                         //printf("%d,%d,%d,%d,%.2f\n",adc0,adc1,adc2,adc3,li_voltage);
  179.          }//switch 结束

  180.         k++;
  181.         //printf("%d,%d,", adc1, adc0);
  182.         if(k%2)
  183.         {
  184.                 if(adc1>=0 && adc1<=80)        
  185.                 {
  186.                         sendMsg(&up, 1, 1);
  187.                 }
  188.                 else if(adc1>=170 && adc1<=255)        
  189.                 {
  190.                         sendMsg(&down, 4, 1);                                         
  191.                 }
  192.                 else
  193.                 {
  194.                         if(up.msg == 1)
  195.                         {
  196.                                 sendMsg(&up, 1, 0);
  197.                         }
  198.                         else if(down.msg == 1)
  199.                         {
  200.                                 sendMsg(&down, 4, 0);
  201.                         }
  202.                 }
  203.         }
  204.         else
  205.         {
  206.                 if(adc0>=0 && adc0<=80)        
  207.                 {
  208.                         sendMsg(&left, 3, 1);
  209.                 }
  210.                 else if(adc0>=170 && adc0<=255)        
  211.                 {
  212.                         sendMsg(&right, 2, 1);                                         
  213.                 }
  214.                 else
  215.                 {
  216.                         if(left.msg == 1)
  217.                         {
  218.                                 sendMsg(&left, 3, 0);
  219.                         }
  220.                         else if(right.msg == 1)
  221.                         {
  222.                                 sendMsg(&right, 2, 0);
  223.                         }
  224.                 }
  225.         }
  226. }

  227. //void KEY_Task()
  228. //{
  229. //        if (key_up==0)
  230. //        {
  231. //                sendMsg(&kb, Key_Num, 1);         //sendMsg()函数里面有printf
  232. //        }
  233. //        else  //if(key_up == 1)
  234. //        {
  235. //
  236. //                if (kb.msg == 1) ;
  237. //                        sendMsg(&kb, kb.key, 0);
  238. //        }
  239. //        //printf("%d\n",Key_Num);
  240. //}

  241. /*可以使用单步仿真一步步查看效果*/
  242. void main()
  243. {        
  244.         unsigned int i;

  245.         Delay_ms(10);        
  246.         Delay_us(10);
  247.         PWM2=0;                        //电机制动,可以下拉10k设置引脚为推挽制动

  248.         /*2.2寸、320*240分辨率、SPI接口的LCD初始化,使用STC的硬件SPI,LCD驱动芯片为ILI9340C*/
  249.         LCD_LED=0;                //LCD背光最亮
  250.         SPI_Init();                //IAP15硬件SPI初始化,切换到了SPI的第二通道:SS/P24、MOSI/P23、MISO/P22、SCK/P21
  251.         LCD_Init();                //LCD初始化,厂家提供

  252.         /*LCD休眠演示*/
  253.         LCD_Sleep();        //LCD进入休眠状态
  254.         Delay_ms(100);        
  255.         LCD_ExitSleep();//LCD退出休眠状态
  256.         /*LCD刷屏演示:红橙黄绿青蓝紫 白黑*/
  257.         LCD_Clear(Red);        
  258.         LCD_Clear(Orange);
  259.         LCD_Clear(Yellow);
  260.         LCD_Clear(Green);
  261.         LCD_Clear(Cyan);
  262.         LCD_Clear(Blue);
  263.         LCD_Clear(Purple);
  264.         LCD_Clear(White);
  265.         LCD_Clear(Black);
  266.         /*LCD画线、英文、汉字、数字显示测试*/
  267.         /*液晶屏左上角坐标为(0,0),右下角坐标为(239,319)*/
  268.         POINT_COLOR=Green; //全局变量
  269.         BACK_COLOR=Black;         //前景色类似于在黑板写字的各种颜色的粉笔,黑板的颜色就是背景色        
  270.         LCD_ShowString(0,0,"Hello,world!");        //从(0,0)坐标开始显示字符串“Hello,World!”
  271.         POINT_COLOR=Blue;                                        //可以随时更改画笔颜色,显示不同颜色的数字
  272.         LCD_DrawLine(100,0,240,15);                        //画一条线段,起始坐标(100,0),终点坐标(240,15)
  273.         LCD_Show2Num(0,16,65535,5);                        //从(0,16)坐标开始显示0~65535的数字,5为数字位数,即显示5位数字
  274.         LCD_ShowNum(100,16,987654321,9);        //从(100,16)坐标开始显示unsigned long型数字(0~4294967295),10为数字位数,即10位数字
  275.         POINT_COLOR=Yellow;
  276.         for(i=32;i<320;i+=16)
  277.         {
  278.                 LCD_ShowString(0,i,"abcdefghijklmnopqrstuvwxyz!");
  279.         }
  280.         LCD_LED=1;                //LCD背光关闭
  281.         Delay_ms(500);
  282.         LCD_LED=0;                //LCD背光最亮
  283.         Delay_ms(500);
  284.         LCD_Clear(Black);                                        //清屏:黑色
  285.         //LCD_Fill(120,120,160,160,Yellow);        //在矩形区域填充色块,在函数处按F12可以查看函数原型
  286.         LCD_ShowImage(gImage_musi,80,120,78,80);//显示彩色图像: 慕司LOGO
  287.         Delay_ms(2000);
  288.         LCD_Clear(Black);
  289.         POINT_COLOR=Red;
  290.         LCD_DrawRectangle(0,0,239,60);         //画矩形:对角坐标(左上、右下)为(0,0),(239,60)
  291.         POINT_COLOR=Purple;
  292.         LCD_ShowString(80,2,"慕司");          //显示16*16汉字
  293.         LCD_ShowString(16,22,"为一线微茫憧憬一意孤行,");
  294.         LCD_ShowString(8,42,"这众生芸芸谁不曾如此任性!");
  295.         POINT_COLOR=Cyan;
  296.         LCD_ShowGB3232(80,160,"青春");
  297.         POINT_COLOR=Green;
  298.         LCD_DrawCircle(112,176,48);
  299.         Delay_ms(500);

  300.         PCA_PWM_Init();                //PWM初始化,切换到PWM的第三通道P25/P26/P27,这里仅使用了PWM1(P26,即LCD_LED引脚)
  301.         LCD_LED=0;                        //LCD背光最亮
  302.         for(i=255;i<=0;i--)        //液晶背光256级亮度调节演示:由亮到暗
  303.         {
  304.                 CCAP1H = CCAP1L = i;           //通过调节占空比来调节屏幕亮度
  305.                 Delay_ms(20);
  306.         }
  307.         LCD_LED=1;                        //LCD背光关闭
  308.         for(i=0;i<255;i++)        //液晶背光256级亮度调节演示:由暗到亮
  309.         {
  310.                 CCAP1H = CCAP1L = i;           //通过调节占空比来调节屏幕亮度
  311.                 Delay_ms(20);
  312.         }
  313.         Delay_ms(1000);
  314.         LCD_Clear(Black);

  315.         LKB_Init();                                //LED Key Buzzer:LED、按键、蜂鸣器 初始化(设置蜂鸣器端口为推挽输出)
  316.         Buzzer_Func(500,1000);        //蜂鸣器500Hz@1000ms

  317.         ADC_Init();                           //AD初始化:设置P1的0 1 2 3(摇杆)4(锂电池电压)口为AD口,
  318.         POINT_COLOR = Green;            //液晶屏画笔颜色
  319.         BACK_COLOR=Black;           //背景色
  320.         LCD_ShowString(0,0 ,"adc0:     ");
  321.         LCD_ShowString(0,16,"adc1:     ");
  322.         LCD_ShowString(120,0,"adc2:     ");
  323.         LCD_ShowString(120,16,"adc3:     ");
  324.         LCD_ShowString(0,32,"li_voltage:      V");
  325.         LCD_ShowString(104,32,".");

  326.         NRF24L01_Init();
  327.         TX_Mode();                     //发送模式
  328.         LCD_ShowString(0,48,"NRF24L01_State: Tx_Mode");

  329.         MPU6050_Init();
  330.         Delay_ms(100);
  331.         POINT_COLOR = Red;
  332.         LCD_DrawLine(0,319,239,319);
  333.         LCD_DrawLine(0,139,239,139);
  334.         LCD_DrawLine(0,229,239,229);

  335.         HMC5883_Init();
  336.         Delay_ms(100);
  337.         POINT_COLOR = Green;
  338.         LCD_DrawCircle(120,100,31);
  339.         LCD_ShowString(0,64,"direction:");

  340.         LCD_ShowString(0,96,"speed:");

  341.         Timer_Init(100);         //每10ms中断一次,参数为百us:100*100us = 10ms

  342.         UART_Init(115200);         //串口初始化,使用了串口1的第一通道,设置波特率115200,用于仿真时可以切换到第二通道P36/P37
  343.         TI=1;
  344.         SBUF=0;                                 //这一句使用printf有时是必须的

  345.         INT_Init();

  346.         while(1)
  347.         {
  348.                 if(LED_flag)                 //每1s切换一次LED的状态
  349.                 {LED_flag=0;LED1 = ~LED1;}

  350.                 if(ADC_flag)
  351.                 {ADC_flag=0;ADC_Task();}
  352.                
  353.                 if(adc2 >=80 && Encoder_flag)         //使用adc2作开关
  354.                 {
  355.                         Encoder_flag=0;
  356.                         CCAP2H = CCAP2L = (adc3 - 10)*2;        //使用摇杆的ADC3调节电机转速
  357.                         Encoder_Task();
  358.                 }
  359.                 else  if(adc2 <=70)
  360.                 {
  361.                         if(MPU6050_flag)          //MPU6050的几个函数使用了Delay_us(5)
  362.                         {MPU6050_flag=0;MPU6050_Task();}
  363.         
  364.                         if(HMC5883_flag)
  365.                         {HMC5883_flag=0;HMC5883_Task();}
  366.         
  367.                         //interrupt.c中把Key_Scan()改成支持连按
  368.                         //uart.c中把串口1切换回P30/P31
  369.                         if(KEY_flag)
  370.                         {
  371. //                                KEY_Task();
  372.                                 if (key_up==0)
  373.                                 {
  374.                                         sendMsg(&kb, Key_Num, 1);         //sendMsg()函数里面有printf
  375.                                 }
  376.                                 else  //if(key_up == 1)
  377.                                 {
  378.                                          KEY_flag=0;
  379.                                         if (kb.msg == 1) ;
  380.                                                 sendMsg(&kb, kb.key, 0);
  381.                                 }
  382.                                 //printf("%d\n",Key_Num);
  383.                         }
  384.                 }
  385.                 else
  386.                         {;}
  387.         }               
  388. }
复制代码

本开发板的全部资料(压缩包)下载:



lizhibo.rar

2.71 MB, 下载次数: 25, 下载积分: 黑币 -5

设计说明和问题汇总.zip

461.16 KB, 下载次数: 27, 下载积分: 黑币 -5

演示程序.rar

256.05 KB, 下载次数: 32, 下载积分: 黑币 -5

IAP15L2K61S2开发板硬件设计.zip

145.2 KB, 下载次数: 43, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:67984 发表于 2016-6-22 09:54 | 只看该作者
怎么没有PCB文件,打开空的
回复

使用道具 举报

板凳
ID:79544 发表于 2018-4-30 11:19 | 只看该作者
楼主:我也IAP15W4K58S4做AD怎么不好啊?请教一下
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表