|
|
//#include <STC89C52RC.H>
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint temp,aa,a,V;
sbit mmm=P3^4;//復(fù)位
sbit nnn=P3^2;//繼電器
sbit kkk=P3^3;//燈
void cc(uint addr) ;
void xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void Q0();
/****************特殊功能寄存器聲明****************/
sfr ISP_DATA = 0xc2;
sfr ISP_ADDRH = 0xc3;
sfr ISP_ADDRL = 0xc4;
sfr ISP_CMD = 0xc5;
sfr ISP_TRIG = 0xc6;
sfr ISP_CONTR = 0xc7;
void cc(uint addr);
void xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void Q0();
void init1();
//計數(shù)器初始化
void delay1(unsigned int cnt);
void delay_50us(uint t)
{
uchar F;
for(;t>0;t--)
for(F=19;F>0;F--);
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
//uchar gg;
init1();
temp=dcx(0x2002);
//if(gg==2)
// {
// bai=temp/100;
// shi=temp%100/10;
// ge=temp%10;
// display(bai,shi,ge);
// }
while(1)
{
if(aa==20)
{
aa=0;
temp++;
cc(0x2000);
delay1(300); // 擦除第1個扇區(qū)(2000h~21FFh)
xcx(0x2002,temp);
delay1(300);
if(temp<=5)
{
nnn=1;
kkk=1;
}
if(temp>1&&temp<20)
{
nnn=0;
kkk=0;
}
if(temp>=20)
{
temp=20;
nnn=1;
kkk=1;
}
if(mmm==0)
{
delay_50us(200);
if(mmm==0)
{
cc(0x2000);
delay1(300);
temp=1;
nnn=1;
kkk=1;
xcx(0x2002,temp);
delay1(300);
temp=dcx(0x2002);
delay1(300);
while(!mmm);
}
delay_50us(200);
while(!mmm);
}
}
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):擦除某一扇區(qū)(每個扇區(qū)512字節(jié))
入口:addr = 某一扇區(qū)首地址
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void cc(uint addr)
{
// 打開 IAP 功能(ISP_CONTR.7)=1:允許編程改變Flash, 設(shè)置Flash操作等待時間
// 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M)
ISP_CONTR = 0x81;
ISP_CMD = 0x03; // 用戶可以對"Data Flash/EEPROM區(qū)"進行扇區(qū)擦除
ISP_ADDRL = addr; // ISP/IAP操作時的地址寄存器低八位,
ISP_ADDRH = addr>>8; // ISP/IAP操作時的地址寄存器高八位。
ISP_TRIG = 0x5A; // 在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,
ISP_TRIG = 0xA5; // 再寫入B9h,ISP/IAP命令才會生效。
_nop_();
Q0(); // 關(guān)閉ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):寫一字節(jié)
入口:addr = 扇區(qū)單元地址 , dat = 待寫入數(shù)據(jù)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void xcx(uint addr,uchar dat)
{
ISP_CONTR = 0x81;
ISP_CMD = 0x02; // 用戶可以對"Data Flash/EEPROM區(qū)"進行字節(jié)編程
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
ISP_DATA = dat; // 數(shù)據(jù)進ISP_DATA
ISP_TRIG = 0x5A;
ISP_TRIG = 0xA5;
_nop_();
_nop_();
_nop_();
Q0(); // 關(guān)閉ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):讀一字節(jié)
入口:addr = 扇區(qū)單元地址
出口:dat = 讀出的數(shù)據(jù)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uchar dcx(uint addr)
{
uchar dat;
ISP_CONTR = 0x81;
ISP_CMD = 0x01; // 用戶可以對"Data Flash/EEPROM區(qū)"進行字節(jié)讀
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
ISP_TRIG = 0x5A;
ISP_TRIG = 0xA5;
_nop_();
dat = ISP_DATA; // 取出數(shù)據(jù)
Q0(); // 關(guān)閉ISP/IAP
return dat;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):關(guān)閉ISP/IAP操作
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0()
{
ISP_CONTR = 0; // 關(guān)閉IAP功能
ISP_CMD = 0; // 待機模式,無ISP操作
ISP_TRIG = 0; // 關(guān)閉IAP功能, 清與ISP有關(guān)的特殊功能寄存器
}
void delay1(unsigned int cnt)
{
while(--cnt);
}
void init1() //計數(shù)器初始化
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
/*
STC89C52RC內(nèi)部EEPROM詳細地址表:
第一扇區(qū) 第二扇區(qū) 第三扇區(qū) 第四扇區(qū)
起始地址 結(jié)束地址 起始地址 結(jié)束地址 起始地址 結(jié)束地址 起始地址 結(jié)束地址
2000h 21FFh 2200h 23FFh 2400h 25FFh 2600h 27FFH
第五扇區(qū) 第六扇區(qū) 第七扇區(qū) 第八扇區(qū)
起始地址 結(jié)束地址 起始地址 結(jié)束地址 起始地址 結(jié)束地址 起始地址 結(jié)束地址
2800h 29FFh 2A00h 2BFFh 2C00h 2DFFh 2E00h 2FFFh
*/
|
|