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

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

QQ登錄

只需一步,快速開始

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

做了個(gè)開關(guān)換擋,利用P32電平來決定換擋還是讀取當(dāng)前

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
做好了開關(guān)換擋的代碼判斷P32的電平來決定換擋還是不換.
現(xiàn)在有時(shí)靈有時(shí)又不靈. 電路圖,代碼如下
求大神幫下我.

  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};//添加數(shù)組,設(shè)置需要的檔位
  11. u8 PWMData[] = {2,8,31};//添加數(shù)組,設(shè)置需要的檔位
  12. u16 delayTime = 3000;//這里修改需要的工作時(shí)間,單位(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扇區(qū)的第一個(gè)字節(jié)
  39. //        SetMode(CMD_READ);                                //設(shè)置為讀取數(shù)據(jù)
  40.        

  41.        
  42.         while(1)
  43.         {               
  44.                
  45.                                 
  46.                 dat = IapRead(EEPROMId + 1);                        //讀取下一字節(jié)數(shù)據(jù)255
  47.        
  48.           
  49.                 
  50.                 if(dat == 0XFF)                                        //下一字節(jié)字節(jié)未寫入數(shù)據(jù)255
  51.                 {
  52.                        
  53.                         dat = IapRead(EEPROMId);                //讀取當(dāng)前字節(jié)數(shù)據(jù)
  54. //                        SetMode(CMD_PROGRAM);                        //寫入數(shù)據(jù)
  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;                                        //返回當(dāng)前字節(jié)數(shù)據(jù)
  72.                 }
  73.                 else                                                        //下一字節(jié)不為空,指針加一,繼續(xù)判斷下一個(gè)字節(jié)
  74.                 {        EEPROMId++;
  75.                 }


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


  91. void main()
  92. {               
  93.        

  94.         sys_init();  

  95.               iscap=CAP;       
  96.           P3M0 = 0x04; P3M1 = 0x00;   //P32推挽輸出對(duì)電容充電
  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;                //關(guān)閉串口中斷,可以雙擊換擋
  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;//這里是定時(shí)器中斷時(shí)間,單位(ms)

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



  152.        
  153.        
  154. }

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

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


  158.         TMOD &= 0xF0;                        //設(shè)置定時(shí)器模式
  159.         TL0 = 0xCD;                                //設(shè)置定時(shí)初始值
  160.         TH0 = 0xD4;                                //設(shè)置定時(shí)初始值
  161.         TF0 = 0;                                //清除TF0標(biāo)志
  162.         TR0 = 1;                                //定時(shí)器0開始計(jì)時(shí)
  163.         ET0 = 1;                                //使能定時(shí)器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.        
復(fù)制代碼



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

使用道具 舉報(bào)

沙發(fā)
ID:1121801 發(fā)表于 2024-8-27 13:39 | 只看該作者
像這種時(shí)靈時(shí)不靈的問題一般都是在程序的延時(shí)問題上,延時(shí)的時(shí)候沒有及時(shí)處理按鍵信號(hào)導(dǎo)致的,自己仔細(xì)查一下程序,把程序延時(shí)去掉或者單獨(dú)空語(yǔ)句延時(shí)看一下是不是不會(huì)出現(xiàn)遺漏信號(hào)的情況,如果沒有出現(xiàn)就說明延時(shí)程序與按鍵檢測(cè)存在沖突了
回復(fù)

使用道具 舉報(bào)

板凳
ID:879348 發(fā)表于 2024-8-27 14:38 | 只看該作者
我之前已經(jīng)回復(fù)過,STC不適合這種斷電換擋,你可以對(duì)比下面2張圖,實(shí)現(xiàn)這個(gè)功能應(yīng)廣單片機(jī)和STC的差別,需要比較多外圍元件,原因是STC斷電以后會(huì)消耗電容,而且是非線性的,然后還有STC IO口檢測(cè)電平會(huì)隨著電壓改變,這意味著電池電壓會(huì)嚴(yán)重影響時(shí)間判斷,所以需要LDO,至于應(yīng)廣的工作原理就不說了,因?yàn)橛质呛蚐TC完全不同的原理

回復(fù)

使用道具 舉報(bào)

地板
ID:1130333 發(fā)表于 2024-8-27 15:06 | 只看該作者
cyi8 發(fā)表于 2024-8-27 13:39
像這種時(shí)靈時(shí)不靈的問題一般都是在程序的延時(shí)問題上,延時(shí)的時(shí)候沒有及時(shí)處理按鍵信號(hào)導(dǎo)致的,自己仔細(xì)查一 ...

已經(jīng)改代碼了. 主要是不能按字節(jié)寫入
現(xiàn)在我是整頁(yè)擦除,然后循環(huán)擦除頁(yè).
10萬(wàn)擦寫變成 80萬(wàn)擦寫.
算是變相延長(zhǎng)壽命把
功能已經(jīng)實(shí)現(xiàn)了.
回復(fù)

使用道具 舉報(bào)

5#
ID:1130333 發(fā)表于 2024-8-27 15:08 | 只看該作者
wufa1986 發(fā)表于 2024-8-27 14:38
我之前已經(jīng)回復(fù)過,STC不適合這種斷電換擋,你可以對(duì)比下面2張圖,實(shí)現(xiàn)這個(gè)功能應(yīng)廣單片機(jī)和STC的差別,需 ...

已經(jīng)改代碼了. 現(xiàn)在這個(gè)代碼是按字節(jié)寫入,寫完整個(gè)eeprom的字節(jié)再擦除.壽命3億次以上
現(xiàn)在代碼是按頁(yè)擦除寫入. 4k = 8個(gè)扇區(qū)
10萬(wàn)次變80萬(wàn),也足夠了.

只監(jiān)控P32引腳的電平. 根據(jù)電平變化決定換擋還是不換擋.
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲免费视频网站 | 成人网av | 黄色片视频 | 中文字幕视频在线 | 国产精品v | 日本 欧美 三级 高清 视频 | 亚洲天堂中文字幕 | 男女国产视频 | 欧美啊v在线观看 | 激情av在线 | 网页av| 久久网国产 | 久久精品天堂 | 欧美成人影院在线 | 国产伦精品一区二区三区照片91 | 伊人春色在线观看 | 天堂亚洲| 精品欧美 | 亚洲一区二区三区四区五区午夜 | 亚洲高清成人在线 | 色噜噜色综合 | 91av在线免费播放 | 奇米av| 麻豆成人在线视频 | 91久久精品一区二区二区 | 日韩国产精品一区二区三区 | 无码一区二区三区视频 | 欧美一区2区三区3区公司 | 成年人在线视频 | 精品视频一区二区三区四区 | 成人国产午夜在线观看 | 一区二区三区在线免费观看 | 欧美一极视频 | jlzzjlzz国产精品久久 | 午夜免费看 | 国产精品美女久久久久aⅴ国产馆 | 亚洲精品视频在线观看免费 | 国产美女精品 | 日韩在线视频一区 | 欧美一级艳情片免费观看 | 色综合一区二区 |