找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7799|回复: 6
收起左侧

51单片机io口如何通过电阻分压电路检测外部电压?

[复制链接]
ID:493480 发表于 2019-3-18 20:03 | 显示全部楼层 |阅读模式
我想让这个单片机P1端口能检测外部电压从而判断高低电平,但是这样接上以后,电压就侧成4.99v了,求大神告知问题在哪里?
TIM图片20190318200114.png
回复

使用道具 举报

ID:493618 发表于 2019-3-18 22:47 来自手机 | 显示全部楼层
单片机IO口要设置成输入,你现在P1
回复

使用道具 举报

ID:493618 发表于 2019-3-18 22:48 来自手机 | 显示全部楼层
单片机IO口要设置成输入,你现在P1全部为输出高电平,当然是检测不了外部电压的。
回复

使用道具 举报

ID:234075 发表于 2019-3-19 00:16 | 显示全部楼层
你通过扫描P1.0端口,来查询外部电路是高电平还是低电平,这种分压方式检测是不对的,因为89C52单片机的IO口不能检测模拟量,只能检测到高电平(1)、低电平(0),这个两个值是相对的。应该将R2换成按键,按键没有按下时,在R11的上拉作用下,扫描P1.0端口的结果为1,按键按下后,扫描P1.0端口的结果为0
回复

使用道具 举报

ID:493480 发表于 2019-3-19 10:32 | 显示全部楼层
zhb2004xp 发表于 2019-3-19 00:16
你通过扫描P1.0端口,来查询外部电路是高电平还是低电平,这种分压方式检测是不对的,因为89C52单片机的IO ...

您好,我并不像知道具体电压多少,我这个设计其实就是想让单片机判断电压0/1,比如分压0.2V时不应该判断为0吗?
回复

使用道具 举报

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:34 | 显示全部楼层
meihua 发表于 2019-3-18 22:48
单片机IO口要设置成输入,你现在P1全部为输出高电平,当然是检测不了外部电压的。

代码里没有对P1口进行设置呀,不知道哪里有错误?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表