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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1553|回復(fù): 9
收起左側(cè)

ADC掉電檢測(cè)的算法怎么寫(xiě),哪個(gè)大佬發(fā)一個(gè),謝謝

[復(fù)制鏈接]
ID:302293 發(fā)表于 2024-4-18 16:59 | 顯示全部樓層 |閱讀模式
謝謝大家
回復(fù)

使用道具 舉報(bào)

ID:1133081 發(fā)表于 2024-11-29 06:30 | 顯示全部樓層
sr861126 發(fā)表于 2024-11-28 16:56
用定時(shí)器掃比較穩(wěn)定,我試過(guò)了


  1. //測(cè)試條件:TX-1C實(shí)驗(yàn)板,MCU型號(hào)IAP15W4K58S4
  2. //注意:測(cè)試本示例時(shí),需在ISP下載時(shí)將【低壓復(fù)位】功能和【低壓時(shí)禁止EEPROM操作】關(guān)閉
  3. //說(shuō)明:本示例采用一個(gè)扇區(qū)寫(xiě)滿再擦除的方式是嘗試延長(zhǎng)EEPROM使用壽命,如需要頻繁寫(xiě)
  4. //EEPROM,可改為所有扇區(qū)寫(xiě)滿再擦除的方式。
  5. #include "STC15Fxxxx.H"
  6. #include <intrins.h>                                //庫(kù)頭文件
  7. #define uint unsigned int                         //宏定義數(shù)據(jù)類(lèi)型uint
  8. #define uchar unsigned char                 //宏定義數(shù)據(jù)類(lèi)型uchar
  9. //宏定義ISP的操作命令
  10. #define CMD_IDLE    0               //空閑模式
  11. #define CMD_READ    1               //IAP字節(jié)讀命令
  12. #define CMD_PROGRAM 2               //IAP字節(jié)編程命令
  13. #define CMD_ERASE   3               //IAP扇區(qū)擦除命令
  14. #define ENABLE_IAP  0x82            //CPU的等待時(shí)間
  15. #define IAP_ADDRESS 0x0800                        //測(cè)試地址
  16. sbit duan=P2^6;
  17. sbit wein=P2^7;
  18. sbit buzzer=P2^3;
  19. //順序共陰極數(shù)碼管段碼表,段碼a-h順序接PX0-PX7
  20. uchar code table[]={//共陰數(shù)碼管段碼"0~f-."
  21.                 0x3f,0x06,0x5b,0x4f,
  22.                 0x66,0x6d,0x7d,0x07,
  23.                 0x7f,0x6f,0x77,0x7c,
  24.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  25. uchar data dis_buf[8];                //緩存數(shù)組
  26. uint num,sec;
  27. uchar i;
  28. uint sign;
  29. void Timer0Init();                                        //定時(shí)器初始化聲明
  30. void IapIdle();                                                //關(guān)閉IAP/EEPROM
  31. uchar IapReadByte(uint addr);                //讀取EEPROM數(shù)據(jù)
  32. void IapProgramByte(uint addr, uchar dat);//寫(xiě)入EEPROM數(shù)據(jù)
  33. void IapEraseSector(uint addr);                //擦除EEPROM數(shù)據(jù)

  34. void main()                                                       
  35. {
  36.         P0M0 = 0x00;
  37.         P0M1 = 0x00;
  38.         P1M0 = 0x00;
  39.         P1M1 = 0x00;
  40.         P2M0 = 0x00;
  41.         P2M1 = 0x00;
  42.         P3M0 = 0x00;
  43.         P3M1 = 0x00;
  44.         P4M0 = 0x00;
  45.         P4M1 = 0x00;
  46.         P5M0 = 0x00;
  47.         P5M1 = 0x00;
  48.         P6M0 = 0x00;
  49.         P6M1 = 0x00;
  50.         P7M0 = 0x00;
  51.         P7M1 = 0x00;
  52.         if(IapReadByte(IAP_ADDRESS)==0xff)//如果沒(méi)有保存過(guò)數(shù)據(jù)存儲(chǔ)器初始值=0xff
  53.         {
  54.                 IapProgramByte(IAP_ADDRESS, 0);//扇區(qū)首地址寫(xiě)0
  55.                 sec=0;
  56.                 sign=1;
  57.         }
  58.         else
  59.         {
  60. //                for(i=1;i<12;i++)//測(cè)試寫(xiě)10次
  61.                 for(i=1;i<511;i++)//測(cè)試寫(xiě)滿510個(gè)字節(jié)
  62.                 {
  63.                         if(IapReadByte(IAP_ADDRESS+i)==0xff)//如果遇到?jīng)]有保存數(shù)據(jù)的單元
  64.                         {
  65.                                 sec=IapReadByte(IAP_ADDRESS+i-1);//讀取前一個(gè)字節(jié)保存的數(shù)據(jù)
  66.                                 sign=i;//地址緩存
  67.                                 break;//跳出循環(huán)
  68.                         }
  69.                 }
  70.         }
  71. //        if(sign==11)//測(cè)試寫(xiě)10次
  72.         if(sign==510)//如果寫(xiě)滿510
  73.         {
  74.                 IapEraseSector(IAP_ADDRESS);//擦除扇區(qū)
  75.                 IapProgramByte(IAP_ADDRESS, 0);//首地址寫(xiě)0
  76.                 sign=1;
  77.                 buzzer=0;
  78.         }
  79.         PCON &= 0xDF;//清0掉電標(biāo)志
  80.         ELVD = 1;//開(kāi)低壓中斷
  81.         EA   = 1;//開(kāi)總中斷

  82.         Timer0Init();//初始化定時(shí)器

  83.         while(1)
  84.         {
  85.                 if(TF0)//查詢(xún)T0中斷請(qǐng)求標(biāo)志
  86.                 {               
  87.                         TF0=0;//T0中斷請(qǐng)求標(biāo)志清0
  88.                         if(++num>=1000)//1秒
  89.                         {
  90.                                 buzzer=1;
  91.                                 num=0;                               
  92.                                 sec=++sec%250;
  93.                         }
  94.                         dis_buf[0]=table[sec/100%10];
  95.                         dis_buf[1]=table[sec/10%10];
  96.                         dis_buf[2]=table[sec%10];
  97.                         P0=0x00;duan=1;duan=0;
  98.                         P0=~(0x01<<i);wein=1;wein=0;
  99.                         P0=dis_buf[i];duan=1;duan=0;
  100.                         i=++i%3;
  101.                 }//耗時(shí)569us
  102.         }
  103. }

  104. void Timer0Init(void)        //1毫秒@11.0592MHz
  105. {
  106.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  107.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  108.         TL0 = 0xCD;                        //設(shè)置定時(shí)初始值
  109.         TH0 = 0xD4;                        //設(shè)置定時(shí)初始值
  110.         TF0 = 0;                        //清除TF0標(biāo)志
  111.         TR0 = 1;                        //定時(shí)器0開(kāi)始計(jì)時(shí)
  112. }
  113. /*----------------------------
  114.         關(guān)閉IAP功能
  115. ----------------------------*/
  116. void IapIdle()
  117. {
  118.     IAP_CONTR = 0;                  //關(guān)閉IAP功能
  119.     IAP_CMD = 0;                    //清除命令寄存器
  120.     IAP_TRIG = 0;                   //清除觸發(fā)寄存器
  121.     IAP_ADDRH = 0x80;               //將地址設(shè)置到非IAP區(qū)域
  122.     IAP_ADDRL = 0;
  123. }
  124. /*----------------------------
  125. 從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
  126. ----------------------------*/
  127. uchar IapReadByte(uint addr)
  128. {
  129.     uchar dat;                       //數(shù)據(jù)緩沖區(qū)

  130.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  131.     IAP_CMD = CMD_READ;             //設(shè)置IAP命令
  132.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  133.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  134.     IAP_TRIG = 0x5a;                //寫(xiě)觸發(fā)命令(0x5a)
  135.     IAP_TRIG = 0xa5;                //寫(xiě)觸發(fā)命令(0xa5)
  136.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  137.     dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數(shù)據(jù)
  138.     IapIdle();                      //關(guān)閉IAP功能
  139.     return dat;                     //返回
  140. }
  141. /*-------------------------------
  142. 寫(xiě)一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
  143. --------------------------------*/
  144. void IapProgramByte(uint addr, uchar dat)
  145. {
  146.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  147.     IAP_CMD = CMD_PROGRAM;          //設(shè)置IAP命令
  148.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  149.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  150.     IAP_DATA = dat;                 //寫(xiě)ISP/IAP/EEPROM數(shù)據(jù)
  151.     IAP_TRIG = 0x5a;                //寫(xiě)觸發(fā)命令(0x5a)
  152.     IAP_TRIG = 0xa5;                //寫(xiě)觸發(fā)命令(0xa5)
  153.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  154.     IapIdle();                      //關(guān)閉IAP功能
  155. }
  156. /*----------------------------
  157. ISP/IAP/EEPROM扇區(qū)擦除
  158. ----------------------------*/
  159. void IapEraseSector(uint addr)
  160. {
  161.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  162.     IAP_CMD = CMD_ERASE;            //設(shè)置IAP命令
  163.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  164.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  165.     IAP_TRIG = 0x5a;                //寫(xiě)觸發(fā)命令(0x5a)
  166.     IAP_TRIG = 0xa5;                //寫(xiě)觸發(fā)命令(0xa5)
  167.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  168.     IapIdle();                      //關(guān)閉IAP功能
  169. }
  170. void PowerLost() interrupt 6
  171. {

  172.         EA = 0;                                                //關(guān)閉總中斷
  173.         P0M1 = 0xff;                                //根據(jù)實(shí)際硬件環(huán)境,設(shè)置端口模式減少耗電
  174.         P1M1 = 0xff;
  175.         P2M1 = 0xff;
  176.         P3M1 = 0xff;
  177.         P4M1 = 0xff;
  178.         P5M1 = 0xff;
  179.         P6M1 = 0xff;
  180.         P7M1 = 0xff;
  181.         IapProgramByte(IAP_ADDRESS+sign,sec);//寫(xiě)數(shù)據(jù)到EEPROM
  182.         while((PCON & 0x20) != 0)         //復(fù)查低壓標(biāo)志
  183.         {
  184.                 PCON &= 0xDF;                  //清除低壓標(biāo)志
  185.                 _nop_();               
  186.                 _nop_();                            //坐等掉電
  187.         }
  188.         IAP_CONTR = 0x20;                 //發(fā)現(xiàn)是誤報(bào),重啟單片機(jī),恢復(fù)正常工作
  189. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2024-11-28 20:16 | 顯示全部樓層
單片機(jī)檢測(cè)掉電的方式往少了說(shuō),也有十幾種,其中唯獨(dú)定時(shí)去用ADC掃描方式是最糟糕的。不說(shuō)大多數(shù)單片機(jī)有掉電中斷了,哪怕沒(méi)有掉電中斷,隨便用個(gè)外部中斷檢測(cè)上游供電電平,都比ADC方式強(qiáng)。
回復(fù)

使用道具 舉報(bào)

ID:427868 發(fā)表于 2024-11-28 17:53 | 顯示全部樓層
STC的單片機(jī)有低壓中斷,也很好用。
回復(fù)

使用道具 舉報(bào)

ID:302293 發(fā)表于 2024-11-28 16:56 | 顯示全部樓層
sr861126 發(fā)表于 2024-4-19 09:45
掉電是有電壓變化的,mcu也是接在電源上的,當(dāng)電源電壓低于12V時(shí),mcu是可以檢測(cè)到ADC電壓值的,但是我用 ...

用定時(shí)器掃比較穩(wěn)定,我試過(guò)了
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-4-19 10:33 | 顯示全部樓層
sr861126 發(fā)表于 2024-4-19 09:46
IO口的電壓是線性變化的,怎么去掃,怎么判斷

我是變壓器供電,在電容前邊加二極管,二極管前的脈動(dòng)信號(hào)經(jīng)過(guò)電阻引入IO,每當(dāng)IO的低電平時(shí)間超過(guò)10ms算掉電。或者其他方式也可以,或者二極管前邊加一個(gè)小電容濾波一下,就不是脈動(dòng)信號(hào)了,總之都可以,只要在二極管后面的電容放電完成之前檢測(cè)到就可以完美保存幾十個(gè)字節(jié)的數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

ID:302293 發(fā)表于 2024-4-19 09:46 | 顯示全部樓層
xiaobendan001 發(fā)表于 2024-4-18 20:37
對(duì)啊,電容大的話用掃描IO狀態(tài)都可以

IO口的電壓是線性變化的,怎么去掃,怎么判斷
回復(fù)

使用道具 舉報(bào)

ID:302293 發(fā)表于 2024-4-19 09:45 | 顯示全部樓層
明日之星8 發(fā)表于 2024-4-18 20:07
不就是掉電檢測(cè)嗎,用端口中斷就檢測(cè)了的,比adc測(cè)量簡(jiǎn)單容易多了。

掉電是有電壓變化的,mcu也是接在電源上的,當(dāng)電源電壓低于12V時(shí),mcu是可以檢測(cè)到ADC電壓值的,但是我用定時(shí)器去掃不穩(wěn)定
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-4-18 20:37 | 顯示全部樓層
對(duì)啊,電容大的話用掃描IO狀態(tài)都可以
回復(fù)

使用道具 舉報(bào)

ID:1110945 發(fā)表于 2024-4-18 20:07 | 顯示全部樓層
不就是掉電檢測(cè)嗎,用端口中斷就檢測(cè)了的,比adc測(cè)量簡(jiǎn)單容易多了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品永久免费视频 | 丝袜美腿一区 | 免费在线观看黄视频 | 欧美一区二区三区四区在线 | www.日本三级| 欧美日韩精品免费观看 | 人人草天天草 | 奇米久久久 | 欧美日韩大陆 | 久久综合一区二区 | 久久伊人亚洲 | 亚洲乱码一区二区三区在线观看 | 伊人狼人影院 | 精品国产乱码久久久久久蜜柚 | 欧美老少妇一级特黄一片 | 91精品福利 | 国产一级视频免费播放 | 91精品久久久久久久久 | 美女视频一区二区三区 | 国产精品3区| 国产亚洲精品精品国产亚洲综合 | 久久久久久天堂 | 黄网站免费在线观看 | 国产乱码精品1区2区3区 | 久久精品高清视频 | 色综合桃花网 | 毛片一级片 | 99国内精品久久久久久久 | 国产亚洲精品成人av久久ww | 看特级黄色片 | 国产一区二区三区免费 | 人碰人操 | 毛片免费视频 | 久久久www| 久久99精品久久久久久秒播九色 | 婷婷开心激情综合五月天 | 亚洲欧美一区二区三区1000 | 亚洲成人精品在线观看 | 99福利视频 | 国产丝袜一区二区三区免费视频 | 成人影院在线 |