找回密码
 立即注册

QQ登录

只需一步,快速开始

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

15F104W的单片机 P0 P1接口能不能当IO口用

[复制链接]
跳转到指定楼层
楼主
ID:334550 发表于 2018-5-31 12:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
15F104W的单片机 为什么我把P0 P1口也就是下载口(tx rx )当IO口用,没有反应呢?是不可用,还是这种用法程序写法不一样!~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:330198 发表于 2018-5-31 15:03 | 只看该作者
可以的,你程序估计有问题
回复

使用道具 举报

板凳
ID:213173 发表于 2018-5-31 15:44 | 只看该作者
15F104W的单片机只有6个I/O口:P3.0~3.5,如果不使用第二功能只做普通I/O口就没有区别。
回复

使用道具 举报

地板
ID:155507 发表于 2018-5-31 15:54 来自手机 | 只看该作者
你在哪里看道?P0,P1? Tx Rx 是P30, P31,
回复

使用道具 举报

5#
ID:241128 发表于 2018-5-31 15:59 | 只看该作者
贴出你的代码看看,可以当普通口用的。
回复

使用道具 举报

6#
ID:7485 发表于 2018-5-31 16:51 | 只看该作者
本来就是。
回复

使用道具 举报

7#
ID:334550 发表于 2018-6-2 00:23 | 只看该作者
#include<reg51.h>
unsigned char times;
sbit key=P3^2;
sbit led=P3^4;
sbit led2=P3^5;
sbit led3=P3^0;
sbit led4=P3^1;
void delay(unsigned char a)
{
unsigned char i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
unsigned char i = 0;
unsigned char ii = 0;
led=1;
while(1)
    {
    if(key==0)

        {
        delay(10);

        if(key==0)
        {
        while(key==0);

        times++;
        }
        times%=3;

        }

    switch(times)

        {
        case 0:led=1;break;

        case 1:led=0;break;

        case 2:
                        for (i = 0; i < 6; ++i)
                        {
                                led = 0;
                                delay(500);
                                led = 1;
                        delay(500);
                                led2 = 0;
                                delay(500);
                                led2 = 1;
                        delay(500);
                        }
                                       
                                        for (i = 0; i < 6; ++i)
                        {
                                led3 = 0;
                                delay(500);
                                led3 = 1;
                        delay(500);
                                led4 = 0;
                                delay(500);
                                led4 = 1;
                        delay(500);
                        }
                                                       



        }

    }

}



现在不光是P3-0 P3-1没反应灯不亮  还有一个问题就是 当times=2时 LED灯开始闪,这个时间有时按按钮不切换,要按好几次,给我的感觉得正好程序循环完了我正好按下去了才可以,如果程序正在循环按钮无效,这个问题如何处理?谢谢大家
回复

使用道具 举报

8#
ID:241128 发表于 2018-6-2 08:27 | 只看该作者
你的延时时间太长,按键按下后程序还在延时那里执行不会知道你按键按下的,程序是一步一步走的你自己看看是不是这样。除非你用中断按键或者用定时器延时。还有建议把按键扫描和led显示放到大循环外面做一个函数模块。led3和led4会不会是你的芯片坏了换一个试试,你也可以在前面像led一样把led3,led4放前面直接点亮看看,还不亮可能是硬件问题。

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:343290 发表于 2018-6-2 09:17 | 只看该作者
可以用的
回复

使用道具 举报

10#
ID:149389 发表于 2018-6-2 19:49 | 只看该作者
我用过15F104w,下载口可以当用作IO
回复

使用道具 举报

11#
ID:213173 发表于 2018-6-3 09:55 | 只看该作者
bosschen 发表于 2018-6-2 00:23
#include
unsigned char times;
sbit key=P3^2;

你使用for循环+delay延时处理闪烁灯,CPU几乎完全被占用,按键状态很难被捕捉到,而且按键抬起识别用了while(key==0);死循环等待,这就导致互相挤占CPU时间,程序运行不畅。给你把闪烁灯程序改在定时器中断里处理,你试试。
#include<reg51.h>
sbit key=P3^2;
sbit led1=P3^4;
sbit led2=P3^5;
sbit led3=P3^0;
sbit led4=P3^1;
unsigned char times=0;
unsigned char time=0;
unsigned char time1=0;
bit flag=1;
void delay(unsigned char a)
{
        unsigned char i,j;
        for(i=0;i<a;i++)
                for(j=0;j<120;j++);
}
void Timer0Init()        //50毫秒@12.000MHz
{
        TMOD= 0x01;                //设置定时器模式
        TL0 = 0xB0;                //设置定时初值
        TH0 = 0x3C;                //设置定时初值
        TF0 = 0;                        //清除TF0标志
//        TR0 = 1;                        //定时器0开始计时
        EA=1;                                //开总中断
        ET0=1;                        //开定时器0中断       
}

void Twinkle()
{
        static unsigned char i=0,j=0;

        if(flag==1)
        {
                time1++;
                if(time1==24)
                        time1=0;
                if(time1<12)
                {
                        switch(i)       
                        {
                                case 0:led1=0;led2=1;led3=1;led4=1;i=1;break;
                                case 1:led1=1;led2=0;led3=1;led4=1;i=0;break;
                        }
                        j=0;
                }               
                else
                {
                        switch(j)       
                        {
                                case 0:led1=1;led2=1;led3=0;led4=1;j=1;break;
                                case 1:led1=1;led2=1;led3=1;led4=0;j=0;break;
                        }
                        i=0;
                }

        }
}

void main()
{
        unsigned char k = 0;        //按键状态
        Timer0Init();
        while(1)
        {
                if(key==0)
                {
                        delay(10);
                        if((key==0)&&(k==0))
                        {
                                k=1;
                                times++;
                                times%=3;
                        }
                }       
                else k=0;
                switch(times)       
                {
                        case 0:led1=led2=led3=led4=1;TR0=0;flag=0;time1=0;break;
                        case 1:led1=0;break;
                        case 2:flag=1;TR0=1;break;
                }
        }
}

void timer0() interrupt        1
{
        TL0 = 0xB0;                //设置定时初值
        TH0 = 0x3C;                //设置定时初值
        time++;                       
        if(time>=10)        //0.5秒
        {
                time=0;
                Twinkle();
        }
}
回复

使用道具 举报

12#
ID:334550 发表于 2018-6-3 16:45 | 只看该作者
wulin 发表于 2018-6-3 09:55
你使用for循环+delay延时处理闪烁灯,CPU几乎完全被占用,按键状态很难被捕捉到,而且按键抬起识别用了wh ...

   我现在要闪灯部份 加了一个 if(k1==on)break;     现在比以前好多了,但我知道这不是最好的办法我知道,我还是学习定时器吧!还有请问  我如何做到在规定时间里 双击有效!  是不是也要用到定时器呢? 麻烦给我个实例让我学习一下 谢谢了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

13#
ID:334550 发表于 2018-6-3 16:50 | 只看该作者
统一回复大家,谢谢大家的帮忙P3-0 P2-1是可以用的 是我的电路有问题,谢谢大家了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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