完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 moleboy 于 2013-11-27 16:47 编辑 ds1302 芯片,时间运行的很准,走时正常,安装备用电池也能正常工作, 当电源断电后,隔几分钟再给电 时间也正常运行! 但是发现设备一直工作 不一定哪一天(也许3天后,也许半个月后,可能跟停电有关,停电时间长短有关系) 举个例子:时间显示本应该18:00:00 变成 01:00:00 我怀疑可能什么因素导致DS1302 归位或者晶振停振了! 在设备上接有一个TT电机 通过 104电容和22uf的电解电容抗干扰 还串联了一个47亨的电感, DS1302电源供电也并联一个10uf的电解电容! 程序如下: #include #include #define uchar unsigned char #define uint unsigned int void delay_main(uint z); /******************************************************************************* 以下是对液晶模块的操作程序 *******************************************************************************/ unsigned char time; //忙碌标志位,,将BF位定义为P0.7引脚 ***it LCD_RS = P1^0; ***it LCD_RW = P1^1; ***it LCD_EN = P1^2; ***it BEEP = P1^3; ***it DENG = P1^4; ***it DENGSHI=P3^7; //***it lcde=P2^7; //***it rs=P2^6; //***it rw=P2^5; ***it K1 = P3^0; ***it K2 = P3^1; ***it K3 = P3^2; ***it K4 = P3^3; ***it B1 = P2^0; ***it B2 = P2^1; ***it B3 = P2^2; ***it B4 = P2^4; ***it BEIDENG=P2^3; ***it reset = P1^7; ***it sclk = P1^5; ***it io = P1^6; //***it SCK=P3^6; //时钟 //***it SDA=P3^4; //数据 //***it RST=P3^5;// DS1302复位 bit flag=1,hour=0,min=0,sec=0; bit year=0,month=0,day=0,week=0; bit alarm_flag=0; uchar timecount=0,count=0; uchar str1[]=" - - Week: "; uchar str2[]=" "; uchar init [] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; // uchar init1[] ={0x00,0x00}; uchar init2[] ={0x00,0x59,0x23,0x01,0x05,0x01,0x06}; // //秒, 分, 时, 日, 月,星期,年 uchar bj_time[] ={0x00,0x57,0x22}; //秒, 分, 时 uchar code mytab[8] = {0x00,0x00,0x0E,0x04,0x0A,0xFF,0x00,0x00};//小灯 //显示右下角开灯图标 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void Set_W1302(uchar addr); void Set_Flash(uchar row,uchar col); void Set_place(uchar row,uchar col); void Play_nowtime(); void key_set(uchar num,uchar row,uchar col ); void alarm_time(); void Play_alarmtime(); void Time_compare(); /******************************************************************/ /******************************************************************/ void delay1(int ms) { unsigned char y; while(ms--) { for(y = 0; y<250; y++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } /******************************************************************/ /* */ /*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */ /* */ /******************************************************************/ bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); } /*********************************************************/ /* */ /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ /* */ /*********************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*********************************************************/ /* */ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ /* */ /*********************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*********************************************************/ /* */ /* LCD初始化设定 */ /* */ /*********************************************************/ void init_lcd() { delay1(15); lcd_wcmd(0x01); //清除LCD的显示内容 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay1(5); lcd_wcmd(0x38); delay1(5); lcd_wcmd(0x38); delay1(5); lcd_wcmd(0x0c); //显示开,关光标 delay1(5); lcd_wcmd(0x06); //移动光标 delay1(5); lcd_wcmd(0x01); //清除LCD的显示内容 delay1(5); } /*********************************************************/ // /*********************************************************/ void delay() { uchar j; for(j=250;j>0;j--); } /*********************************************************/ /* */ /* 写字符串函数 */ /* */ /*********************************************************/ void write_str(uchar addr,uchar *p) { uchar i=0; lcd_wcmd(addr); while(p!=' |