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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 780|回復: 4
收起左側

做了個開關換擋,利用P32電平來決定換擋還是讀取當前

[復制鏈接]
ID:1130333 發表于 2024-8-26 23:42 | 顯示全部樓層 |閱讀模式
做好了開關換擋的代碼判斷P32的電平來決定換擋還是不換.
現在有時靈有時又不靈. 電路圖,代碼如下
求大神幫下我.

開關換擋.png
  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.        
復制代碼



回復

使用道具 舉報

ID:1121801 發表于 2024-8-27 13:39 | 顯示全部樓層
像這種時靈時不靈的問題一般都是在程序的延時問題上,延時的時候沒有及時處理按鍵信號導致的,自己仔細查一下程序,把程序延時去掉或者單獨空語句延時看一下是不是不會出現遺漏信號的情況,如果沒有出現就說明延時程序與按鍵檢測存在沖突了
回復

使用道具 舉報

ID:879348 發表于 2024-8-27 14:38 | 顯示全部樓層
我之前已經回復過,STC不適合這種斷電換擋,你可以對比下面2張圖,實現這個功能應廣單片機和STC的差別,需要比較多外圍元件,原因是STC斷電以后會消耗電容,而且是非線性的,然后還有STC IO口檢測電平會隨著電壓改變,這意味著電池電壓會嚴重影響時間判斷,所以需要LDO,至于應廣的工作原理就不說了,因為又是和STC完全不同的原理
51hei截圖20240827143729.jpg
51hei截圖20240827143736.jpg
回復

使用道具 舉報

ID:1130333 發表于 2024-8-27 15:06 | 顯示全部樓層
cyi8 發表于 2024-8-27 13:39
像這種時靈時不靈的問題一般都是在程序的延時問題上,延時的時候沒有及時處理按鍵信號導致的,自己仔細查一 ...

已經改代碼了. 主要是不能按字節寫入
現在我是整頁擦除,然后循環擦除頁.
10萬擦寫變成 80萬擦寫.
算是變相延長壽命把
功能已經實現了.
回復

使用道具 舉報

ID:1130333 發表于 2024-8-27 15:08 | 顯示全部樓層
wufa1986 發表于 2024-8-27 14:38
我之前已經回復過,STC不適合這種斷電換擋,你可以對比下面2張圖,實現這個功能應廣單片機和STC的差別,需 ...

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看av网站永久 | 91精品国产一区二区 | 成人国产精品免费观看 | 日韩一区二区福利视频 | 国产精品成人在线播放 | 国产精品一二三区 | 精品欧美二区 | 欧美一级欧美三级在线观看 | av免费入口 | 亚洲高清在线观看 | 欧美色性 | 久久成人一区 | 亚洲在线视频 | 日本人和亚洲人zjzjhd | a久久久久久 | 黄色片在线看 | 色综合天天天天做夜夜夜夜做 | 国产在线观看一区二区三区 | 国产一区二区 | 亚洲欧美中文日韩在线 | 性色在线| 国产一区久久 | 日韩91 | 久久综合一区 | av日日操 | 国产福利在线播放麻豆 | 久久高清| 欧美午夜影院 | 欧美日韩在线视频一区 | 国产黄色大片在线免费观看 | 久久99久久99| 尹人av| av在线免费播放 | 一区二区三区精品视频 | 97精品国产97久久久久久免费 | 午夜影院在线观看视频 | 日韩一区二区在线视频 | 国产精品久久久久久久久久东京 | 久久久久国产 | 日日夜夜免费精品视频 | 中文字幕人成乱码在线观看 |