定时定次催款应用程序设计
时间:11-30 11:38 阅读:775次
*温馨提示:点击图片可以放大观看高清大图
简介:实现功能:定时定次催款应用程序
使用芯片: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;
}
}
}
/********************************************************************
结束
*********************************************************************/