|
環(huán)境介紹:硬件部分有LD3320語(yǔ)音識(shí)別模塊+STC11L56XE+51單片機(jī)開(kāi)發(fā)板(普中51-單核-A2)。語(yǔ)音識(shí)別模塊的程序已經(jīng)寫(xiě)好了(見(jiàn)下部分),每次輸入語(yǔ)音信號(hào)后,LD3320模塊對(duì)應(yīng)輸出口輸出一個(gè)高電平信號(hào),幾十毫秒后,再輸出低電平信號(hào)(如:我說(shuō)“開(kāi)燈”,LD3320將IO口P1.0輸出高電平,幾十毫秒后再輸出低電平,LD3320的P1.0接入51的P2.0);LD3320的P1.0~P1.5和51的P2.0~P2.5已經(jīng)通過(guò)杜邦線連接,51的P2.6口為L(zhǎng)ED高電平輸入口,51的P1.0為風(fēng)扇的驅(qū)動(dòng)口(相關(guān)驅(qū)動(dòng)程序已經(jīng)寫(xiě)好)。
整個(gè)項(xiàng)目的目的是:通過(guò)語(yǔ)音識(shí)別的方式,控制LED燈開(kāi)燈(低亮度),高亮度,關(guān)燈;控制直流電機(jī)開(kāi)風(fēng)扇(低速),高速度,關(guān)風(fēng)扇。
問(wèn)題1:現(xiàn)在的情況是,我輸入“亮一點(diǎn)”指令后,LED確實(shí)是亮度高的那檔,然后輸入“開(kāi)燈”指令后,LED確實(shí)是低亮度那檔,但是如果我先輸入“開(kāi)燈”指令,LED能低亮度運(yùn)行,后輸入“亮一點(diǎn)”指令后,LED無(wú)法到高亮度那檔(電機(jī)的情況通LED)。
問(wèn)題2:為什么我輸入“關(guān)燈”或“關(guān)風(fēng)扇”指令后,LED總會(huì)有一點(diǎn)點(diǎn)亮度,電機(jī)還會(huì)有很微小的轉(zhuǎn)動(dòng)。
各位老師幫幫孩子吧,一直沒(méi)想到問(wèn)題在哪里,如有描述不清的地方,我都會(huì)盡快回復(fù)的,謝謝各位。
語(yǔ)音識(shí)別模塊部分程序:
- void User_handle(uint8 dat)
- {
- //UARTSendByte(dat);//串口識(shí)別碼(十六進(jìn)制)
- if(0==dat)
- {
- G0_flag=ENABLE;
- LED=0;
- PrintCom("小智收到\r\n"); /*text.....*/
- }
- else if(ENABLE==G0_flag)
- {
- G0_flag=DISABLE;
- LED=1;
- switch(dat) /*對(duì)結(jié)果執(zhí)行相關(guān)操作,客戶(hù)可刪除Printcom 串口輸出語(yǔ)句替換為其他需要控制的代碼*/
- {
- case CODE_DMCS:
- PrintCom("“開(kāi)燈”命令識(shí)別成功\r\n"); /*text.....*/
- PrintCom("主人,已打開(kāi)燈\r\n"); /*text.....*/
- P10=1;delay(200);P10=0;
- break;
- case CODE_KFBYZ:
- PrintCom("“亮一點(diǎn)”命令識(shí)別成功\r\n"); /*text.....*/
- PrintCom("主人,燈亮度已經(jīng)變高\(yùn)r\n"); /*text.....*/
- P11=1;delay(200);P11=0;
- break;
- case CODE_KD:
- PrintCom("“關(guān)燈”命令識(shí)別成功\r\n"); /*text.....*/
- PrintCom("主人,已關(guān)閉LED\r\n"); /*text.....*/
- P12=1;delay(200);P12=0;
- break;
- case CODE_GD:
- PrintCom("“開(kāi)風(fēng)扇”命令識(shí)別成功\r\n"); /*text.....*/
- PrintCom("主人,已打開(kāi)風(fēng)扇\r\n"); /*text.....*/
- P13=1;delay(200);P13=0;
- break;
- case CODE_BJ:
- PrintCom("“快一點(diǎn)”命令識(shí)別成功\r\n"); /*text.....*/
- PrintCom("主人,風(fēng)扇轉(zhuǎn)速已經(jīng)變高\(yùn)r\n"); /*text.....*/
- P14=1;delay(200);P14=0;
- break;
- case CODE_SH:
- PrintCom("“關(guān)風(fēng)扇”命令識(shí)別成功\r\n"); /*text.....*/
- PrintCom("主人,已關(guān)閉風(fēng)扇\r\n"); /*text.....*/
- P15=1;delay(200);P15=0;
- break;
- case CODE_GZ:
- PrintCom("“晚安”命令識(shí)別成功\r\n"); /*text.....*/
- PrintCom("晚安,主人\r\n"); /*text.....*/
- break;
- default:PrintCom("請(qǐng)重新識(shí)別發(fā)口令\r\n"); /*text.....*/
- break;
- }
- }
- else
- {
- PrintCom("請(qǐng)說(shuō)出一級(jí)口令\r\n"); /*text.....*/
- }
- }
復(fù)制代碼
51單片機(jī)代碼如下:
- #include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
- #include<intrins.h> //因?yàn)橐玫阶笥乙坪瘮?shù),所以加入這個(gè)頭文件
- typedef unsigned int u16; //對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義
- typedef unsigned char u8;
- sbit led1 = P2^0; //LED標(biāo)志位1,開(kāi)啟LED和低亮度
- sbit led2 = P2^1; //LED標(biāo)志位2,高亮度
- sbit led3 = P2^2; //LED標(biāo)志位3,關(guān)閉LED
- sbit fengshan1 = P2^3; //風(fēng)扇標(biāo)志位1,開(kāi)啟風(fēng)扇和低速度
- sbit fengshan2 = P2^4; //風(fēng)扇標(biāo)志位2,高速度
- sbit fengshan3 = P2^5; //風(fēng)扇標(biāo)志位3,關(guān)閉風(fēng)扇
- sbit led = P2^6;//LED驅(qū)動(dòng)位
- sbit fengshan = P1^0; //風(fēng)扇驅(qū)動(dòng)位
- u16 Counter,Compare1,Compare2; //計(jì)數(shù)值和比較值,用于輸出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; //設(shè)置定時(shí)器模式
- TMOD |= 0x01; //設(shè)置定時(shí)器模式
-
- TH0 = 0xFF; //設(shè)置定時(shí)初始值 高八位低八位0xFFA4 組成 100us
- TL0 = 0x9C; //設(shè)置定時(shí)初始值
-
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
- ET0=1; //允許定時(shí)器T0中斷
- EA=1; //開(kāi)啟總中斷
- PT0=0; //優(yōu)先級(jí)為低
- }
- void main()
- {
- Timer0_Init(); //定時(shí)器初始化
- P2 = 0;//P2.0-P2.7初始化
- fengshan = 0;
- while(1)
- {
- LED();
- FS();
- }
- }
- void Timer0() interrupt 1 //進(jìn)入定時(shí)器中斷
- {
- TH0 = 0xFF;
- TL0 = 0x9C; //重新賦初始值
-
- Counter++; //計(jì)數(shù)值自加
- Counter%=100; //計(jì)數(shù)值變化范圍限制在0~99
-
- if(led1flag == 1 || led2flag == 1 || led3flag ==1)
- {
- if(Counter < Compare1) //計(jì)數(shù)值小于比較值
- {
- led = 1;
- }
- else //計(jì)數(shù)值大于比較值
- {
- led = 0;
- }
- }
- if(fengshan1flag == 1||fengshan2flag == 1||fengshan3flag == 1)
- {
- if(Counter < Compare2) //計(jì)數(shù)值小于比較值
- {
- fengshan = 1;
- }
- else //計(jì)數(shù)值大于比較值
- {
- fengshan = 0;
- }
- }
- }
復(fù)制代碼
2.jpg (449.77 KB, 下載次數(shù): 37)
下載附件
2022-4-28 10:58 上傳
|
|