本人菜鳥,想問一下我想用這個電路給單片機輸入電壓,但是無論分壓多少為什么單片機都不能識別低電平,一定要直接接地才是低電平嗎???

uj5u.com熱心網友回復:
51單片機是TTL電平,一般0.7V以下就能被識別為低電平了。樓主的單片機系統運行正常嗎?uj5u.com熱心網友回復:
一般二極管的導通電壓以下就是低電平uj5u.com熱心網友回復:
能仿真,p1口沒設定,就是寫了判斷是否有低電平信號uj5u.com熱心網友回復:
我就是想把r11換成一個光敏電阻其他不變,無光的時候單片機p1口能判斷為低電壓,但是不太行uj5u.com熱心網友回復:
記得以前課本上說P1口要用的話先寫1進去uj5u.com熱心網友回復:
#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;
}
}
}
}
uj5u.com熱心網友回復:
上面是程式代碼,我昨晚在主函式里也寫了一個P1=1,但是好像效果不大uj5u.com熱心網友回復:
測一下電阻R2的電壓變化范圍
uj5u.com熱心網友回復:
這是一個驅動的問題!因為你在地和IO口之間接了電阻!IO口會把電阻拉到5v所以不會是0!你換成沒有上拉的P0試試,或許可以,但不一定!而且我覺得沒有必要,你要是想讓他接地的話,就直接接,為啥要一個電阻呢!若是非要特定值,你可以加一個電壓比較器!畢竟單片機的IO口并不足夠靈敏uj5u.com熱心網友回復:
如果不接上單片機,r2電壓正常的,接上就不行了
uj5u.com熱心網友回復:
// 你這個分壓電路不對吧?// V+ -> R11 -> R2 -> GND,R11和R2之間抽頭到P1.0
// R2為光敏電阻
// R11的值根據光敏電阻的導通電阻值計算下。
// 51單片機低于0.7V為低電平
uj5u.com熱心網友回復:
這是一個驅動的問題!因為你在地和IO口之間接了電阻!IO口會把電阻拉到5v所以不會是0!你換成沒有上拉的P0試試,或許可以,但不一定!而且我覺得沒有必要,你要是想讓他接地的話,就直接接,為啥要一個電阻呢!若是非要特定值,你可以加一個電壓比較器!畢竟單片機的IO口并不足夠靈敏
有道理我來試一試p0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/151395.html
標籤:單片機/工控
上一篇:8266模塊!怎么寫入程式?
