找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 537|回复: 9
打印 上一主题 下一主题
收起左侧

stc8g单片机io口无法同时设置为准双向口和推挽输出

[复制链接]
跳转到指定楼层
楼主
用的是stc8g1k08a,用官方给的io口配置工具,想把P3.7 P3.6 P3.5 P3.4设置为推挽输出,把P3.3 P3.2 P3.1 P3.0设置为准双向口,但是设置了之后只能全部为推挽输出或者全部为准双向口,这是为什么啊

#include "stc8g.h"


sbit KeyA = P3^3;         //按键A连接引脚12
sbit KeyB = P3^2;         //按键B连接引脚11
sbit button1 = P3^6;      //相位开关F连接引脚15
sbit button2 = P3^7;      //相位开关E连接引脚16
sbit BI = P1^1;           //电机后退输入D连接引脚2
sbit FI = P1^0;           //电机前进输入C连接引脚1
sbit FAN = P5^4;          //风扇G连接引脚引脚5
sbit lock = P3^5;         //锁扣I连接引脚14
sbit S1 = P3^4;           //锁扣开关S1连接引脚13

bit openFlag = 1;

#define MAIN_Fosc                22118400L        //定义主时钟


void delay_ms(unsigned char ms)    //延时函数
{
        unsigned int i;
        do{
                i = MAIN_Fosc / 10000;
                while(--i);
        }while(--ms);
}


void main()
{
      P1M0 = 0x03; P1M1 = 0x00;
      P3M0 = 0xf0; P3M1 = 0x00;         
      P5M0 = 0x10; P5M1 = 0x00;     //设置推挽输出


          if(openFlag==1)
                {
                        openFlag = 0;
                        BI = 0;
                        FI = 0;
                        FAN = 0;
                        lock = 0;
                        KeyA = 0;
                        KeyB = 0;
                        KeyAFlag = 1;
                        KeyBFlag = 1;
                }
        
                while(1)
                {

        if(KeyA==1)                          //按键A按下,标志位置1
        {
                delay_ms(10);
                if(KeyA==1)
                {
                        lock = 1;
                        FI = 1;
                        BI = 0;
                }
        }
        
        if(KeyB==1)                           //按键B按下,标志位置1
        {
                delay_ms(10);
                if(KeyB==1)
                {                        
                          FAN = 0;
                                FI = 0;
                                BI = 1;
                                
                }
        }
        
        if(button1==0)                         //相位开关1到位后,标志位置0
        {
                delay_ms(10);
                if(button1==0)
                {
                        FI = 0;
                        BI = 0;
                        FAN = 1;
                }
        }
        
        if(button2==0)                                    //相位开关2到位后,标志位置0               
        {
                delay_ms(10);
                if(button2==0)
                {
                        FI = 0;
                        BI = 0;
                        FAN = 0;
                }
        }
        
                if(S1==0)
                {
                        delay_ms(10);
                        if(S1==0)
                        {
                                lock = 1;
                        }
                }
                }
}

   }
}

51hei.png (81.14 KB, 下载次数: 12)

51hei.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1076567 发表于 2024-7-10 09:47 | 只看该作者
我还想问一下,设置为准双向口的时候,我测了P3.6 即button1的电压为2.3v,为什么它判断成了低电平,还没按下就执行了后面的程序,只有设置为推挽输出,它的电压为5v才为高电平,单片机的工作电压是5v,它的高低电平判断范围是多少呀
然后P3.3和P3.2设置为准双向口时的电压为3.2v,设置为推挽输出时的电压就接近0v了,它外面接了一个12k的电阻,和24v的电源,还有一个2.2k的电阻,这是为什么呀
回复

使用道具 举报

板凳
ID:1034262 发表于 2024-7-10 09:49 | 只看该作者
stc8g1k08a只有P3.0 P3.1 P3.2 P3.3 P5.4 P5.5,没别的IO了,你是怎么测试P3.7 P3.6 P3.5 P3.4的?
回复

使用道具 举报

地板
ID:1109793 发表于 2024-7-10 10:39 | 只看该作者
设置是好使的,你怎么确定设置没有成功?
回复

使用道具 举报

5#
ID:161164 发表于 2024-7-10 11:16 | 只看该作者
“但是设置了之后只能全部为推挽输出或者全部为准双向口”
如何得出这个结论?
回复

使用道具 举报

6#
ID:76027 发表于 2024-7-10 11:57 | 只看该作者
分二次设置看看。
回复

使用道具 举报

7#
ID:1076567 发表于 2024-7-10 13:32 | 只看该作者
coody_sz 发表于 2024-7-10 09:49
stc8g1k08a只有P3.0 P3.1 P3.2 P3.3 P5.4 P5.5,没别的IO了,你是怎么测试P3.7 P3.6 P3.5 P3.4的?

这个是16个脚的

回复

使用道具 举报

8#
ID:1076567 发表于 2024-7-10 13:47 | 只看该作者
lkc8210 发表于 2024-7-10 11:16
“但是设置了之后只能全部为推挽输出或者全部为准双向口”
如何得出这个结论?

我把完整的代码贴了上去,分开设置过,全部设置成推挽输出时,P3.3和P3.2引脚的电压接近于0,P3.6和P3.7的电压有5v,能够正常工作。设置成准双向口时,P3.3和P3.2引脚有3v多的电压,P3.6和P3.7的电压只有2.3v,被单片机检测为低电平。按图片那样一起设置的,引脚的电压跟设置成推挽输出一样的
用的是万能板,只画了一个简单的图,vcc是24v
回复

使用道具 举报

9#
ID:1076567 发表于 2024-7-10 13:48 | 只看该作者
xiaobendan001 发表于 2024-7-10 10:39
设置是好使的,你怎么确定设置没有成功?

分开设置过,全部设置成推挽输出时,P3.3和P3.2引脚的电压接近于0,P3.6和P3.7的电压有5v,能够正常工作。设置成准双向口时,P3.3和P3.2引脚有3v多的电压,P3.6和P3.7的电压只有2.3v,被单片机检测为低电平。按图片那样一起设置的,引脚的电压跟设置成推挽输出一样的
回复

使用道具 举报

10#
ID:1109793 发表于 2024-7-10 17:55 | 只看该作者
Dokkis 发表于 2024-7-10 13:48
分开设置过,全部设置成推挽输出时,P3.3和P3.2引脚的电压接近于0,P3.6和P3.7的电压有5v,能够正常工作 ...

3.2和3.3的3V多是在开关接通时的吧。这个电压由VCC经由电阻分压得到的。有2.2K下拉电阻,内部上拉被忽略了。3.6和3.7的话没有上拉,直接用内部上拉,此时上拉能力比较弱。如果没有外围电阻漏电,作为开关输入也应该是可以的,我就这样用过,不过实际情况还是要增加一点上拉电阻例如10K的。看官方资料显示内部上拉电阻30K左右吧。你现在只有2.3V,大概是外部电路中有什么东西把电压拉低了。输入口的高低判定一般是二分之一VCC的,5V时就是2.5V。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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