#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0 //定义数据端口
#define waitetime 0x01;
sfr ISP_DATA=0xe2;
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sbit LATCH1=P2^6;
sbit LATCH2=P2^7;
bit flag;
uchar code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
uchar code WeiMa[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//分别对应相应的数码管点亮,即位码
uchar TempData[8]; //存储显示值的全局变量
uchar num;
static unsigned int num1;
void kaiISP(void);
void guanISP(void);
void chufa();
void ISP_write(uint address,uchar dat);
uchar ISP_read(uint address);
void ISP_cachu(uint address);
void smg(uchar FirstBit,uchar num);
void Init_Timer0(void);
void start();
void Timer0_isr(void);
/*********************打开ISP/IAP***********************/
void kaiISP(void)
{
EA=0; //管总中断
ISP_CONTR=ISP_CONTR&0x18; //写入00011000则复位
ISP_CONTR=ISP_CONTR|waitetime; //写入CPU等待时间
ISP_CONTR=ISP_CONTR|0x80; //写入IPSEN=1;
}
/*********************关闭ISP/IAP***********************/
void guanISP(void)
{
ISP_CONTR=ISP_CONTR&0x7f; //IPSEN=0
ISP_TRIG=0x00; //命令出发寄存器复位
EA=1; //开总中断
}
/*********************触发执行**************************/
void chufa(void)
{
void kaiISP();
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
guanISP();
}
/*********************写入字节**************************/
void ISP_write(uint address,uchar dat)
{
ISP_ADDRH=(uchar)(address>>8); //取地址高八位并且赋值uchar变量给ISP_ADDRH
ISP_ADDRL=(uchar)(address&0x00ff); //取地址第八位并且赋值uchar变量给ISP_ADDRL
ISP_CMD=ISP_CMD&0xf8; //清除低三位
ISP_CMD=ISP_CMD|0x02; //写入清除命令
ISP_DATA=dat; //准备写入数据
chufa(); //触发执行
}
/*********************读取字节**************************/
uchar ISP_read(uint address)
{
ISP_ADDRH=(uchar)(address>>8); //取地址高八位并且赋值uchar变量给ISP_ADDRH
ISP_ADDRL=(uchar)(address&0x00ff); //取地址第八位并且赋值uchar变量给ISP_ADDRL
ISP_CMD=ISP_CMD&0xf8;
ISP_CMD=ISP_CMD|0x01;
chufa();
return(ISP_DATA);
}
/*********************扇区擦除**************************/
void ISP_cachu(uint address)
{
uint adr;
adr=(address&0xfe00);
ISP_ADDRH=(uchar)(adr>>8);
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0x18;
ISP_CMD=ISP_CMD|0x03;
chufa();
}
/*********************数码管显示*************************/
void smg(uchar FirstBit,uchar num)
{
static unsigned char i=0;
DataPort=0; //清空数据,防止有交替重影
LATCH1=1; //段锁存
LATCH1=0;
DataPort=WeiMa[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
DataPort=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
i++;
if(i==num)
i=0;
}
/*********************定时器初始化***********************/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/******************定时器中断子程序**********************/
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
smg(0,8); // 调用数码管扫描
num1++;
if(num1==300) //
{
num1=0;
flag=1; //读标志位置1
}
}
/**********************数码管赋值************************/
void start()
{
flag=0;
TempData[0]=DuanMa[num%10];
TempData[1]=DuanMa[num/10];
num++;
if(num>=20)
num=0;
ISP_cachu(0x2000);
ISP_write(0x2000,num);
}
/**********************主函数******************************/
void main()
{
Init_Timer0();//定时器初始化
num=ISP_read(0x2000);
if(num1>=60) //防止首次上电时读取出错
num1=0;
while(1)
{
if(flag==1)
start();
}
}
情况是这样的,上电后单片机先乱码一下,然后正常运行从0开始累加,但是掉电后重新上点,还是先乱码从0累加,eeprom根本没起到作用,求大神指点迷津!跪谢
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0 //定义数据端口
#define waitetime 0x01;
sfr ISP_DATA=0xe2;
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sbit LATCH1=P2^6;
sbit LATCH2=P2^7;
bit flag;
uchar code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
uchar code WeiMa[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//分别对应相应的数码管点亮,即位码
uchar TempData[8]; //存储显示值的全局变量
uchar num;
static unsigned int num1;
void kaiISP(void);
void guanISP(void);
void chufa();
void ISP_write(uint address,uchar dat);
uchar ISP_read(uint address);
void ISP_cachu(uint address);
void smg(uchar FirstBit,uchar num);
void Init_Timer0(void);
void start();
void Timer0_isr(void);
/*********************打开ISP/IAP***********************/
void kaiISP(void)
{
EA=0; //管总中断
ISP_CONTR=ISP_CONTR&0x18; //写入00011000则复位
ISP_CONTR=ISP_CONTR|waitetime; //写入CPU等待时间
ISP_CONTR=ISP_CONTR|0x80; //写入IPSEN=1;
}
/*********************关闭ISP/IAP***********************/
void guanISP(void)
{
ISP_CONTR=ISP_CONTR&0x7f; //IPSEN=0
ISP_TRIG=0x00; //命令出发寄存器复位
EA=1; //开总中断
}
/*********************触发执行**************************/
void chufa(void)
{
void kaiISP();
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
guanISP();
}
/*********************写入字节**************************/
void ISP_write(uint address,uchar dat)
{
ISP_ADDRH=(uchar)(address>>8); //取地址高八位并且赋值uchar变量给ISP_ADDRH
ISP_ADDRL=(uchar)(address&0x00ff); //取地址第八位并且赋值uchar变量给ISP_ADDRL
ISP_CMD=ISP_CMD&0xf8; //清除低三位
ISP_CMD=ISP_CMD|0x02; //写入清除命令
ISP_DATA=dat; //准备写入数据
chufa(); //触发执行
}
/*********************读取字节**************************/
uchar ISP_read(uint address)
{
ISP_ADDRH=(uchar)(address>>8); //取地址高八位并且赋值uchar变量给ISP_ADDRH
ISP_ADDRL=(uchar)(address&0x00ff); //取地址第八位并且赋值uchar变量给ISP_ADDRL
ISP_CMD=ISP_CMD&0xf8;
ISP_CMD=ISP_CMD|0x01;
chufa();
return(ISP_DATA);
}
/*********************扇区擦除**************************/
void ISP_cachu(uint address)
{
uint adr;
adr=(address&0xfe00);
ISP_ADDRH=(uchar)(adr>>8);
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0x18;
ISP_CMD=ISP_CMD|0x03;
chufa();
}
/*********************数码管显示*************************/
void smg(uchar FirstBit,uchar num)
{
static unsigned char i=0;
DataPort=0; //清空数据,防止有交替重影
LATCH1=1; //段锁存
LATCH1=0;
DataPort=WeiMa[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
DataPort=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
i++;
if(i==num)
i=0;
}
/*********************定时器初始化***********************/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/******************定时器中断子程序**********************/
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
smg(0,8); // 调用数码管扫描
num1++;
if(num1==300) //
{
num1=0;
flag=1; //读标志位置1
}
}
/**********************数码管赋值************************/
void start()
{
flag=0;
TempData[0]=DuanMa[num%10];
TempData[1]=DuanMa[num/10];
num++;
if(num>=20)
num=0;
ISP_cachu(0x2000);
ISP_write(0x2000,num);
}
/**********************主函数******************************/
void main()
{
Init_Timer0();//定时器初始化
num=ISP_read(0x2000);
if(num1>=60) //防止首次上电时读取出错
num1=0;
while(1)
{
if(flag==1)
start();
}
}
情况是这样的,上电后单片机先乱码一下,然后正常运行从0开始累加,但是掉电后重新上点,还是先乱码从0累加,eeprom根本没起到作用,求大神指点迷津!跪谢