基于stm32 的智能小車
單片機源程序如下:
- #include <stm32f10x_lib.h>
- #include "sys.h"
- #include "usart.h"
- #include "delay.h"
- #include "led.h"
- #include "key.h"
- #include "exti.h"
- #include "wdg.h"
- #include "timer.h"
- #include "lcd.h"
- #include "usmart.h"
- //===
- #include "adc.h"
- #include "dma.h"
- #include "24cxx.h"
- #include "flash.h"
- #include "touch.h"
- ////////////////////////////////////////////////////////////////////////////////////
- #include "Imageprocess.h"//圖像處理
- #include "car_crtl.h"//車子的控制
- //全局變量
- #include "world.h"
-
- //全局變量
- int pinbi;
- int data00; //速度
- char jz_flag;
- char flag_show; // 一場數據接收完標志
- unsigned int ang; //轉角
- int m; // 記錄行中斷次數
- int hang; // 存數組行標
- //==== 全局數組定義 ==========================
- int before[IMAGE_ROW]; // 上一場數據緩存數組
- signed int Line_center[IMAGE_ROW+1]; // 記錄黑線中心數組
- //unsigned char uca_Buffer1[IMAGE_ROW][IMAGE_COLUMN]; // 數據數組//90,136
- unsigned char uca_pic[IMAGE_ROW*IMAGE_COLUMN]; // 數據數組//90,136
- unsigned char *p_addr_Buffer1[IMAGE_ROW]; // 等同于數據數組
- unsigned char *p_pic; // 等同于數據數組
- char chang_flag,lcd_flag;
- int speed_0,speed_now;
- int pwmval,duoval;
- void show_set(void)
- {
- LCD_ShowString(272,16*2,"- +");
- LCD_ShowNum(280,16*2,pwmval,4,16);//顯示速度
- LCD_ShowString(272,16*3,"- +");
- LCD_ShowNum(280,16*3,pwmval*2,4,16);
- LCD_ShowString(272,16*4,"- +");
- LCD_ShowNum(280,16*4,pwmval*3,4,16);
- LCD_ShowString(272,16*5,"- +");
- LCD_ShowNum(280,16*5,pwmval*4,4,16);
- LCD_ShowString(272,16*6,"- +");
- LCD_ShowNum(280,16*6,pwmval*5,4,16);
- LCD_ShowString(272,16*7,"- +");
- LCD_ShowNum(280,16*7,pwmval*6,4,16);
- }
- void Load_Drow_Dialog(void)
- {
- LCD_Clear(WHITE);//清屏
- POINT_COLOR=BLUE;//設置字體為藍色
- LCD_ShowString(296,0,"RST");//顯示清屏區域
- LCD_ShowString(296,16,"SET");//顯示清屏區域
-
- //畫矩形
- POINT_COLOR=RED;
- LCD_DrawRectangle(64-1, 32-1, IMAGE_COLUMN+64, 32+IMAGE_ROW);
- show_set();
-
-
- }
- //==============================================
- void GAY03_init()
- {
- Stm32_Clock_Init(12);//系統時鐘設置
- delay_init(96); //延時初始化
- uart_init(96,38400); //串口1初始化
- LED_Init(); //燈的初始化
- LCD_Init(); //彩色屏幕初始化
- usmart_dev.init(96); //初始化USMART//本來是100ms中斷掃描
- EXTIX_Init(); //行場中斷初始化
- //KEY_Init(); //PA0設置成輸入,采集二值化數據 (上一句已經搞定)
- //Timerx_Init(5000,9599); //Timerx_Init(5000,7199);//10Khz 的計數頻率,計數到 5000 為500ms
- //PWM_Init(900,0); //不分頻。PWM 頻率=72000/900=8Khz
- //====電機
- PWM11_Init(1000,31); //PA8 95---1K
- //====舵機 //60HZ
- PWM22_Init(16666,95); //PWM_Init(900,0); //不分頻。PWM 頻率=72000/900=8Khz
- DIAN_VAL=0; //0---1000
- DUO_VAL=straight;//1500---1.5ms //
- pwmval=0;
- duoval=straight;
-
- }
- //串口,狀態設置函數
- void sset(u16 a,u16 b)
- {
- if(a==0)
- pwmval=b; //更改電機速度
- else if(a==1)
- duoval=b; //更改舵機角度
- else if(a==2)
- lcd_flag=b; //車載視頻
- else if(a==3)
- pwmval=b; //
- else if(a==4)
- pwmval=b; //
- else if(a==5)
- pwmval=b; //
- else if(a==6)
- pwmval=b; //
- else if(a==99)
- {
- jz_flag=1;
- }
- }
- //函數參數調用測試函數
- void test_fun(void(*ledset)(u8),u8 sta)
- {
- ledset(sta);
- }
- //Mini STM32開發板擴展實驗9
- //USMART應用 實驗
- //正點原子@ALIENTEK
- //技術論壇:www.openedv.com
- int main(void)
- {
-
- signed int i;
- char lost_h;
- //unsigned int j;
- //unsigned int speed[8];
- //unsigned int j;
- //u16 led0pwmval=0;
- // u8 dir=1;
- //u8 dir=1;
-
- //=====================================================================//
- GAY03_init(); //超頻到96M,串口工作在38400波特率,初始化了LED和液晶
- chang_disable();
- hang_disable();
- for(i = 0 ; i < IMAGE_ROW ; i++) // 圖像采集數組賦地址
- p_addr_Buffer1[i] = &uca_pic[i*IMAGE_COLUMN];
- //p_addr_Buffer1[0]=&uca_Buffer1[i][0];
- //p_pic=uca_Buffer1;//取圖像首地址!!!!
- flag_show=0;
- //===============================================================================//
- // 初始化結束開始辦正事
- //===============================================================================//
- POINT_COLOR=RED;
- LED0=!LED0;
- //delay_ms(500);
- //開機畫面
- /*for(i=68;i>0;i=i-10)
- {
- //LCD_Clear(WHITE);
- LCD_Init();
- LCD_chinese(20,i,0); LCD_chinese(120,i,1); LCD_chinese(220,i,2);
- LCD_chinese(20,i+100,3); LCD_chinese(120,i+100,4); LCD_chinese(220,i+100,5);
- delay_ms(80);
- }
- */
- POINT_COLOR=BLUE;
- LCD_ShowString(140,200,"Designed By E=mc^2.0");
- //畫矩形
- POINT_COLOR=RED;
- LCD_DrawRectangle(64-1, 32-1, IMAGE_COLUMN+64, 32+IMAGE_ROW);
- //delay_ms(800);
-
- //===============================================================================//
- // 辦正事
- //===============================================================================//
- //Timerx_Init(5000,7199);//10Khz的計數頻率,計數到5000為500ms
- //PWM_Input_Init(50000,96);
- //PWM0_INPUT_INIT(50000,960); //測量頻率越高,pcs要越小;測量頻率越小,psc要越大,這樣,精度才能跟上去
- // void PWM0_INPUT_INIT(u16 arr,u16 psc)
- //
- chang_enable();
- //hang_disable();
- //=============默認打開車載視頻!!!==============
- lcd_flag=1;
- //================默認速度=======================
- pwmval=330;
- //初始化觸摸屏
- POINT_COLOR=RED;//設置字體為藍色
-
- Touch_Init();
-
- Load_Drow_Dialog();
- JTAG_Set(JTAG_SWD_DISABLE);
- while(1)
- {
- //如果速度發生了變化!!
- //LCD_ShowNum(156,130,TIM3->CCR1,5,16);//顯示頻率
- //LCD_ShowNum(156,150,TIM3->CCR2,5,16);//顯示占空比
- /*if(speed[4]!=)
- {
- j=speed[0];
- speed[0]= speed[1];
- speed[1]= speed[2];
- speed[2]= speed[3];
- speed[3]= speed[4];
- speed[4]= speed[5];
- speed[5]= speed[6];
- speed[6]= speed[7];
- speed[7]= TIM3->CCR1;
- if(j<speed[1])
- j=speed[1];
- if(j<speed[2])
- j=speed[2];
- if(j<speed[3])
- j=speed[3];
- if(j<speed[4])
- j=speed[4];
- if(j<speed[5])
- j=speed[5];
- if(j<speed[6])
- j=speed[6];
- if(j<speed[7])
- j=speed[7];
- } */
- // delay_ms(10);
- //if(dir)pwmval+=10;
- // else pwmval-=10;
-
- // if(pwmval>1000)dir=0;
- //if(pwmval==0)dir=1;
- //DIAN_VAL=pwmval; //0---1000
- //DUO_VAL=duoval;//1500---1.5ms //
- //==========這個其實應該每隔一段時間執行一次1ms-2ms=========
- dianji();
- //===========是否一場數據???===========//
- if(flag_show == 1)
- {
- flag_show = 0;
- //LCD_ShowNum(156,128,speed_now,5,16);//顯示車速
- LED1=!LED1; //注意這個綠色燈的的頻率//控制頻率
- // 標志清零,等待下一場數據
- //uart(3);//把圖像通過串口發回來
- lost_h = Imageprocess();//圖像處理函數
- duoji(lost_h);
-
- //chang_enable();
- //===============打開接收==============//
- chang_flag=1;
- //====================車載視頻相關======================//
- if(lcd_flag==1)
- {
- LCD_pic();
- }
- }
- //===================觸摸屏被按下==================//
- if(Pen_Point.Key_Sta==Key_Down)
- {
- Pen_Int_Set(0);//關閉中斷
- do
- {
- Convert_Pos();
- Pen_Point.Key_Sta=Key_Up;
- //判斷觸摸屏位置
- if(Pen_Point.X0>296&&Pen_Point.Y0<16)
- {
- Load_Drow_Dialog();//清除
- LCD_LED=1;// 背光
- lcd_flag=1;// 車載視頻
- }
- //===
- else if(Pen_Point.X0>296&&Pen_Point.Y0<32&&Pen_Point.Y0>16)
- {
- Load_Drow_Dialog();//清除
- LCD_LED=0;//關閉背光
- lcd_flag=0;//關閉車載視頻
- }
- else if(Pen_Point.X0>270&&Pen_Point.X0<282&&Pen_Point.Y0>16*2&&Pen_Point.Y0<16*3)
- {
- pwmval++; //==1
- show_set();
- }
- else if(Pen_Point.X0>308&&Pen_Point.Y0>16*3&&Pen_Point.Y0<16*4)
- {
- pwmval--; //==2
- show_set();
- }
- /* else if(Pen_Point.X0>270&&Pen_Point.X0<282&&Pen_Point.Y0>16*2&&Pen_Point.Y0<16*3)
- {
- pwmval++; //==3
- show_set();
- }
- else if(Pen_Point.X0>270&&Pen_Point.X0<282&&Pen_Point.Y0>16*2&&Pen_Point.Y0<16*3)
- {
- pwmval++; //==4
- show_set();
- }
- else if(Pen_Point.X0>270&&Pen_Point.X0<282&&Pen_Point.Y0>16*2&&Pen_Point.Y0<16*3)
- {
- pwmval++; //==5
- show_set();
- }
- else if(Pen_Point.X0>270&&Pen_Point.X0<282&&Pen_Point.Y0>16*2&&Pen_Point.Y0<16*3)
- {
- pwmval++; //==6
- show_set();
- }*/
- else
- {
- //Draw_Big_Point(Pen_Point.X0,Pen_Point.Y0);//畫圖
- LCD_DrawPoint(Pen_Point.X0,Pen_Point.Y0);
- GPIOC->ODR|=1<<1; //PC1 上拉
- }
- }while(PEN==0);//如果PEN一直有效,則一直執行
- Pen_Int_Set(1);//開啟中斷
- }
- //else delay_ms(10);
- if(jz_flag==1)//則執行校準程序
- {
- jz_flag=0;
- LCD_Clear(WHITE);//清屏
- Touch_Adjust(); //屏幕校準
- Save_Adjdata();
- Load_Drow_Dialog();
- }
-
-
- }
- }
復制代碼
所有資料51hei提供下載:
GAY03_V1.0.zip
(257.26 KB, 下載次數: 124)
2018-3-15 10:10 上傳
點擊文件名下載附件
小車程序
|