久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2986|回復: 15
打印 上一主題 下一主題
收起左側

一個簡單的單片機入門程序,用C編寫.不知道錯在哪?希望大佬指點

[復制鏈接]
跳轉到指定樓層
樓主
   利用P1口輸出高低電平,控制繼電器的開合,以實現對外部裝置的控制。
1)利用定時計數器0定時0.5秒,在定時時間到時,通過P1.2控制繼電器每隔0.5秒通斷1次,以便控制LED燈的閃爍。
         2)利用定時計數器1設置為計數模式,通過P3.5所接的按鈕開關給出計數脈沖,每檢測到一個脈沖,控制繼電器通斷1次,以便切換連接在P1.2引腳的LED燈狀態。
  我的理解:繼電器只是個幌子,其實就是一個LED燈,上面兩個要求分開來用兩個程序做我都能實現,問題是放到一個程序中再仿真,什么現象也沒有.
總程序如下,不知道錯在哪,希望大佬指點
#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;                                   //置定時器0工作方式1,計數器1工作方式2

        TH0=0x3c;                                   //設置計數初值,定時100ms
        TL0=0xae;
        TH1=0xff;                                   //計數1個脈沖
        TL1=0xff;
        
        EA=1;                                              //開中斷
        ET0=0;                                           //關定時器0中斷
        ET1=1;                                           //開計數器1中斷

        TF0=0;                                           //清除TF0標志位
        TF1=0;                                           //清除TF1標志位
        TR0=1;                                           //啟動定時器0
        TR1=1;                                           //啟動計數器1
        while (1)
        {
                if(TF0)
                {
                   TF0=0;                                           //清除TF0標志位
                   TH0=0x3c;                                   //重裝初值,定時100ms
               TL0=0xae;
                   P1_0=!P1_0;
                }
        }

}

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:526188 發表于 2019-5-2 22:33 | 只看該作者
本帖最后由 單片機新手375 于 2019-5-2 22:35 編輯

重新附上程序,看得清楚點
#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;  //置定時器0工作方式1,計數器1工作方式2

        TH0=0x3c;     //設置計數初值,定時100ms
        TL0=0xae;
        TH1=0xff;             //計數1個脈沖
        TL1=0xff;
        
        EA=1;         //開中斷
        ET0=0;         //關定時器0中斷
        ET1=1;         //開計數器1中斷

        TF0=0;         //清除TF0標志位
        TF1=0;        //清除TF1標志位
        TR0=1;         //啟動定時器0
        TR1=1;         //啟動計數器1
        while (1)
        {
                if(TF0)
                {
                   TF0=0;          //清除TF0標志位
                   TH0=0x3c;    //重裝初值
                  TL0=0xae;
                   P1_0=!P1_0;
                }
        }

}

void service_int1()interrupt 3 using 3
{
        P1_0=!P1_0;            //自動裝初值
}         
回復

使用道具 舉報

板凳
ID:525872 發表于 2019-5-3 20:39 | 只看該作者
中斷入口必須重新裝載初值
回復

使用道具 舉報

地板
ID:525872 發表于 2019-5-3 20:40 | 只看該作者
中斷入口程序需要重新裝載值,TH1,TL1
回復

使用道具 舉報

5#
ID:185385 發表于 2019-5-3 20:46 | 只看該作者
你那個定時器查詢應該括號內加個感嘆號,然后仿真一下。
回復

使用道具 舉報

6#
ID:213173 發表于 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;  //計數變量
  14. bit flag=1;//中斷標志

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

  34.         P1_0=0;

  35.         while (1)
  36.         {
  37.                 if(TF0)
  38.                 {
  39.                         TF0=0;        //清除TF0標志位
  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;            //自動裝初值
  59. }
復制代碼





回復

使用道具 舉報

7#
ID:526827 發表于 2019-5-4 10:52 來自手機 | 只看該作者
樓主,中斷入口程序需要重新裝載初值,TH1,TL1
回復

使用道具 舉報

8#
ID:525872 發表于 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;//脈沖次數
void int0(void)//中斷計數/定時器0 初始化
{
        TMOD=0X50;//定時器1方式1
       //方式0 13位 8192,最大定時8.192ms;方式1 16位,65536,最大定時65.536ms,不能直接定時100ms
       //方式2 自動裝載8位
        TH1=(65536-1000)/256;        //整除得高位  如12/10=1        定時1ms
        TL1=(65535-1000)%256 ;        //取余得低位   如12%10=2  定時1ms
      //計算按鍵脈沖數數:在定時器計數每50us(定時越小越好,檢測越頻繁)檢測下檢測按鍵脈沖次數
        EA=1;//開總中斷
        ET1=1;TR1=1;//定時器1開啟定時中斷標志
}

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

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

          i==0;  
         }
       if(P3_5==0)//脈沖檢測
         {
           delayms(10); //按鍵消抖10ms
           if(P3_5==0)//再次確認是否被按下
             {
              count++;//計數按鍵脈沖次數,自加一次
              P1_2=0; //按鍵未松開則常亮
              while(!P3_5);//按鍵松開檢測
              i==0;
             }
         }
}
//如有疑問請加qq答疑1124485718;同時啟動兩個定時計數是不合理的,中斷有優先級,除非關閉另一個中斷
回復

使用道具 舉報

9#
ID:467275 發表于 2019-5-4 19:16 | 只看該作者

樓主,中斷入口程序需要重新裝載初值,TH1,TL1
回復

使用道具 舉報

10#
ID:526188 發表于 2019-5-5 09:08 | 只看該作者
18312284784 發表于 2019-5-3 20:40
中斷入口程序需要重新裝載值,TH1,TL1

方式2不是可以自動重裝初值嗎?
我一個用的查詢方式,一個用的中斷方式應該不沖突吧,不是很懂....
回復

使用道具 舉報

11#
ID:526188 發表于 2019-5-5 09:09 | 只看該作者
白羊一只老母豬 發表于 2019-5-3 20:46
你那個定時器查詢應該括號內加個感嘆號,然后仿真一下。

書上的都沒加,他這是判斷為1才執行吧
回復

使用道具 舉報

12#
ID:526188 發表于 2019-5-5 09:14 | 只看該作者

為什么給TH0,TL0賦值兩次?
還有if(1>=10)那一塊看不懂,中斷程序里面為什么只有flag
回復

使用道具 舉報

13#
ID:260597 發表于 2019-5-5 16:24 | 只看該作者
樓主,中斷入口程序需要重新裝載初值,TH1,TL1
回復

使用道具 舉報

14#
ID:526188 發表于 2019-5-7 08:01 | 只看該作者
877140465 發表于 2019-5-5 16:24
樓主,中斷入口程序需要重新裝載初值,TH1,TL1

重裝了,還是不行,再說方式2應該是自動裝初值吧(書上寫的)
回復

使用道具 舉報

15#
ID:528288 發表于 2019-5-7 08:47 | 只看該作者
很好的學習資料
回復

使用道具 舉報

16#
ID:213173 發表于 2019-5-7 08:48 | 只看該作者
單片機新手375 發表于 2019-5-5 09:14
為什么給TH0,TL0賦值兩次?
還有if(1>=10)那一塊看不懂,中斷程序里面為什么只有flag

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久人成影片免费观看 | 日韩一区二区不卡 | 99视频免费看 | 国产人成在线观看 | 亚州激情| 欧美一区二区免费视频 | 国产一二区免费视频 | 在线不卡一区 | 久色网| 国产精品久久久久久久久久东京 | 免费一看一级毛片 | 999久久久精品 | 欧美一区二区在线 | 天天干干| 91在线精品视频 | 欧美在线一区视频 | 久久伊人精品一区二区三区 | 亚洲欧美在线观看 | 欧美久久久电影 | 涩涩视频网站在线观看 | 亚洲精彩免费视频 | 色视频网站免费 | www狠狠干| 亚洲最大看片网站 | 伊人春色成人 | 色综合一区二区三区 | 亚洲电影一区二区三区 | 国产黄色小视频在线观看 | 天天操天天射综合网 | 丁香综合 | 欧美一区二区三区四区视频 | 特级黄一级播放 | 综合久久久 | 亚洲乱码一区二区三区在线观看 | 中文成人在线 | 天天天操天天天干 | 久草新在线 | 亚洲成人999 | 久久久久久久一区 | 国产亚洲网站 | 久久精品中文字幕 |