找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STM32的智能小车源码

[复制链接]
跳转到指定楼层
楼主
ID:292155 发表于 2018-3-15 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于stm32 的智能小车


单片机源程序如下:
  1. #include <stm32f10x_lib.h>
  2. #include "sys.h"
  3. #include "usart.h"               
  4. #include "delay.h"       
  5. #include "led.h"
  6. #include "key.h"
  7. #include "exti.h"
  8. #include "wdg.h"
  9. #include "timer.h"
  10. #include "lcd.h"          
  11. #include "usmart.h"
  12. //===
  13. #include "adc.h"
  14. #include "dma.h"
  15. #include "24cxx.h"
  16. #include "flash.h"
  17. #include "touch.h"        
  18. ////////////////////////////////////////////////////////////////////////////////////
  19. #include "Imageprocess.h"//图像处理
  20. #include "car_crtl.h"//车子的控制
  21. //全局变量
  22. #include "world.h"



  23.    
  24. //全局变量
  25. int pinbi;
  26. int data00;                     //速度
  27. char jz_flag;
  28. char flag_show;                  // 一场数据接收完标志
  29. unsigned int ang;               //转角
  30. int m;                          // 记录行中断次数
  31. int hang;                       // 存数组行标
  32. //==== 全局数组定义 ==========================
  33. int before[IMAGE_ROW];          // 上一场数据缓存数组
  34. signed int Line_center[IMAGE_ROW+1];     // 记录黑线中心数组
  35. //unsigned char uca_Buffer1[IMAGE_ROW][IMAGE_COLUMN];       // 数据数组//90,136
  36. unsigned char uca_pic[IMAGE_ROW*IMAGE_COLUMN];       // 数据数组//90,136
  37. unsigned char *p_addr_Buffer1[IMAGE_ROW];                 // 等同于数据数组
  38. unsigned char *p_pic;                 // 等同于数据数组
  39. char chang_flag,lcd_flag;
  40. int speed_0,speed_now;
  41. int pwmval,duoval;


  42. void show_set(void)
  43. {
  44.   LCD_ShowString(272,16*2,"-    +");
  45.     LCD_ShowNum(280,16*2,pwmval,4,16);//显示速度
  46.   LCD_ShowString(272,16*3,"-    +");
  47.     LCD_ShowNum(280,16*3,pwmval*2,4,16);
  48.   LCD_ShowString(272,16*4,"-    +");
  49.     LCD_ShowNum(280,16*4,pwmval*3,4,16);
  50.   LCD_ShowString(272,16*5,"-    +");
  51.     LCD_ShowNum(280,16*5,pwmval*4,4,16);
  52.   LCD_ShowString(272,16*6,"-    +");
  53.     LCD_ShowNum(280,16*6,pwmval*5,4,16);
  54.   LCD_ShowString(272,16*7,"-    +");
  55.     LCD_ShowNum(280,16*7,pwmval*6,4,16);
  56. }


  57. void Load_Drow_Dialog(void)
  58. {
  59.         LCD_Clear(WHITE);//清屏   
  60.         POINT_COLOR=BLUE;//设置字体为蓝色
  61.         LCD_ShowString(296,0,"RST");//显示清屏区域
  62.         LCD_ShowString(296,16,"SET");//显示清屏区域
  63.   
  64.                 //画矩形
  65.                 POINT_COLOR=RED;
  66.         LCD_DrawRectangle(64-1, 32-1, IMAGE_COLUMN+64, 32+IMAGE_ROW);
  67. show_set();
  68.   


  69. }
  70. //==============================================
  71. void GAY03_init()
  72. {
  73.         Stm32_Clock_Init(12);//系统时钟设置
  74.         delay_init(96);                 //延时初始化
  75.         uart_init(96,38400); //串口1初始化  
  76.         LED_Init();                 //灯的初始化
  77.         LCD_Init();                 //彩色屏幕初始化
  78.         usmart_dev.init(96); //初始化USMART//本来是100ms中断扫描       
  79. EXTIX_Init();        //行场中断初始化        
  80.     //KEY_Init();                //PA0设置成输入,采集二值化数据 (上一句已经搞定)
  81.         //Timerx_Init(5000,9599); //Timerx_Init(5000,7199);//10Khz 的计数频率,计数到 5000 为500ms
  82.     //PWM_Init(900,0);  //不分频。PWM 频率=72000/900=8Khz
  83. //====电机
  84. PWM11_Init(1000,31); //PA8 95---1K
  85. //====舵机 //60HZ
  86. PWM22_Init(16666,95); //PWM_Init(900,0);  //不分频。PWM 频率=72000/900=8Khz
  87.   DIAN_VAL=0; //0---1000
  88.   DUO_VAL=straight;//1500---1.5ms        //
  89.   pwmval=0;
  90.   duoval=straight;




  91. }
  92. //串口,状态设置函数
  93. void sset(u16 a,u16 b)
  94. {
  95.      if(a==0)
  96.         pwmval=b;        //更改电机速度
  97. else if(a==1)
  98.     duoval=b;   //更改舵机角度
  99. else if(a==2)
  100.     lcd_flag=b;        //车载视频
  101. else if(a==3)
  102.     pwmval=b;        //
  103. else if(a==4)
  104.     pwmval=b;        //
  105. else if(a==5)
  106.     pwmval=b;        //
  107. else if(a==6)
  108.     pwmval=b;        //
  109. else if(a==99)
  110.               {
  111.                          jz_flag=1;
  112.              }
  113. }
  114. //函数参数调用测试函数
  115. void test_fun(void(*ledset)(u8),u8 sta)
  116. {
  117.         ledset(sta);
  118. }  

  119. //Mini STM32开发板扩展实验9
  120. //USMART应用 实验
  121. //正点原子@ALIENTEK
  122. //技术论坛:www.openedv.com               
  123. int main(void)
  124. {                          
  125.    
  126. signed int i;
  127. char lost_h;
  128. //unsigned int j;
  129. //unsigned int speed[8];
  130. //unsigned int j;
  131. //u16 led0pwmval=0;
  132. // u8 dir=1;
  133. //u8 dir=1;
  134.          
  135. //=====================================================================//
  136. GAY03_init();          //超频到96M,串口工作在38400波特率,初始化了LED和液晶       

  137. chang_disable();
  138. hang_disable();

  139. for(i = 0 ; i < IMAGE_ROW ; i++)                   // 图像采集数组赋地址
  140.         p_addr_Buffer1[i] = &uca_pic[i*IMAGE_COLUMN];
  141.       //p_addr_Buffer1[0]=&uca_Buffer1[i][0];
  142. //p_pic=uca_Buffer1;//取图像首地址!!!!

  143. flag_show=0;                        
  144. //===============================================================================//
  145. //                            初始化结束开始办正事                              
  146. //===============================================================================//       
  147.         POINT_COLOR=RED;               
  148.                 LED0=!LED0;                                         
  149.                 //delay_ms(500);
  150.                 //开机画面
  151.                 /*for(i=68;i>0;i=i-10)
  152.                 {
  153.                 //LCD_Clear(WHITE);
  154.                 LCD_Init();
  155.                 LCD_chinese(20,i,0);        LCD_chinese(120,i,1);        LCD_chinese(220,i,2);       
  156.                 LCD_chinese(20,i+100,3);        LCD_chinese(120,i+100,4);        LCD_chinese(220,i+100,5);
  157.                 delay_ms(80);       
  158.                 }
  159.                 */
  160.                 POINT_COLOR=BLUE;
  161.                 LCD_ShowString(140,200,"Designed By E=mc^2.0");
  162.                 //画矩形
  163.                 POINT_COLOR=RED;
  164.         LCD_DrawRectangle(64-1, 32-1, IMAGE_COLUMN+64, 32+IMAGE_ROW);
  165.                 //delay_ms(800);            
  166.          
  167. //===============================================================================//
  168. //                          办正事                              
  169. //===============================================================================//       
  170.         //Timerx_Init(5000,7199);//10Khz的计数频率,计数到5000为500ms  
  171.         //PWM_Input_Init(50000,96);       
  172.          //PWM0_INPUT_INIT(50000,960);         //测量频率越高,pcs要越小;测量频率越小,psc要越大,这样,精度才能跟上去
  173. //        void PWM0_INPUT_INIT(u16 arr,u16 psc)
  174. //       
  175.         chang_enable();
  176.     //hang_disable();
  177. //=============默认打开车载视频!!!==============
  178.         lcd_flag=1;
  179. //================默认速度=======================
  180.         pwmval=330;

  181.          //初始化触摸屏
  182.         POINT_COLOR=RED;//设置字体为蓝色          
  183.        
  184.         Touch_Init();
  185.        
  186.         Load_Drow_Dialog();
  187.         JTAG_Set(JTAG_SWD_DISABLE);       

  188.         while(1)
  189.         {                                  
  190. //如果速度发生了变化!!
  191. //LCD_ShowNum(156,130,TIM3->CCR1,5,16);//显示频率
  192. //LCD_ShowNum(156,150,TIM3->CCR2,5,16);//显示占空比
  193.         /*if(speed[4]!=)
  194.             {
  195.                 j=speed[0];                       
  196.                 speed[0]= speed[1];
  197.                 speed[1]= speed[2];
  198.                 speed[2]= speed[3];
  199.                 speed[3]= speed[4];
  200.                 speed[4]= speed[5];
  201.                 speed[5]= speed[6];
  202.                 speed[6]= speed[7];
  203.                 speed[7]= TIM3->CCR1;
  204.                 if(j<speed[1])
  205.                   j=speed[1];
  206.                 if(j<speed[2])
  207.                   j=speed[2];
  208.                 if(j<speed[3])
  209.                   j=speed[3];
  210.                 if(j<speed[4])
  211.                   j=speed[4];
  212.                 if(j<speed[5])
  213.                   j=speed[5];
  214.                 if(j<speed[6])
  215.                   j=speed[6];
  216.                 if(j<speed[7])
  217.                   j=speed[7];        
  218.                 }  */      
  219.   // delay_ms(10);
  220.    //if(dir)pwmval+=10;
  221.   // else pwmval-=10;

  222.   // if(pwmval>1000)dir=0;
  223.    //if(pwmval==0)dir=1;              
  224.   //DIAN_VAL=pwmval; //0---1000
  225.   //DUO_VAL=duoval;//1500---1.5ms        //
  226. //==========这个其实应该每隔一段时间执行一次1ms-2ms=========
  227.           dianji();  
  228. //===========是否一场数据???===========//  
  229.           if(flag_show == 1)                                                                      
  230.                 {
  231.                 flag_show = 0;                                                                   
  232.                 //LCD_ShowNum(156,128,speed_now,5,16);//显示车速                               
  233.                 LED1=!LED1;         //注意这个绿色灯的的频率//控制频率                  
  234.                                                                                 // 标志清零,等待下一场数据
  235.                 //uart(3);//把图像通过串口发回来
  236.                 lost_h = Imageprocess();//图像处理函数
  237.                 duoji(lost_h);
  238.        
  239.             //chang_enable();
  240.                 //===============打开接收==============//
  241.                 chang_flag=1;            
  242.                 //====================车载视频相关======================//
  243.                 if(lcd_flag==1)
  244.                         {
  245.                         LCD_pic();
  246.                         }
  247.                 }
  248.         //===================触摸屏被按下==================//         
  249.         if(Pen_Point.Key_Sta==Key_Down)
  250.                 {
  251.                         Pen_Int_Set(0);//关闭中断
  252.                         do
  253.                         {
  254.                                 Convert_Pos();
  255.                                 Pen_Point.Key_Sta=Key_Up;
  256.                                 //判断触摸屏位置
  257.                                 if(Pen_Point.X0>296&&Pen_Point.Y0<16)
  258.                                 {
  259.                                 Load_Drow_Dialog();//清除
  260.                                 LCD_LED=1;// 背光
  261.                                 lcd_flag=1;// 车载视频
  262.                                 }
  263.                                 //===
  264.                                 else if(Pen_Point.X0>296&&Pen_Point.Y0<32&&Pen_Point.Y0>16)
  265.                                 {
  266.                                 Load_Drow_Dialog();//清除
  267.                                 LCD_LED=0;//关闭背光
  268.                                 lcd_flag=0;//关闭车载视频
  269.                                 }
  270.                                 else if(Pen_Point.X0>270&&Pen_Point.X0<282&&Pen_Point.Y0>16*2&&Pen_Point.Y0<16*3)
  271.                                 {
  272.                                 pwmval++;  //==1
  273.                                  show_set();
  274.                                 }
  275.                                         else if(Pen_Point.X0>308&&Pen_Point.Y0>16*3&&Pen_Point.Y0<16*4)
  276.                                 {
  277.                                 pwmval--;  //==2
  278.                                  show_set();
  279.                                 }
  280.                                 /*        else if(Pen_Point.X0>270&&Pen_Point.X0<282&&Pen_Point.Y0>16*2&&Pen_Point.Y0<16*3)
  281.                                 {
  282.                                 pwmval++;        //==3
  283.                                  show_set();
  284.                                 }
  285.                                         else if(Pen_Point.X0>270&&Pen_Point.X0<282&&Pen_Point.Y0>16*2&&Pen_Point.Y0<16*3)
  286.                                 {
  287.                                 pwmval++;        //==4
  288.                                  show_set();
  289.                                 }
  290.                                         else if(Pen_Point.X0>270&&Pen_Point.X0<282&&Pen_Point.Y0>16*2&&Pen_Point.Y0<16*3)
  291.                                 {
  292.                                 pwmval++;  //==5
  293.                                  show_set();
  294.                                 }
  295.                                         else if(Pen_Point.X0>270&&Pen_Point.X0<282&&Pen_Point.Y0>16*2&&Pen_Point.Y0<16*3)
  296.                                 {
  297.                                 pwmval++;  //==6
  298.                                  show_set();
  299.                                 }*/
  300.                                 else
  301.                                 {
  302.                                         //Draw_Big_Point(Pen_Point.X0,Pen_Point.Y0);//画图            
  303.                                          LCD_DrawPoint(Pen_Point.X0,Pen_Point.Y0);
  304.                                         GPIOC->ODR|=1<<1;    //PC1 上拉          
  305.                                 }
  306.                         }while(PEN==0);//如果PEN一直有效,则一直执行
  307.                         Pen_Int_Set(1);//开启中断
  308.                 }
  309.         //else delay_ms(10);
  310.                 if(jz_flag==1)//则执行校准程序
  311.                 {
  312.                     jz_flag=0;
  313.                         LCD_Clear(WHITE);//清屏
  314.                     Touch_Adjust();  //屏幕校准
  315.                         Save_Adjdata();         
  316.                         Load_Drow_Dialog();
  317.                 }
  318.        
  319.          
  320.         }                                                                                            
  321. }

复制代码

所有资料51hei提供下载:
GAY03_V1.0.zip (257.26 KB, 下载次数: 124)


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

使用道具 举报

沙发
ID:330544 发表于 2018-7-13 13:31 | 只看该作者
全智能的还是遥控的呀
回复

使用道具 举报

板凳
ID:502693 发表于 2019-4-1 19:37 | 只看该作者
厉害了
回复

使用道具 举报

地板
ID:484435 发表于 2019-8-4 15:54 | 只看该作者
谢谢分享
回复

使用道具 举报

5#
ID:496635 发表于 2020-5-17 12:25 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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