|
环境介绍:硬件部分有LD3320语音识别模块+STC11L56XE+51单片机开发板(普中51-单核-A2)。语音识别模块的程序已经写好了(见下部分),每次输入语音信号后,LD3320模块对应输出口输出一个高电平信号,几十毫秒后,再输出低电平信号(如:我说“开灯”,LD3320将IO口P1.0输出高电平,几十毫秒后再输出低电平,LD3320的P1.0接入51的P2.0);LD3320的P1.0~P1.5和51的P2.0~P2.5已经通过杜邦线连接,51的P2.6口为LED高电平输入口,51的P1.0为风扇的驱动口(相关驱动程序已经写好)。
整个项目的目的是:通过语音识别的方式,控制LED灯开灯(低亮度),高亮度,关灯;控制直流电机开风扇(低速),高速度,关风扇。
问题1:现在的情况是,我输入“亮一点”指令后,LED确实是亮度高的那档,然后输入“开灯”指令后,LED确实是低亮度那档,但是如果我先输入“开灯”指令,LED能低亮度运行,后输入“亮一点”指令后,LED无法到高亮度那档(电机的情况通LED)。
问题2:为什么我输入“关灯”或“关风扇”指令后,LED总会有一点点亮度,电机还会有很微小的转动。
各位老师帮帮孩子吧,一直没想到问题在哪里,如有描述不清的地方,我都会尽快回复的,谢谢各位。
语音识别模块部分程序:
- 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 CODE_DMCS:
- PrintCom("“开灯”命令识别成功\r\n"); /*text.....*/
- PrintCom("主人,已打开灯\r\n"); /*text.....*/
- P10=1;delay(200);P10=0;
- break;
- case CODE_KFBYZ:
- PrintCom("“亮一点”命令识别成功\r\n"); /*text.....*/
- PrintCom("主人,灯亮度已经变高\r\n"); /*text.....*/
- P11=1;delay(200);P11=0;
- break;
- case CODE_KD:
- PrintCom("“关灯”命令识别成功\r\n"); /*text.....*/
- PrintCom("主人,已关闭LED\r\n"); /*text.....*/
- P12=1;delay(200);P12=0;
- break;
- case CODE_GD:
- PrintCom("“开风扇”命令识别成功\r\n"); /*text.....*/
- PrintCom("主人,已打开风扇\r\n"); /*text.....*/
- P13=1;delay(200);P13=0;
- break;
- case CODE_BJ:
- PrintCom("“快一点”命令识别成功\r\n"); /*text.....*/
- PrintCom("主人,风扇转速已经变高\r\n"); /*text.....*/
- P14=1;delay(200);P14=0;
- break;
- case CODE_SH:
- PrintCom("“关风扇”命令识别成功\r\n"); /*text.....*/
- PrintCom("主人,已关闭风扇\r\n"); /*text.....*/
- P15=1;delay(200);P15=0;
- break;
- case CODE_GZ:
- PrintCom("“晚安”命令识别成功\r\n"); /*text.....*/
- PrintCom("晚安,主人\r\n"); /*text.....*/
- break;
- default:PrintCom("请重新识别发口令\r\n"); /*text.....*/
- break;
- }
- }
- else
- {
- PrintCom("请说出一级口令\r\n"); /*text.....*/
- }
- }
复制代码
51单片机代码如下:
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- #include<intrins.h> //因为要用到左右移函数,所以加入这个头文件
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- sbit led1 = P2^0; //LED标志位1,开启LED和低亮度
- sbit led2 = P2^1; //LED标志位2,高亮度
- sbit led3 = P2^2; //LED标志位3,关闭LED
- sbit fengshan1 = P2^3; //风扇标志位1,开启风扇和低速度
- sbit fengshan2 = P2^4; //风扇标志位2,高速度
- sbit fengshan3 = P2^5; //风扇标志位3,关闭风扇
- sbit led = P2^6;//LED驱动位
- sbit fengshan = P1^0; //风扇驱动位
- u16 Counter,Compare1,Compare2; //计数值和比较值,用于输出PWM
- u16 led1flag,led2flag,led3flag;
- u16 fengshan1flag,fengshan2flag,fengshan3flag;
- void delay10ms(void)
- {
- unsigned char i,j,k;
- for(i=5;i>0;i--)
- for(j=4;j>0;j--)
- for(k=248;k>0;k--);
- }
- void LED()
- {
- if(led1 == 1) {led1flag = 1;}
- if(led2 == 1) {led2flag = 1;}
- if(led3 == 1) {led3flag = 1;}
-
- if(led1flag == 1) {Compare1 = 5;led2flag = 0;led3flag = 0;}
- if(led2flag == 1) {Compare1 = 100;led1flag = 0;led3flag = 0;}
- if(led3flag == 1) {Compare1 = 0;led1flag = 0;led2flag = 0;}
-
- }
- void FS()
- {
- if(fengshan1 == 1) {fengshan1flag = 1;}
- if(fengshan2 == 1) {fengshan2flag = 1;}
- if(fengshan3 == 1) {fengshan3flag = 1;}
- if(fengshan1flag == 1) {Compare2 = 40;fengshan2flag = 0;fengshan3flag = 0;}
- if(fengshan2flag == 1) {Compare2 = 100;fengshan1flag = 0;fengshan3flag = 0;}
- if(fengshan3flag == 1) {Compare2 = 0;fengshan1flag = 0;fengshan2flag = 0;}
- }
- void Timer0_Init(void)
- {
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
-
- TH0 = 0xFF; //设置定时初始值 高八位低八位0xFFA4 组成 100us
- TL0 = 0x9C; //设置定时初始值
-
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0=1; //允许定时器T0中断
- EA=1; //开启总中断
- PT0=0; //优先级为低
- }
- void main()
- {
- Timer0_Init(); //定时器初始化
- P2 = 0;//P2.0-P2.7初始化
- fengshan = 0;
- while(1)
- {
- LED();
- FS();
- }
- }
- void Timer0() interrupt 1 //进入定时器中断
- {
- TH0 = 0xFF;
- TL0 = 0x9C; //重新赋初始值
-
- Counter++; //计数值自加
- Counter%=100; //计数值变化范围限制在0~99
-
- if(led1flag == 1 || led2flag == 1 || led3flag ==1)
- {
- if(Counter < Compare1) //计数值小于比较值
- {
- led = 1;
- }
- else //计数值大于比较值
- {
- led = 0;
- }
- }
- if(fengshan1flag == 1||fengshan2flag == 1||fengshan3flag == 1)
- {
- if(Counter < Compare2) //计数值小于比较值
- {
- fengshan = 1;
- }
- else //计数值大于比较值
- {
- fengshan = 0;
- }
- }
- }
复制代码
|
|