EEPROM_24C02.c程序的定时器问题。
//文件名 : EEPROM_24C02.c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit scl=P3^6;
sbit sda=P3^7;
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uchar sec; //定义计数值,每过1秒,sec加1
bit write=0;//写标志位
//*******************短暂的延时函数****************************************************/
void delay1(uint i)
{
uchar x, j;
for(j=0; j<i; j++)
for(x=0; x<=148; x++)
;
}
//***********24c02初始化程序*****************
void init_24c02()
{
scl=1;
_nop_(); _nop_();_nop_();_nop_();_nop_();
sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//************24c02的启动程序*************************
void start_24c02()
{
sda=1; //发送开始信号的数据信号
_nop_();
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();//开始信号建立时间大于4.7US.
sda=0; //发送开始信号
_nop_();_nop_();_nop_();_nop_();_nop_();//开始信号锁定时间大于4us。
scl=0; // 钳住IC总线,准备发送或接受总线。
_nop_();_nop_();
}
//**************24c02的终止程序************************************
void stop_24c02()
{
sda=0; //发送结束信号的数据信号
_nop_();
scl=1; //发送结束信号的时钟信号
_nop_();_nop_();_nop_();_nop_();_nop_();// 结束信号建立时间大于4US.
sda=1; //发送IC总线的结束信号。
_nop_();_nop_();_nop_();_nop_();
}
//*************24c02的应答信号*****************************************
void respond_24c02()
{
uchar i=0;
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
while ((sda==1)&&(i<250)) //若在一段时间内没有接受到从器件的应答则主器件默认从器件乙已经收到数据而不再等待应答信号。
{
i++;
}
scl=0;
_nop_();_nop_();_nop_();_nop_();
}
//*******************24c02的写字节************************************
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
_nop_();_nop_();
sda=CY;
_nop_();_nop_();
scl=1;
}
scl=0;
_nop_();_nop_();
sda=1;
_nop_();_nop_();
}
//*********************24c02读字节*************************************
uchar read_byte()
{
uchar i,k;
scl=0;
_nop_();_nop_();
sda=1;
for(i=0;i<8;i++)
{
scl=1;
_nop_();_nop_();
k=(k<<1)|sda;
scl=0;
_nop_();_nop_();
}
_nop_();_nop_();
return k;
}
//**********************24C02的写器件地址***********************************
void write_add(uchar address ,uchar date)
{
start_24c02();
write_byte(0xa0) ;
respond_24c02();
write_byte(address);
respond_24c02();
write_byte(date) ;
respond_24c02();
stop_24c02() ;
delay1(5);
}
//************************24c02的读器件地址*****************************************
uchar read_add(uchar address)
{
uchar date;
start_24c02();
write_byte(0xa0) ;
respond_24c02();
write_byte(address);
respond_24c02();
start_24c02() ;
write_byte(0xa1) ;
respond_24c02();
date=read_byte();
stop_24c02() ;
delay1(10);
return date;
}
// *************************数码管的现实函数************************
void display()
{
P2=0X02;
P0=table[sec/10];
delay1(5);
P2=0X01;
P0=table[sec%10];
delay1(5);
}
//*************************定时器的初始化**************************
void timer0_init()
{
TMOD=0X01;
//TR0=1;
ET0=1;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
EA=1;
TR0=1;
}
//***********************主要的函数 main *************************
main()
{
P2=0X00;
init_24c02();
timer0_init();
sec=read_add(2);
while(1)
{
display();
if(write==1)
{
write=0;
write_add(2,sec);
}
}
}
//***********************定时器函数******************************
void timer0() interrupt 1
{
uchar count=0;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
count++;
if(count==20)
{
count=0;
sec++;
write=1; //一秒写一次24C02
if(sec==100)
sec=0;
}
}
每次现实的时候都是25, 定时器好像没有用进去,大家帮帮忙,看看。
[解决办法]
void timer0() interrupt 1貌似这个定时器程序有固定的格式的
void timer0() interrupt 1 using 0这样试试
[解决办法]
void timer0() interrupt 1
{
uchar count=0; // 每次进入中断就复位count?
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
count++;
if(count==20) // 这里永远为false吧?
[解决办法]
同意楼上的
[解决办法]
uchar sec; //定义计数值,每过1秒,sec加1
把这句改成 uchar sec=0; 试试
另外每次初始化都显示25的话, 你可以查查 你的硬件连线是不是正确~
[解决办法]