找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6962|回復(fù): 12
收起左側(cè)

單片機io推免不受控制問題 P5M0=0x00;P5M1=0xff;

[復(fù)制鏈接]
ID:325735 發(fā)表于 2019-2-17 12:14 | 顯示全部樓層 |閱讀模式
這么寫完不知道哪里不對  P5M0=0x00;P5M1=0xff; 加上后io就不受控制了  刪掉這2個就可以  但不是推免輸出 高電位推不動

單片機源程序如下:
  1. #include "reg52.h"
  2. #include <intrins.H>
  3. #define uchar unsigned char //宏定義字符型變量
  4. #define uint  unsigned int        //宏定義整型變量
  5. /********************************************************************
  6.                             波特率設(shè)定
  7. *********************************************************************/
  8. //#define BAUD 0XF400  //1200bps@ 11.0592MHZ
  9. //#define BAUD 0XFA00  //2400bps@ 11.0592MHZ
  10. //#define BAUD 0XFD00  //4800bps@ 11.0592MHZ
  11. #define BAUD 0XFE80  //9600bps@ 11.0592MHZ
  12. //#define BAUD 0XFF40  //19200bps@ 11.0592MHZ
  13. //#define BAUD 0XFFA0  //38400bps@ 11.0592MHZ

  14. uchar dat; //用于存儲單片機接收發(fā)送緩沖寄存器SBUF里面的內(nèi)容
  15. /********************************************************************
  16.                             I/O定義
  17. *********************************************************************/
  18. sfr P5M1 = 0xC9;
  19. sfr P5M0 = 0xCA;

  20. sbit key1=P3^2;         //定義單片機P3口的第3位 (即P3.2)//為輸入
  21. sbit key2=P3^3;

  22. sbit LED1=P5^4;         //定義單片機P3口的第3位 (即P3.3)//為輸出
  23. sbit LED2=P5^5;         //定義單片機P3口的第3位 (即P3.3)//為輸出


  24. sbit RXB=P3^0;
  25. sbit TXB=P3^1;





  26. /********************************************************************
  27.                             定義特殊寄存器
  28. *********************************************************************/
  29. sfr AUXR  =  0x8E;   //輔助寄存器

  30. /********************************************************************
  31.                            定義數(shù)據(jù)類型
  32. *********************************************************************/
  33. uchar  TBUF,RBUF; //發(fā)送的數(shù)據(jù)
  34. uchar TDAT,RDAT;
  35. uchar TCNT,RCNT;
  36. uchar TBIT,RBIT;
  37. uint TING,RING;
  38. uint TEND,REND;

  39. void UART_INIT(); //聲明函數(shù)

  40. uchar t,r;                  //定義數(shù)據(jù)類型
  41. uchar but[16];          //數(shù)據(jù)存儲數(shù)組
  42. /********************************************************************
  43.                             延時函數(shù)
  44. *********************************************************************/
  45. void delay(uchar t)
  46. {
  47.   uchar i,j;
  48.    for(i=0;i<t;i++)
  49.    {
  50.             for(j=110;j>0;j--);
  51.          { ;
  52.          }
  53.    }
  54. }

  55. /********************************************************************
  56.                             主函數(shù)
  57. *********************************************************************/
  58. void main()
  59. {

  60.       
  61. P5M0=0x00;//這里設(shè)置推免輸出
  62. P5M1=0xff;
  63.       
  64. TMOD=0X00;           //定時器T0設(shè)定
  65. AUXR=0X80;           //輔助寄存器
  66. TL0=BAUD;           //十六位寄存器
  67. TH0=BAUD>>8;   //十六位寄存器
  68. TR0=1;                   //開定時器
  69. ET0=1;
  70. PT0=1;
  71. EA=1;                   //開總中斷
  72. UART_INIT();   //串口初始化
  73. while(1)           //無線循環(huán)
  74. {
  75. //      if(key1==0){delay(20);if(key1==0){TBUF = 0xFC; LED1=0;        TING=1;        while( !key1);LED1=1;}delay(20);} //如果key1按鍵按下,P3.3口輸出低電平,指示燈亮。。
  76.       
  77.         if(key1==0){delay(20);if(key1==0){TBUF = 0xFA;         TING=1;        while( !key1); ;}delay(20);}
  78.         if(key2==0){delay(20);if(key2==0){TBUF = 0xFB;         TING=1;        while( !key2); ;}delay(20);}        
  79.                        
  80. if(REND)
  81.   {
  82.    REND=0;
  83.    r++;
  84.    //but[r++&0x0f]=RBUF;
  85.    dat=RBUF;
  86.    }
  87.   if(TEND)
  88.    {
  89.    if(t!=r)
  90.      {
  91.          TEND=0;
  92. //         TBUF=dat;
  93. switch(dat) //接收數(shù)據(jù)判斷
  94. {

  95. case 'G': LED1=1;delay(200         );TBUF = dat;dat=0xee;break;           //  開,并返回數(shù)據(jù)值
  96. case 'K': LED1=0;delay(10);TBUF = dat;dat=0xee;break;           //  關(guān),并返回數(shù)據(jù)值
  97. case 'A': LED2=1;delay(200         );TBUF = dat;dat=0xee;break;           //  開,并返回數(shù)據(jù)值
  98. case 'B': LED2=0;delay(10);TBUF = dat;dat=0xee;break;           //  關(guān),并返回數(shù)據(jù)值
  99.       
  100.         //case 'Y': if(LED1==1){TBUF = 'W';}if(LED1==0){TBUF = 'X';}delay(10);dat=0xee;break;           //  讀輸出口狀態(tài),并返回數(shù)據(jù)值
  101. //case 'Z': LED1=!LED1;delay(10);TBUF = dat;dat=0xee;break;  //  輸出口取反
  102. default:break;                                           //  跳出
  103. }
  104.          t++;
  105.          //TBUF=but[t++&0x0f];
  106.          TING=1;
  107.          }
  108.    }
  109. }

  110. }

  111. /********************************************************************
  112.                             定時器T0
  113. *********************************************************************/
  114. void tm0()interrupt 1 using 1
  115. {
  116. if(RING)
  117.   {
  118.    if(--RCNT==0)
  119.     {
  120.          RCNT=3;
  121.          if(--RBIT==0)
  122.         {
  123.                  RBUF=RDAT;
  124.                  RING=0;
  125.          REND=1;
  126.                 }
  127.                 else
  128.                 {
  129.                  RDAT>>=1;
  130.                  if(RXB)RDAT|=0X80;
  131.                 }

  132.     }
  133.   }
  134.     else if(!RXB)
  135.         {
  136.          RING=1;
  137.          RCNT=4;
  138.          RBIT=9;
  139.         }
  140.     if(--TCNT==0)
  141.         {
  142.         TCNT=3;
  143.         if(TING)
  144.         {
  145.           if(TBIT==0)
  146.           {
  147.           TXB=0;
  148.           TDAT=TBUF;
  149.           TBIT=9;
  150.           }
  151.           else
  152.           {
  153.           TDAT>>=1;
  154.           if(--TBIT==0)
  155.           {
  156.            TXB=1;
  157.            TING=0;
  158.            TEND=1;
  159.           }
  160.           else
  161.           {
  162.           TXB=CY;
  163.           }
  164.           }
  165.         }
  166.         }
  167. }
  168. /********************************************************************
  169.               功能:串口初始化,波特率9600,方式1
  170. *********************************************************************/
  171. void UART_INIT()
  172. {
  173. TING=0;
  174. RING=0;

  175. TEND=1;
  176. REND=0;

  177. TCNT=0;
  178. RCNT=0;
  179. }

  180. /********************************************************************
  181.                             結(jié)束
  182. *********************************************************************/
復(fù)制代碼





回復(fù)

使用道具 舉報

ID:325735 發(fā)表于 2019-2-17 12:16 | 顯示全部樓層
求助下 推免設(shè)置的不對嗎
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2019-2-17 17:40 | 顯示全部樓層
kaixin8318 發(fā)表于 2019-2-17 12:16
求助下 推免設(shè)置的不對嗎

P5M0=0x00;P5M1=0xff; 你這是設(shè)置為高阻,推挽是P5M1=0x00;P5M0=0xff; 。
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2019-2-17 18:13 | 顯示全部樓層
你把端口設(shè)定成推挽之后,單片機就讀不到這個IO的端口狀態(tài)了,所以就不受控制了.
如果你想要有輸出又能讀取狀態(tài),那就不人設(shè)定IO的輸出模式,如果輸出要有一定的電流,那就把P5端口內(nèi)置的上拉電阻使能.
回復(fù)

使用道具 舉報

ID:310519 發(fā)表于 2019-2-17 18:32 | 顯示全部樓層
你這是用的STC的單片機吧?

P5M0=0x00;P5M1=0xff; 這是高阻啊。

應(yīng)該這樣:
P5M0=0xff;P5M1=0x00;
回復(fù)

使用道具 舉報

ID:203000 發(fā)表于 2019-2-17 22:05 | 顯示全部樓層
推挽設(shè)置不對,要單獨寫一段函數(shù):
void port_mode()            // 端口模式
{
        P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
        P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0xFF;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
在void main()加port_mode();
void main()
{
        port_mode();
回復(fù)

使用道具 舉報

ID:325735 發(fā)表于 2019-2-17 23:40 | 顯示全部樓層
wulin 發(fā)表于 2019-2-17 17:40
P5M0=0x00;P5M1=0xff; 你這是設(shè)置為高阻,推挽是P5M1=0x00;P5M0=0xff; 。

謝謝您  我是剛開始研究,什么都不懂呢
我試試
回復(fù)

使用道具 舉報

ID:325735 發(fā)表于 2019-2-17 23:40 | 顯示全部樓層
謝謝大家!我會逐一進行試驗。我是小白,剛開始學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:325735 發(fā)表于 2019-2-17 23:53 | 顯示全部樓層
wulin 發(fā)表于 2019-2-17 17:40
P5M0=0x00;P5M1=0xff; 你這是設(shè)置為高阻,推挽是P5M1=0x00;P5M0=0xff; 。

是我馬虎了,修改過來就好了
回復(fù)

使用道具 舉報

ID:325735 發(fā)表于 2019-2-17 23:54 | 顯示全部樓層
Y_G_G 發(fā)表于 2019-2-17 18:13
你把端口設(shè)定成推挽之后,單片機就讀不到這個IO的端口狀態(tài)了,所以就不受控制了.
如果你想要有輸出又能讀取 ...

謝謝您回復(fù)
回復(fù)

使用道具 舉報

ID:325735 發(fā)表于 2019-2-17 23:54 | 顯示全部樓層
diy1997 發(fā)表于 2019-2-17 18:32
你這是用的STC的單片機吧?

P5M0=0x00;P5M1=0xff; 這是高阻啊。

謝謝指導(dǎo) 正解
回復(fù)

使用道具 舉報

ID:158375 發(fā)表于 2019-2-18 08:18 | 顯示全部樓層
看資料不仔細(xì),看資料很重要,注意細(xì)節(jié)。
回復(fù)

使用道具 舉報

ID:325735 發(fā)表于 2019-2-18 14:53 | 顯示全部樓層
笨笨兔 發(fā)表于 2019-2-18 08:18
看資料不仔細(xì),看資料很重要,注意細(xì)節(jié)。

謝謝,剛開始接觸編程。沒看仔細(xì)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表