![]() |
發布時間: 2020-11-24 13:13
正文摘要:(89C51)通過proteus ISIS已經仿真確診沒有問題16按鍵矩陣各方面都沒毛病。但通過開發板烤制出來連接電路為什么就不能發音呢? 同樣是仿真軟件烤制,同學的 計算機、測距儀等等通過仿真烤制程序配合各模塊都能實現 ... |
此貼終結,謝謝各位hxd |
wulin 發表于 2020-11-27 07:59 我測試了一下,好想是的,發出來基本頂多就幾個音調,一點都不抑揚頓挫 |
王論夜舞111 發表于 2020-11-26 23:06 如果開發板上矩陣鍵盤有端口與蜂鳴器共用那只能把程序改成3*4矩陣鍵盤,另外開發板上多為有源蜂鳴器,發聲頻率固定,不適合播放音樂。 |
各位hxdm,我發現問題了。 好像我開發板的上的1.3腳 因矩陣腳和蜂鳴器腳雷同有沖突,貌似這樣就會有干擾對嗎??? |
你你摸摸你的 發表于 2020-11-26 05:01 謝謝,我參考試試 |
glinfei 發表于 2020-11-25 23:26 難道蜂鳴器模塊不行嗎? ![]() |
glinfei 發表于 2020-11-25 23:26 就是蜂鳴器,但按理說沒超過2Khz 這個雜音就一直很煩 |
多次實踐 |
你的頻率不對,#include <reg51.h> #define uint unsigned int #define uchar unsigned char #define output P1 #define input P1 //方便移植在其他電路板上,我的電路使用P1口做鍵盤輸入接口 //定義16個按鍵 enum KEY{key0,key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15}; uchar code table[]={ //數組定義,顯示數碼管 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; unsigned int code Freqtab[] = { //定時半周期的初始值 64021,64103,64260,64400, //低音3 4 5 6 64524,64580,64684,64777, //低音7,中音1 2 3 64820,64898,64968,65030, //中音4 5 6 7 65058,65110,65157,65178}; //高音1 2 3 4 uint FreqTemp; //蜂鳴器聲音不怎么樣,我們使用揚聲器,接P3.7口 sbit SPEAK = P3^7; void delay1ms(uint n) //誤差 0us ,延時n毫秒 { uint a,b,c; for(c=n;c>0;c--) for(b=199;b>0;b--) for(a=1;a>0;a--); } uint key_input(void) { uchar temp1,temp2; //臨時保存讀取的行或者列 uchar num = 16; //返回按鍵的值 output = 0x0f; temp1 = input; //先讀取行 if(0x0f != temp1) //按鍵按下 { delay1ms(5); //延時,消除抖動 temp1 = input; //再次讀取行 if(0x0f != temp1) //說明按鍵確實按下 { temp1 = temp1 & 0x0f; //保留低4位 output = 0xf0; //準備讀取列 delay1ms(1); //延時一下,防止下一句讀不到 temp2 = input; //直接讀取列 temp2 = temp2 & 0xf0; //保留高4位 temp1 = temp1 | temp2; //將temp1和temp2的值合并 } } switch(temp1) { case 0xee:num=0;break; case 0xde:num=1;break; case 0xbe:num=2;break; case 0x7e:num=3;break; case 0xed:num=4;break; case 0xdd:num=5;break; case 0xbd:num=6;break; case 0x7d:num=7;break; case 0xeb:num=8;break; case 0xdb:num=9;break; case 0xbb:num=10;break; case 0x7b:num=11;break; case 0xe7:num=12;break; case 0xd7:num=13;break; case 0xb7:num=14;break; case 0x77:num=15;break; default:break; } return num; } void T0_INT(void) interrupt 1 { TL0 = FreqTemp; //載入定時半周期的初始值 TH0 = FreqTemp >> 8; SPEAK = ~SPEAK; //發音 } int main() { TMOD = 0X01; //定時器T0設置為方式1 EA = 1; ET0 = 1; TR0 = 0; while(1) { uint num,temp; num = key_input(); temp = num; P0 = table[num]; if(16 != num) { FreqTemp = Freqtab[num]; TR0 = 1; while(0xf0 != output); //檢測按鍵松開 TR0 = 0; SPEAK = 1; } } return 0; } |
看程序,我算了一下,晶振應該是12M的,你的是不是太低了?另外,你這個音頻是方波,諧波太多了,應該濾波,否則聲音會非常嘈雜,聽起來就怪怪的;最后,你用什么放音的,別是嗡鳴器吧?反正,好多無源的播音有頻率限制,eg:2KHz以上,它就放不出你這么低的頻率。 |
權威人物 發表于 2020-11-25 09:16 我用的各種模塊來做的 蜂鳴器,矩陣,單片機 就這仨模塊接上來做,感覺還是有點小問題 |
13487086265 發表于 2020-11-25 20:01 仿真的時候沒問題,我就是在開發板上直接將hex烤進單片機實物然后就不行了 |
你看看那個矩陣接線對嗎 |
模擬并不總是適用于實際電路。 |
蜂鳴器用上拉驅動試試,有條件的可以檢測下驅動口的信號頻率是否正確 |
程序/圖如下,希望懂哥幫我看看 |
適得府君書 發表于 2020-11-24 17:53 就是正常的可以考烤程序開發板,理論來說沒問題 |
T_Trigger 發表于 2020-11-24 16:10 我用的就是開發板燒的,然后定義十六種不同頻率的聲音,我也不知道仿真為什么就可以做到十六個聲音信號(我也覺得新奇) 但實際開發板上操作矩陣按鍵就只有四個按鍵可以按同頻沙啞的聲音 |
電路圖有嗎,有就發出來看看 |
理論與實踐還是存在著一定的距離。仿真軟件里面的電子元件都是工作在理想狀態。而實物就是實物。仿真沒問題那你就看看連接,電源方面有沒有問題。 |
既然已經成功的例子了,那就更容易的對比試驗找到問題所在了。 有成功的證明程序不會有什么問題!一點一點的排查,可以慢慢確定到底是你的電腦燒寫程序設置,還是單片機,還是單片某個模塊。。。 |