主程序

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "encoder.h"
#include "usart.h"
#include "motor.h"
#include "servo.h"
#include "oled.h"
#include "DataScope_DP.h"
#include "myIIC.h"
#include "mpu6050.h"
#include "stmflash.h"
#include "display.h"
#include "timer.h"
#include "2401.h"
#include "ocsct1.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include "adc.h"
//ALIENTEK 探索者STM32F407开发板 实验4
//串口通信实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @ALIENTEK
//要写入到STM32 FLASH的字符串数组
extern int D,A;
extern u8 send_flag,uart_flag;
extern int DISTANCE,Angle;
extern u8 UART_FLAG;
extern int distance;
extern u8 UART_RX3[6];
extern int DDDDD;
extern int x1,y;
extern int X_TINE_COUNT;
extern u8 zc;
extern int CHANG_ANGLE;
extern u8 X_FLAG;
extern u8 TURN_flag;
extern u8 turn_flag;
void find_angle()
{if(x_err>=5 && x_err<=10 && TURN_flag==1){send_flag=1;}if(x_err>=150 && x_err<=155 && TURN_flag==0){send_flag=1;}
}void send_pao()
{if(send_flag==1){send_flag=0;fangdian=0;// 充电前不能开启放电delay_ms(200);chongdian=1;//开始充电delay_ms(1500);chongdian=0;//充电结束delay_ms(300);fangdian=1;//开始放电delay_ms(200);fangdian=0;//放电结束}
}
void init()
{delay_init(168);       //延时初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2KEY_Init();LED_Init();TIM1_PWM_Init(9999,335);//50HZ  精度10000TIM_SetCompare1(TIM1,center_X);//900 500 680 //左小右大center_X//580 790TIM_SetCompare2(TIM1,center_Y);//900 1230 //上下center_Yuart_init2(9600);uart_init3(115200);TIM6_Int_Init(100-1,8400-1);OLED_Init();STMFLASH_Read(FLASH_SAVE_ADDR,(u32*)flash_read,SIZE1);D=flash_read[0];A=flash_read[1];
}
int main(void)
{ init();while(1){OLED_ShowCHinese(0,0,0);//电磁炮发射线装置OLED_ShowCHinese(16,0,1);OLED_ShowCHinese(32,0,2);OLED_ShowCHinese(48,0,3);OLED_ShowCHinese(64,0,4);OLED_ShowCHinese(80,0,5);OLED_ShowCHinese(96,0,6);OLED_ShowCHinese(0,2,7);OLED_ShowCHinese(16,2,8);OLED_ShowCHinese(64,2,9);OLED_ShowCHinese(80,2,10);OLED_ShowCHinese(32,4,11);OLED_ShowCHinese(48,4,12);OLED_ShowCHinese(64,4,13);;if(KEY4_PRES==KEY_Scan(0)){OLED_Clear();break;}}while(1){ display();send_pao();if(turn_flag==1){find_angle();}}
}

OLED显示程序

#include "display.h"
#include "oled.h"
#include "key.h"
#include "stmflash.h"
extern int D;
extern int A;//u8 miaozhi=L;//选择基础或者发挥
//u8 bianliang=D_Y;//选择改变D或A选择改变D或A
//void change_data(u8 bb)
//{
//          switch(KEY_Scan(0))
//     {
//                case KEY1_PRES:
//               bianliang= D_Y;
//               OLED_Clear();
//                  break;
//                case KEY2_PRES:
//                           bianliang= A_Y;
//               OLED_Clear();
//                  break;
//                  case KEY3_PRES:
//               //OLED_Clear();
//             //judge_choose();
//                  break;
//
//      }
//}u8 MODE_FLAG=1;
u8 find_flag=0;
u8 turn_flag=0;
extern u8 UART_FLAG;
void change_mode(u8 aa)
{u8 stop_flag=0;while(1){OLED_ShowString(0,0,"D:");OLED_ShowNum(20,0,D,3,16);OLED_ShowString(0,2,"A:");OLED_ShowNum(20,2,A,3,16);OLED_ShowString(0,4,"find:");OLED_ShowNum(40,4,find_flag,1,16);OLED_ShowString(0,6,"turn:");OLED_ShowNum(40,6,turn_flag,1,16);switch(KEY_Scan(0)){                 case KEY2_PRES:if(aa==1){D+=2;if(D>=300)D=300;flash_write[0]=D;}if(aa==2){A+=1;if(A>=30)A=30;flash_write[1]=A;}if(aa==3)find_flag=1;if(aa==4)turn_flag=1;OLED_Clear();break;case KEY3_PRES:if(aa==1){D-=2;if(D<=200)D=200;flash_write[0]=D;}if(aa==2){A-=1;if(A<=-30)A=-30;flash_write[1]=A;}if(aa==3)find_flag=0;if(aa==4)turn_flag=0;OLED_Clear();break;case KEY1_PRES:UART_FLAG=1;//允许执行中断程序stop_flag=1;break;}if(stop_flag==1){STMFLASH_Write(FLASH_SAVE_ADDR,(u32*)flash_write,SIZE1);MODE_FLAG=1;OLED_Clear();break;}}
}extern u8 send_flag;
void display()
{switch(KEY_Scan(0)){                case KEY2_PRES:MODE_FLAG++;if(MODE_FLAG>4)MODE_FLAG=1;OLED_Clear();break;case KEY3_PRES:MODE_FLAG--;if(MODE_FLAG<1)MODE_FLAG=4;OLED_Clear();break;case KEY4_PRES:OLED_Clear();change_mode(MODE_FLAG);break;case KEY5_PRES:  send_flag=1;OLED_Clear();break;}OLED_ShowString(0,0,"D:");OLED_ShowNum(20,0,D,3,16);OLED_ShowString(0,2,"A:");OLED_ShowNum(20,2,A,3,16);OLED_ShowString(0,4,"find:");OLED_ShowNum(40,4,find_flag,1,16);OLED_ShowString(0,6,"turn:");OLED_ShowNum(40,6,turn_flag,1,16);if(MODE_FLAG==1)OLED_ShowString(70,0,"1");else if(MODE_FLAG==2)OLED_ShowString(70,2,"1");else if(MODE_FLAG==3)OLED_ShowString(70,4,"1");else OLED_ShowString(70,6,"1");if(send_flag==1)OLED_ShowString(90,6,"ok");
}

云台舵机控制程序

float servo_KP=0,servo_KI=0.085;
int X_servo_PID(int val,int aim)
{static int temp=0,duty=0;static int ThisError=0,LastError=0;static int pError=0,iError=0;static int PWM1;ThisError=(int)(aim-val);pError=ThisError-LastError;iError=ThisError;temp=(int)(servo_KP*pError+servo_KI*iError);LastError=ThisError; duty+=temp;PWM1=duty+center_X;if(PWM1>max_X)PWM1=max_X;if(PWM1<min_X)PWM1=min_X;TIM_SetCompare1(TIM1,PWM1);return center_X+duty;
}int Y_servo_PID(int val,int aim)
{static int temp1=0,duty1=0;static int ThisError1=0,LastError1=0;static int pError1=0,iError1=0;ThisError1=(int)(aim-val);pError1=ThisError1-LastError1;iError1=ThisError1;temp1=(int)(servo_KP*pError1+servo_KI*iError1);LastError1=ThisError1; duty1+=temp1;if(duty1>150)duty1=150;//900if(duty1<-100)duty1=-100;//650TIM_SetCompare2(TIM1,750+duty1);//110 30 68 //左大右小   return duty1;
}
int Y_servo_pwm(int d)
{static int Distance;static int dd,last_dd;if(d>=200){//距离需大于等于200dd=d;if(dd!=last_dd){//云台Y轴模拟三阶比例输出Distance =(int)(-0.000030*d*d*d+0.022546*d*d+-6.417342*d+1809.190229);// Distance=(int)(+0.000154*d*d*d+-0.034523*d*d+1.448813*d+1392.202060);}last_dd=dd;if(Distance<min_Y) Distance=min_Y;if(Distance>center_Y) Distance=center_Y;TIM_SetCompare2(TIM1,Distance);//900 1230return Distance;}else{TIM_SetCompare2(TIM1,center_Y);//900 1230return center_Y;}
}
int X_servo_pwm(int a)
{static int Pwm;static int aa,last_aa=1;aa=a;//云台X轴二阶比例输出if(aa!=last_aa){Pwm=(int)(0.000320*a*a+-5.503297*a+680.118881);}last_aa=aa;if(Pwm>max_X)Pwm=max_X;if(Pwm<min_X)Pwm=min_X;TIM_SetCompare1(TIM1,Pwm);//900 500 700 //左小右大return Pwm;
}// TIM1_PWM_Init(999,3359);
//  TIM_SetCompare1(TIM1,70);//110 30 68 //110 30 70int ZCZC=830;
u8 TURN_flag=0;
int TIME_COUNT=0;
int CHANG_ANGLE=680;
extern u8 send_flag;
extern int x_err;
void Turn_servo(int time)
{TIME_COUNT++;if(TIME_COUNT==time){TIME_COUNT=0;if(TURN_flag==0)ZCZC-=5;if(TURN_flag==1)ZCZC+=5;if(ZCZC>830){ZCZC=830;TURN_flag=0;}if(ZCZC<530){ZCZC=530;TURN_flag=1;}TIM_SetCompare1(TIM1,ZCZC);//900 500 680 //左小右大}
}

摄像头串口数据接收程序

void Optical_Flow_Receive_Prepare(u8 data)
{/* 局部静态变量:接收缓存 */static u8 RxBuffer[4];/* 数据长度 *//* 数据数组下标 */static u8  _data_cnt = 0;/* 接收状态 */static u8 state = 0;/* 帧头1 */if(state==0&&data==TITLE1){state=1;}/* 帧头2 */else if(state==1&&data==TITLE2){state=2;_data_cnt = 0;}/* 接收数据租 */else if(state==2){uart_flag=1;//数据校验没问题,开启串口接收标志RxBuffer[++_data_cnt]=data;if(_data_cnt>=2){state = 0;Data_Processing(RxBuffer,_data_cnt);}}/* 若有错误重新等待接收帧头 */elsestate = 0;
}int x_err,y_err;
void Data_Processing(u8 *data_buf,u8 num)
{int theta_org,rho_org;/* 读取偏移角度原始数据  *///theta_org = (int)(*(data_buf+1)<<0) | (int)(*(data_buf+2)<<8) | (int)(*(data_buf+3)<<16) | (int)(*(data_buf+4)<<24) ;//theta_err = theta_org;theta_org = (char)(*(data_buf+1)<<0); //| (char)(*(data_buf+2)<<8); //| (int)(*(data_buf+3)<<16) | (int)(*(data_buf+4)<<24) ;x_err = theta_org;/* 读取偏移尺寸原始数据 *///rho_org = (int)(*(data_buf+5)<<0) | (int)(*(data_buf+6)<<8) | (int)(*(data_buf+7)<<16) | (int)(*(data_buf+8)<<24) ;//rho_err = rho_org;rho_org = (char)(*(data_buf+2)<<0); //| (char)(*(data_buf+4)<<8);//| (int)(*(data_buf+7)<<16) | (int)(*(data_buf+8)<<24) ;y_err = rho_org;}u8  UART_RX2[9];
u8 uart_flag=0;
u8 numzz;
void USART2_IRQHandler(void)                    //串口1中断服务程序
{u8 Res2;
//  u8 t2;
//  u8 len2;
#if SYSTEM_SUPPORT_OS       //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntEnter();
#endifif(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){//uart_flag=1;Res2 =USART_ReceiveData(USART2);//(USART1->DR);   //读取接收到的数据Optical_Flow_Receive_Prepare(Res2);
//      if((USART_RX_STA2&0x8000)==0)//接收未完成
//      {
//          if(USART_RX_STA2&0x4000)//接收到了0x0d
//          {
//              if(Res2!=0x0a)USART_RX_STA2=0;//接收错误,重新开始
//              else USART_RX_STA2|=0x8000;    //接收完成了
//          }
//          else //还没收到0X0D
//          {
//              if(Res2==0x0d)USART_RX_STA2|=0x4000;
//              else
//              {
//                  USART_RX_BUF2[USART_RX_STA2&0X3FFF]=Res2 ;
//                  USART_RX_STA2++;
//                  if(USART_RX_STA2>(USART_REC_LEN-1))USART_RX_STA2=0;//接收数据错误,重新开始接收
//              }
//          }
//      }
//    if(USART_RX_STA2&0x8000)
//       {
//              len2=USART_RX_STA2&0x3fff;//得到此次接收到的数据长度
//              for(t2=0;t2<len2;t2++)
//              {//接收OPENMV1
//                   UART_RX2[t2]=USART_RX_BUF2[t2];
//                   USART_RX_BUF2[t2]=0;
//              }
//            USART_RX_STA2=0;
//       }      }
#if SYSTEM_SUPPORT_OS   //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntExit();
#endif
}

测距模块数据接收程序

u16 UART_RX3[9];
u8 DistanceBuff[6];
u8 numzc=0;
int DDDDD=0;
u8 zc;
extern u8 X_FLAG;
int distance;
void USART3_IRQHandler(void)                    //串口1中断服务程序
{static u8 seri_count=0;u16 check_sum=0;u8 i;static u8 flag;if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){zc=1;USART_ClearFlag(USART3, USART_FLAG_RXNE);USART_ClearITPendingBit(USART3, USART_IT_RXNE);if(USART_ReceiveData(USART3)==Data_Head){flag=1;}if( flag==1){UART_RX3[seri_count++]=USART_ReceiveData(USART3);if(seri_count == 9){if(UART_RX3[0]==Data_Head && UART_RX3[1]==Data_Head){for(i=0;i<9-1;i++){check_sum+=UART_RX3[i];}if((check_sum & 0x00ff)==UART_RX3[8]){distance=UART_RX3[2]+UART_RX3[3]*256;seri_count=0;flag=0;}}}}}
}

中断处理函数

int x1,y;
extern u8 uart_flag;
extern int D,A;
int DISTANCE,Angle;
u8 UART_FLAG;
u8 TURN_OFF=0;
u8 X_FLAG=1,Y_FLAG;
int X_TINE_COUNT=0;
extern int DDDDD;
extern u8 send_flag;
extern int distance;
void camera_send1(void)
{if(TURN_OFF==1){X_TINE_COUNT++;}if(X_TINE_COUNT==X_TIME){//摄像头循迹关闭,打开激光测距X_FLAG=0;//摄像头循迹关闭,打开激光测距DDDDD= distance;if(DDDDD>330)DDDDD=330;if(DDDDD<230)DDDDD=230;DISTANCE=Y_servo_pwm(DDDDD-30);}if(X_TINE_COUNT==SEND_TIME){X_TINE_COUNT=0;TURN_OFF=0;UART_FLAG=0;if(send_flag==0){send_flag=1;//发射电磁炮}}if(X_FLAG==1){//X轴摄像头循迹打开,关闭激光测距if(uart_flag==1)//接到数据开始处理{//uart_flag=0;   x1=X_servo_PID(x_err,X);   //X_TINE_COUNT++;TURN_OFF=1; //关闭舵机自动打角               }else{//没有接受到数据,打角找坐标if(TURN_OFF==0){Turn_servo(10);}}}
}extern u8 find_flag;
extern u8 turn_flag;
void TIM6_DAC_IRQHandler(void)
{ if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET){if(UART_FLAG==1){//允许执行中断程序if(find_flag==1){camera_send1();}else if(turn_flag==1){Turn_servo(10);DISTANCE=Y_servo_pwm(255);//1141   }else{DISTANCE=Y_servo_pwm(D);Angle=X_servo_pwm(A);}}}TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
}

电磁炮程序(电子设计大赛)相关推荐

  1. 2019全国大学生电子设计大赛H题 模拟电磁炮系统全国一等奖

    2019全国大学生电子设计大赛H题 模拟电磁炮系统全国一等奖 作者 xxx 队友 阿华 狗子 (想要比赛指导的可以xian鱼搜索 电子设计竞赛国一竞赛指导(发布人为晨星)) (想要源码和我比赛时候准备 ...

  2. 计算机大赛搞笑队名,电子设计大赛队名

    篇一:电子设计竞赛报告格式要求 附件3 电子设计竞赛报告格式要求 封面: 作品名称:(黑体,二号) 申报者信息:(宋体,四号) 队员1:姓名,性别,出生年月,所在学院.专业.年级,教学号,邮箱,电话 ...

  3. 电子设计大赛-电源电路

    文末下载完整资料 集成直流稳压电源的设计   直流稳压电源是电子设备的能源电路,关系到整个电路设计的稳定性和可靠性,是电路设计中非常关键的一个环节.本节重点介绍三端固定式(正.负压)集成稳压器.三端可 ...

  4. 电子设计大赛-微电网模拟系统

    关注v-x-公-众-号:[嵌入式基地] 后-台-回-复:[电赛] 即可获资料 回复[编程]即可获取 包括有:C.C++.C#.JAVA.Python.JavaScript.PHP.数据库.微信小程序. ...

  5. 大学生电子设计大赛(内容有点多,细细看看,应该会有收获)

    内容有些多,有些杂,需要静下心好好看看,趁着假期,多少给自己添点储备. 全国大学生电子设计大赛应该怎么准备? 最主要的是学习什么课程::<电工电路基础><低频电子线路>< ...

  6. 2019全国大学生电子设计大赛(回忆录)

    全国大学生电子设计大赛可以说是电子信息类专业在大学时最重要.同时也是最有含金量的几个赛事之一,也是我一进大学就听学长们无数此提起的一场四天三夜的盛会.我也是从大一开始便期待着,准备着.大二暑假有幸参加 ...

  7. 2018年辽宁省电子设计大赛D题手势识别装置

    一转眼,两年过去了.距离这个比赛已经好久.我此时(2020年5月28日)已然大四,马上要念研究生了.现在回头看这篇我刚开始接触CSDN写的文章,还没有学会markdown,而且认识也比较粗浅.大概会等 ...

  8. [电子设计大赛]射频宽带放大器设计报告

    射频宽带放大器 摘要:该设计实现的射频宽带放大器,由固定增益放大部分.可变增益放大部分.单片机控 制部分组成.固定增益放大部分由宽带电流反馈型运算放大器OPA695构成,采用同相放大电 路,可变增益放 ...

  9. 电子设计大赛-放大器类题目分析

    关注v-x-公-众-号:[嵌入式基地] 后-台-回-复:[电赛] 即可获资料 回复[编程]即可获取 包括有:C.C++.C#.JAVA.Python.JavaScript.PHP.数据库.微信小程序. ...

  10. 毕业设计:电子设计大赛点阵电子显示屏(A题).pdf

    毕业设计:电子设计大赛点阵电子显示屏(A题).pdf 32个单片机类毕业设计集锦,给广大大四学生的福利,即将要毕业了,是不是要交毕业设计呢,关于电子设计,单片机,proteus等硬软件的毕业设计在闯客 ...

最新文章

  1. 实用javaScript技术-屏蔽总结
  2. 行为型模式:策略模式
  3. 微型计算机内存不能用指令修改的部分,在微型计算机内存储器中,不能用指令修改其存储内容的部分是什么?...
  4. 实现tinyc语言的扫描程序_适合编程小白的C语言设计习题,实现自动发牌程序!源码分享!...
  5. 个人控件/对象命名规范(慢慢更新)
  6. 六西格玛dfss_六西格玛系列知识之二:六西格玛管理的基本原理
  7. IT 软件开发最常用英语单词总汇
  8. 继口罩厕纸双黄连之后,限制出口会导致“粮食挤兑”吗?
  9. python并集符号_Python No.18_集合以及表示符号
  10. 《C语言实战教学》:程序式思维及C语言介绍
  11. EditText设置输入的类型,比如说限制只能输入字母和数字
  12. 【JavaScript】JS 的执行
  13. 2022-2027年中国海参行业市场调研及未来发展趋势预测报告
  14. 伊利诺伊香槟分校计算机排名,伊利诺伊大学香槟分校计算机工程排名第8(2018年TFE美国排名)...
  15. 常用的时间系统有哪些?
  16. MySQL 存储 IP 地址
  17. .out文件转bin文件
  18. 网吧XP系统母盘制作参考(1)
  19. [HCIP-IoT Developer V2.5 题库] 1-50 题 华为
  20. Opencv学习笔记四——图像形态学操作

热门文章

  1. python银行小项目
  2. JS的8种创建对象的方法
  3. MISC-audio
  4. 做python的socket训练,在Windows中使用telnet只能发送一个字符的问题。
  5. pca人脸识别python_PCA人脸识别技术概述
  6. ppt中如何合并流程图_简单4招,教你轻松搞定PPT中的流程图!
  7. 基于SSM的垃圾分类管理系统
  8. QTS公司在芝加哥新开通数据中心
  9. 一本英文书|让在华外资企业了解中国网络安全等级保护实施条例
  10. 微信小程序 — wx:for和wx:if