关于51单片机处理外部电压

njit098 2019-03-18 09:05:09
本人菜鸟,想问一下我想用这个电路给单片机输入电压,但是无论分压多少为什么单片机都不能识别低电平,一定要直接接地才是低电平吗???
...全文
298 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
njit098 2019-03-19
  • 打赏
  • 举报
回复
引用 9 楼 lake_81的回复:
这是一个驱动的问题!因为你在地和IO口之间接了电阻!IO口会把电阻拉到5v所以不会是0!你换成没有上拉的P0试试,或许可以,但不一定!而且我觉得没有必要,你要是想让他接地的话,就直接接,为啥要一个电阻呢!若是非要特定值,你可以加一个电压比较器!毕竟单片机的IO口并不足够灵敏
有道理我来试一试p0
一条晚起的虫 2019-03-19
  • 打赏
  • 举报
回复
// 你这个分压电路不对吧? // V+ -> R11 -> R2 -> GND,R11和R2之间抽头到P1.0 // R2为光敏电阻 // R11的值根据光敏电阻的导通电阻值计算下。 // 51单片机低于0.7V为低电平
njit098 2019-03-19
  • 打赏
  • 举报
回复
引用 8 楼 一树梅的回复:
[quote=引用 7 楼 njit098 的回复:] 上面是程序代码,我昨晚在主函数里也写了一个P1=1,但是好像效果不大
测一下电阻R2的电压变化范围[/quote] 如果不接上单片机,r2电压正常的,接上就不行了
lake_81 2019-03-19
  • 打赏
  • 举报
回复
这是一个驱动的问题!因为你在地和IO口之间接了电阻!IO口会把电阻拉到5v所以不会是0!你换成没有上拉的P0试试,或许可以,但不一定!而且我觉得没有必要,你要是想让他接地的话,就直接接,为啥要一个电阻呢!若是非要特定值,你可以加一个电压比较器!毕竟单片机的IO口并不足够灵敏
yishumei 2019-03-19
  • 打赏
  • 举报
回复
引用 7 楼 njit098 的回复:
上面是程序代码,我昨晚在主函数里也写了一个P1=1,但是好像效果不大
测一下电阻R2的电压变化范围
njit098 2019-03-19
  • 打赏
  • 举报
回复
上面是程序代码,我昨晚在主函数里也写了一个P1=1,但是好像效果不大
njit098 2019-03-19
  • 打赏
  • 举报
回复
#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;
}
}
}
}
dceacho 2019-03-19
  • 打赏
  • 举报
回复
记得以前课本上说P1口要用的话先写1进去
njit098 2019-03-19
  • 打赏
  • 举报
回复
我就是想把r11换成一个光敏电阻其他不变,无光的时候单片机p1口能判断为低电压,但是不太行
njit098 2019-03-19
  • 打赏
  • 举报
回复
能仿真,p1口没设置,就是写了判断是否有低电平信号
fly 100% 2019-03-19
  • 打赏
  • 举报
回复
一般二极管的导通电压以下就是低电平
yishumei 2019-03-18
  • 打赏
  • 举报
回复
51单片机是TTL电平,一般0.7V以下就能被识别为低电平了。楼主的单片机系统运行正常吗?

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧