打印

昨日的问题续。。求助大神。。

[复制链接]
3398|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
弱弱地再问一句。。如果51的P1口用一个电阻接地拉低了电平,,,那是不是意味着这个端口没办法输出高电平了???因为上电复位默认是锁存器写1的嘛,这个时候MOS管被隔断端口内部通过一个电阻接到VCC,而外接的下拉电阻把这种情况下的端口电压都拉到低电平了,岂不是就没办法再通过软件拉高了????

相关帖子

沙发
linfeng24| | 2013-11-7 00:43 | 只看该作者
只要不是太小阻值的电阻,可以拉到高电平的。

使用特权

评论回复
板凳
乱世文章|  楼主 | 2013-11-7 01:44 | 只看该作者
linfeng24 发表于 2013-11-7 00:43
只要不是太小阻值的电阻,可以拉到高电平的。

10K的呢,还可以拉高么。。。

使用特权

评论回复
地板
ayb_ice| | 2013-11-7 08:09 | 只看该作者
10K不可以,这种情况只能通过外部拉高了

使用特权

评论回复
5
乱世文章|  楼主 | 2013-11-7 08:51 | 只看该作者
ayb_ice 发表于 2013-11-7 08:09
10K不可以,这种情况只能通过外部拉高了

大神。。。你帮我看一下这个4×4按键输入电路的图吧。。我实在不理解为啥每个端口都用一个10K电阻接地了。。。

使用特权

评论回复
6
NE5532| | 2013-11-7 08:56 | 只看该作者
是画错了吧,这图设计得真烂,看复位电路就知道是学生作品,所以别太认真,该咋做咋做好了。

能不能输出高电平,只看电阻大小,其实就是电阻分压的问题,没啥高深的。

使用特权

评论回复
7
乱世文章|  楼主 | 2013-11-7 09:00 | 只看该作者
NE5532 发表于 2013-11-7 08:56
是画错了吧,这图设计得真烂,看复位电路就知道是学生作品,所以别太认真,该咋做咋做好了。

能不能输出高 ...

谢谢。。这本书叫《51单片机C语言常用模块与综合系统设计实例精讲》,这问题折磨我不少时间了。。。我也有点怀疑是图画错了,但是想着这是全书的第一个实例而且又是最简单的实例所以想是不是是我自己没想透。。

使用特权

评论回复
8
NE5532| | 2013-11-7 09:03 | 只看该作者
乱世** 发表于 2013-11-7 09:00
谢谢。。这本书叫《51单片机C语言常用模块与综合系统设计实例精讲》,这问题折磨我不少时间了。。。我也 ...

尽信书,不如无书啊!

看到复位电路串的那个1k电阻,这本书上的硬件电路你都可以不用相信了。

使用特权

评论回复
9
ayb_ice| | 2013-11-7 09:06 | 只看该作者
这个图对于标准51 GPIO(弱上拉)是错误的,是不能正常工作的,但对于GPIO有推挽输出的是正常的,此时下拉电阻是输入功能(输出设备,但被下拉电阻拉低),按键另外一端输出高电平(推挽输出1),按键按下时,输入端被拉高,
这个按键和通常的按键检测是反逻辑的,这种电路费路,没有好处

通常按键IO拉低认为有按键,这个按键按下IO拉高认为有按键。。。

使用特权

评论回复
10
linfeng24| | 2013-11-7 09:53 | 只看该作者
http://wenku.baidu.com/link?url= ... HeW4xGi9CL2tGLJQuD_
楼主看这篇**就知道了。理解了什么叫IO的拉电流和灌电流,那么这问题就解决了。明显拉电流蛮小,灌电流大些。所以这里很难输出高电平。建议用低电平检测按键。
那个按键电路所有IO都接电阻到地,我想,是下拉电阻吧,因为直接接地的话就没有限流电阻了。所以,当按键按下时候就是低电平。但是由于IO难以输出高电平, 最高,如手册所说就是2.4V,这刚好是TTL的高电平起点。TTL输出高电平>2.4V,输出低电平<0.4V。在室温下,一般输出高电平是3.5V,输出低电平是0.2V。好险,不晓得单片机能不能识别它为高,所以,尽量不要这么下拉电阻设计。

正确的做法就是利用单片机灌电流的优势,用上拉电阻。输出低,按下按键就是高电平的做法。

使用特权

评论回复
11
乱世文章|  楼主 | 2013-11-7 10:51 | 只看该作者
ayb_ice 发表于 2013-11-7 09:06
这个图对于标准51 GPIO(弱上拉)是错误的,是不能正常工作的,但对于GPIO有推挽输出的是正常的,此时下拉 ...

大神,如下是按键电路所附的程序。。我在里面没找到把P1口设置成推挽输出这个操作啊。。有时间的话能不能帮忙看一眼。。。#include <stdio.h>#include <absacc.h>
#include <./Atmel/at89x52.h>
extern void start_t2imer(void);
unsigned char scankey;
bit Timerout=0;
bit keypress;
#define KR0    P1_0
#define KR1    P1_1
#define KR2    P1_2
#define KR3    P1_3
#define KC0    P1_4
#define KC1    P1_5
#define KC2    P1_6
#define KC3    P1_7
#define KBD_PORT  P1
#define FSM_INIT    0X00
#define FSM_WAIT_PRESS  0X01
#define FSM_VERFY1      0X02
#define FSM_VERFY2      0X03
#define FSM_WAIT_RELESE 0X04
#define KBD_VAL_VAILD   0X80
main(){
        unsigned char fsm_key=0;
        unsigned char kbd_col;
        unsigned char kbd_row;
        unsigned char key_val;
        IE=0X40;
        start_t2imer();
        EA=1;       /* Enable interrupts */
        while(1){
                if(Timerout){
                        Timerout=0;
                        switch(fsm_key){
                                case FSM_INIT:
                                        KR0=1;
                                        KR1=1;
                                        KR2=1;
                                        KR3=1;
                                        fsm_key=FSM_WAIT_PRESS;
                                        break;
                                case FSM_WAIT_PRESS:
                                        if(keypress){
                                                key_val=0;
                                                if(KC0){
                                                        KC0=1;
                                                        kbd_col=1;
                                                }
                                                else if(KC1){
                                                        KC1=1;
                                                        kbd_col=2;
                                                }
                                                else if(KC2){
                                                        KC2=1;
                                                        kbd_col=3;
                                                }
                                                else if(KC3){
                                                        KC3=1;
                                                        kbd_col=4;
                                                }
                                                else{
                                                        fsm_key=FSM_INIT;
                                                }

                                                kbd_row =KBD_PORT;
                            kbd_row >>=4;
                                                if(kbd_row){
                                                        if(KR0){
                                                                kbd_row=0;
                                                                fsm_key=FSM_VERFY1;
                                                        }
                                                        else if(KR1){
                                                                kbd_row=4;
                                                                fsm_key=FSM_VERFY1;
                                                        }
                                                        else if(KR2){
                                                                kbd_row=8;
                                                                fsm_key=FSM_VERFY1;
                                                        }
                                                        else if(KR3){
                                                                kbd_row=12;
                                                                fsm_key=FSM_VERFY1;
                                                        }
                                                        else{
                                                                fsm_key=FSM_INIT;
                                                        }
                                                }
                                                else{
                                                        fsm_key=FSM_INIT;
                                                }
                                        }
                                        break;
                                case FSM_VERFY1:
                                        switch(kbd_row){
                                                case 0:
                                                        if(KR0)        fsm_key=FSM_VERFY2;
                                                        else fsm_key=FSM_INIT;
                                                        break;
                                                case 4:
                                                        if(KR1)        fsm_key=FSM_VERFY2;
                                                        else fsm_key=FSM_INIT;
                                                        break;
                                                case 8:
                                                        if(KR2)        fsm_key=FSM_VERFY2;
                                                        else fsm_key=FSM_INIT;
                                                        break;
                                                case 12:
                                                        if(KR3)        fsm_key=FSM_VERFY2;
                                                        else fsm_key=FSM_INIT;
                                                        break;
                                                default:
                                                        fsm_key=FSM_INIT;
                                                        break;
                                        }
                                        break;
                                case FSM_VERFY2:
                                        switch(kbd_row){
                                                case 0:
                                                        if(KR0)        key_val=(kbd_row+kbd_col)|KBD_VAL_VAILD;
                                                        break;
                                                case 4:
                                                        if(KR1)        key_val=(kbd_row+kbd_col)|KBD_VAL_VAILD;
                                                        break;
                                                case 8:
                                                        if(KR2)        key_val=(kbd_row+kbd_col)|KBD_VAL_VAILD;
                                                        break;
                                                case 12:
                                                        if(KR3)        key_val=(kbd_row+kbd_col)|KBD_VAL_VAILD;
                                                        break;
                                                default:                                                       
                                                        break;
                                        }
                                        KR0=1;
                                        KR1=1;
                                        KR2=1;
                                        KR3=1;
                                        fsm_key=FSM_WAIT_RELESE;
                                        break;
                                case FSM_WAIT_RELESE:
                                        if(!keypress){
                                                fsm_key=FSM_INIT;
                                        }
                                        break;
                                default:
                                        fsm_key=FSM_INIT;
                                        break;
                        }
                }
        }
}
void time2()interrupt 5 {//base 10 ms
        TF2=0;
        Timerout=1;
        scankey=KBD_PORT;
        if(scankey&0x0f){
                keypress=1;       
        }
        else{
                keypress=0;
        }

}

使用特权

评论回复
12
乱世文章|  楼主 | 2013-11-7 11:09 | 只看该作者
linfeng24 发表于 2013-11-7 09:53
http://wenku.baidu.com/link?url=NyI1us9g7r6CynGv1jhFhMvAsSmBAwtjHBBkfZm12yOJEWmIxk2muzU_4O8JTciXSQfA ...

版主啊,我知道拉电流跟灌电流,但是我不确定我是否读懂了你的意思啊,因为这个按键的接法并不是IO口跟地之间依次串按键跟电阻。。。而是IO口直接串电阻接地啊。。。可能是我没读明白你的意思。。

使用特权

评论回复
13
ayb_ice| | 2013-11-7 11:24 | 只看该作者
这个程序与原理图绝对对不上的,如果对应的话,绝对不是想要的结果,
要么程序不对,要么SCH不对,要么器件型号不对

使用特权

评论回复
14
乱世文章|  楼主 | 2013-11-7 12:34 | 只看该作者
ayb_ice 发表于 2013-11-7 11:24
这个程序与原理图绝对对不上的,如果对应的话,绝对不是想要的结果,
要么程序不对,要么SCH不对,要么器件 ...

好...赶明儿就把这本书撤了,去换本看看....谢谢你啊~~

使用特权

评论回复
15
伟布斯| | 2013-11-7 12:59 | 只看该作者
祝你成功!!!!!!!

使用特权

评论回复
16
乱世文章|  楼主 | 2013-11-7 13:54 | 只看该作者
ayb_ice 发表于 2013-11-7 11:24
这个程序与原理图绝对对不上的,如果对应的话,绝对不是想要的结果,
要么程序不对,要么SCH不对,要么器件 ...

对了。。有没有51 C语言模块方面的好的书籍推荐一下。。。最好是硬件连接和程序备注都相对清楚详细一点的。。。

使用特权

评论回复
17
通宵敲代码| | 2013-11-7 14:52 | 只看该作者
第一次见到都把P0口拉低的,似乎我见过的都是拉高的。

使用特权

评论回复
18
NE5532| | 2013-11-7 15:28 | 只看该作者
乱世** 发表于 2013-11-7 10:51
大神,如下是按键电路所附的程序。。我在里面没找到把P1口设置成推挽输出这个操作啊。。有时间的话能不能 ...

AT89的51好像没有推完输出端口的选项吧。

使用特权

评论回复
19
NE5532| | 2013-11-7 15:28 | 只看该作者
乱世** 发表于 2013-11-7 10:51
大神,如下是按键电路所附的程序。。我在里面没找到把P1口设置成推挽输出这个操作啊。。有时间的话能不能 ...

AT89的51好像没有推完输出端口的选项吧。

使用特权

评论回复
20
乱世文章|  楼主 | 2013-11-7 16:20 | 只看该作者
NE5532 发表于 2013-11-7 15:28
AT89的51好像没有推完输出端口的选项吧。

这个用的单片机是STC89C516RD的,我看了一下数据手册貌似有推挽输出的。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

31

帖子

0

粉丝