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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1655|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

初學(xué)者求修改單片機(jī)掉電模式過程中自動(dòng)喚醒且可手動(dòng)喚醒的程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
200黑幣
硬件:
1、使用stc8g1k08a-8pin單片機(jī)
2、手動(dòng)按鍵(sdkey)、設(shè)置按鍵(szkey)、3個(gè)指示燈,輸出led燈。
程序需求:
1、按設(shè)置鍵設(shè)置led燈亮的時(shí)間,
(指示燈1亮表示3秒、
   指示燈2亮表示6秒、
   指示燈3亮表示9秒、
   指示燈3和1亮表示12秒
   指示燈3和2亮表示15秒
   指示燈3和2和1全亮表示18秒)
2、設(shè)置后按(sdkey)鍵可驗(yàn)證led運(yùn)行時(shí)間、
3、led滅后10秒進(jìn)入掉電模式,掉電模式24小時(shí)后,led自動(dòng)按設(shè)置時(shí)長亮燈,10秒后再次進(jìn)入掉電模式,如此循環(huán)。
4、在掉電模式(24小時(shí))過程中,手動(dòng)(sdkey 或szkey)可喚醒,喚醒后,led按照設(shè)置時(shí)長亮燈,并可進(jìn)行第1步和第2步操作。
求修改:
#include <stc8g.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 ms;time1;time2;
u16 mode;
sbit led = P3^0;
sbit sdkey = P3^2;
sbit szkey = P5^4;
sbit led1 = P3^1;
sbit led2 = P5^5;
sbit led3 = P3^3;
/*************/
void delay(unsigned int y)
{
unsigned int x,z;
for (x=y;x>0;x--);
for (z=110;z>0;z--);
}
/****************/
void sz()
{
  switch(mode)
   {
    case(0):led1=0;led2=1;led3=1;break;
    case(1):led1=1;led2=0;led3=1;break;
    case(2):led1=1;led2=1;led3=0;break;
    case(3):led1=0;led2=1;led3=0;break;
    case(4):led1=1;led2=0;led3=0;break;
    case(5):led1=0;led2=0;led3=0;break;
   }
}
/****************/
void main()
{
  P1 = 0xff;
  P3 = 0xff;
  P5 = 0xff;
  P1M0 = 0x00;
  P1M1 = 0x00;
  P_SW1 = 0x00;
  P3M0 = 0x00;
  P3M1 = 0x00;
  P5M0 = 0x00;
  P5M1 = 0x00;
  WKTCL = 0xff; //設(shè)定掉電喚醒時(shí)鐘約為1秒鐘
  WKTCH = 0x87;
  TMOD = 0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  EA=1;
  ET0=1;
  TR0=1;
  while(1)
    {
     ;
    }
}
/********************/
void server(void) interrupt 1
{
unsigned char i;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ms++;
if(ms>=20)
   {
    ms = 0;
    time1++;
    if(time1==1)
      {
      led=0;//
      }
    if(time1==1+3+time2)
      {
      led=1;
      }
    if(time1==1+3+time2+10)
      { time1=0;
        led1=led2=led3=1;
        i=86400;
        while(i--)
          {
           PCON=0x02;
           _nop_();
           _nop_();
          }
       }
   }
/****************/
sz();
  if(szkey==0)
   {
    delay(10);
    if(szkey==0)
     {
      mode++;
      time1=1;
      if(mode==6)
       {
        mode=0;
       }
        while(!szkey);
     }
   }
/****************/
if (mode==0)
    {
    time2=0;
    }
if (mode==1)
    {
    time2=3;
    }
if (mode==2)
    {
    time2=6;
    }
if (mode==3)
    {
    time2=9;
    }
if (mode==4)
    {
    time2=12;
    }
if (mode==5)
    {
    time2=15;
    }

/******************/
if(sdkey==0)
        {
         delay(5);
         while(sdkey==0)
           {
            led = 0;
            time1 = 1;
           }
         }              
}
/******************/
                              

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

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2024-11-29 17:08 | 只看該作者
  1. #include <stc8g.h>
  2. #include <intrins.h>
  3. typedef unsigned char u8;
  4. typedef unsigned int u16;
  5. u8 ms,time1,time2;
  6. u16 Sec = 0;
  7. u8 hr = 0;
  8. u16 mode;
  9. sbit led = P3^0;
  10. sbit sdkey = P3^2;
  11. sbit szkey = P5^4;
  12. sbit led1 = P3^1;
  13. sbit led2 = P5^5;
  14. sbit led3 = P3^3;
  15. /*************/
  16. void delay(unsigned int y)
  17. {
  18.         unsigned int x,z;
  19.         for (x=y; x>0; x--);
  20.         for (z=110; z>0; z--);
  21. }
  22. /****************/
  23. void sz()
  24. {
  25.   switch(mode)
  26.    {
  27.     case(0):led1=0;led2=1;led3=1;time2=3;break;
  28.     case(1):led1=1;led2=0;led3=1;time2=6;break;
  29.     case(2):led1=1;led2=1;led3=0;time2=9;break;
  30.     case(3):led1=0;led2=1;led3=0;time2=12;break;
  31.     case(4):led1=1;led2=0;led3=0;time2=15;break;
  32.     case(5):led1=0;led2=0;led3=0;time2=18;break;
  33.    }
  34. }
  35. void led_On()
  36. {
  37.         led = 0;
  38.         ms = 0;
  39.         time1 = time2 + 10;       
  40.         EX0 = 0;
  41. }
  42. void INT0_ISR() interrupt 0
  43. {
  44.         led_On();
  45. }
  46. /****************/
  47. void main()
  48. {
  49.         P3 = 0xff;
  50.         P5 = 0xff;
  51.         P_SW1 = 0x00;
  52.         P3M0 = 0x00;
  53.         P3M1 = 0x00;
  54.         P5M0 = 0x00;
  55.         P5M1 = 0x00;
  56.         WKTCL = 0xff; //設(shè)定掉電喚醒時(shí)鐘約為1秒鐘
  57.         WKTCH = 0x87;
  58.         TMOD = 0x00;
  59.         TH0=(65536-50000)/256;
  60.         TL0=(65536-50000)%256;
  61.         EA=1;
  62.         ET0=1;
  63.         TR0=1;
  64.         IT0 = 1;
  65.         EX0 = 0;
  66.         time1 = 10;
  67.         while(1)
  68.         {
  69.                 if(szkey==0)
  70.                 {
  71.                         delay(10);
  72.                         if(szkey==0)
  73.                         {
  74.                                 sz();
  75.                                 mode++;
  76.                                 if(mode==6)
  77.                                 {
  78.                                         mode=0;
  79.                                 }
  80.                                 while(!szkey);
  81.                         }
  82.                 }
  83.                 /******************/
  84.                 if(sdkey==0)
  85.                 {
  86.                         delay(5);
  87.                         if(sdkey==0)
  88.                         {
  89.                                 led_On();
  90.                         }               
  91.                         while(sdkey==0);
  92.                 }
  93.                 if(time1==0xFF)
  94.                 {
  95.                         PCON=0x02;
  96.                         _nop_();
  97.                         _nop_();
  98.                         if(Sec++>=3600)
  99.                         {
  100.                                 Sec = 0;
  101.                                 if(hr++>=24)
  102.                                 {
  103.                                         hr = 0;
  104.                                         led_On();
  105.                                 }
  106.                         }
  107.                 }
  108.         }
  109. }
  110. /********************/
  111. void server(void) interrupt 1
  112. {
  113.         if(time1)
  114.         {
  115.                 ms++;
  116.                 if(ms>=20)
  117.                 {
  118.                         ms = 0;
  119.                         time1--;
  120.                         if(time1<10)led = 1;
  121.                         if(time1==0)
  122.                         {
  123.                                 time1=0xFF;
  124.                                 led1=led2=led3=1;
  125.                                 Sec = 0;
  126.                                 hr = 0;
  127.                                 IE0 = 0;
  128.                                 EX0 = 1;
  129.                         }
  130.                 }
  131.         }
  132. }
  133.         /******************/
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:1133081 發(fā)表于 2024-11-30 08:16 | 只看該作者
樓主想實(shí)現(xiàn)的功能本身沒有多少難度。需要使用內(nèi)部掉電喚醒定時(shí)器,如果不是用電池供電沒必要使用掉電模式,掉電喚醒定時(shí)器誤差很大。另外還要使用EEPROM保存設(shè)置值。用一個(gè)按鍵接外部中斷腳,睡眠狀態(tài)短按外部中斷喚醒,工作狀態(tài)外部中斷腳改為普通IO,長按2秒進(jìn)入設(shè)置,3個(gè)指示燈閃爍,短按3個(gè)指示燈按2進(jìn)制方式可顯示7個(gè)設(shè)置狀態(tài),停按5~10秒自動(dòng)退出設(shè)置狀態(tài)并將設(shè)置值保存在EEPROM,如果斷電下次重啟不會(huì)改變運(yùn)行方式。

評分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

地板
ID:1136514 發(fā)表于 2024-11-30 10:36 | 只看該作者
WL0123 發(fā)表于 2024-11-30 08:16
樓主想實(shí)現(xiàn)的功能本身沒有多少難度。需要使用內(nèi)部掉電喚醒定時(shí)器,如果不是用電池供電沒必要使用掉電模式, ...

就是用電池供電使用的,目前就是,進(jìn)入掉電循環(huán)后,不能手動(dòng)喚醒,改手動(dòng)喚醒后又不能自動(dòng)進(jìn)入掉電循環(huán),所以求大佬給改一下程序,改為需要即可自動(dòng)運(yùn)行,又可手動(dòng)喚醒的程序

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

5#
ID:1133081 發(fā)表于 2024-11-30 16:37 | 只看該作者
zhaojiechao 發(fā)表于 2024-11-30 10:36
就是用電池供電使用的,目前就是,進(jìn)入掉電循環(huán)后,不能手動(dòng)喚醒,改手動(dòng)喚醒后又不能自動(dòng)進(jìn)入掉電循環(huán), ...

手動(dòng)喚醒和自動(dòng)喚醒都不是問題,但24小時(shí)自動(dòng)喚醒有點(diǎn)麻煩。因?yàn)樗吆蠖〞r(shí)器也停止工作。掉電喚醒定時(shí)器的最長時(shí)間很有限。
回復(fù)

使用道具 舉報(bào)

6#
ID:624769 發(fā)表于 2024-11-30 17:51 | 只看該作者
zhaojiechao 發(fā)表于 2024-11-30 10:36
就是用電池供電使用的,目前就是,進(jìn)入掉電循環(huán)后,不能手動(dòng)喚醒,改手動(dòng)喚醒后又不能自動(dòng)進(jìn)入掉電循環(huán), ...

你是不是搞明白 中斷喚醒 是什么意思?
除了定時(shí)喚醒之外,要喚醒單片機(jī),都是通過 中斷 來喚醒的。即,你要產(chǎn)生  中斷。就要有中斷產(chǎn)生。
假定,你是想通過sdkey 喚醒。
那么,EX0 = 1; 呢?
void EX0_INT()   interrupt 0  呢?  哪怕 空的你也要寫一個(gè)啊。
回復(fù)

使用道具 舉報(bào)

7#
ID:1136514 發(fā)表于 2024-12-1 09:06 | 只看該作者
感謝各位大佬的支持,已解決。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人免费视频播放 | 国产精品久久片 | 在线一区二区三区 | 91麻豆蜜桃一区二区三区 | 久久久久综合 | 精品日韩 | 一区二区三区在线播放 | 在线91| 国产精品免费看 | 国产精品久久久久久久久久久久久 | 91看片免费版 | 国产一区二区在线播放 | 免费人成在线观看网站 | 麻豆久久久9性大片 | 亚洲精品在线免费播放 | 国产黄视频在线播放 | 国产日韩精品一区二区 | 激情在线视频网站 | 国产9999精品| 成人欧美日韩一区二区三区 | 97免费在线观看视频 | 99re在线 | 九九热在线免费视频 | 亚洲视频一区 | 国产大片黄色 | 在线免费观看亚洲 | 国产一级片| 国产成人a亚洲精品 | 日韩精品一区二区三区老鸭窝 | 亚洲欧美激情视频 | 精品无码久久久久久久动漫 | 五月婷婷色 | 中国一级特黄真人毛片免费观看 | av激情影院| 超碰97在线免费 | 欧美久久一区二区 | 欧美激情精品久久久久 | 精品一区二区三区在线视频 | 国产久| 91精品国产欧美一区二区 | 欧美精品二区 |