标题: 15F104W的单片机 P0 P1接口能不能当IO口用 [打印本页]

作者: bosschen    时间: 2018-5-31 12:57
标题: 15F104W的单片机 P0 P1接口能不能当IO口用
15F104W的单片机 为什么我把P0 P1口也就是下载口(tx rx )当IO口用,没有反应呢?是不可用,还是这种用法程序写法不一样!~

作者: zhanghyg    时间: 2018-5-31 15:03
可以的,你程序估计有问题
作者: wulin    时间: 2018-5-31 15:44
15F104W的单片机只有6个I/O口:P3.0~3.5,如果不使用第二功能只做普通I/O口就没有区别。
作者: angmall    时间: 2018-5-31 15:54
你在哪里看道?P0,P1? Tx Rx 是P30, P31,
作者: fzhlpp    时间: 2018-5-31 15:59
贴出你的代码看看,可以当普通口用的。
作者: ahshmj    时间: 2018-5-31 16:51
本来就是。
作者: bosschen    时间: 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灯开始闪,这个时间有时按按钮不切换,要按好几次,给我的感觉得正好程序循环完了我正好按下去了才可以,如果程序正在循环按钮无效,这个问题如何处理?谢谢大家
作者: fzhlpp    时间: 2018-6-2 08:27
你的延时时间太长,按键按下后程序还在延时那里执行不会知道你按键按下的,程序是一步一步走的你自己看看是不是这样。除非你用中断按键或者用定时器延时。还有建议把按键扫描和led显示放到大循环外面做一个函数模块。led3和led4会不会是你的芯片坏了换一个试试,你也可以在前面像led一样把led3,led4放前面直接点亮看看,还不亮可能是硬件问题。
作者: SADong    时间: 2018-6-2 09:17
可以用的
作者: weidoit    时间: 2018-6-2 19:49
我用过15F104w,下载口可以当用作IO
作者: wulin    时间: 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();
        }
}

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

   我现在要闪灯部份 加了一个 if(k1==on)break;     现在比以前好多了,但我知道这不是最好的办法我知道,我还是学习定时器吧!还有请问  我如何做到在规定时间里 双击有效!  是不是也要用到定时器呢? 麻烦给我个实例让我学习一下 谢谢了
作者: bosschen    时间: 2018-6-3 16:50
统一回复大家,谢谢大家的帮忙P3-0 P2-1是可以用的 是我的电路有问题,谢谢大家了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1