標(biāo)題: 一個(gè)簡(jiǎn)單的單片機(jī)入門(mén)程序,用C編寫(xiě).不知道錯(cuò)在哪?希望大佬指點(diǎn) [打印本頁(yè)]

作者: 單片機(jī)新手375    時(shí)間: 2019-5-2 22:31
標(biāo)題: 一個(gè)簡(jiǎn)單的單片機(jī)入門(mén)程序,用C編寫(xiě).不知道錯(cuò)在哪?希望大佬指點(diǎn)
   利用P1口輸出高低電平,控制繼電器的開(kāi)合,以實(shí)現(xiàn)對(duì)外部裝置的控制。
1)利用定時(shí)計(jì)數(shù)器0定時(shí)0.5秒,在定時(shí)時(shí)間到時(shí),通過(guò)P1.2控制繼電器每隔0.5秒通斷1次,以便控制LED燈的閃爍。
         2)利用定時(shí)計(jì)數(shù)器1設(shè)置為計(jì)數(shù)模式,通過(guò)P3.5所接的按鈕開(kāi)關(guān)給出計(jì)數(shù)脈沖,每檢測(cè)到一個(gè)脈沖,控制繼電器通斷1次,以便切換連接在P1.2引腳的LED燈狀態(tài)。
  我的理解:繼電器只是個(gè)幌子,其實(shí)就是一個(gè)LED燈,上面兩個(gè)要求分開(kāi)來(lái)用兩個(gè)程序做我都能實(shí)現(xiàn),問(wèn)題是放到一個(gè)程序中再仿真,什么現(xiàn)象也沒(méi)有.
總程序如下,不知道錯(cuò)在哪,希望大佬指點(diǎn)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit P1_0=P1^0;
sbit P3_5=P3^5;
void delayms(uint xms)
{
        uint i,j;
        for(i=0;i<xms;i++)
                for(j=0;j<110;j++) ;
}

void main(void)
{
        TMOD=0x61;                                   //置定時(shí)器0工作方式1,計(jì)數(shù)器1工作方式2

        TH0=0x3c;                                   //設(shè)置計(jì)數(shù)初值,定時(shí)100ms
        TL0=0xae;
        TH1=0xff;                                   //計(jì)數(shù)1個(gè)脈沖
        TL1=0xff;
        
        EA=1;                                              //開(kāi)中斷
        ET0=0;                                           //關(guān)定時(shí)器0中斷
        ET1=1;                                           //開(kāi)計(jì)數(shù)器1中斷

        TF0=0;                                           //清除TF0標(biāo)志位
        TF1=0;                                           //清除TF1標(biāo)志位
        TR0=1;                                           //啟動(dòng)定時(shí)器0
        TR1=1;                                           //啟動(dòng)計(jì)數(shù)器1
        while (1)
        {
                if(TF0)
                {
                   TF0=0;                                           //清除TF0標(biāo)志位
                   TH0=0x3c;                                   //重裝初值,定時(shí)100ms
               TL0=0xae;
                   P1_0=!P1_0;
                }
        }

}

void service_int1()interrupt 3 using 3
{
        P1_0=!P1_0;                                   //自動(dòng)裝初值
}         


作者: 單片機(jī)新手375    時(shí)間: 2019-5-2 22:33
本帖最后由 單片機(jī)新手375 于 2019-5-2 22:35 編輯

重新附上程序,看得清楚點(diǎn)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit P1_0=P1^0;
sbit P3_5=P3^5;
void delayms(uint xms)
{
        uint i,j;
        for(i=0;i<xms;i++)
                for(j=0;j<110;j++) ;
}

void main(void)
{
        TMOD=0x61;  //置定時(shí)器0工作方式1,計(jì)數(shù)器1工作方式2

        TH0=0x3c;     //設(shè)置計(jì)數(shù)初值,定時(shí)100ms
        TL0=0xae;
        TH1=0xff;             //計(jì)數(shù)1個(gè)脈沖
        TL1=0xff;
        
        EA=1;         //開(kāi)中斷
        ET0=0;         //關(guān)定時(shí)器0中斷
        ET1=1;         //開(kāi)計(jì)數(shù)器1中斷

        TF0=0;         //清除TF0標(biāo)志位
        TF1=0;        //清除TF1標(biāo)志位
        TR0=1;         //啟動(dòng)定時(shí)器0
        TR1=1;         //啟動(dòng)計(jì)數(shù)器1
        while (1)
        {
                if(TF0)
                {
                   TF0=0;          //清除TF0標(biāo)志位
                   TH0=0x3c;    //重裝初值
                  TL0=0xae;
                   P1_0=!P1_0;
                }
        }

}

void service_int1()interrupt 3 using 3
{
        P1_0=!P1_0;            //自動(dòng)裝初值
}         
作者: 18312284784    時(shí)間: 2019-5-3 20:39
中斷入口必須重新裝載初值
作者: 18312284784    時(shí)間: 2019-5-3 20:40
中斷入口程序需要重新裝載值,TH1,TL1
作者: 白羊一只老母豬    時(shí)間: 2019-5-3 20:46
你那個(gè)定時(shí)器查詢(xún)應(yīng)該括號(hào)內(nèi)加個(gè)感嘆號(hào),然后仿真一下。
作者: wulin    時(shí)間: 2019-5-4 07:06
本帖最后由 wulin 于 2019-5-4 08:15 編輯


  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit P1_0=P1^0;
  5. sbit P3_5=P3^5;
  6. /*
  7. void delayms(uint xms)
  8. {
  9.         uint i,j;
  10.         for(i=0;i<xms;i++)
  11.                 for(j=0;j<110;j++) ;
  12. }*/
  13. uchar i=0;  //計(jì)數(shù)變量
  14. bit flag=1;//中斷標(biāo)志

  15. void main(void)
  16. {
  17.         TMOD=0x61;  //置定時(shí)器0工作方式1,計(jì)數(shù)器1工作方式2
  18.        
  19.         TH0=0x3C;        //設(shè)置定時(shí)初值,定時(shí)50ms
  20.         TL0=0xB0;
  21. //        TH0=0x3c;     //設(shè)置計(jì)數(shù)初值,定時(shí)100ms
  22. //        TL0=0xae;
  23.         TH1=0xff;             //計(jì)數(shù)1個(gè)脈沖
  24.         TL1=0xff;
  25.        
  26.         EA=1;         //開(kāi)中斷
  27.         ET0=0;         //關(guān)定時(shí)器0中斷
  28.         ET1=1;         //開(kāi)計(jì)數(shù)器1中斷
  29.        
  30.         TF0=0;         //清除TF0標(biāo)志位
  31.         TF1=0;        //清除TF1標(biāo)志位
  32.         TR0=1;         //啟動(dòng)定時(shí)器0
  33.         TR1=1;         //啟動(dòng)計(jì)數(shù)器1

  34.         P1_0=0;

  35.         while (1)
  36.         {
  37.                 if(TF0)
  38.                 {
  39.                         TF0=0;        //清除TF0標(biāo)志位
  40.                         TH0=0x3C;    //重裝初值
  41.                         TL0=0xB0;               
  42. //                        TH0=0x3c;    //重裝初值
  43. //                        TL0=0xae;
  44.                         i++;
  45.                         if(i>=10)        //0.5秒
  46.                         {
  47.                                 i=0;
  48.                                 if(flag)
  49.                                         P1_0=~P1_0;
  50.                                 else
  51.                                         P1_0=0;
  52.                         }
  53.                 }
  54.         }
  55. }

  56. void service_int1()interrupt 3 using 3
  57. {
  58.         flag=~flag;            //自動(dòng)裝初值
  59. }
復(fù)制代碼






作者: 5201312    時(shí)間: 2019-5-4 10:52
樓主,中斷入口程序需要重新裝載初值,TH1,TL1
作者: 18312284784    時(shí)間: 2019-5-4 12:03
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit P1_2=P1^2;
sbit P3_5=P3^5;

uchar count=0;//脈沖次數(shù)
void int0(void)//中斷計(jì)數(shù)/定時(shí)器0 初始化
{
        TMOD=0X50;//定時(shí)器1方式1
       //方式0 13位 8192,最大定時(shí)8.192ms;方式1 16位,65536,最大定時(shí)65.536ms,不能直接定時(shí)100ms
       //方式2 自動(dòng)裝載8位
        TH1=(65536-1000)/256;        //整除得高位  如12/10=1        定時(shí)1ms
        TL1=(65535-1000)%256 ;        //取余得低位   如12%10=2  定時(shí)1ms
      //計(jì)算按鍵脈沖數(shù)數(shù):在定時(shí)器計(jì)數(shù)每50us(定時(shí)越小越好,檢測(cè)越頻繁)檢測(cè)下檢測(cè)按鍵脈沖次數(shù)
        EA=1;//開(kāi)總中斷
        ET1=1;TR1=1;//定時(shí)器1開(kāi)啟定時(shí)中斷標(biāo)志
}

void main(void)
{
        int0();//  定時(shí)器0/定時(shí)器1中斷初始化   
        while (1);
}

void service_int1()interrupt 3  //定時(shí)器1定時(shí)/計(jì)數(shù)入口
{
        TH1=(65536-1000)/256;//重新裝載定時(shí)初值  
        TL1=(65535-1000)%256 ;       
        uchar i=0;
        i++;
        if(i==500)    //0.5s=500ms=1ms*500,500次中斷即為500ms
         {
          P1_2=~P1_2;
          //取反實(shí)現(xiàn)0.5s閃爍;剛開(kāi)始默認(rèn)P1_2為1,直接接led則燈滅,接繼電器則燈是亮

          i==0;  
         }
       if(P3_5==0)//脈沖檢測(cè)
         {
           delayms(10); //按鍵消抖10ms
           if(P3_5==0)//再次確認(rèn)是否被按下
             {
              count++;//計(jì)數(shù)按鍵脈沖次數(shù),自加一次
              P1_2=0; //按鍵未松開(kāi)則常亮
              while(!P3_5);//按鍵松開(kāi)檢測(cè)
              i==0;
             }
         }
}
//如有疑問(wèn)請(qǐng)加qq答疑1124485718;同時(shí)啟動(dòng)兩個(gè)定時(shí)計(jì)數(shù)是不合理的,中斷有優(yōu)先級(jí),除非關(guān)閉另一個(gè)中斷

作者: 艱難018jin    時(shí)間: 2019-5-4 19:16

樓主,中斷入口程序需要重新裝載初值,TH1,TL1
作者: 單片機(jī)新手375    時(shí)間: 2019-5-5 09:08
18312284784 發(fā)表于 2019-5-3 20:40
中斷入口程序需要重新裝載值,TH1,TL1

方式2不是可以自動(dòng)重裝初值嗎?
我一個(gè)用的查詢(xún)方式,一個(gè)用的中斷方式應(yīng)該不沖突吧,不是很懂....
作者: 單片機(jī)新手375    時(shí)間: 2019-5-5 09:09
白羊一只老母豬 發(fā)表于 2019-5-3 20:46
你那個(gè)定時(shí)器查詢(xún)應(yīng)該括號(hào)內(nèi)加個(gè)感嘆號(hào),然后仿真一下。

書(shū)上的都沒(méi)加,他這是判斷為1才執(zhí)行吧
作者: 單片機(jī)新手375    時(shí)間: 2019-5-5 09:14
wulin 發(fā)表于 2019-5-4 07:06

為什么給TH0,TL0賦值兩次?
還有if(1>=10)那一塊看不懂,中斷程序里面為什么只有flag
作者: 877140465    時(shí)間: 2019-5-5 16:24
樓主,中斷入口程序需要重新裝載初值,TH1,TL1
作者: 單片機(jī)新手375    時(shí)間: 2019-5-7 08:01
877140465 發(fā)表于 2019-5-5 16:24
樓主,中斷入口程序需要重新裝載初值,TH1,TL1

重裝了,還是不行,再說(shuō)方式2應(yīng)該是自動(dòng)裝初值吧(書(shū)上寫(xiě)的)
作者: 物聯(lián)傳感小雨    時(shí)間: 2019-5-7 08:47
很好的學(xué)習(xí)資料
作者: wulin    時(shí)間: 2019-5-7 08:48
單片機(jī)新手375 發(fā)表于 2019-5-5 09:14
為什么給TH0,TL0賦值兩次?
還有if(1>=10)那一塊看不懂,中斷程序里面為什么只有flag

如果我給你改好的程序你只是粗略的看一眼,根本就沒(méi)有試,甚至把 i 看成1,我就沒(méi)有興趣做多余的解釋了。




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