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