欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8712|回復: 6
收起左側

51單片機io口如何通過電阻分壓電路檢測外部電壓?

[復制鏈接]
ID:493480 發表于 2019-3-18 20:03 | 顯示全部樓層 |閱讀模式
我想讓這個單片機P1端口能檢測外部電壓從而判斷高低電平,但是這樣接上以后,電壓就側成4.99v了,求大神告知問題在哪里?
TIM圖片20190318200114.png
回復

使用道具 舉報

ID:493480 發表于 2019-3-19 10:34 | 顯示全部樓層
meihua 發表于 2019-3-18 22:48
單片機IO口要設置成輸入,你現在P1全部為輸出高電平,當然是檢測不了外部電壓的。

代碼里沒有對P1口進行設置呀,不知道哪里有錯誤?
回復

使用道具 舉報

ID:493480 發表于 2019-3-19 10:33 | 顯示全部樓層
這個是我程序代碼,圖上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;
}
}
}
}
回復

使用道具 舉報

ID:493480 發表于 2019-3-19 10:32 | 顯示全部樓層
zhb2004xp 發表于 2019-3-19 00:16
你通過掃描P1.0端口,來查詢外部電路是高電平還是低電平,這種分壓方式檢測是不對的,因為89C52單片機的IO ...

您好,我并不像知道具體電壓多少,我這個設計其實就是想讓單片機判斷電壓0/1,比如分壓0.2V時不應該判斷為0嗎?
回復

使用道具 舉報

ID:234075 發表于 2019-3-19 00:16 | 顯示全部樓層
你通過掃描P1.0端口,來查詢外部電路是高電平還是低電平,這種分壓方式檢測是不對的,因為89C52單片機的IO口不能檢測模擬量,只能檢測到高電平(1)、低電平(0),這個兩個值是相對的。應該將R2換成按鍵,按鍵沒有按下時,在R11的上拉作用下,掃描P1.0端口的結果為1,按鍵按下后,掃描P1.0端口的結果為0
回復

使用道具 舉報

ID:493618 發表于 2019-3-18 22:48 來自觸屏版 | 顯示全部樓層
單片機IO口要設置成輸入,你現在P1全部為輸出高電平,當然是檢測不了外部電壓的。
回復

使用道具 舉報

ID:493618 發表于 2019-3-18 22:47 來自觸屏版 | 顯示全部樓層
單片機IO口要設置成輸入,你現在P1
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表