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

標題: 做了個開關換擋,利用P32電平來決定換擋還是讀取當前 [打印本頁]

作者: vb2002    時間: 2024-8-26 23:42
標題: 做了個開關換擋,利用P32電平來決定換擋還是讀取當前
做好了開關換擋的代碼判斷P32的電平來決定換擋還是不換.
現在有時靈有時又不靈. 電路圖,代碼如下
求大神幫下我.

  1. #include "stc8g.h"
  2. #include "intrins.h"
  3. #include "eeprom.h"
  4. #include <stdio.h>

  5. #define MAIN_Fosc 11059200UL
  6. #define BRT         (65536 - MAIN_Fosc / 115200 / 4)
  7. //#define EEPROMId           0x0E00

  8. typedef unsigned char u8;
  9. typedef unsigned int u16;

  10. //u8 PWMData[] = {181,111,51,2};//添加數組,設置需要的檔位
  11. u8 PWMData[] = {2,8,31};//添加數組,設置需要的檔位
  12. u16 delayTime = 3000;//這里修改需要的工作時間,單位(ms)

  13. u8 dat;
  14. u16 EEPROMId = 0020;
  15. u16 time;
  16. sbit CAP = P3^2;
  17. u8 iscap=0;


  18. u8 mode = 0;


  19. void delayms(u16 ms);   
  20. void sys_init();
  21. void PWM_init(void);
  22. void Timer0_Init(void);

  23.   void UartInit()
  24. {
  25.     SCON = 0x5a;
  26.     TL1 = BRT;
  27.     TH1 = BRT >> 8;
  28.         TR1=1;
  29.     AUXR = 0x40;
  30. }



  31. u8 LEDControl()
  32. {       
  33.          
  34.        
  35.         u8 i;
  36.         u8 length = (sizeof(PWMData)/sizeof(PWMData[0]));
  37.                 delayms(20);

  38. //        u16 EEPROMId = 0XE00;                                //將指針指向第8扇區的第一個字節
  39. //        SetMode(CMD_READ);                                //設置為讀取數據
  40.        

  41.        
  42.         while(1)
  43.         {               
  44.                
  45.                                 
  46.                 dat = IapRead(EEPROMId + 1);                        //讀取下一字節數據255
  47.        
  48.           
  49.                 
  50.                 if(dat == 0XFF)                                        //下一字節字節未寫入數據255
  51.                 {
  52.                        
  53.                         dat = IapRead(EEPROMId);                //讀取當前字節數據
  54. //                        SetMode(CMD_PROGRAM);                        //寫入數據
  55.                        
  56.                 
  57.                         
  58.                         for(i = 0; i < length-1; i++)
  59.                         {        if(dat == i)
  60.                                 {       
  61.                                         if(iscap)
  62.                                         {
  63.                                         IapProgram(EEPROMId+1,i+1);
  64.                                         }
  65.                                         return dat;
  66.                                 }
  67.                         }
  68.                
  69. //                        dat=0;
  70.                         IapProgram(EEPROMId+1,0);

  71.                         return dat;                                        //返回當前字節數據
  72.                 }
  73.                 else                                                        //下一字節不為空,指針加一,繼續判斷下一個字節
  74.                 {        EEPROMId++;
  75.                 }


  76.                 if(EEPROMId >= 0XFFD)                                //如果當前字節到達EEPROM末尾,擦除扇區所有數據
  77.                 {       
  78. //                        SetMode(CMD_ERASE);                        //扇區擦除
  79.                         IapErase(0x0000);                                //擦除扇區
  80.                         IapErase(0x0200);                                //擦除扇區       
  81.                         IapErase(0x0400);                                //擦除扇區       
  82.                         IapErase(0x0600);                                //擦除扇區       
  83.                         IapErase(0x0800);                                //擦除扇區       
  84.                         IapErase(0x0A00);                                //擦除扇區       
  85.                         IapErase(0x0C00);                                //擦除扇區       
  86.                         IapErase(0x0E00);                                //擦除扇區                               
  87.                         return 1;
  88.                 }
  89.         }
  90. }


  91. void main()
  92. {               
  93.        

  94.         sys_init();  

  95.               iscap=CAP;       
  96.           P3M0 = 0x04; P3M1 = 0x00;   //P32推挽輸出對電容充電
  97.   LEDControl();
  98.         UartInit();
  99.   

  100.        
  101.       PWM_init();
  102.        

  103.                 CCAP1H = PWMData[dat] ;  

  104.           while(1)
  105.         {
  106.                 printf("id=%u\n",EEPROMId);
  107.                 printf("cap=%bu\n",CCAP1H);
  108.                 printf("cap=%bu\n",iscap);
  109.                 delayms(1000);

  110.        
  111.         }

  112. }



  113. void sys_init(void)
  114. {
  115.         P_SW2=0x80;

  116. //    P3M0 = 0x04; P3M1 = 0x00;      
  117.        
  118.     Timer0_Init();

  119.        
  120.         IT0=1;EX0=1;
  121.         INTCLKO|=0x40;   //EX4=1; 允許INT4外部中斷
  122. //        IP2H=0x00;               
  123.         IP2=0x10;

  124.        
  125.        
  126. //         ES = 1;                //關閉串口中斷,可以雙擊換擋
  127.         EA=1;                        //打開總中斷

  128. }


  129. //// 初始化PWM功能
  130. void PWM_init(void)
  131. {
  132.     CCON = 0x00;
  133.     CMOD = 0x08;
  134.     CL = 0x00;
  135.     CH = 0x00;

  136.     CCAPM1 = 0x42;
  137.     PCA_PWM1 = 0x00;
  138.     CCAP1L = 0x00;                  
  139.     CCAP1H = 0x00;
  140.         CR=1;       
  141. }


  142. //u8 TimeNum = 1;//這里是定時器中斷時間,單位(ms)

  143. void Timer0_Isr(void) interrupt 1
  144. {       
  145. //        u8 Num = delayTime/TimeNum;//中斷執行多少次到達工作時間
  146. //        if(time < Num)
  147. //        {        time++;
  148. //        }else if(time == Num)        //到達要求的時間
  149. //        {        IapProgram(EEPROMId+2,dat);
  150. //                time++;
  151. //        }



  152.        
  153.        
  154. }

  155. void Timer0_Init(void)                //1毫秒@11.0592MHz
  156. {

  157.         AUXR |= 0x80;                        //定時器時鐘1T模式


  158.         TMOD &= 0xF0;                        //設置定時器模式
  159.         TL0 = 0xCD;                                //設置定時初始值
  160.         TH0 = 0xD4;                                //設置定時初始值
  161.         TF0 = 0;                                //清除TF0標志
  162.         TR0 = 1;                                //定時器0開始計時
  163.         ET0 = 1;                                //使能定時器0中斷
  164. }


  165. void INT4_Isr(void) interrupt 16
  166. {
  167. IAP_CONTR=0x60;                       
  168. }


  169. void INT0_Isr(void) interrupt 0
  170. {
  171. //                  printf("dat=%bu\r\n",dat);
  172. //                printf("id=%u\r\n",EEPROMId);               
  173. }

  174. void delayms(u16 ms)
  175.         {u16 i;
  176.         do{
  177.                 i = MAIN_Fosc /10000;
  178.                 while(--i);
  179.         }                while(--ms);
  180. }
  181.        
復制代碼




作者: cyi8    時間: 2024-8-27 13:39
像這種時靈時不靈的問題一般都是在程序的延時問題上,延時的時候沒有及時處理按鍵信號導致的,自己仔細查一下程序,把程序延時去掉或者單獨空語句延時看一下是不是不會出現遺漏信號的情況,如果沒有出現就說明延時程序與按鍵檢測存在沖突了
作者: wufa1986    時間: 2024-8-27 14:38
我之前已經回復過,STC不適合這種斷電換擋,你可以對比下面2張圖,實現這個功能應廣單片機和STC的差別,需要比較多外圍元件,原因是STC斷電以后會消耗電容,而且是非線性的,然后還有STC IO口檢測電平會隨著電壓改變,這意味著電池電壓會嚴重影響時間判斷,所以需要LDO,至于應廣的工作原理就不說了,因為又是和STC完全不同的原理


作者: vb2002    時間: 2024-8-27 15:06
cyi8 發表于 2024-8-27 13:39
像這種時靈時不靈的問題一般都是在程序的延時問題上,延時的時候沒有及時處理按鍵信號導致的,自己仔細查一 ...

已經改代碼了. 主要是不能按字節寫入
現在我是整頁擦除,然后循環擦除頁.
10萬擦寫變成 80萬擦寫.
算是變相延長壽命把
功能已經實現了.
作者: vb2002    時間: 2024-8-27 15:08
wufa1986 發表于 2024-8-27 14:38
我之前已經回復過,STC不適合這種斷電換擋,你可以對比下面2張圖,實現這個功能應廣單片機和STC的差別,需 ...

已經改代碼了. 現在這個代碼是按字節寫入,寫完整個eeprom的字節再擦除.壽命3億次以上
現在代碼是按頁擦除寫入. 4k = 8個扇區
10萬次變80萬,也足夠了.

只監控P32引腳的電平. 根據電平變化決定換擋還是不換擋.




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久神马| 在线观看日韩欧美 | 人人澡人人干 | 天天干夜夜骑 | 免费国产精品视频 | 欧美在线性爱视频 | 日韩国产精品一区二区 | 亚洲自拍网站 | 日本久久视频 | 久久久久人 | 成人综合网站 | 久久精品视频网站 | 成人一级片 | 激情综合婷婷 | 欧美精品在线免费观看 | 91精品国产一区二区三区 | www.四虎在线 | 日韩黄色大片 | 高清av在线 | 国产一级生活片 | 毛片视频免费 | 97超碰资源站| 国产精品成人一区二区三区 | 97青青草| 久久精品99久久久久久 | 在线免费观看av网站 | 色婷婷国产精品综合在线观看 | 五月天婷婷激情 | 日韩av免费在线播放 | www.色com | 亚洲影音 | 久久久黄色片 | 成年人一级片 | 亚洲+小说+欧美+激情+另类 | 中文字幕在线免费观看视频 | 黄色小视频免费观看 | 黄色片免费在线观看 | 黄大色黄大片女爽一次 | 青青草免费在线视频 | av久久久| 久久精品2 |