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 |