130
1520
1859
金牌会员
#include "stc8h.h" #include "intrins.h" #define MAIN_Fosc 11059200UL #define BRT (65536 - MAIN_Fosc / 115200 / 4) typedef unsigned char u8;typedef unsigned int u16; void delayms(u16 ms); void sys_init(); void PWM_init(void); //void Timer0_Init(void); void UartInit(); void UartSend(char dat); char IapRead(unsigned int addr); void IapProgram(unsigned int addr, char dat); void IapErase(unsigned int addr); void IapIdle(); u8 temp,number,save; bit flag; sbit key=P3^2; static u8 state; void UartInit() { SCON = 0x5a; T2L = BRT; T2H = BRT >> 8; AUXR = 0x15; } void UartSend(char dat) { while (!TI); TI = 0; SBUF = dat; } void main() { P_SW2|=0x80; sys_init(); UartInit(); UartSend(); IapRead(); IapProgram(); IapErase(); IapIdle(); temp = IapRead(0x0000); // if(temp != 0xFF) number = temp; while(1) { switch(state) { case 0 : PWMA_CCR1 = 0; break; case 1 : PWMA_CCR1 = 5; break; case 2 : PWMA_CCR1 = 25; break; case 3 : PWMA_CCR1 = 70; IapErase(0x0000);IapProgram(0x0000,state); break; default:break; } } } void INT0_Isr(void) interrupt 0 { delayms(10); if(INT0==0) { state++; if(state >= 4) state=0; } } void sys_init(void) { P_SW2=0x80; P3M0 = 0x00; P3M1 = 0xf8; P1M0 = 0x00; P1M1 = 0xfe; PWM_init(); // Timer0_Init(); IT0=1;EX0=1; INTCLKO|=0x40; //EX4=1; 允许INT4外部中断 // IP2H=0x00; IP2=0x10; EA=1; //打开总中断 } //// 初始化PWM功能 void PWM_init(void) { PWMA_CCER1 = 0x00; // 写CCMRx前必须先清零CCERx关闭通道 PWMA_CCMR1 = 0x60; // 设置CC1为PWMA输出模式 PWMA_PS = 0x00; // PWMA_CCER1 = 0x03; // 使能CC4通道双极 PWMA_CCR1 = temp; // 初始化CCR4计数值为0 PWMA_ARR = 100; // 设置周期时间为12000个计数周期 PWMA_ENO = 0x01; // 使能PWM4P+N端口输出 PWMA_PSCR = 0; // PWM时钟预分频寄存器设置为0 PWMA_BKR = 0x80; // 使能主输出 PWMA_CR1 = 0x01; // 开始计时 } void Timer0_Isr(void) interrupt 1 { flag=1; } 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 IapIdle() { IAP_CONTR = 0; // 关闭 IAP 功能 IAP_CMD = 0; // 清除命令寄存器 IAP_TRIG = 0; // 清除触发寄存器 IAP_ADDRH = 0x00; // 清零高地址寄存器 IAP_ADDRL = 0x00; // 清零低地址寄存器 } char IapRead(unsigned int addr) { char dat; IAP_CONTR = 0x80; // 使能 IAP IAP_TPS = 12; // 设置等待参数 12MHz IAP_CMD = 1; // 设置 IAP 读命令 IAP_ADDRL = addr; // 设置 IAP 低地址 IAP_ADDRH = addr >> 8; // 设置 IAP 高地址 IAP_TRIG = 0x5a; // 写触发命令 (0x5a) IAP_TRIG = 0xa5; // 写触发命令 (0xa5) _nop_(); _nop_(); _nop_(); _nop_(); dat = IAP_DATA; // 读 IAP 数据 IapIdle(); // 关闭 IAP 功能 return dat; } void IapProgram(unsigned int addr, char dat) { IAP_CONTR = 0x80; // 使能 IAP IAP_TPS = 12; // 设置等待参数 12MHz IAP_CMD = 2; // 设置 IAP 写命令 IAP_ADDRL = addr; // 设置 IAP 低地址 IAP_ADDRH = addr >> 8; // 设置 IAP 高地址 IAP_DATA = dat; // 写 IAP 数据 IAP_TRIG = 0x5a; // 写触发命令 (0x5a) IAP_TRIG = 0xa5; // 写触发命令 (0xa5) _nop_(); _nop_(); _nop_(); _nop_(); IapIdle(); // 关闭 IAP 功能 } void IapErase(unsigned int addr) { IAP_CONTR = 0x80; // 使能 IAP IAP_TPS = 12; // 设置等待参数 12MHz IAP_CMD = 3; // 设置 IAP 擦除命令 IAP_ADDRL = addr; // 设置 IAP 低地址 IAP_ADDRH = addr >> 8; // 设置 IAP 高地址 IAP_TRIG = 0x5a; // 写触发命令 (0x5a) IAP_TRIG = 0xa5; // 写触发命令 (0xa5) _nop_(); _nop_(); _nop_(); _nop_(); IapIdle(); // 关闭 IAP 功能 } void INT4_Isr(void) interrupt 16 { IAP_CONTR=0x60; } void delayms(u16 ms) {u16 i; do{ i = MAIN_Fosc /10000; while(--i); } while(--ms); } 复制代码
使用道具 举报 送花
wnag*** 发表于 2024-8-1 21:28 我一般是哪个完整的代码删减,删到程序现象出异常为止,就找到可用代码的精简版了 ...
23
296
1160
27
301
822
高级会员
lez*** 发表于 2024-8-2 08:00 很厉害
39
2006
6841
论坛元老
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-5-2 05:49 , Processed in 0.139518 second(s), 85 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.