电路图
代码我也发出来吧

- #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 save;
- u8 state;
- u8 dat;
- u16 EEPROMId = 0100;
- u16 time;
-
- bit key_flag;
-
- //void delayms(u16 ms);
- void sys_init();
- void PWM_init(void);
- void Timer0_Init(void);
-
-
- void UartInit()
- {
- SCON = 0x5a;
- TL1 = BRT;
- TH1 = BRT >> 8;
- AUXR = 0x15;
- TR1=1;
- }
-
-
- //void UartSend(char dat)
- //{
- // while (!TI);
- // TI = 0;
- // SBUF = dat;
- //}
-
-
- u8 LEDControl()
- {
- // u8 dat;
-
- // u16 EEPROMId = 0XE00; //将指针指向第8扇区的第一个字节
- // SetMode(CMD_READ); //设置为读取数据
-
- while(1)
- {
- dat = IapRead(EEPROMId + 1); //读取下一字节数据
- // printf("%bu\r\n",dat);
- // printf("%u\r\n",EEPROMId);
- // printf("dat= %bu\r\n",dat);
- // printf("id= %u\r\n",EEPROMId);
-
- if(dat == 0XFF) //下一字节字节未写入数据
- {
- dat = IapRead(EEPROMId); //读取当前字节数据
- // SetMode(CMD_PROGRAM); //写入数据
-
- switch(dat)
- {
- case 1: IapProgram(EEPROMId+1,191);break;
- case 191: IapProgram(EEPROMId+1,121);break;
- case 121: IapProgram(EEPROMId+1,51);break;
-
- default: IapProgram(EEPROMId+1,1);break;
-
- }
- 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();
-
- UartInit();
- CR=0;
-
- LEDControl();
- CR=1;
- PWM_init();
- // UartSend(IapRead(dat));
- // UartSend(IapRead(EEPROMId));
-
- // UartSend(IapRead(dat));
-
-
-
- while(1)
- {
- CCAP1H = dat;
- // switch(state)
- // {
- // case 0 : PWMA_CCR1 = 5; break;
- // case 1 : PWMA_CCR1 = 15; break;
- // case 2 : PWMA_CCR1 = 55; break;
- // case 3 : PWMA_CCR1 = 250; break;
- // default:break;
-
- //
- // }
-
- }
-
-
-
-
-
-
- }
-
-
-
- void sys_init(void)
- {
- P_SW2=0x80;
-
- P0M0 = 0x00; P0M1 = 0x00;
- P1M0 = 0x00; P1M1 = 0x00;
- P2M0 = 0x00; P2M1 = 0x00;
- P3M0 = 0x00; P3M1 = 0x00;
- P4M0 = 0x00; P4M1 = 0x00;
- P5M0 = 0x00; P5M1 = 0x00;
- P6M0 = 0x00; P6M1 = 0x00;
- P7M0 = 0x00; P7M1 = 0x00;
-
- // P1M0 = 0x00; P1M1 = 0x00;
-
-
- Timer0_Init();
-
- IT0=1;EX0=1;
- INTCLKO|=0x40; //EX4=1; 允许INT4外部中断
- // IP2H=0x00;
- IP2=0x10;
-
-
- 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;
- }
-
-
- void Timer0_Isr(void) interrupt 1
- {
- TL0 = 0xCD; //设置定时初始值
- TH0 = 0xD4; //设置定时初始值
-
- if(time>=200)
-
-
- switch(dat)
- {
-
- case 191: IapProgram(EEPROMId+2,dat);break;
- case 121: IapProgram(EEPROMId+2,dat);break;
- case 51: IapProgram(EEPROMId+2,dat);break;
- case 1: IapProgram(EEPROMId+2,dat);break;
- default:IapProgram(EEPROMId+2,191); break;
- }
-
-
- if(time<200) time++;
- }
-
-
-
- void Timer0_Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- 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);
- }
-
-
-
-
-
-
-
-
-
复制代码
|