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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2159|回復: 6
收起左側

想做手電驅動 stc8g1k單片機這個代碼有點問題

[復制鏈接]
ID:1062408 發表于 2023-8-2 11:56 | 顯示全部樓層 |閱讀模式
我的要求是接通電源led1先亮然后按一下開關en亮再按都不亮電流ua睡眠模式再按開關回到開頭led1亮
現在問題是接通電源led1亮,按一下開關en亮,再按一下睡眠都不亮,然后再按幾下開關(快速按十下左右或慢按十下左右)才能回到led1亮的狀態
本來想搞手電斷電換擋,搞不定先搞這個不斷電開關換擋要求關掉電流要ua,斷電換擋有沒有大神有代碼也給個
手電驅動.jpg
單片機代碼如下
  1. #include "STC8G.H"
  2. #include<intrins.h>
  3. #define MAIN_Fosc                12000000L
  4. typedef unsigned char uchar;
  5. typedef unsigned int uint;


  6. sbit LED=P5^4;
  7. //sbit LED2=P5^5;
  8. sbit EN=P5^5;
  9. sbit key=P3^2;
  10. sbit INT0=P3^2;
  11. uchar count=0,count1=0;
  12. uint num=0;
  13. bit i=0,j=0;


  14. /*void  delay_ms(uint a)
  15. {
  16.         unsigned int i;
  17.         do
  18.         {
  19.                 i = MAIN_Fosc / 10000L;
  20.                 while(--i)        ;
  21.         }while(--a);
  22. }
  23. /**************中斷服務程序*****************/
  24. void delay(uint a)
  25. {
  26.         uint i,j;
  27.         for(i=0;i<a;i++)
  28.                 for(j=0;j<500;j++);
  29. }


  30. void INT0_Isr() interrupt 0
  31. {
  32. //P32 = !P32;                                 //測試端口


  33.                      EA=1;
  34.                 IT0=1;
  35.                 EX0=1;
  36.                 PCON=0x00;                             
  37. }
  38. void Timer0Init()        //500微秒@12.000MHz
  39. {
  40.         TMOD |= 0x01;                //設置定時器模式
  41.         TL0 = 0x0C;                //設置定時初值
  42.         TH0 = 0xFE;                //設置定時初值
  43.         TR0 = 1;                //定時器0開始計時
  44.         EA = 1;
  45.         ET0 = 1;
  46. }


  47. void main()
  48. {
  49.         P1M0 = 0x00; P1M1 = 0x00;
  50.        //P1口設置為準雙向口
  51.             P3M0 = 0x00; P3M1 = 0x04;
  52.     //P3M0 = 0x00; P3M1 = 0x00;
  53.         //P3口設置為準雙向口
  54.             P5M0 = 0x00; P5M1 = 0x00;
  55.         
  56.          //LED2=1;
  57.         Timer0Init();
  58.         while(1)
  59.         {
  60.                 if(key==0)
  61.                 {
  62.                         delay(20);
  63.                         if(key==0)
  64.                         {
  65.                                 count++;
  66.                                 if(count>2)
  67.                                         count=0;
  68.                                 while(!key);
  69.                         }
  70.                 }
  71.                                                                     
  72.      
  73.                      
  74.                        
  75.      
  76.         }
  77. }
  78. /**************中斷服務程序*****************/
  79. void timer0() interrupt        1        //500微秒@12.000MHz
  80. {
  81.         TL0 = 0x0C;                //設置定時初值
  82.         TH0 = 0xFE;                //設置定時初值
  83.         i=~i;
  84.         if(count==0){LED=0;EN=1;}
  85.         /*if(count!=0)
  86.         {
  87.                 num++;
  88.                 if(num<=9600)
  89.                         j=1;
  90.                 else j=0;
  91.                 if(num>=10000)
  92.                         num=0;
  93.         }*/
  94.         if(count==1){LED=1;EN=0;}
  95.         if(count==2)
  96.                                         {  
  97.                                                      EN=1;
  98.                  IT0 = 1;                //INT0 下降沿中斷               
  99.                 IE0 = 0;                //清除外中斷0標志位
  100.                 _nop_();
  101.                 _nop_();
  102.                 EX0 = 1;                //INT0 允許中斷
  103.                 _nop_();
  104.                 _nop_();
  105.                 PCON |= 0x02;        //Sleep
  106.                 _nop_();
  107.                 _nop_();
  108.                 _nop_();
  109.                   
  110.          }
  111. }                  
復制代碼

      

回復

使用道具 舉報

ID:1087948 發表于 2023-8-2 14:45 | 顯示全部樓層
根據您提供的代碼,我看到你已經實現了按一下開關EN后LED1亮,并按一下EN后進入睡眠模式。但是你遇到了一些問題:再按一下EN時不亮,需要按幾下EN才能回到LED1亮的狀態。

首先,讓我們來看一下你的代碼中的一些問題:

在INT0_Isr()函數中,你設置了EA=1和IT0=1以及EX0=1。這些設置應該在main()函數中進行,而不是在中斷服務程序中。

在timer0()中斷服務程序中,你使用了if(count==2)條件來處理EN亮的情況。但是你沒有給count重新賦值的語句,導致當count為2時,無法執行任何操作。你可以添加類似count = 0;的語句來重新初始化count變量。

在timer0()中斷服務程序中,你使用了PCON |= 0x02;來使芯片進入睡眠模式。但是在STC8系列單片機中,要進入睡眠模式,還需要設置PCON寄存器的其他位。例如,你可以使用PCON |= 0x03;來設置Power-down模式。

解決這些問題后,你可以嘗試以下步驟來實現你的要求:

將EA=1,IT0=1和EX0=1的設置放在main()函數中。

在timer0()中斷服務程序中,添加count = 0;來重新初始化count變量。

修改timer0()中斷服務程序中的PCON |= 0x02;為PCON |= 0x03;來設置Power-down模式。

請注意,在睡眠模式下,所有的IO口都會被禁止,所以你需要確保EN引腳在進入睡眠模式前已經被拉低。

另外,如果你希望在按一下EN后再按也能回到LED1亮的狀態,你可能需要在INT0_Isr()中加入相關的邏輯來實現這個功能。你可以使用一個狀態變量來記錄當前的狀態,根據按下EN的次數進行切換。

最后,關于手電斷電換擋的問題,這涉及到更復雜的電路設計和控制算法,可能超出了這個問題的范圍。建議您參考相關的電路設計資料或咨詢專業人士來獲取更詳細的幫助。
回復

使用道具 舉報

ID:1062408 發表于 2023-8-2 15:19 | 顯示全部樓層
count = 0有了,這個程序就是一鍵循環改的,就是按一下開關1個io口亮,再按下另一個io口亮,再按下都不亮,循環,現在就是再按下都不亮這第三個狀態加入睡眠低功耗模式使電流降到ua,但現在問題就是睡眠后要按十次左右按鍵才能回到第一個狀態led1,這個感覺有點無法理解,為什么要按十次
回復

使用道具 舉報

ID:161164 發表于 2023-8-2 16:22 | 顯示全部樓層
可能是因為在定時中斷里睡眠然后外中斷喚醒引起中斷沖突
可參考以下代碼
  1. #include "STC8G.H"
  2. #include<intrins.h>
  3. #define MAIN_Fosc                12000000L
  4. typedef unsigned char uchar;
  5. typedef unsigned int uint;
  6. sbit LED=P5^4;
  7. //sbit LED2=P5^5;
  8. sbit EN=P5^5;
  9. sbit key=P3^2;
  10. sbit INT0=P3^2;
  11. uchar count=0,count1=0;
  12. uint num=0;
  13. bit i=0,j=0;
  14. /**************中斷服務程序*****************/
  15. void delay(uint a)
  16. {
  17.         uint i,j;
  18.         for(i=0; i<a; i++)
  19.                 for(j=0; j<500; j++);
  20. }
  21. void INT0_Isr() interrupt 0
  22. {
  23.         EX0=0;
  24.         PCON=0x00;
  25.         count = 3;
  26. }
  27. void Timer0Init()        //500微秒@12.000MHz
  28. {
  29.         TMOD |= 0x01;                //設置定時器模式
  30.         TL0 = 0x0C;                //設置定時初值
  31.         TH0 = 0xFE;                //設置定時初值
  32.         TR0 = 1;                //定時器0開始計時
  33.         EA = 1;
  34.         ET0 = 1;
  35. }
  36. void main()
  37. {
  38.         P3M0 = 0x00;
  39.         P3M1 = 0x04;
  40.         //P3M0 = 0x00; P3M1 = 0x00;
  41.         //P3口設置為準雙向口
  42.         P5M0 = 0x00;
  43.         P5M1 = 0x00;
  44.         //LED2=1;
  45.         Timer0Init();
  46.         IT0 = 1;                //INT0 下降沿中斷
  47.         while(1)
  48.         {
  49.                 if(count==0)
  50.                 {
  51.                         LED=0;
  52.                         EN=1;
  53.                 }
  54.                 if(count==1)
  55.                 {
  56.                         LED=1;
  57.                         EN=0;
  58.                 }
  59.                 if(count==2)
  60.                 {
  61.                         EN=1;
  62.                         IE0 = 0;                //清除外中斷0標志位
  63.                         _nop_();
  64.                         _nop_();
  65.                         EX0 = 1;                //INT0 允許中斷
  66.                         _nop_();
  67.                         _nop_();
  68.                         PCON |= 0x02;        //Sleep
  69.                         _nop_();
  70.                         _nop_();
  71.                         _nop_();
  72.                 }
  73.         }
  74. }
  75. /**************中斷服務程序*****************/
  76. void timer0() interrupt        1        //500微秒@12.000MHz
  77. {
  78.         static uint delay_xd= 0;
  79.         TL0 = 0x0C;                //設置定時初值
  80.         TH0 = 0xFE;                //設置定時初值
  81.         if(key)
  82.         {
  83.                 if(delay_xd)
  84.                 {
  85.                         delay_xd--;
  86.                         if(!delay_xd)
  87.                         {
  88.                                 count++;
  89.                                 if(count>2)count=0;
  90.                         }
  91.                 }
  92.         }else{
  93.                 delay_xd= 40;
  94.         }
  95. }
復制代碼



回復

使用道具 舉報

ID:213173 發表于 2023-8-2 17:12 | 顯示全部樓層
這個示例與你的需求非常接近,稍改一下即可滿足。
一鍵開關機(掉電喚醒).rar (12.61 KB, 下載次數: 13)

回復

使用道具 舉報

ID:1062408 發表于 2023-8-2 18:57 | 顯示全部樓層
lkc8210 發表于 2023-8-2 16:22
可能是因為在定時中斷里睡眠然后外中斷喚醒引起中斷沖突
可參考以下代碼

搞定了要p3.2要設置準雙向口,這里高手就是多,非常感謝,接下來自己研究下斷電換擋
回復

使用道具 舉報

ID:155785 發表于 2023-8-11 23:50 | 顯示全部樓層
大佬搞定沒,最近也在做這個玩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级大片 | 久久久久久久久一区 | 久久久免费少妇高潮毛片 | 在线国产一区二区 | 久久久夜 | 韩国av电影网 | 黄色网络在线观看 | 亚洲欧美一区二区三区视频 | 精品日韩 | 国产精品久久久久久久久久久久 | 在线午夜 | 国产黄色小视频在线观看 | 久久久成人动漫 | 国产91精品在线 | 亚洲一区中文字幕在线观看 | 欧美精品一区二区三区在线播放 | 黄 色 毛片免费 | 国产高清在线观看 | 欧美在线一区二区视频 | 天天夜干| 日韩精品一区二区三区中文字幕 | 一区二区三区四区五区在线视频 | 精品欧美乱码久久久久久 | 欧美视频日韩 | 国产一级免费视频 | 91天堂网| 黄色中文字幕 | 欧美xxxx日本| 91 视频网站| 免费一级淫片aaa片毛片a级 | www.干| 久久久久国产精品免费免费搜索 | 玖玖综合在线 | 亚洲视频在线观看一区二区三区 | 国产欧美在线一区二区 | 久久久www成人免费无遮挡大片 | 中文字幕二区 | 久艹网站 | 精品一二三区 | 成人精品一区二区三区中文字幕 | 91操操操|