读DS1307寄存器时,DS1307不工作? 是用PROTUES 仿真 程序: #include <reg52.h> #include <absacc.h> //#include <intrins.h> void _nop_(void);
#define Uchar unsigned char #define Uint unsigned int #define Lcd_cmd_wr XBYTE [0x8000] #define Lcd_data_wr XBYTE [0x8100] #define Lcd_busy_rd XBYTE [0x8200] #define Lcd_data_rd XBYTE [0x8300]
#define Lcd_cls 0x01 #define Lcd_home 0x02 #define Lcd_setmode 0x04 #define Lcd_setvisible 0x08 #define Lcd_shift 0x10 #define Lcd_setfunction 0x20 #define Lcd_setcgaddr 0x40 #define Lcd_setddaddr 0x80
#define DS1307_W 0xD0 #define DS1307_R 0xD1
sbit busy=P0^7; sbit E=P1^1; sbit A15=P2^7; sbit wdg=P3^4; sbit I2C_SCK=P1^6; sbit I2C_SDA=P1^7; sbit led=P1^0;
Uchar RTC_ADDRESS[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06}; Uchar WRITE_DATA[]={0x31,0x02,0x13,4,0x21,0x05,0x09}; Uchar DISPLAY_DATA[7];
void Delay_us(Uchar i) { while(i--); }
void short_delay() { _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); }
void delay() { Uint i=500; while(i--) {Uchar j=120; while(j--); } }
//*********************************************** // I2C subprocedure // //*********************************************** bit I2C_Start(void) { short_delay(); I2C_SDA =1; short_delay(); I2C_SCK =1; short_delay(); if ( I2C_SDA == 0) return 0; if ( I2C_SCK == 0) return 0; I2C_SDA = 0; short_delay(); I2C_SCK = 0; short_delay(); return 1; } void I2C_Stop(void) { short_delay(); I2C_SDA = 0; short_delay(); I2C_SCK = 1; short_delay(); I2C_SDA = 1; short_delay(); } void I2C_Ack(void) { short_delay(); I2C_SDA=0; short_delay(); I2C_SCK=1; short_delay(); I2C_SCK=0; short_delay(); } void I2C_Nack(void) { short_delay(); I2C_SDA=1; short_delay(); I2C_SCK=1; short_delay(); I2C_SCK=0; short_delay(); }
bit I2C_Send_Byte(unsigned char d) { unsigned char i=8; bit bit_ack; while( i-- ) { short_delay(); if ( d &0x80 ) I2C_SDA =1; else I2C_SDA =0; short_delay(); I2C_SCK = 1; short_delay(); I2C_SCK = 0; d = d << 1; } short_delay(); I2C_SDA = 1; short_delay(); I2C_SCK = 1; short_delay(); bit_ack = I2C_SDA; I2C_SCK =0; short_delay(); return bit_ack; }
unsigned char I2C_Receive_Byte(void) { unsigned char i = 8, d; short_delay(); I2C_SDA = 1; while ( i--) { d = d << 1; short_delay(); I2C_SCK =1; if ( I2C_SDA ) d++; short_delay(); I2C_SCK =0; } return d; } //**********************************************************************************// void wrcmd(Uchar i) { Lcd_cmd_wr=i; Delay_us(10); wdg=1; wdg=0; }
void wrdata(Uchar i) { Lcd_data_wr=i; Delay_us(10); wdg=1; wdg=0; }
//****************************************************************************// // DS1307读写子程序 /****************************************************************************/ void Write_DS1307( unsigned char address,unsigned char dat ) { I2C_Start(); I2C_Send_Byte(DS1307_W); I2C_Send_Byte(address); //发送地址 I2C_Send_Byte(dat); //发送数据 I2C_Stop(); }
unsigned char Read_DS1307 ( unsigned char address ) { Uchar temp; I2C_Start(); I2C_Send_Byte(DS1307_W); I2C_Send_Byte(address); I2C_Start(); I2C_Send_Byte(DS1307_R); temp=I2C_Receive_Byte(); I2C_Nack(); I2C_Stop(); return temp; }
/****************************************************************************/ //**************************************************************************** // DS1307 init
// //**************************************************************************// void DS1307_init(void) { Uchar i,*p,*s; p=RTC_ADDRESS; s=WRITE_DATA; for(i=0;i<7;i++) { Write_DS1307(*p,*s); p++; s++; } }
//********************************************************************read time void Read_time(void) { Uchar i,*p; p=RTC_ADDRESS; for(i=0;i<7;i++) { DISPLAY_DATA=Read_DS1307(*p); p++; } }
/*显示屏字符串写入函数*/ void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { wrcmd(0x80 + x); } else { wrcmd(0xC0 + x); } while (*s) { wrdata( *s); s ++; } }
/*显示屏单字符写入函数*/ void LCD_write_char(unsigned char x,unsigned char y,unsigned char date) { if (y == 0) { wrcmd(0x80 + x); } else { wrcmd(0xC0 + x); } wrdata( date); }
void main() { P1=0xff; Lcd_cmd_wr=0x38; Delay_us(10); Lcd_cmd_wr=0x0c; Delay_us(10); DS1307_init(); Read_time(); while (1) { Read_time(); LCD_write_char(1,0,((DISPLAY_DATA[0]>>4)&0x0f)+0x30); LCD_write_char(2,0,(DISPLAY_DATA[0]&0x0f)+0x30); LCD_write_char(4,0,((DISPLAY_DATA[1]>>4)&0x0f)+0x30); LCD_write_char(5,0,(DISPLAY_DATA[1]&0x0f)+0x30); LCD_write_char(7,0,((DISPLAY_DATA[2]>>4)&0x0f)+0x30); LCD_write_char(8,0,(DISPLAY_DATA[2]&0x0f)+0x30); LCD_write_char(1,1,((DISPLAY_DATA[4]>>4)&0x0f)+0x30); LCD_write_char(2,1,(DISPLAY_DATA[4]&0x0f)+0x30); LCD_write_char(4,1,((DISPLAY_DATA[5]>>4)&0x0f)+0x30); LCD_write_char(5,1,(DISPLAY_DATA[5]&0x0f)+0x30); LCD_write_char(7,1,((DISPLAY_DATA[6]>>4)&0x0f)+0x30); LCD_write_char(8,1,(DISPLAY_DATA[6]&0x0f)+0x30); } } 如果在死循环里屏蔽掉Read_time();DS1307就正常计时。 不会上传图片 |