做好了開關換擋的代碼判斷P32的電平來決定換擋還是不換.
現在有時靈有時又不靈. 電路圖,代碼如下
求大神幫下我.
- #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};//添加數組,設置需要的檔位
- u8 PWMData[] = {2,8,31};//添加數組,設置需要的檔位
- u16 delayTime = 3000;//這里修改需要的工作時間,單位(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扇區的第一個字節
- // SetMode(CMD_READ); //設置為讀取數據
-
-
-
- while(1)
- {
-
-
- dat = IapRead(EEPROMId + 1); //讀取下一字節數據255
-
-
-
- if(dat == 0XFF) //下一字節字節未寫入數據255
- {
-
- dat = IapRead(EEPROMId); //讀取當前字節數據
- // SetMode(CMD_PROGRAM); //寫入數據
-
-
-
- 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; //返回當前字節數據
- }
- else //下一字節不為空,指針加一,繼續判斷下一個字節
- { EEPROMId++;
- }
- if(EEPROMId >= 0XFFD) //如果當前字節到達EEPROM末尾,擦除扇區所有數據
- {
- // SetMode(CMD_ERASE); //扇區擦除
- IapErase(0x0000); //擦除扇區
- IapErase(0x0200); //擦除扇區
- IapErase(0x0400); //擦除扇區
- IapErase(0x0600); //擦除扇區
- IapErase(0x0800); //擦除扇區
- IapErase(0x0A00); //擦除扇區
- IapErase(0x0C00); //擦除扇區
- IapErase(0x0E00); //擦除扇區
- return 1;
- }
- }
- }
- void main()
- {
-
- sys_init();
- iscap=CAP;
- P3M0 = 0x04; P3M1 = 0x00; //P32推挽輸出對電容充電
- 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; //關閉串口中斷,可以雙擊換擋
- 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;//這里是定時器中斷時間,單位(ms)
- void Timer0_Isr(void) interrupt 1
- {
- // u8 Num = delayTime/TimeNum;//中斷執行多少次到達工作時間
- // if(time < Num)
- // { time++;
- // }else if(time == Num) //到達要求的時間
- // { IapProgram(EEPROMId+2,dat);
- // time++;
- // }
-
-
-
- }
- void Timer0_Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定時器時鐘1T模式
-
-
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0xCD; //設置定時初始值
- TH0 = 0xD4; //設置定時初始值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0 = 1; //使能定時器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);
- }
-
復制代碼
|