2023年智能电子产品设计资料(模拟工业传送带物品识别系统)

赛题部分:赛题最后会上传到资源里。
功能介绍:
静态识别模式:

电视机上静止图片方式播放,连续播放4幅图片,每幅图片停留 8 秒;

低速识别模式:

电视机上低速播放(5~15cm/s)播放连续视频,播放 14s;
电视机上高速播放(15~45cm/s)播放连续视频,播放 14s;
系统检测到待测物品时,先以语音播报提示,然后用激光笔照射检测到的物品。
物品检测系统在工作中,每当发现符合特征条件的物品时,通过RS-485 通讯接口,向运行维护系统发送一条报文。
在检测工作结束时,将在不同检测难度条件下检测,到的物品统计数据发送一组数据给运行维护系统。运维管理由口袋机等触摸屏实现,触摸屏已配备软件,可显示接收到的数据。述检测结果,也需要在系统内的 LCD 显示器上显示,显示信息满屏后自动向上滚动;

部分代码展示,有需要资料的可以私信,评论区私信就行
int main(void)
{
	HAL_Init();  //HAL库初始化
	SystemClock_Config();  //时钟初始化
	MX_GPIO_Init();  //GPIO初始化
	Led_Init();  //口袋机LED灯初始化
	Beep_Init();  //口袋机蜂鸣器初始化
	Touch_Key_Init();  //口袋机触摸按键初始化
	HAL_Delay(2000);
	if(Touch_Key_Value == TOUCH_KEY_C) //如果检测到按键“C”按下
	{
		Touch_Key_Value = TOUCH_KEY_NONE;
		HAL_Delay(2000);
		if(Touch_Key_Value == TOUCH_KEY_C) //延时两秒之后还能检测到按键“C”按下
		{
			Touch_Key_Value = TOUCH_KEY_NONE;

			Beep_Control(BEEP_ON);
			HAL_Delay(10);
			Beep_Control(BEEP_OFF);
			HAL_Delay(200);
			Beep_Control(BEEP_ON);
			HAL_Delay(10);
			Beep_Control(BEEP_OFF);
			MX_DMA_Init();  //DMA初始化
			MX_ADC1_Init(); //ADC1初始化
  			MX_TIM8_Init(); //定时器8初始化,用于触发ADC采样 800k
			MX_SPI1_Init();  //SPI1初始化(口袋机lcd屏使用)
			Lcd_Pin_Init();  //口袋机lcd屏接口初始化
			Lcd_Init();  //口袋机lcd屏初始化

			MX_USART1_UART_Init();
			
			HAL_Delay(100);
			Lcd_Clear(BLACK); //lcd清屏

			adc_value = malloc(1024*sizeof(uint32_t)); //申请内存,用于存放ADC采集的数据
			
			HAL_ADC_Start_DMA(&hadc1, adc_value, 1024); //ADC1打开DMA接收,一次传输1024个数据
			HAL_TIM_Base_Start(&htim8); //打开定时器8,计数溢出时会触发ADC采样 //800K

			arm_cfft_radix4_init_f32(&scfft, 1024, 0, 1); //初始化scfft结构体,设定fft相关参数

			while (1)
			{
				Osci_Show();//模拟示波器
			}
		}
	}MX_DMA_Init();  //DMA初始化
	MX_SPI1_Init();  //SPI1初始化(口袋机lcd屏使用)
	MX_USART1_UART_Init();  //串口1初始化(连接AI识别模组使用)
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
	__HAL_UART_CLEAR_IDLEFLAG(&huart1);
	HAL_UART_Receive_DMA(&huart1, Vision_Receive.receive_buffer, UART_BUFFER_SIZE); //串口1使用DMA接收,开启了DMA接收完成中断和串口空闲中断
	MX_UART4_Init();  //串口4初始化(连接语音模块)
	MAX485_Init();  //UART转485芯片-MAX485初始化(连接迪文屏)
  	MX_UART5_Init();  //串口5初始化(通过MAX485连接迪文屏)
	__HAL_UART_ENABLE_IT(&huart5, UART_IT_IDLE);
	__HAL_UART_CLEAR_IDLEFLAG(&huart5);
	HAL_UART_Receive_IT(&huart5, DiWenLcd_Receive.receive_buffer, 1);  //串口5开启了数据接收中断和空闲中断接收数据
	uart5_receive_num = 1; //移动数据放入串口5接收缓冲区的位置。
	MX_TIM4_Init();  //定时器4初始化,控制云台Y轴步进电机
	MX_TIM3_Init();  //定时器3初始化,控制红外头模拟遥控信号 26us
	MX_TIM2_Init();  //定时器2初始化,控制云台X轴步进电机 100us

	Led_Init();  //口袋机LED灯初始化
	Beep_Init();  //口袋机蜂鸣器初始化
	Touch_Key_Init();  //口袋机触摸按键初始化
	Lcd_Pin_Init();  //口袋机lcd屏接口初始化
	Lcd_Init();  //口袋机lcd屏初始化

	Power_Init();  //外接功率电源模块初始化
	Matrix_Key_Init();  //外接4*5按键初始化
	Tripod_Init();  //云台初始化
	HAL_GPIO_WritePin(Tripod_X_EN.GPIOx, Tripod_X_EN.GPIO_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(Tripod_Y_EN.GPIOx, Tripod_Y_EN.GPIO_Pin, GPIO_PIN_SET);
	Relay_Init();  //外接继电器初始化(控制激光笔通断)
	Voice_Init();  //语音模块初始化
	Infared_Init();  //红外发射头初始化
	DiWenLcd_Init();  //外接迪文屏初始化

	Beep_Control(BEEP_ON);
	HAL_Delay(10);
	Beep_Control(BEEP_OFF);  //“滴”一声,提示系统初始化完成

	LCD_BACKGROUND = RED;
	Lcd_Clear(LCD_BACKGROUND);
	HAL_Delay(10);  //LCD屏刷屏

//	Power_Control(POWER_ON);  //打开外界功率电源输出(老款)
//	HAL_Delay(3000);  //等待功率输出稳定
	Voice_Play((uint8_t)DEVICE_STARTED);  //语音播报“设备已启动”
	DiWenLcd_Show_Page(2);  //迪文屏翻到第二页
	HAL_Delay(1000);
    Lcd_ShowZHChar(0, 0, 0, GREEN);
    Lcd_ShowZHChar(16, 0, 1, BROWN);
    Lcd_ShowZHChar(32, 0, 2, BLUE);
    Lcd_ShowString(48, 0, ": 666", SHOW_SIZE_16, BLACK);
	DiWenLcd_Printf("正在复位");
	Lcd_printf("self resetting");  

	Tripod_X_Go_Mechzero();  //云台X轴机械归零
	Tripod_Y_Go_Mechzero();  //云台Y轴机械归零

	Voice_Play((uint8_t)DEVICE_CHECKED);  //语音播报“自检完成”

	DiWenLcd_Printf("复位完成");
	Lcd_printf("Reset complete");
	Relay_Control(RELAY_ON);  //打开激光笔

	Run_Mode_Init();  //状态机初始化运行模式

	Vision_Send_Cmd(select_color, select_shape);//AI识别模组检测的颜色形状
	
	DiWenLcd_Show_RunState(130, "%s%s", ColorStrZh[select_color-1], ShapeStrZh[select_shape-1]);
	HAL_Delay(10);
	DiWenLcd_Show_RunState(129, "停止检测");

	Matrix_Key_Value = MATRIX_KEY_NONE;  //清除矩阵按键键值
	Touch_Key_Value = TOUCH_KEY_NONE;  //清除触摸按键键值
	run_time = 0;

	while(!manual_claib_finish)  //等待手动校准完成
	{
		if(main_1ms_flag == true)  //控制运行时序1ms一次
		{
			Logic_Tripod_Calib();  //手动校准云台和摄像头
			main_1ms_flag = false;
		}
	}

	Tripod_X_Coord(684);
  Tripod_Y_Coord(Y_OFFSET);
	Beep_Control(BEEP_ON);
	HAL_Delay(10);
	Beep_Control(BEEP_OFF);  //“滴”一声提示设备开始运行
	
	//物品识别逻辑
	while (1)
	{
		Logic_Matrix_Key();  //矩阵按键逻辑处理
  	Logic_Touch_Key();  //触摸按键逻辑处理
  	Logic_Tripod_Calib();//触摸按键云台校准相关逻辑
		
		if(main_1ms_flag == true)  //控制运行时序1ms一次
		{
			static uint16_t num;

			Run_Mode_Now->mode_run();  //运行当前模式

			num++;
			if(num >= 200)
			{
				num = 0;
				HAL_GPIO_TogglePin(LED1.GPIOx, LED1.GPIO_Pin);  //呼吸灯指示前台程序运行正常
			}

			main_1ms_flag = false;
		}

		if(run_time % 1000 == 0) //每1秒向迪文屏发送一次运行时间计数
		{
			DiWenLcd_Cmd_Data(0x6000, run_time/1000);
			run_time++;
		}

		if(Run_Mode_Now == &Run_Mode_Stop) //暂停时才能翻页
		{
			uint16_t i=0;
			uint8_t lcd_rece_data;
			
			lcd_rece_data = DiWen_Dat_Explan(); //解析迪文屏发出的数据
			if(lcd_rece_data == 1) //迪文屏按了“上一页”键
			{
				if(mUserUartLcdData.cur_page > 0)
				{
					mUserUartLcdData.cur_page--; //显示存储的上一页信息
					for(i=0; i<DIWEN_SHOW_LINE; i++)
					{
						DiWenLcd_Send_Data(i, mUserUartLcdData.line_str[mUserUartLcdData.cur_page*17+i], 32);
						HAL_Delay(10);
					}
				}
				if(mUserLcdData.cur_page > 0)
                {
                    mUserLcdData.cur_page--; //显示存储的上一页信息
                    Lcd_Clear_Print(LCD_BACKGROUND);
                    for(i=0; i<10; i++)
                    {
                        Lcd_ShowString(0, (i+4)*16, mUserLcdData.line_str[mUserLcdData.cur_page*10+i], SHOW_SIZE_16, LCD_TYPEFACE);
                        HAL_Delay(10);
                    }
                }
			}
			else if(lcd_rece_data == 2) //迪文屏按了“下一页”键
			{
				if(mUserUartLcdData.cur_page < mUserUartLcdData.mem_page)
				{
					mUserUartLcdData.cur_page++; //显示存储的下一页信息
					for(i=0; i<17; i++)
					{
						DiWenLcd_Send_Data(i, mUserUartLcdData.line_str[mUserUartLcdData.cur_page*17+i], 32);
						HAL_Delay(10);
					}
				}
				if(mUserLcdData.cur_page < mUserLcdData.mem_page)
                {
                    mUserLcdData.cur_page++; //显示存储的下一页信息
                    Lcd_Clear_Print(LCD_BACKGROUND);
                    for(i=0; i<10; i++)
                    {
                        Lcd_ShowString(0, (i+4)*16, mUserLcdData.line_str[mUserLcdData.cur_page*10+i], SHOW_SIZE_16, LCD_TYPEFACE);
                        HAL_Delay(10);
                    }
                }
			}
		}
	}
}

有需要资料的可以私信

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执着的着

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值