大虾们,帮忙给看看。没加看门狗,数码管可以显示00-99。
数码管显示99。看看应该在哪儿喂狗呢?
/* this program is a led's example */
#include <reg51.h>
#include <stdio.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define WREN 0x06
#define WRDI 0x04
#define RDSR 0x05
#define WRSR 0x01
#define READ 0x03
#define WRITE 0x02
#define nop5(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
sbit SO=P2^0;
sbit SI=P2^2;
sbit SCK=P2^3;
sbit SCS=P2^4;
sbit WP=P2^1;
void rd_data(uchar);
void timeToBuffer();
void delay(uint);
void scanled();
void csh_X25045();
void rest_dog();
bit dog_sign;
uchar one;
uchar ten;
uchar buffer[2];
uchar dog_buff[10];
void delay(uint x)
{ uchar j;
while((x--)!=0){
for(j=0;j <125;j++)
{;}
}
}
void init_sys(void)
{ IP=0x08;
TMOD=0x11;
TH0=0x4c;
TL0=0;
TH1=0xb8;
TL1=0;
TR0=1;
TR1=1;
ET0=1;
ET1=1;
EA=1;
ten=0;
one=0;
dog_sign=0;
buffer[0]=0x28;
buffer[1]=0x28;
}
void timer0(void) interrupt 1 using 1
{uchar click=0;
TH0=0x4c;
TL0=0x81;
++click;
if(click> =20){
click=0;
if(one++> =9){
one=0;
if(ten++> =9){
ten=0;
}
}
}
}
void timer1(void) interrupt 3 using 2
{uchar count=0;
TL1=0;
TH1=0xb8;
++count;
if(count==70)
rest_dog();
}
void scanled()
{uchar i;
uchar opt0=0xff;
uchar digit=0x80;
for(i=0;i <2;i++){
P2=digit&0xc0;
P0=buffer[i];
delay(1);
P0=0xff;
digit> > =1;
}
}
void timeToBuffer()
{ rd_data(10);
buffer[0]=dog_buff[one];
buffer[1]=dog_buff[ten];
}
/*********************************************************************
%%%%%%%%%%%%%%%%%%%%%%%%*X5045开始%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
**********************************************************************/
/**********************************************************************
向 X5045 发送命令 (8 bit) (初始:SCS = 0), SCK上升沿锁存数据
***********************************************************************/
void sent_X5045(uchar n)
{
uchar i;
for ( i=0x80; i> =0x01; i=i> > 1 )
{
SCK = 0; /* SCK=0 */
if ( ( n & i ) == 0 ) SI = 0;
else SI = 1; /* 置SI */
SCK = 1; /* SCK=1 */
SI=0; /* 清SI */
}
}
/***********************************************************************
从 X5045 读出数据 (8 bit) (初始:SCS = 0), SCK下降沿输出数据
************************************************************************/
uchar get_X5045()
{
uchar i,n;
n=0x00;
for ( i=0x80; i> =0x01; i=i> > 1 )
{
SCK = 1;
SO = 1; /* 置 SO 为读 */
SCK = 0;
if ( SO == 1 ) n = ( n | i );
}
return( n );
}
/******************************************************************************
读 X5045 状态寄存器 (8 bit)
******************************************************************************/
uchar rdsr_X5045()
{
uchar n;
SCK = 0;
SCS = 0;
sent_X5045( 0x05 ); /* RDSR => X5045 */
n = get_X5045( );
SCK = 0;
SCS = 1;
return( n );
}
/******************************************************************************
等 X5045 内部写完成
******************************************************************************/
void wrok_X5045()
{
uchar i;
for ( i=0; i <=99; i++ )
{
if ( ( rdsr_X5045() & 0x01 ) == 0x00 ) break;
}
}
/******************************************************************************
置 X5045 写使能
******************************************************************************/
void wren_X5045()
{
SCK = 0;
SCS = 0;
sent_X5045( 0x06 ); /* WREN => X5045 写使能 */
SCK = 0;
SCS = 1;
}
/******************************************************************************
置 X5045 写禁止
******************************************************************************/
void wrdi_X5045()
{
SCK = 0;
SCS = 0;
sent_X5045( 0x04 ); /* WREN => X5045 写使能 */
SCK = 0;
SCS = 1;
}
/******************************************************************************
写 X5045 状态寄存器 (8 bit)
******************************************************************************/
void wrsr_X5045( uchar n )
{
SCK = 0;
SCS = 0;
wren_X5045();
nop5();
SCS=0;
sent_X5045( 0x01 ); /* WRSR=> X5045 */
sent_X5045( n ); /* n => X5045 看门狗定时, 块保护范围, */
SCK = 0;
SCS = 1;
wrok_X5045();
}
/******************************************************************************
初始化 X5045
******************************************************************************/
void csh_X5045()
{
uchar n;
n = 0x00; /* 0x00 => X25045状态寄存器看门狗定时:1.4s, 块保护范围: NO */
if ( rdsr_X5045() != n )
{
wren_X5045();
wrsr_X5045( n );
wrdi_X5045();
}
}
/******************************************************************************
从 X5045 读1个字节
uchar Cread_EEPROM( uint addr )
输入: addr 地址范围 0x000-0x1FF [512B]
输出: 数据 (uchar,char)
******************************************************************************/
uchar Cread_EEPROM( uint addr )
{
uchar n;
/* 访问看门狗 */
SCS = 0; /* 清看门狗 */
SCS = 1; /* 恢复看门狗 */
n = 0x03; /* 0000 (A8)011 READ */
if ( ( addr & 0x0100 ) != 0 ) n = ( n | 0x08 ); //高位
SCK = 0;
SCS = 0;
sent_X5045( n ); /* READ => X5045 */
sent_X5045( (uchar)(addr) ); /* addr => X5045 */
n = get_X5045( ); /* X5045 => n */
SCK = 0;
SCS = 1;
return( n );
}
/******************************************************************************
从 X5045 读数组
uchar read_data(uchar count )
输入: addr 地址范围 0x000-0x1FF [512B]
输出: 数据 (char)
******************************************************************************/
void rd_data(uchar count)
{
uchar i;
for(i=0;i <count;i++)
{
dog_buff[i]=Cread_EEPROM( 0x010 );
}
}
/******************************************************************************
向 X5045 写1个字节
void Cwrite_EEPROM( uint addr, uchar n )
输入: addr 地址范围 0x000-0x1FF [512B]
n 数据(uint,uchar)
******************************************************************************/
void Cwrite_EEPROM( uint addr, uchar n )
{
uchar i;
/* 访问看门狗 */
SCS = 0; /* 清看门狗 */
SCS = 1; /* 恢复看门狗 */
if ( Cread_EEPROM( addr ) == n ) return;
i = 0x02; /* 0000 (A8)010 WRITE */
if ( ( addr & 0x0100 ) != 0 ) i = ( i | 0x08 );
wren_X5045();
SCK = 0;
SCS = 0;
sent_X5045( i ); /* WRITE => X5045 */
sent_X5045( (uchar)(addr) ); /* addr => X5045 */
sent_X5045( n ); /* n => X5045 */
SCK = 0;
SCS = 1;
wrok_X5045();
wrdi_X5045();
}
/******************************************************************************
向 X5045写数据 整型数(2B)
void Iwrite_EEPROM( uint addr, uint n )
输入: addr 地址范围0x000-0x1FF [512B]
n = 写入数值(uint, int)
******************************************************************************/
void write_data(uchar *buff,uchar n)
{
uchar i;
for(i=0;i <n;i++)
{
Cwrite_EEPROM(0x010,buff[i]);
}
}
//复位看门狗子程
void rest_dog(void)
{
SCS=1;
SCS=0;
}
/**************************************************
* X5045
* 结束
**************************************************/
void main()
{
uchar table[10]={0x28,0x7E,0xA4,0x64,0x72,0x61,0x21,0x7C,0x20,0x60};
csh_X5045();
init_sys();
write_data(&table,10);
for(;;)
{
timeToBuffer();
scanled();
}
}
发表时间:2003年9月26日10:23:51