0.连线

LD3302 5v(stm32电流不行,需额外供电) GND RXD TXD
stm32     PB10 PB11

1.安装keil4

地址

报错

 'C:\ Kei\ TOOLS.INI' does not contain a valid tool path for 'C51'.
 The selected device has no corresponding toolchain installed.
 Either use'Project-Select Device'to change the device for the project, or install
 the missing toolchain.

解决办法:https://blog.csdn.net/limingliang_/article/details/80851656

2.修改代码

main.c

void     User_handle(uint8 dat) 口令识别后提示收到

void 	User_handle(uint8 dat)
{
     //UARTSendByte(dat);//串口识别码(十六进制)
		 if(0==dat)
		 {
		  	G0_flag=ENABLE;
			LED=0;
			PrintCom("收到\r\n"); /*text.....*/
		 }
		 else if(ENABLE==G0_flag)
		 {	
		 		G0_flag=DISABLE;
				LED=1;
			 switch(dat)		   /*对结果执行相关操作,客户可删除Printcom 串口输出语句替换为其他需要控制的代码*/
			  {
				  case 1:			/*命令“测试”*/
						PrintCom("“代码测试”命令识别成功\r\n"); /*text.....*/
													 break;
					case 2:	 /*命令“全开”*/
						PrintCom("“开发板验证”命令识别成功\r\n"); /*text.....*/
													 break;
					case 3:		/*命令“复位”*/				
						PrintCom("“开灯”命令识别成功\r\n"); /*text.....*/
													break;
					case 4:		/*命令“复位”*/				
						PrintCom("“关灯”命令识别成功\r\n"); /*text.....*/
													break;
					case 5:		/*命令“复位”*/				
						PrintCom("“北京”命令识别成功\r\n"); /*text.....*/
													break;
					case 6:		/*命令“复位”*/				
						PrintCom("“上海”命令识别成功\r\n"); /*text.....*/
													break;
					case 7:		/*命令“复位”*/				
						PrintCom("“广州”命令识别成功\r\n"); /*text.....*/
													break;																											
							default:PrintCom("请重新识别发口令\r\n"); /*text.....*/break;
				}	
			}	
			else 	
			{
				PrintCom("请说出一级口令\r\n"); /*text.....*/	
			}
}	 

E:\app\my\LDV7\code\LDChip.c

uint8 LD_AsrAddFixed() 关键字输入

uint8 LD_AsrAddFixed()
{
	uint8 k, flag;
	uint8 nAsrAddLength;
	#define DATE_A 9   /*数组二维数值*/
	#define DATE_B 20		/*数组一维数值*/
	uint8 code sRecog[DATE_A][DATE_B] = {
																				"xiao yang",\		
																				"kai fa ban yan zheng",\
																				 "dai ma ce shi",\
																				 "kai deng",\
																				 "guan deng",\
																				 "bei jing",\
																				 "shang hai",\
																				 "guang zhou"
																			};	/*添加关键词,用户修改*/
	uint8 code pCode[DATE_A] = { 0, 1,2,3,4,5,6,7,8
														 };	/*添加识别码,用户修改*/	
	flag = 1;
	for (k=0; k<DATE_A; k++)
	{
			
		if(LD_Check_ASRBusyFlag_b2() == 0)
		{
			flag = 0;
			break;
		}
		
		LD_WriteReg(0xc1, pCode[k] );
		LD_WriteReg(0xc3, 0 );
		LD_WriteReg(0x08, 0x04);
		delay(1);
		LD_WriteReg(0x08, 0x00);
		delay(1);

		for (nAsrAddLength=0; nAsrAddLength<DATE_B; nAsrAddLength++)
		{
			if (sRecog[k][nAsrAddLength] == 0)
				break;
			LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);
		}
		LD_WriteReg(0xb9, nAsrAddLength);
		LD_WriteReg(0xb2, 0xff);
		LD_WriteReg(0x37, 0x04);
	}
    return flag;
}

3.烧录固件

编译后自动生成到\obj\V07A.hex文件

下载工具使用stc-isp-15xx-v6.86I.exe

单片机选择STC11L32XE

下载时候拿掉gnd,在连接上就烧录就去了

 

4.代码实现

Ld3320的main.c的PrintCom打印的可以用stm32串口接收

D:\stm32\c8t6-继电器\USER\main.c

 /*-----------------------------------------------------*/
/*                                                     */
/*            程序main函数,入口函数源文件              */
/*                                                     */
/*-----------------------------------------------------*/

#include "stm32f10x.h"   //包含需要的头文件
#include "delay.h"       //包含需要的头文件
#include "timer2.h"      //包含需要的头文件
#include "timer3.h"      //包含需要的头文件
#include "timer4.h"      //包含需要的头文件
#include "led.h"	     //包含需要的头文件 LED                                                  
#include "ji.h"	
#include "USART.h"

//变量声明
u8 RXBUF[20];       //串口存储数组
u8 RXOVER=0;        //串口接收标志位
u8 RXCOUNT=0;       //串口计数变量  
u8 i;               //清空数组变量



//函数声明
void RCC_Configuration(void);
void USART_Deal(void);

int main(void) 
{	
	RCC_Configuration();
	Delay_Init();          //延时功能初始化              
	//Usart1_Init(9600);     //串口1功能初始化,波特率9600,默认PA9,PA10选9600
	//Usart2_Init(115200);   //串口2功能初始化,波特率115200	
	TIM4_Init(500,7200);   //TIM4初始化,定时时间 500*7200*1000/72000000 = 50ms
	JI_Init();
	USART3_Init(9600);	
	
		while(1)
		{		
			USART_Deal();
			
		}
	}				

	//外设时钟使能函数
void RCC_Configuration(void)
{
	/* GPIOx enable */
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

	/* USART2 enable */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
}

//串口处理函数
void USART_Deal(void)
{
	
		if(RXOVER)
		{
			RXOVER = 0;    //清除接收标志位
			switch(RXBUF[0]-48)
			{
				case   3:JI_On();   //点亮灯
								 break;
				
				case   4:JI_Off(); //熄灭灯
								 break;	
				default: break;			
			}
			USART3_SendString(RXBUF);    //发送给pc机上面打印显示			
			for(i=0;i<20;i++)            //将已接收数据的数组清空:共20个字符长度
			{
				 RXBUF[i] = 0;          	 //重置数据缓存区
			}
			USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//始能串口接收 
		}
}

D:\stm32\c8t6-继电器\HARDWARE\scr\usart.c

#include "USART.h"
/*
PB10   :TXD
PB11   : RXD
*/

//串口IO初始化函数
void USART3_Init(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;         //IO端口的初始化
	USART_InitTypeDef USART_InitStructure;			 //串口的初始化
	NVIC_InitTypeDef NVIC_InitStructure;         //使能中断接收
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能IO端口的时钟
  	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能串口的时钟
	
	//发送
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;  //发送引脚
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	//接收
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_11;  //接收引脚
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);

	USART_InitStructure.USART_BaudRate = bound;    //设置传输的波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;  //设置传输一帧数据的数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;       //一位停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;					 //无奇偶校验位
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //能使接收的发送
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //无硬件流控制
	USART_Init(USART3,&USART_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);          //优先级分组
	NVIC_InitStructure.NVIC_IRQChannel= USART3_IRQn;         //开启串口3的中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0; //抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //响应优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	

	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); //使能串口接收
  	USART_Cmd(USART3,ENABLE);               //使能串口3
	
}

/*
函数名:USART3串口发送函数
功能:  发送数据
入口参数:发送的字符
*/
void USART3_SendString(u8 *str)
{
		u8 index=0;
	  do
		{
					USART_SendData(USART3,str[index]);  //逐一的发送数组中的内容
					while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET);  //判断是否发送完 发完为高电平
					index++;
		}
    while(str[index] != 0);   //检查字符串结束标志
}


/*
函数名:USART3中断服务函数
功能:  接收数据
注意:接收数据长度可调:RXCOUNT
*/
void USART3_IRQHandler(void)
{
	u8 temp;
  if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
  {
		USART_ClearITPendingBit(USART3,USART_IT_RXNE);
		temp = USART_ReceiveData(USART3);
		if(temp == '\n' || RXCOUNT == 20)   //判断是否接收到一个完整字符
		{
			RXCOUNT = 0;
			RXOVER =1;    //接收数据完成标志位置1
			USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);//失能串口接收中断标志	
		}
		else
		{
			RXBUF[RXCOUNT] = temp;   //依次存放到数组中
			RXCOUNT++;		           //字符长度变化
		}
	}
}

D:\stm32\c8t6-继电器\HARDWARE\inc\USART.h 

#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"

//变量引用
extern u8 RXBUF[20];
extern u8 RXOVER;
extern u8 RXCOUNT;

void USART3_Init(u32 bound);
void USART3_SendString(u8 *str);
	
#endif