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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機睡眠-外中斷INT0 INT1喚醒(匯編+C語言程序)

[復制鏈接]
跳轉到指定樓層
樓主
ID:279997 發表于 2019-2-10 22:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
跟大家分享在網上尋找好久資料之后又自己改編的一個可以睡眠的程序,可以用來進行對靜態功耗有要求的項目。

單片機源程序如下:
  1. /*************        本程序功能說明        **************

  2. 用STC的MCU的IO方式控制74HC595驅動8位數碼管。

  3. 用戶可以修改宏來選擇時鐘頻率.

  4. 顯示效果為: 上電后顯示秒計數, 計數范圍為0~255,顯示在右邊的3個數碼管.

  5. 顯示5秒后, 睡眠. 按板上的AW17 SW18喚醒, 繼續計秒顯示. 5秒后再睡眠.

  6. 如果MCU在準備睡眠時, AW17 SW18任一鍵或兩鍵同時按著(INT0 INT1任一個或兩個同時為低電平),

  7. 則MCU不睡眠, 直到INT0 INT1都為高電平為止.


  8. ******************************************/

  9. #define MAIN_Fosc                22118400L        //定義主時鐘

  10. #include        "STC15Fxxxx.H"

  11. #define DIS_DOT                0x20
  12. #define DIS_BLACK        0x10
  13. #define DIS_                0x11

  14. /****************************** 用戶定義宏 ***********************************/

  15. #define                Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中斷頻率, 1000次/秒

  16. /*****************************************************************************/






  17. /*************        本地常量聲明        **************/
  18. u8 code t_display[]={                                                //標準字庫
  19. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  20.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  21. //black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y
  22.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  23.         0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

  24. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位碼



  25. /*************        IO口定義        **************/
  26. sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
  27. sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
  28. sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock

  29. /*************        本地變量聲明        **************/

  30. u8         LED8[8];                //顯示緩沖
  31. u8        display_index;        //顯示位索引
  32. u16        msecond;                //1000ms計數

  33. u8        Test_cnt;        //測試用的秒計數變量
  34. u8        SleepDelay;        //喚醒后再進入睡眠所延時的時間

  35. void        delay_ms(u8 ms);
  36. void        Display(void);
  37. void         DisplayScan(void);




  38. /********************** 主函數 ************************/
  39. void main(void)
  40. {
  41.         u8        i;
  42.        
  43.         P0M1 = 0;        P0M0 = 0;        //設置為準雙向口
  44.         P1M1 = 0;        P1M0 = 0;        //設置為準雙向口
  45.         P2M1 = 0;        P2M0 = 0;        //設置為準雙向口
  46.         P3M1 = 0;        P3M0 = 0;        //設置為準雙向口
  47.         P4M1 = 0;        P4M0 = 0;        //設置為準雙向口
  48.         P5M1 = 0;        P5M0 = 0;        //設置為準雙向口
  49.         P6M1 = 0;        P6M0 = 0;        //設置為準雙向口
  50.         P7M1 = 0;        P7M0 = 0;        //設置為準雙向口

  51.         display_index = 0;
  52.         for(i=0; i<8; i++)        LED8[i] = DIS_BLACK;        //全部消隱
  53.        
  54.         Test_cnt = 0;        //秒計數范圍為0~255
  55.         SleepDelay = 0;
  56.         LED8[5] = 0;
  57.         LED8[6] = 0;
  58.         LED8[7] = 0;
  59.        
  60.         EA = 1;                //允許總中斷

  61.         while(1)
  62.         {
  63.                 delay_ms(1);        //延時1ms
  64.                 DisplayScan();
  65.                
  66.                 if(++msecond >= 1000)        //1秒到
  67.                 {
  68.                         msecond = 0;                //清1000ms計數
  69.                         Test_cnt++;                        //秒計數+1
  70.                         LED8[5] = Test_cnt / 100;
  71.                         LED8[6] = (Test_cnt % 100) / 10;
  72.                         LED8[7] = Test_cnt % 10;

  73.                         if(++SleepDelay >= 5)        //5秒后睡眠
  74.                         {
  75.                                 SleepDelay = 0;

  76.                                 if(INT0 && INT1)        //兩個中斷都是高電平時才進入睡眠,下降沿喚醒。
  77.                                 {
  78.                                         SleepDelay = 0;
  79.                                         P_HC595_SER = 0;
  80.                                         for(i=0; i<16; i++)                //先關閉顯示,省電
  81.                                         {
  82.                                                 P_HC595_SRCLK = 1;
  83.                                                 P_HC595_SRCLK = 0;
  84.                                         }
  85.                                         P_HC595_RCLK = 1;
  86.                                         P_HC595_RCLK = 0;                //鎖存輸出數據

  87.                                         IE1  = 0;        //外中斷1標志位
  88.                                         IE0  = 0;        //外中斷0標志位
  89.                                         EX1 = 1;        //INT1 Enable
  90.                                         EX0 = 1;        //INT0 Enable

  91.                                         IT0 = 1;                //INT0 下降沿中斷               
  92.                                 //        IT0 = 0;                //INT0 上升,下降沿中斷       
  93.                                         IT1 = 1;                //INT1 下降沿中斷               
  94.                                 //        IT1 = 0;                //INT1 上升,下降沿中斷       

  95.                                         PCON |= 0x02;        //Sleep
  96.                                         _nop_();
  97.                                         _nop_();
  98.                                         _nop_();
  99.                                 }
  100.                         }
  101.                 }
  102.         }
  103. }
  104. /**********************************************/

  105. //========================================================================
  106. // 函數: void  delay_ms(unsigned char ms)
  107. // 描述: 延時函數。
  108. // 參數: ms,要延時的ms數, 這里只支持1~255ms. 自動適應主時鐘.
  109. // 返回: none.
  110. // 版本: VER1.0
  111. // 日期: 2013-4-1
  112. // 備注:
  113. //========================================================================
  114. void  delay_ms(u8 ms)
  115. {
  116.      u16 i;
  117.          do{
  118.               i = MAIN_Fosc / 13000;
  119.                   while(--i)        ;   //14T per loop
  120.      }while(--ms);
  121. }


  122. /********************* INT0中斷函數 *************************/
  123. void INT0_int (void) interrupt INT0_VECTOR                //進中斷時已經清除標志
  124. {
  125.         EX0 = 0;        //INT0 Disable
  126.         IE0 = 0;        //外中斷0標志位
  127. }

  128. /********************* INT1中斷函數 *************************/
  129. void INT1_int (void) interrupt INT1_VECTOR                //進中斷時已經清除標志
  130. {
  131.         EX1 = 0;        //INT1 Disable
  132.         IE1 = 0;        //外中斷1標志位
  133. }



  134. /**************** 向HC595發送一個字節函數 ******************/
  135. void Send_595(u8 dat)
  136. {               
  137.         u8        i;
  138.         for(i=0; i<8; i++)
  139.         {
  140.                 dat <<= 1;
  141.                 P_HC595_SER   = CY;
  142.                 P_HC595_SRCLK = 1;
  143.                 P_HC595_SRCLK = 0;
  144.         }
  145. }

  146. /********************** 顯示掃描函數 ************************/
  147. void DisplayScan(void)
  148. {       
  149.         Send_595(~T_COM[display_index]);                                //輸出位碼
  150.         Send_595(t_display[LED8[display_index]]);        //輸出段碼

  151.         P_HC595_RCLK = 1;
  152.         P_HC595_RCLK = 0;                                                        //鎖存輸出數據
  153.         if(++display_index >= 8)        display_index = 0;        //8位結束回0
  154. }
復制代碼

所有資料51hei提供下載:
單片機睡眠-外中斷INT0 INT1喚醒.zip (31.11 KB, 下載次數: 49)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:517794 發表于 2020-2-18 17:51 | 只看該作者
是好家伙!!!竟然沒人點贊,我來頂
回復

使用道具 舉報

板凳
ID:481011 發表于 2021-8-23 00:03 | 只看該作者
這是嘗試修改的掉電延時代碼,睡了之后,醒不過來了。。。求老大幫忙看看。
#include "reg51.h"
#include "intrins.h"
sfr WKTCL=0xAA;
sfr WKTCH=0xAB;
sbit LED1=P3^3;
void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;
        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
}
void Delayms(unsigned int n)
{
   do
   {
          Delay1ms();
   }while(n--);
}
void main()
{
    unsigned char i;
          WKTCL = 49;      //488us*(49+1) = 24.4ms
    WKTCH = 0x80;     
    LED1=1;
       while(1)
       {
         i=2;      
          while(i--)
           {
            PCON = 0x02;   
            _nop_();            
            _nop_();
                                         }
                                                LED1=0;
                   Delayms(100);
                        LED1=1;
                        Delayms(100);
                        LED1=0;
                        Delayms(100);
                        LED1=1;
                        Delayms(500);
                        LED1=0;
                        Delayms(100);
                        LED1=1;                                                  
        }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩a在线观看 | 欧美一级二级视频 | 亚洲午夜在线 | 国产精品日韩欧美一区二区 | 久久国产精品视频 | 亚洲精品乱码8久久久久久日本 | 成人一区二区三区在线观看 | 水蜜桃久久夜色精品一区 | 成人免费在线观看视频 | 国产精品一区二区三区免费观看 | 最新免费黄色网址 | 国产欧美一区二区精品忘忧草 | 少妇精品亚洲一区二区成人 | 91精品国产综合久久久动漫日韩 | 亚洲成人网在线播放 | 91色网站| 欧美中文一区 | 福利久久 | 免费一区二区三区在线视频 | 黄色一级免费 | 国产免费一区二区三区 | 久久三区| 综合中文字幕 | 一区二区三区精品视频 | 在线亚洲欧美 | a欧美| 午夜av一区二区 | 亚洲xxxxx| 96国产精品久久久久aⅴ四区 | 国产免费福利 | 亚洲免费网 | 国产精品不卡一区 | 韩日av在线 | 三级视频在线观看 | 中文字幕在线播放第一页 | 日韩在线视频免费观看 | 精品日韩| 自拍视频一区二区三区 | 免费黄色av网站 | 精品视频在线播放 | 免费毛片网 |