![]() |
meihua 發表于 2019-3-18 22:48 代碼里沒有對P1口進行設置呀,不知道哪里有錯誤? |
這個是我程序代碼,圖上R11最后要換成光敏電阻,意思是我無光的時候,分壓很低,P1口能判斷為低電平即可。 #include<AT89X52.h> #define KeyPort P1 unsigned char High,Low; //定時器預裝高低八位 sbit SPK=P3^7; //蜂鳴器 sbit ps=P0^0; //蜂鳴器 sbit RS=P2^0; //暫時無用 sbit RW=P2^1; //暫時無用 unsigned char code freq[][2]={ //音階頻率 0xD8,0XF7, 0xBD,0XF8, 0x87,0xF9, 0xE4,0xF9, 0x90,0xFA, 0x29,0xFB, 0xB1,0xFB, 0xEF,0xFB, }; unsigned char Time; unsigned char code YINFU[9][1]={{'0'},{'1'},{'2'},{'3'},{'4'},{'5'},{'6'},{'7'},{'8'}}; unsigned char MUSIC[]={6,2,3, 5,2,1, 3,2,2 , 5,2,2, 1,3,2, 6,2,1, 5,2,1, 6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1, 6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2, 5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0}; unsigned char code FREQH[ ]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, 0xFC,0xFD,0xFD,0xFD,0xFD,0xFD,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, }; unsigned char code FREQL[ ]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6, 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, 0xEE,0x44,0x6B,0xB4,0xF4,0x2D, 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, }; void Init_timer0(void); //定時器初始化 void delay2xus(unsigned char z) //延時 { while(z--); } void delayms(unsigned char x) //延時 { while(x--) { delay2xus(245); delay2xus(245); } } void delaytips(unsigned char t) //延時 { unsigned char i; for(i=0;i<t;i++) { delayms(250); } TR0=0; } void PlaySong() { TH0=High; TL0=Low; TR0=1; delaytips(Time); } void Init_Timer0(void) //定時器初始化 { TMOD |=0x01; EA=1; ET0=1; } void Timer0_isr(void)interrupt 1 //定時中斷 { TH0=High; TL0=Low; SPK=!SPK; } int main(void) //主函數 { unsigned char num,k,i; Init_Timer0(); SPK=0; while(1) { switch(KeyPort) //P1口判斷,是否有低電平 { case 0xfe:num=1;break; case 0xfd:num=2;break; case 0xfb:num=3;break; case 0xf7:num=4;break; case 0xef:num=5;break; case 0xdf:num=6;break; case 0xbf:num=7;break; case 0x7f:num=8;break; default:num=0;break; } P2=KeyPort; //暫時無用 if(num==0) { TR0=0; SPK=0; } else { High=freq[num-1][1]; Low=freq[num-1][0]; TR0=1; } if(ps==0) { delayms(10); if(ps==0) { i=0; while(i<100) { k=MUSIC[i]+7*MUSIC[i+1]-1; High=FREQH[k]; Low=FREQL[k]; Time=MUSIC[i+2]; i=i+3; if(P1!=0xff) { delayms(10); if(P1!=0xff) i=101; } PlaySong(); } TR0=0; } } } } |
zhb2004xp 發表于 2019-3-19 00:16 您好,我并不像知道具體電壓多少,我這個設計其實就是想讓單片機判斷電壓0/1,比如分壓0.2V時不應該判斷為0嗎? |
你通過掃描P1.0端口,來查詢外部電路是高電平還是低電平,這種分壓方式檢測是不對的,因為89C52單片機的IO口不能檢測模擬量,只能檢測到高電平(1)、低電平(0),這個兩個值是相對的。應該將R2換成按鍵,按鍵沒有按下時,在R11的上拉作用下,掃描P1.0端口的結果為1,按鍵按下后,掃描P1.0端口的結果為0 |
單片機IO口要設置成輸入,你現在P1全部為輸出高電平,當然是檢測不了外部電壓的。 |
單片機IO口要設置成輸入,你現在P1 |