標題: 求助!STC89C52RC單片機的引腳問題 [打印本頁]

作者: 葉風(fēng)天寒    時間: 2018-3-25 15:00
標題: 求助!STC89C52RC單片機的引腳問題
為什么STC89C52RC單片機上電后的引腳輸出全部都是低電平?怎樣用C語言程序定義引腳輸出是高電平??

作者: angmall    時間: 2018-3-25 15:59
P0=0xFF;
P1=0xFF;
P2=0xFF;
P3=0xFF;
P4=0xFF;

作者: 葉風(fēng)天寒    時間: 2018-3-25 17:03
angmall 發(fā)表于 2018-3-25 15:59
P0=0xFF;
P1=0xFF;
P2=0xFF;

放在主函數(shù)中,測試后還是上電后引腳都是低電平。實在不知是怎么回事了
作者: 愛愛愛    時間: 2018-3-25 17:03
低電平給零  高電平給1就可以了

作者: 葉風(fēng)天寒    時間: 2018-3-25 17:29
愛愛愛 發(fā)表于 2018-3-25 17:03
低電平給零  高電平給1就可以了

還是不行
作者: wulin    時間: 2018-3-25 17:34
STC89C52RC單片機上電復(fù)位后進入main前所有IO口默認高電平(P0開漏),你要檢查單片機基本工作條件:電源、復(fù)位、振蕩。
作者: 葉風(fēng)天寒    時間: 2018-3-25 18:17
wulin 發(fā)表于 2018-3-25 17:34
STC89C52RC單片機上電復(fù)位后進入main前所有IO口默認高電平(P0開漏),你要檢查單片機基本工作條件:電源、 ...

電源,復(fù)位,振蕩電路都沒有問題,用新的芯片測試過,發(fā)覺STC89C52RC單片機的引腳默認是低電平,只能通過程序控制,不知道要修改程序哪個地方
作者: zwl1980220    時間: 2018-3-25 18:29
先確認一下電源,復(fù)位電路,晶振電路等是否工作正常,再檢查代碼。
作者: huangzixuan    時間: 2018-3-25 19:34
STC89C52RC有4個端口,32個輸出I/O口!P0=0xFF; P1=0xFF; P2=0xFF; P3=0xFF;
作者: wulin    時間: 2018-3-26 22:17
葉風(fēng)天寒 發(fā)表于 2018-3-25 18:17
電源,復(fù)位,振蕩電路都沒有問題,用新的芯片測試過,發(fā)覺STC89C52RC單片機的引腳默認是低電平,只能通過 ...

單片機源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char                 //宏定義
  4. //元器件定義
  5. sbit DY_key1=P3^2; //布防/撤防公用一個鍵
  6. //sbit DY_key2=P3^3; //撤防
  7. sbit DY_BUZZ=P0^4;  //蜂鳴器
  8. sbit DY_rsd=P2^4; //熱釋電輸入
  9. sbit LED_B=P2^3; //布防指示燈
  10. sbit LED_S=P2^0; //發(fā)送消息指示燈
  11. //初始化定義
  12. uchar code somebody[]="SOS";//字符串?dāng)?shù)組
  13. uint Cnt250us=0;                                //250us計時變量
  14. uchar Cnt500ms=0;                                //500ms計時變量
  15. bit Cnt1min=0;                                //1分鐘計時標志位(當(dāng)發(fā)送一條短信后,不能馬上發(fā)送第二條,所以等待一分鐘后再檢測是否有人,有人再發(fā)送短信)
  16. bit flag=0;                                        //布防標志
  17. bit again=0;                                 //1分鐘等待標志
  18. bit Twinkle=1;                                //閃爍標志

  19. void Uart_init()
  20. {
  21.         TMOD=0x22;        //T0方式2、T1方式2
  22.         TH0=0x1A;        //設(shè)置定時重載值250us
  23.         TL0=0x1A;        //8位自動重裝
  24.         TH1=0xfd;        //8位自動重裝
  25.         TL1=0xfd;        //波特率為 9600
  26.         SM0=0;                //設(shè)置串口的工作模式
  27.         SM1=1;                //方式 1
  28.         TF0=0;                //定時器0溢出標志TF0清0
  29.         TR0=1;                //開定時器0
  30.         TR1=1;                //開定時器0
  31. //        REN=1;                //不用開接收
  32. //        ES=1;                //不用開串口中斷
  33. //        EA=1;                //不用開總中斷
  34. }
  35. //按鍵掃描函數(shù)
  36. void keyscan()        
  37. {
  38.         static bit key_sign=0;                //按鍵自鎖標志
  39.         static uchar count=0;                //消抖計數(shù)變量                        
  40.         if(!DY_key1)                                //檢測按鍵如果為0
  41.         {
  42.                 count++;                                //消抖計數(shù)
  43.                 if((count>=250)&&(key_sign==0))
  44.                 {                        
  45.                         key_sign=1;                        //按鍵自鎖標志置1
  46.                         flag=~flag;                        //布防標志取反
  47.                         if(flag==1)
  48.                         {
  49.                                 Cnt250us=0;                //250us計時變量清0
  50.                                 Cnt500ms=0;                //500ms計時變量清0
  51.                                 Cnt1min =0;                //Cnt1min計時變量清0
  52.                                 again=0;                //1分鐘等待標志位置0
  53.                         }
  54.                         else
  55.                         {
  56.                                 LED_B=1;                //布防燈熄滅
  57.                         }
  58.                 }
  59.         }
  60.         else
  61.         {
  62.                 key_sign=0;                                //按鍵自鎖標志清0
  63.                 count=0;                                //消抖計數(shù)清0
  64.         }
  65. }
  66. //計時函數(shù)
  67. void Time()        
  68. {
  69.         if(TF0==1)                                                //查詢定時器溢出標志TF0為1
  70.         {               
  71.                 if(flag==1)                                                //布防標志為1
  72.                 {                                                                //定時器溢出周期250us
  73.                         Cnt250us++;                                        //時間變量Cnt250us自+1
  74.                           if(Cnt250us>=2000)                        //如果時間變量Cnt200us>=2000
  75.                         {                                                        //500毫秒時間到
  76.                                 Cnt250us=0;                                //時間變量Cnt200us清0
  77.                                 Twinkle=~Twinkle;                //閃爍標志取反
  78.                                 Cnt500ms++;                                //時間變量Cnt1s自+1
  79.                                 if(Cnt500ms>=120)                //1分鐘時間到
  80.                                 {                                
  81.                                           Cnt500ms=0;                        //時間變量Cnt500ms清0
  82.                                         Cnt1min=1;                        //1分鐘標志置1
  83.                                         again=1;                        //1分鐘等待標志位置1
  84.                                 }
  85.                         }
  86.                 }
  87.                 TF0=0;                                                //定時器0溢出標志TF0清0
  88.         }
  89. }
  90. void SendASC(uchar d) //串口發(fā)送字符
  91. {
  92.         SBUF=d;  //數(shù)據(jù)賦值到緩沖區(qū)
  93.         while(!TI); //發(fā)送完
  94.         TI=0; //清零
  95. }
  96. void GSM_work()//發(fā)送 GSM 短信
  97. {
  98.         uchar i;
  99.         for(i=0;i<3;i++)
  100.                 SendASC(somebody[i]); //發(fā)送字符;
  101. }
  102. //警報函數(shù)
  103. void alert()
  104. {
  105.         if(flag==1)
  106.         {
  107.                 if(again==0)                                //預(yù)備等待        
  108.                         LED_B=Twinkle;                        //布防燈閃爍
  109.                 else
  110.                 {
  111.                         LED_B=0;                                        //布防燈常亮
  112.                         if(DY_rsd==0)                        //有人入侵
  113.                         {
  114.                                 DY_BUZZ=Twinkle;        //報警
  115.                                 if(Cnt1min==1)                //立即發(fā)送信息,以后隔1分鐘發(fā)送一次信息
  116.                                 {
  117.                                         LED_S=0;                        //發(fā)送指示燈亮
  118.                                         GSM_work();                        //發(fā)送 GSM 短信
  119.                                         Cnt1min=0;                        //1分鐘等待標志位清0
  120.                                 }
  121.                                 if(Twinkle==0)
  122.                                         LED_S=1;                                //發(fā)送指示燈熄滅
  123.                         }
  124.                         else DY_BUZZ=1;                                //蜂鳴器復(fù)位
  125.                 }
  126.         }
  127. }
  128. //主函數(shù)
  129. void main()
  130. {
  131.         Uart_init();                 //初始化定時器
  132.         DY_key1=1;                        //初始化端口
  133. //        DY_key2=1;
  134.         DY_BUZZ=1;
  135.         DY_rsd=1;
  136.         LED_B=1;
  137.         LED_S=1;
  138.         while(1)                        //進入 while 循環(huán)
  139.         {
  140.                 keyscan();                //按鍵
  141.                 Time();                        //計時
  142.                 alert();                        //警報
  143.         }
  144. }
復(fù)制代碼

作者: 夜絮戰(zhàn)袍    時間: 2018-3-27 16:00
晶振電路等是否工作正常
作者: dadiao    時間: 2018-3-27 16:19
輸出管腳接10K電阻上拉到VDD。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1