|
#include <STC15.H>
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define count 50000
#define TimerH0_M1 (65536-count)/256
#define TimerL0_M1 (65536-count)%256
#define uint unsigned int
#define uchar unsigned char
#define CMD_IDLE 0 //空閑模式
#define CMD_READ 1 //IAP字節(jié)讀命令
#define CMD_PROGRAM 2 //IAP字節(jié)編程命令
#define CMD_ERASE 3 //IAP扇區(qū)擦除命令
#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
#define IAP_ADDRESS 0x0000
//void DelayB(BYTE n);
//void IapIdle();
//BYTE IapReadByte(WORD addr);
//void IapProgramByte(WORD addr, BYTE dat);
//void IapEraseSector(WORD addr);
uint t=0,i=0,d=0,temp,sec=0,min=0,h=0;
//****************************************************
//延時(shí)函數(shù)
//****************************************************
void Delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<121;j++);
}
//****************************************************
//發(fā)送函數(shù)
//****************************************************
void send(unsigned int m)
{
ES=0; //關(guān)串口中斷
SBUF=m;
while(!TI);
TI=0;
ES=1; //開串口中斷
}
//****************************************************
//初始化函數(shù)
//****************************************************
void init()
{
EA =0; //總中斷關(guān)
TMOD=0x21; //定時(shí)/計(jì)數(shù)工作模式
AUXR=0x14;
AUXR|=0x01; //STC15W204S使用定時(shí)器2做波特率發(fā)生器
T2H =0xfe; //波特率9600 N 8 1
T2L =0xe0; //65536-(晶振/32/波特率)
SCON=0x50; //串行口控制寄存器,8位可變波特率
PCON=0x00; //波特率選擇寄存器,不加倍
TR1 =1; //定時(shí)器1開
TR0 =1; //定時(shí)器0開
ET0 =1; //定時(shí)器0中斷開
EA =1; //總中斷開
ES =1; //串口中斷開
RI =0; //清除串口接收標(biāo)志位
TI =0; //清除串口發(fā)送標(biāo)志位
sec=0; //秒
min=0; // 分
h=0; // 時(shí)
}
///*----------------------------
//關(guān)閉IAP
//----------------------------*/
//void IapIdle()
//{
// IAP_CONTR = 0; //關(guān)閉IAP功能
// IAP_CMD = 0; //清除命令寄存器
// IAP_TRIG = 0; //清除觸發(fā)寄存器
// IAP_ADDRH = 0x80; //將地址設(shè)置到非IAP區(qū)域
// IAP_ADDRL = 0;
//}
///*----------------------------
//從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
//----------------------------*/
//BYTE IapReadByte(WORD addr)
//{
// BYTE dat; //數(shù)據(jù)緩沖區(qū)
// IAP_CONTR = ENABLE_IAP; //使能IAP
// IAP_CMD = CMD_READ; //設(shè)置IAP命令
// IAP_ADDRL = addr; //設(shè)置IAP低地址
// IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
// IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
// IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
// _nop_(); //等待ISP/IAP/EEPROM操作完成
// dat = IAP_DATA; //讀ISP/IAP/EEPROM數(shù)據(jù)
// IapIdle(); //關(guān)閉IAP功能
// return dat; //返回
//}
///*----------------------------
//寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
//----------------------------*/
//void IapProgramByte(WORD addr, BYTE dat)
//{
// IAP_CONTR = ENABLE_IAP; //使能IAP
// IAP_CMD = CMD_PROGRAM; //設(shè)置IAP命令
// IAP_ADDRL = addr; //設(shè)置IAP低地址
// IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
// IAP_DATA = dat; //寫ISP/IAP/EEPROM數(shù)據(jù)
// IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
// IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
// _nop_(); //等待ISP/IAP/EEPROM操作完成
// IapIdle();
//}
///*----------------------------
//扇區(qū)擦除
//----------------------------*/
//void IapEraseSector(WORD addr)
//{
// IAP_CONTR = ENABLE_IAP; //使能IAP
// IAP_CMD = CMD_ERASE; //設(shè)置IAP命令
// IAP_ADDRL = addr; //設(shè)置IAP低地址
// IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
// IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
// IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
// _nop_(); //等待ISP/IAP/EEPROM操作完成
// IapIdle();
//}
//****************************************************
//主函數(shù)
//****************************************************
void main()
{
init(); //單片機(jī)初始化
WDT_CONTR=0x36; //啟動(dòng)看門狗,清零看門狗,設(shè)置其為128分頻,4.5511s溢出
Delay(100);
//sec=IapReadByte(IAP_ADDRESS);
//min=IapReadByte(0x0200);
send(0xDD);
while(1)
{
/***************************測(cè)試數(shù)據(jù)記憶用********************************/
// send(IapReadByte(IAP_ADDRESS));
// Delay(10);
// send(IapReadByte(0x0200));
/*************************************************************************/
Delay(2000);
Delay(2000);
Delay(2000);
Delay(2000);
Delay(2000);
Delay(2000);
Delay(2000);
WDT_CONTR=0x36; //啟動(dòng)看門狗,清零看門狗,設(shè)置其為128分頻,4.5511s溢出
}
}
//****************************************************
//串口1中斷函數(shù)
//****************************************************
void Uart1(void) interrupt 4 //串口中斷
{
ES=0;
if(RI==1)
temp=SBUF;
send(temp);
if(temp==0xCC)
{
// IapEraseSector(0x0000); //扇區(qū)擦除
// IapEraseSector(0x0200); //扇區(qū)擦除
Delay(100);
// IapProgramByte(0x0000, 0); //寫數(shù)據(jù)
// IapProgramByte(0x0200, 0); //寫數(shù)據(jù)
}
RI=0;
ES=1;
}
//****************************************************
//定時(shí)器0中斷函數(shù)
//****************************************************
void time0(void) interrupt 1
{
TH0 =TimerH0_M1;
TL0 =TimerL0_M1;
t++;
if(t>=20) //t=20為1sec
{
sec++;
// IapEraseSector(IAP_ADDRESS); //扇區(qū)擦除
// IapProgramByte(0x0000, sec); //寫數(shù)據(jù)
t=0;
}
if(sec>=60) //sec=60為1min
{
min++;
// IapEraseSector(0x0200); //扇區(qū)擦除
// IapProgramByte(0x0200, min); //寫數(shù)據(jù)
sec=0;
}
/***************************只需要設(shè)置min值就好了********************************/
/********************************STC15W204S**************************************/
/****************************12H=720 0x02D0***********************************/
/****************************24H=1440 0x05A0***********************************/
/****************************72H=4320 0x10E0***********************************/
/********************************************************************************/
// if(sec>=0x000A) //例測(cè)試用10秒
// if(min>=0x0001) //例測(cè)試用1分鐘
// if(min>=0x5A0)//24小時(shí)
// if(min>=0xB40)//48小時(shí)
// if(min>=0x10E0)//72小時(shí)
if(min>=0x0009) //測(cè)試9分鐘
{
min=0;
sec=0;
// IapEraseSector(IAP_ADDRESS); //扇區(qū)擦除
// Delay(100);
// IapProgramByte(0x0000, sec); //寫數(shù)
// Delay(100);
// IapEraseSector(0x0200); //扇區(qū)擦除
// Delay(100);
// IapProgramByte(0x0200, min); //寫數(shù)據(jù)-清楚溢出標(biāo)志
Delay(2000);
P32=0;
P32=0;
P32=0;
}
}
|
|