新手入门
- 积分
- 6
- 金钱
- 6
- 注册时间
- 2022-2-17
- 在线时间
- 2 小时
|
1金钱
#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;
}
}
|
|
|