使用芯片:STC15F104E
晶振:12MHZ
编译环境:Keil
/********************************************************************实现功能:定时定次催款应用程序使用芯片:STC15F104E晶振:12MHZ编译环境:Keil *********************************************************************//********************************************************************/#include "reg52.h" #include <intrins.H>#define uchar unsigned char //宏定义字符型变量#define uint unsigned int //宏定义整型变量/******************************************************************** 寄存器设置*********************************************************************/ sfr IAP_DATA =0xc2; //数据寄存器sfr IAP_ADDRH =0xc3; //地址寄存器sfr IAP_ADDRL =0xc4; //地址寄存器sfr IAP_CMD =0xc5; //命令寄存器sfr IAP_TRIG =0xc6; //触发寄存器sfr IAP_CONTR =0xc7; //擦除寄存器sbit P33=P3^3; //定义继电器控制输出脚/******************************************************************** 命令定义*********************************************************************/#define CMD_IDLE 0 //EEPROM无操作#define CMD_READ 1 //读取字节#define CMD_PROGRAM 2 //写入字节#define CMD_ERASE 3 //擦除字节/******************************************************************** 编程周期由晶振决定*********************************************************************///#define ENABLE_IAP 0X80 //编程周期由晶振决定(如果<30MHZ选用此项)//#define ENABLE_IAP 0X81 //编程周期由晶振决定(如果<24MHZ选用此项)//#define ENABLE_IAP 0X82 //编程周期由晶振决定(如果<20MHZ选用此项) #define ENABLE_IAP 0X83 //编程周期由晶振决定(如果<12MHZ选用此项)//#define ENABLE_IAP 0X84 //编程周期由晶振决定(如果<6MHZ选用此项)//#define ENABLE_IAP 0X85 //编程周期由晶振决定(如果<3MHZ选用此项)//#define ENABLE_IAP 0X86 //编程周期由晶振决定(如果<2MHZ选用此项)//#define ENABLE_IAP 0X87 //编程周期由晶振决定(如果<1MHZ选用此项)#define IAP_ADDRESS 0X0000 //内部EEPROM地址/******************************************************************** 开机最大次数和最长时间定义*********************************************************************/#define C 10 //开机最大次数(次)#define T 1 //开机最长时间(小时)/******************************************************************** 初始定义*********************************************************************/#define DUAN P0 //P0口控制段#define WEI P2 //P2口控制位uchar Count,days;uint fen,cnt;sbit jdq=P3^3;sbit key=P3^5;/******************************************************************** 函数初始化*********************************************************************/void IapIdle(); //操作函数uchar IapReadByte(uint addr); //读取函数void IapProgramByte(uint addr,uchar dat); //写入函数void IapEraseSector(uint addr); //擦除函数void cshh();//============================================================//延时程序void delayms(unsigned int x){ int i,j; for(i=0;i<x;i++) { for(j=0;j<260;j++); } }/******************************************************************** 主函数*********************************************************************/void main(){ delayms(600); Count=IapReadByte(0); days=IapReadByte(1); Count++; IapEraseSector(0); //擦除扇区 //34us IapProgramByte(0,Count); //写入数据//38us cshh(); //定时器中断初始化 if(Count<C) TR0=1; if(Count>=C||days==T) { TR0=0; jdq=1; IapEraseSector(0); //擦除扇区 IapProgramByte(0,C+2); //写入数据 } while(1) { if(key==0) { while(!key); IapEraseSector(0); //擦除扇区 } }}/******************************************************************** 操作函数*********************************************************************/void IapIdle(){ IAP_CONTR=0; IAP_CMD=0; IAP_TRIG=0; IAP_ADDRH=0X80; IAP_ADDRL=0;}/******************************************************************** 读取一个字节函数*********************************************************************/uchar IapReadByte(uint addr){ uchar dat; IAP_CONTR=ENABLE_IAP; IAP_CMD=CMD_READ; IAP_ADDRL=addr; IAP_ADDRH=addr>>8; IAP_TRIG=0X5A; IAP_TRIG=0XA5; _nop_(); _nop_(); _nop_(); dat=IAP_DATA; IapIdle(); return dat;}/******************************************************************** 写入一个字节函数*********************************************************************/void IapProgramByte(uint addr,uchar dat){ IAP_CONTR=ENABLE_IAP; IAP_CMD=CMD_PROGRAM; IAP_ADDRL=addr; IAP_ADDRH=addr>>8; IAP_DATA=dat; IAP_TRIG=0X5A; IAP_TRIG=0XA5; _nop_(); _nop_(); _nop_(); IapIdle();}/******************************************************************** 擦除一个字节函数*********************************************************************/void IapEraseSector(uint addr){ IAP_CONTR=ENABLE_IAP; IAP_CMD=CMD_ERASE; IAP_ADDRL=addr; IAP_ADDRH=addr>>8; IAP_TRIG=0X5A; IAP_TRIG=0XA5; _nop_(); _nop_(); _nop_(); IapIdle();}/******************************************************************** 定时器中断初始化*********************************************************************/void cshh(){ TMOD|=0X01;//定义定时器工作方式 TH0=(65536-60000)/256; TL0=(65536-60000)%256; ET0=1; EA=1; //开中断 }/******************************************************************** 定时器中断函数*********************************************************************/void timer1(void)interrupt 1{ TH0=(65536-60000)/256; //60ms TL0=(65536-60000)%256; cnt++; if(cnt==1000)//1000次一分钟 { cnt=0; fen++; if(fen==60) //60次为一小时 { fen=0; days++; IapEraseSector(1); //擦除扇区 IapProgramByte(1,Count); //写入数据 } if(days==T) { jdq=1; TR0=0; } } } /******************************************************************** 结束*********************************************************************/