本帖最后由 nwjjdwx 于 2020-1-3 21:25 编辑
各位朋友大家好,我在这里请教一个问题,我用STC15W404AS做了一个8分钟倒计时的定时器的实验,用了片内的EEPROM,模拟断电存储当前数据,并且提前将“从零开始学单片机”这本书提供的EEPROM驱动加到了KEIL当中,程序写好后编译正常通过,可是断电时的数据怎么就存不到EEPROM中去呢?不好意思我水平太低了,希望大家帮我看看问题出在那儿了。下面上图和程序:C:\Documents and Settings\Administrator\桌面
#include"STC15.H"
#include "STC_EEPROM.h" //随书附赠的EEPROM驱动软件包
#define uint unsigned int
#define uchar unsigned char
sbit ge=P1^0; //声明秒个位驱动(19脚)
sbit shi=P1^1; //声明十秒位驱动(20脚)
sbit bai=P1^2; //分钟数驱动
sbit dian=P1^3; //小数点
sbit key5=P1^4; //模拟断电按钮(按下引起比较器中断)
sbit out1=P5^4; //继电器驱动
uchar code table[]={ 0x48,0x5f,0x38,0x19, //定义字段编码表
0x0f,0x89,0x88,0x5b,0x08,0x09};
uchar gexian,shixian,num,num2,num3,baixian; /ixian=秒十位数,gexian=秒个位数,baixian=分钟数,num=分钟数num3=秒点,
//num2=毫秒计数变量(num=20为1秒),
int num1; //num1=分钟数
///////////////
/*延时子程序 */
/////////////
void delayms(uint xms) //延时1ms子程序
{
uint i,j;
for(i=xms;i>0;i--)
for(j=400;j>0;j--);
}
////////////
/*初始化*/
///////////
void init()
{
P1M1=0x10; //设置P1.0,P1.1,P1.2为推挽
P1M0=0x07; //设置P1.0,P1.1,P1.2为推挽
P5M1=0x00; //设置P5.4为推挽,
P5M0=0x10; //设置P5.4为推挽.
num=byte_read(0x0000); //读出**的分钟数
num1=byte_read(0x0001); //读出**的秒数
if(num==0)
{
if(num1==0)
{
num=8;
}
}
out1=1; //继电器吸合
dian=1; //暂时关闭小数点
TMOD=0x01; //设置定时器0为工作方式1(M1M0为01)
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1;
CMPCR1=0x90; //启动比较器,下降沿触发中断,正极P5.5为输入,负极为内部1.27作比较
CMPCR2=0x3f; //0.1us延时后正常输出,63个时钟后动作,
}
////////////////
/*计时判断程序*/
////////////////
void panduan()
{
if(num==0)
{
if(num1==0)
{
TR0=0; //关定时器
out1=0; //关输出(继电器释放)
}
}
if(num1<0)
{
if(num>=1)
{
num--;
num1=59;
}
}
}
///////////////////////
/*--------------------
显示子程序函数
--------------------*/
///////////////////////
void display(uchar gexian,uchar shixian,uchar baixian)
{
shixian=num1/10; //将num1中的数求模,然后赋值给秒十位显示
gexian=num1%10; //将num1中的数求余,然后赋值给秒个位显示
baixian=num; //将num中的数赋值给分钟数显示
P3=table[gexian];
dian=1;
ge=1;
delayms(5);
ge=0;
P3=table[shixian];
dian=1;
shi=1;
delayms(5);
shi=0;
P3=table[baixian];
dian=num3;
bai=1;
delayms(5);
bai=0;
}
//////////////////
/*---------------
主程序函数
---------------*/
//////////////////
void main()
{
init();
while(1)
{
display(gexian,shixian,baixian); //显示程序
panduan(); //判断程序
}
}
////////////////////////
/*定时器0中断服务程序*/
///////////////////////
void T0_tame() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num2++;
if(num2==20) //num2==20为1秒
{
num2=0;
num1--; //秒数减1(倒计时)
}
if(num2<7)
{
num3=1; //小数点灭0.3秒
}
if(num2>8)
{
num3=0; //小数点亮0.7秒
}
}
///////////////////////
////比较器中断服务程序//
///////////////////////
void cmp()interrupt 21
{
CMPCR1=0x90; //清比较器中断标志
TR0=0;
EA=0; //关中断
SectorErase(0x0000); //擦除扇区,Sector=扇区,Erase=擦除,擦除从0x0000开始的一个扇区
byte_write(0x0000,num); //将小时数存入0x0000单元中
byte_write(0x0001,num1); //将分钟数存入0x0001单元中
num3=0; //小数点保留显示
}
|