|
做好了開關(guān)換擋的代碼判斷P32的電平來決定換擋還是不換.
現(xiàn)在有時(shí)靈有時(shí)又不靈. 電路圖,代碼如下
求大神幫下我.
開關(guān)換擋.png (15.97 KB, 下載次數(shù): 6)
下載附件
2024-8-26 23:42 上傳
- #include "stc8g.h"
- #include "intrins.h"
- #include "eeprom.h"
- #include <stdio.h>
-
- #define MAIN_Fosc 11059200UL
- #define BRT (65536 - MAIN_Fosc / 115200 / 4)
- //#define EEPROMId 0x0E00
-
- typedef unsigned char u8;
- typedef unsigned int u16;
- //u8 PWMData[] = {181,111,51,2};//添加數(shù)組,設(shè)置需要的檔位
- u8 PWMData[] = {2,8,31};//添加數(shù)組,設(shè)置需要的檔位
- u16 delayTime = 3000;//這里修改需要的工作時(shí)間,單位(ms)
-
- u8 dat;
- u16 EEPROMId = 0020;
- u16 time;
- sbit CAP = P3^2;
- u8 iscap=0;
- u8 mode = 0;
- void delayms(u16 ms);
- void sys_init();
- void PWM_init(void);
- void Timer0_Init(void);
-
- void UartInit()
- {
- SCON = 0x5a;
- TL1 = BRT;
- TH1 = BRT >> 8;
- TR1=1;
- AUXR = 0x40;
- }
-
- u8 LEDControl()
- {
-
-
- u8 i;
- u8 length = (sizeof(PWMData)/sizeof(PWMData[0]));
- delayms(20);
- // u16 EEPROMId = 0XE00; //將指針指向第8扇區(qū)的第一個(gè)字節(jié)
- // SetMode(CMD_READ); //設(shè)置為讀取數(shù)據(jù)
-
-
-
- while(1)
- {
-
-
- dat = IapRead(EEPROMId + 1); //讀取下一字節(jié)數(shù)據(jù)255
-
-
-
- if(dat == 0XFF) //下一字節(jié)字節(jié)未寫入數(shù)據(jù)255
- {
-
- dat = IapRead(EEPROMId); //讀取當(dāng)前字節(jié)數(shù)據(jù)
- // SetMode(CMD_PROGRAM); //寫入數(shù)據(jù)
-
-
-
- for(i = 0; i < length-1; i++)
- { if(dat == i)
- {
- if(iscap)
- {
- IapProgram(EEPROMId+1,i+1);
- }
- return dat;
- }
- }
-
- // dat=0;
- IapProgram(EEPROMId+1,0);
-
- return dat; //返回當(dāng)前字節(jié)數(shù)據(jù)
- }
- else //下一字節(jié)不為空,指針加一,繼續(xù)判斷下一個(gè)字節(jié)
- { EEPROMId++;
- }
- if(EEPROMId >= 0XFFD) //如果當(dāng)前字節(jié)到達(dá)EEPROM末尾,擦除扇區(qū)所有數(shù)據(jù)
- {
- // SetMode(CMD_ERASE); //扇區(qū)擦除
- IapErase(0x0000); //擦除扇區(qū)
- IapErase(0x0200); //擦除扇區(qū)
- IapErase(0x0400); //擦除扇區(qū)
- IapErase(0x0600); //擦除扇區(qū)
- IapErase(0x0800); //擦除扇區(qū)
- IapErase(0x0A00); //擦除扇區(qū)
- IapErase(0x0C00); //擦除扇區(qū)
- IapErase(0x0E00); //擦除扇區(qū)
- return 1;
- }
- }
- }
- void main()
- {
-
- sys_init();
- iscap=CAP;
- P3M0 = 0x04; P3M1 = 0x00; //P32推挽輸出對(duì)電容充電
- LEDControl();
- UartInit();
-
-
- PWM_init();
-
-
- CCAP1H = PWMData[dat] ;
-
- while(1)
- {
- printf("id=%u\n",EEPROMId);
- printf("cap=%bu\n",CCAP1H);
- printf("cap=%bu\n",iscap);
- delayms(1000);
-
- }
- }
- void sys_init(void)
- {
- P_SW2=0x80;
- // P3M0 = 0x04; P3M1 = 0x00;
-
- Timer0_Init();
-
- IT0=1;EX0=1;
- INTCLKO|=0x40; //EX4=1; 允許INT4外部中斷
- // IP2H=0x00;
- IP2=0x10;
-
-
- // ES = 1; //關(guān)閉串口中斷,可以雙擊換擋
- EA=1; //打開總中斷
- }
-
- //// 初始化PWM功能
- void PWM_init(void)
- {
- CCON = 0x00;
- CMOD = 0x08;
- CL = 0x00;
- CH = 0x00;
- CCAPM1 = 0x42;
- PCA_PWM1 = 0x00;
- CCAP1L = 0x00;
- CCAP1H = 0x00;
- CR=1;
- }
-
-
- //u8 TimeNum = 1;//這里是定時(shí)器中斷時(shí)間,單位(ms)
- void Timer0_Isr(void) interrupt 1
- {
- // u8 Num = delayTime/TimeNum;//中斷執(zhí)行多少次到達(dá)工作時(shí)間
- // if(time < Num)
- // { time++;
- // }else if(time == Num) //到達(dá)要求的時(shí)間
- // { IapProgram(EEPROMId+2,dat);
- // time++;
- // }
-
-
-
- }
- void Timer0_Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
-
-
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0xCD; //設(shè)置定時(shí)初始值
- TH0 = 0xD4; //設(shè)置定時(shí)初始值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0 = 1; //使能定時(shí)器0中斷
- }
- void INT4_Isr(void) interrupt 16
- {
- IAP_CONTR=0x60;
- }
- void INT0_Isr(void) interrupt 0
- {
- // printf("dat=%bu\r\n",dat);
- // printf("id=%u\r\n",EEPROMId);
- }
- void delayms(u16 ms)
- {u16 i;
- do{
- i = MAIN_Fosc /10000;
- while(--i);
- } while(--ms);
- }
-
復(fù)制代碼
|
|