|
環境介紹:硬件部分有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;
- }
- }
- }
復制代碼
2.jpg (449.77 KB, 下載次數: 37)
下載附件
2022-4-28 10:58 上傳
|
|