DS1302 时钟芯片的程序
DS1302时钟程序
#define ds1302_charge_add 0x8e //控制数据地址
unsigned char sec,min,hr;
sbit DS1302_CLK=P1^5; //实时时钟时钟线引脚
sbit DS1302_IO=P1^6; //实时时钟数据线引脚
case 1:P2_1=0;P0=led_code[led_reg[1]]; break;
case 2:P2_2=0;P0=led_code[led_reg[2]]; break;
case 3:P2_3=0;P0=led_code[led_reg[3]]; break;
case 4:P2_4=0;P0=led_code[led_reg[4]]; break;
else temp&=0x7F;
DS1302_CLK=1;
DS1302_CLK=0;
}
DS1302_CLK=1;
DS1302_RST=0; //停止DS1302总线
return temp;
}
void T_display() //时钟显示
DS1302_CLK=1;
DS1302_CLK=0;
addr=addr>>1;
}
for(i=0;i<8;i++) //输出数据:temp
{
temp=temp>>1;
if(DS1302_IO)temp|=0x80;
}
}
void main() //主程序
{
ds1302_init();
delay(5);
ds1302时钟芯片汇编控制程序
OUTBIT1:MOV C,T_IO
RRC A
SETB T_CLK
CLR T_CLK
DJNZ R4,OUTBIT1
RET
;---------- ----------END DS0302--------------------------------
SETB T_CLK
CLR T_RST
mov R0,#SECOND
MOV R7,#3 ;秒/时/分;-----R7
MOV R1,#80H ;秒写地址;-----R1
S1302:
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,R1 ;写秒/时/分地址;---R1
LCALL WRITEBYTE
ds1302时钟芯片ds1302时钟电路ds1302时钟不走ds1302芯片功能ds1302ds1302lcd1602时钟ds1302芯片ds1302中文资料ds1302工作原理ds1302程序
DS1302初始化及读写操作汇编程序
;************ DS1302初始化子程序************************************
MOV R0,#SECOND ;------R0
MOV R7,#03H ;-----R7
MOV R2,#81H ;-----R2
G13021:CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,R2
LCALL WRITEBYTE ;写操作时,将一字节的内容由B写至DS1302中
LCALL READBYTE ;读操作时,将一字节的内容读至A中
INBIT1:MOV A,B
实时时钟芯片DS1302设计程序
IO EQU P1.0SCLK EQU P1.1RST EQU P1.2RW BIT P1.6RS BIT P1.7E BIT P1.5KEY0 BIT P3.2KEY1 BIT P3.3KEY2 BIT P3.5KEY3 BIT P3.7ORG 0000HAJMP MAINORG 000BHAJMP T0INTORG 0100HMAIN: ACALL LCDINIT ;对LCD进行初始化LOP5:MOV 30H,#8 ;以下为将DS1302的数据存到单片机的40H到46H中MOV R0,#40HMOV R7,#7MOV R6,#81HLOP:CLR P1.2CLR P1.1SETB P1.2MOV B,R6ACALL WRITEACALL READMOV @R0,AINC R0INC R6INC R6DJNZ R7,LOP ;读出DS1302中的数据存到单片机中MOV 30H, 40H ;秒MOV 31H, 41H ;分MOV 32H, #00H ;时缓存MOV 33H, 42H ;时MOV R4, #00H ;控制显示模式MOV R3, #00H ;记录控制信号MOV TMOD, #01HMOV TL0, #0E0HMOV TH0, #0B1HMOV IE, #10000010BMOV R2, #32HSETB TR0MOV A, #83H ;DDRAM的地址进行设置,选择从哪里开始显示ACALL WRCMOV A, #54H ;T的ASCII码ACALL WRDMOV A, #49H ;I的ASCII码ACALL WRDMOV A, #4DH ;M的ASCII码ACALL WRDMOV A, #45H ;E的ASCII码ACALL WRDMOV A, #3AH ;:的ASCII码ACALL WRDMOV A,#0C3H ;对DDRAM地址进行设置CALL WRCMOV A,#58H ;X的ASCII码CALL WRDMOV A,#51H ;Q的ASCII码CALL WRDDEC 45HMOV A,45H ;显示星期ANL A,#0FHADD A,#30HACALL WRDMOV A,#3AH ;:的ASCII码CALL WRDMOV A,#10H ; 的ASCII码CALL WRDMOV A,46H ;显示年ANL A,#0F0HSWAP AADD A,#30HACALL WRDMOV A,46HANL A,#0FHADD A,#30HACALL WRDMOV A,#0CAH ;对DDRAM地址进行设置CALL WRCMOV A,#2DH ;-的ASCII码CALL WRDMOV A,44H ;显示月ANL A,#0F0HSWAP AADD A,#30HACALL WRDMOV A,44HANL A,#0FHADD A,#30HACALL WRDMOV A,#0CDH ;对DDRAM地址进行设置CALL WRCMOV A,#2DH ;-的ASCII码CALL WRDMOV A,43H ;显示日ANL A,#0F0HSWAP AADD A,#30HACALL WRDMOV A,43HANL A,#0FHADD A,#30HACALL WRDDONE: ACALL DISPLAYMOV A,#097H ;DDRAM的地址进行设置,选择从哪里开始显示CALL WRCMOV A,#31H ;1CALL WRDMOV A,#31H ;1CALL WRDMOV A,#30H ;0CALL WRDMOV A,#32H ;2CALL WRDMOV A,#3AH ;:CALL WRDMOV A,#48H ;H的ASCII码CALL WRDMOV A,#41H ;A的ASCII码CALL WRDMOV A,#4EH ;N的ASCII码CALL WRDMOV A,#10H ; 的ASCII码CALL WRDMOV A,#58H ;X的ASCII码CALL WRDMOV A,#49H ; I 的ASCII码CALL WRDMOV A,#41H ; A 的ASCII码CALL WRDMOV A,#4FH ;O的ASCII码CALL WRDMOV A,#10H ; 的ASCII码CALL WRDMOV A,#4EH ;N的ASCII码CALL WRDMOV A,#41H ; A 的ASCII码CALL WRDMOV A,#4EH ;N的ASCII码CALL WRDACALL KEYAJMP DONELCDINIT:MOV A, #01HACALL WRCMOV A, #38HACALL WRCMOV A, #0CHACALL WRCMOV A, #06HACALL WRCRET ;对液晶显示器初始功能设置DISPLAY:MOV R0, #32HMOV R1, #70HMOV R5, #03HMOV A, 33HCJNE A, #12H, LP2LP2: JC LP1MOV A, #9AHCLR CSUBB A, #12HADD A, 33HDA ALP1: MOV 32H, A ;调整显示模式LP3: MOV A, @R0SWAP AANL A, #0FHMOV @R1, AINC R1MOV A, @R0ANL A, #0FHMOV @R1, AINC R1DEC R0MOV @R1, #0AH ;:ASCII码减30H INC R1DJNZ R5, LP3MOV A, #88H ;第二行首地址ACALL WRCMOV R0, #70HLP4: MOV A, @R0ADD A, #30HACALL WRDINC R0RET ;显示时间KEY: JB KEY0, KK1ACALL DELAYJB KEY0, KK1JNB KEY0, $INC R4CJNE R4, #02H, KOENDMOV R4, #00H KOEND: RETKK1:JB KEY1, KK2ACALL DELAYJB KEY1, KK2JNB KEY1, $CLR TR0INC R3CJNE R3, #04H, K1ENDMOV R3, #00HSETB TR0K1END: RETKK2: JB KEY2, KK3ACALL DELAYJB KEY2, KK3JNB KEY2, $MOV A, R3RL AMOV DPTR, #KJMP2JMP @A+DPTRKJMP2: AJMP K2ENDAJMP SINCAJMP MINCAJMP HINCSINC: MOV A, 30HADD A, #01HDA AMOV 30H, ACJNE A, #60H, K2ENDMOV 30H, #00HAJMP K2ENDMINC: MOV A, 31HADD A, #01HDA AMOV 31H, ACJNE A, #60H, K2ENDMOV 31H, #00HAJMP K2ENDHINC: MOV A, 33HADD A, #01HDA AMOV 33H, ACJNE A, #24H, K2ENDMOV 33H, #00HK2END: RET ;增1程序KK3: JB KEY3, K3ENDACALL DELAYJB KEY3, K3ENDJNB KEY3, $MOV A, R3RL AMOV DPTR, #KJMP3JMP @A+DPTRKJMP3: AJMP K3ENDAJMP SDECAJMP MDECAJMP HDECSDEC: MOV A, #9AHCLR CSUBB A, #01HADD A, 30HDA AMOV 30H, ACJNE A, #99H, K3ENDMOV 30H, #59HAJMP K3ENDMDEC: MOV A, #9AHCLR CSUBB A, #01HADD A, 31HDA AMOV 31H, ACJNE A, #99H, K3ENDMOV 31H, #59HAJMP K3ENDHDEC: MOV A, #9AHCLR CSUBB A, #01HADD A, 33HDA AMOV 33H, ACJNE A, #99H, K3ENDMOV 33H, #59HAJMP K3ENDK3END: RET ;减1程序T0INT: PUSH ACCPUSH PSWMOV TL0, #0E0HMOV TH0, #0B1HDJNZ R2, NEXTMOV R2, #32HMOV A, 30HADD A, #01HDA AMOV 30H, ACJNE A, #60H, NEXTMOV 30H, #00HS1: MOV A, 31HADD A, #01HDA AMOV 31H, ACJNE A, #60H, NEXTMOV 31H, #00HS2: MOV A, 32HADD A, #01HDA AMOV 33H, AMOV A, 33HCJNE A, #24H, NEXTMOV 33H, #00HNEXT: POP P SWPOP A CCRETI ;定时器计时WRITE: ;以下全为子程序MOV 30H,#8LOP1:MOV A,BRRC AMOV B,AMOV P1.0,CSETB P1.1CLR P1.1DJNZ 30H,LOP1RET ;写入命令子程序DS1302READ:MOV 30H,#8LOP2:MOV C,P1.0RRC ASETB P1.1CLR P1.1DJNZ 30H,LOP2RET ;读出数据子程序DS1302WRC: CLR RSCLR RWSETB EMOV P2, ACLR EACALL DELAYRET ;写入LCD命令的程序WRD: SETB RSCLR RWSETB EMOV P2, ACLR EACALL DELAYRET ;写入LCD要显示的数据的DELAY: MOV R7, #35HLP5: MOV R6, #3FHDJNZ R6, $DJNZ R7, LP5RET ;延时END ACALL DELAYRET ;写入LCD要显示的数据的DELAY: MOV R7, #35HLP5: MOV R6, #3FHDJNZ R6, $DJNZ R7, LP5RET ;延时 END。
DS1302数码管电子闹钟程序
/*****************************************************///DS1302+数码管+3个独立按键//// 精确定时/////*****************************************************/ /****************************************************************/// 利用ds1302精确定时,同时按键可调时间。
//// 每操作一次时钟,都会有蜂鸣器响大约200ms,以提示操作。
///***************************************************************/#include<reg52.h>#include"ds1302.h"uchar code tab[]={ 0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/} ;//共阴码char clock1[3]={0};int i,j=0,flag1=0;void delay(uint xms){uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void init()//初始化{//RST=0;//SCLK=0;//write_1302(0x80,0x00);//写控制字,允许写//write_1302(0x90,0x00);//禁止涡流充电TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void display(uchar miaog,uchar miaos,uchar feng,uchar fens,uchar shig,uchar shis)//数码管动态显示{P2=0x7f;P0=tab[miaog];delay(5);P2=0xbf;P0=tab[miaos];delay(5);P2=0xdf;P0=0xc0;delay(5);P2=0xef;P0=tab[feng];delay(5);P2=0xf7;P0=tab[fens];delay(5);P2=0xfb;P0=0xc0;delay(5);P2=0xfd;P0=tab[shig];delay(5);P2=0xfe;P0=tab[shis];delay(5);}write_sfm(uchar miao,uchar fen,uchar shi) //写入到数码管{uchar miaog,miaos,feng,fens,shig,shis;miaog=miao%10;miaos=miao/10;feng=fen%10;fens=fen/10;shig=shi%10;shis=shi/10;display(miaog,miaos,feng,fens,shig,shis);}void didi() //发声程序{buzzer=0;delay(50);buzzer=1;}void keyscan()//按键扫描程序{uchar temp;if(key1==0) //功能键{if(key1==0){while(!key1);key1n=key1n++;if(key1n==5)key1n=1;switch(key1n){case 1://didi();temp=(miao)/10*16+(miao)%10;//将秒转化成bcd码,没这句秒就变化,不知为什么write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp); //时钟暂停write_1302 (0x8e,0x80); //允许写保护break;case 2 ://didi();break;case 3 ://didi();break;case 4 ://didi();temp=miao/10*16+miao%10;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x00|temp);//时钟开始write_1302 (0x8e,0x80); //允许写保护break;}}}if(key4==0) //闹钟键{if(key4==0){while(!key4);keyn++;if(keyn==4)keyn=0;while(keyn){EA=0; //闹钟键if(key4==0)if(key4==0){while(!key4);keyn++;if(keyn==4)keyn=0;}write_sfm(clock1[2],clock1[1],clock1[0]);if(keyn==1) //时修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[0]--;if(clock1[0]<0)clock1[0]=24;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[0]++;if(clock1[0]>24)clock1[0]=0;}}}if(keyn==2) //分修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[1]--;if(clock1[1]<0)clock1[1]=59;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[1]++;if(clock1[1]>59)clock1[1]=0;}}}if(keyn==3) //秒修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[2]--;if(clock1[2]<0)clock1[2]=59;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[2]++;if(clock1[2]>59)clock1[2]=0;}}}}} EA=1;}if(key1n!=0) //当按下功能键key1,按以下才有用{if(key2==0) //加键{delay(3);if(key2==0){while(!key2);switch(key1n){case 1 : //didi(); //秒temp=(miao+1)/10*16+(miao+1)%10;if(miao==59)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp);write_1302 (0x8e,0x80); //允许写保护break;case 2 : // didi(); //分temp=(fen+1)/10*16+(fen+1)%10;if(fen==59)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x82,temp);write_1302 (0x8e,0x80); //允许写保护break;case 3 :// didi();temp=(shi+1)/10*16+(shi+1)%10; //时if(shi==23)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x84,temp);write_1302 (0x8e,0x80); //允许写保护break;}}}if(key3==0) //减键{delay(3);if(key3==0){while(!key3);switch(key1n){case 1 ://didi();temp=(miao-1)/10*16+(miao-1)%10; //秒if(miao==0)temp=89;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp);write_1302 (0x8e,0x80); //允许写保护break;case 2 ://didi();temp=(fen-1)/10*16+(fen-1)%10; //分if(fen==0)temp=89;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x82,temp);write_1302 (0x8e,0x80); //允许写保护break;case 3 ://didi();temp=(shi-1)/10*16+(shi-1)%10; //时if(shi==0)temp=35;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x84,temp);write_1302 (0x8e,0x80); //允许写保护break;}}}}//write_1302(0x80,miao|0x80);//miao++;/* if(key2==0){if(key2==0){while(!key2);write_1302(0x80,miao|0x00);//打开1302振荡器}}*/}void main(){init();//buzzer=0;//miao=20;//fen=10;//shi=23;while(1){miao = BCD_Decimal(read_1302(0x81));fen = BCD_Decimal(read_1302(0x83));shi = BCD_Decimal(read_1302(0x85));keyscan();if((miao==clock1[2])&&(fen==clock1[1])&&(shi==clock1[0])) {flag1=1;for(i=0;i<10;i++)didi();}if(j==100) for(i=0;i<10;i++) didi();if(j==200) {for(i=0;i<10;i++)didi();flag1=0;j=0;}}}void tiemr0() interrupt 1{if(flag1) j++;TH0=(65536-50000)/256;TL0=(65536-50000)%256;write_sfm(miao,fen,shi); }。
DS1302时钟芯片_C语言程序设计
/*输出数据:temp*/ for (i = 0; i < 8; i ++) {
temp = temp >> 1; if (IO_R) {
temp |= 0x80; } else { temp &= 0x7F; } SCK_SET; SCK_CLR; }
RST_CLR; return temp; }
//涓流充电
ds1302_write_byte(ds1302_year_add,time_buf[1]);
//年
ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
ds1302_write_byte(ds1302_date_add,time_buf[3]);
/******************************************************************************
********************************************************8
程
序
*******************************************************************************
time_buf[i]=time_buf[i]+tmp*16;
}
ds1302_write_byte(ds1302_control_add,0x00);
//关闭写保护
ds1302_write_byte(ds1302_sec_add,0x80);
//暂停
ds1302_write_byte(ds1302_charger_add,0xa9);
51单片机DS1302日历时钟程序
v_W1302(0x86,0x13); //设置日
v_W1302(0x84,0x18); //设置小时
v_W1302(0x82,0x05); //设置分
v_W1302(0x80,0x00); //启动晶振,设置秒
v_W1302(0x8e,0x80); //使能
v_W1302(0x80,second);
}
if(key0_count==2)
{
minute ++;
if(60==minute)
minute = 0;
write_add(0x40+7,minute);
v_W1302(0x82,minute);
}
if(key0_count==3)
{
hour ++;
if(24==hour)
uchar reverse(uchar c);
void keyscan();
void init();
void RTC_initial ();
void wr_1302(uchar wr_data);
uchar rd_1302(void);
uchar uc_R1302(uchar ucAddr);
void v_W1302(uchar ucAddr, uchar ucDa);
delay(1);
}
}
void RTC_initial ()
{
v_W1302(0x8e,0x00); //使能
v_W1302(0x80,0x80); //停止晶振
v_W1302(0x90,0x00); //关闭充电
v_W1302(0x8c,0x07); //设置年
时钟芯片ds1302程序
这是对DS1302编程最常见的操作,有很好的参考价值!我们通过本例程可以了解 DS1302时钟芯片的基本原理和使用 ,理解并掌握DS1302时钟芯片,驱动程序的编写以及实现数字字符在数码管中的显示。
#include<reg52.h>#include <intrins.h>sbit SCK=P3^6; //时钟引脚sbit SDA=P3^4; //数据端口sbit RST = P3^5;// DS1302复位sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;bit ReadRTC_Flag;//定义读DS1302标志unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分时日月周年08-05-15 12:00:00 unsigned char l_tmpdisplay[8];code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};code unsigned chartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阴数码管 0-9 '-' '熄灭‘表/******************************************************************/ /* 函数声明 *//******************************************************************/void Write_Ds1302_byte(unsigned char temp);void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);//read RTCvoid Set_RTC(void); //set RTCvoid InitTIMER0(void);//inital timer0/******************************************************************/ /* 主函数 *//******************************************************************/ void main(void){InitTIMER0(); //初始化定时器0Set_RTC(); //写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽while(1){if(ReadRTC_Flag){ReadRTC_Flag=0;Read_RTC();l_tmpdisplay[0]=l_tmpdate[2]/16; //数据的转换,因我们采用数码管0~9的显示,将数据分开l_tmpdisplay[1]=l_tmpdate[2]&0x0f;l_tmpdisplay[2]=10; //加入"-"l_tmpdisplay[3]=l_tmpdate[1]/16;l_tmpdisplay[4]=l_tmpdate[1]&0x0f;l_tmpdisplay[5]=10;l_tmpdisplay[6]=l_tmpdate[0]/16;l_tmpdisplay[7]=l_tmpdate[0]&0x0f;}}}/******************************************************************/ /* 定时器0初始化 *//******************************************************************/ void InitTIMER0(void){TMOD|=0x01;//定时器设置 16位TH0=0xef;//初始化值TL0=0xf0;ET0=1;TR0=1;EA=1;}/******************************************************************/ /* 写一个字节 *//******************************************************************/ void Write_Ds1302_Byte(unsigned char temp){unsigned char i;for (i=0;i<8;i++) //循环8次写入数据{SCK=0;SDA=temp&0x01; //每次传输低字节temp>>=1; //右移一位SCK=1;}}/******************************************************************/ /* 写入DS1302 *//******************************************************************/ void Write_Ds1302( unsigned char address,unsigned char dat ){RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_(); //启动Write_Ds1302_Byte(address); //发送地址Write_Ds1302_Byte(dat); //发送数据RST=0; //恢复}/******************************************************************/ /* 读出DS1302数据 *//******************************************************************/unsigned char Read_Ds1302 ( unsigned char address ){unsigned char i,temp=0x00;RST=0;_nop_();_nop_();SCK=0;_nop_();_nop_();RST=1;_nop_();_nop_();Write_Ds1302_Byte(address);for (i=0;i<8;i++) //循环8次读取数据{if(SDA)temp|=0x80; //每次传输低字节SCK=0;temp>>=1; //右移一位_nop_();_nop_();_nop_();SCK=1;}RST=0;_nop_(); //以下为DS1302复位的稳定时间_nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return (temp); //返回}/******************************************************************/ /* 读时钟数据 *//******************************************************************/ void Read_RTC(void) //读取日历{unsigned char i,*p;p=read_rtc_address; //地址传递for(i=0;i<7;i++) //分7次读取秒分时日月周年{l_tmpdate[i]=Read_Ds1302(*p);p++;}}/******************************************************************//* 设定时钟数据 *//******************************************************************/ void Set_RTC(void) //设定日历{unsigned char i,*p,tmp;for(i=0;i<7;i++){ //BCD处理tmp=l_tmpdate[i]/10;l_tmpdate[i]=l_tmpdate[i]%10;l_tmpdate[i]=l_tmpdate[i]+tmp*16;}Write_Ds1302(0x8E,0X00);p=write_rtc_address; //传地址for(i=0;i<7;i++) //7次写入秒分时日月周年{Write_Ds1302(*p,l_tmpdate[i]);p++;}Write_Ds1302(0x8E,0x80);}/******************************************************************/ /* 定时器中断函数 *//******************************************************************/ void tim(void) interrupt 1 using 1//中断,用于数码管扫描{static unsigned char i,num;TH0=0xf5;TL0=0xe0;P0=table[l_tmpdisplay[i]]; //查表法得到要显示数字的数码段switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}i++;if(i==8){i=0;num++;if(10==num) //隔段时间读取1302的数据。
DS1302时钟芯片驱动程序
DS1302时钟芯片驱动程序//DS1302时钟芯片驱动程序#include <reg51.h>//下面是引脚连接关系sbit clock_dat=P1^0;sbit clock_clk=P1^1;sbit clock_clk=P1^2;sbit a0=ACC^0;sbit a1=ACC^1;sbit a2=ACC^2;sbit a3=ACC^3;sbit a4=ACC^4;sbit a5=ACC^5;sbit a6=ACC^6;sbit a7=ACC^7;void clock_out(unsigned char dd) {ACC=dd;clock_dat=a0;clock_clk=1;clock_clk=0; clock_dat=a1;clock_clk=1;clock_clk=0; clock_dat=a2;clock_clk=1;clock_clk=0; clock_dat=a3;clock_clk=1;clock_clk=0; clock_dat=a4;clock_clk=1;clock_clk=0; clock_dat=a5;clock_clk=1;clock_clk=0; clock_dat=a6;clock_clk=1;clock_clk=0; clock_dat=a7;clock_clk=1;clock_clk=0; }unsigned char clock_in(void) {clock_dat=1;a0=clock_dat;clock_clk=1;clock_clk=0;a1=clock_dat; clock_clk=1;clock_clk=0;a2=clock_dat; clock_clk=1;clock_clk=0;a3=clock_dat; clock_clk=1;clock_clk=0;a4=clock_dat; clock_clk=1;clock_clk=0;a5=clock_dat;clock_clk=1;clock_clk=0;a6=clock_dat;clock_clk=1;clock_clk=0;a7=clock_dat;return(ACC);}unsigned char read_clock(unsigned char ord) {unsigned char dd=0;clock_clk=0;clock_rst=0;clock_rst=1;clock_out(ord);dd=clock_in();clock_rst=0;clock_clk=1;return(dd);}void write_clock(unsigned char ord,unsigned char dd) {clock_clk=0;clock_rst=0;clock_rst=1;clock_out(ord);clock_out(dd);clock_rst=0;clock_clk=1;}/*注意事项:1.每次上电,必须把秒寄存器高位(第7位)设置为0,时钟才能走时。
DS1302时钟程序(完整版),液晶显示
#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar table0[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //液晶显示数字0——9代码sbit SCLK=P1^0;sbit DATA=P1^1;sbit CE=P1^2;sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;sbit FB=P0^7;sbit start=P1^4;sbit stop=P1^5;uchar i;/*******************延时n微秒函数*****************/void delaynus(uchar n) //n us延时函数{// uchar i;for(i=n;i>0;i--);}/*******************写数据函数*****************/void write1302(uchar add,uchar dat){CE=0;SCLK=0;CE=1;for(i=0;i<8;i++) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=0;i<8;i++) //写入数据{DATA=dat&0x01;SCLK=1;SCLK=0;dat>>=1;}SCLK=1;CE=0;}/*******************读数据函数*****************/uchar read1302(uchar add){uchar dat;CE=0;SCLK=0;CE=1;for(i=8;i>0;i--) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=8;i>0;i--) //读出数据/********************为神马???**************************/{dat>>=1;if(DATA==1)dat=dat|0x80;SCLK=1;SCLK=0;}SCLK=1;CE=0;return dat;}/*******************DS1302初始化函数*****************/void init1302(){uchar flag;flag=read1302(0x81);if(flag&0x80){write1302(0x8e,0x00);write1302(0x80,0x00);write1302(0x82,(((1/10)<<4)|(1%10)));write1302(0x84,(((20/10)<<4)|(20%10)));write1302(0x86,(((19/10)<<4)|(19%10)));write1302(0x88,(((7/10)<<4)|(7%10)));write1302(0x8a,((2/10)<<4)|(2%10));write1302(0x8c,(((11/10)<<4)|(11%10)));write1302(0x90,0xa5); //充电。
51单片机 ds1302万年历 时钟显示
//DS1302时钟芯片程序#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit CLK=P2^3; //定义口sbit IO=P2^4;sbit RST=P2^5;sbit ACC7=ACC^7;sbit ACC0=ACC^0;uchar a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}, //定义数码管显示码b[8]={0x00,0x00,0x12,0x23,0x11,0x07,0x08,0xbe},//写入时钟数据,最后be突发访问c[7],s,s1,ml1,mh1,ml2,mh2,ml3,mh3; //c存放读.出时钟数据void delay(uint z) // 延时{uint i;uchar j;for(i=z;i>0;i--)for(j=200;j>0;j++);}// 显示子程序void display(uchar mh1,uchar ml1,uchar mh2,uchar ml2,uchar mh3,uchar ml3){uchar x,k,r;for(k=0;k<80;k++){for(r=0;r<8;r++){x=P2&0XF8;P2=x+r ;if(r==2||r==5){ P0=0XBF;delay(3);}//------秒-------if(r==0){P0=a[ml1] ;delay(3) ;}if(r==1){P0=a[mh1] ;delay(3) ;}//------fen---------if(r==3){P0=a[ml2] ;delay(3) ;}if(r==4){P0=a[mh2] ;delay(3) ;}//-----shi---------if(r==6){P0=a[ml3] ;delay(3) ;}if(r==7){P0=a[mh3] ;delay(3) ;}delay(3);}}}//********DS1302读写程序************void w(uchar u) //写入1位字节{uchar i;ACC = u;for(i=8; i>0; i--){IO = ACC0;CLK = 1;CLK = 0;ACC = ACC >> 1;}}uchar r(void) //读出1位字节{uchar i;for(i=8; i>0; i--){ACC = ACC >>1;ACC7 = IO;CLK = 1;CLK = 0;}return(ACC);}void W1302(uchar ucAddr, uchar ucDa){RST = 0;CLK = 0;RST = 1;w(ucAddr); // 地址,命令w(ucDa); //写1Byte数据CLK = 1;RST = 0;}void wclock(uchar *p) //写入时钟多字节数据{uchar i;// W1302(0x80,0x00); //停止时钟W1302(0x8e,0x00); // 允许写RST=0;CLK=0;RST=1;w(0xbe); //写多字节命令for(i=8;i>0;i--){w(*p); //按数组指针逐个写入,写入数据在主函数调用时指向b数组p++;}W1302(0x00,0x50); //启动定时器CLK=1;RST=0;}void rclock(uchar *p) //读出时钟多字节数据{uchar i;RST=0;CLK=0;RST=1;w(0xbf);for(i=7;i>0;i--){*p=r();p++;}CLK=1;RST=0;}void main(void){uchar mh,ml,fh,fl,sh,sl,z,v,q,e,y,t,k;wclock(b);while(1){rclock(c);mh=(c[0]&0xf0)>>4;ml=c[0]&0x0f;fh=(c[1]&0xf0)>>4;fl=c[1]&0x0f;sh=(c[2]&0xf0)>>4;sl=c[2]&0x0f;display(mh,ml,fh,fl,sh,sl);if(mh==3&&ml==0){ for(k=0;k<3;k++){z=(c[3]&0xf0)>>4;v=c[3]&0x0f;q=(c[4]&0xf0)>>4;e=c[4]&0x0f;y=(c[6]&0xf0)>>4;t=c[6]&0x0f;display(z,v,q,e,y,t);}}}}。
时钟芯片DS1302 的程序(C51程序)
时钟芯片DS1302 的程序(C51程序)模块名称:DS1302.c功能:实时时钟模块时钟芯片型号:DS1302 程序设计:zhaojunjie********************************************************************* /#includesbit T_CLK = P2^7; /*实时时钟时钟线引脚 */ sbit T_IO = P1^4; /*实时时钟数据线引脚 */ sbit T_RST = P1^5; /*实时时钟复位线引脚 */sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;void RTInputByte(uchar); /* 输入 1Byte */uchar RTOutputByte(void); /* 输出?1Byte */void W1302(uchar, uchar);uchar R1302(uchar);void Set1302(uchar *); /* 设置时间 */void Bcd2asc(uchar,uchar *);void Get1302(uchar curtime[]); /* 读取1302当前时间 *//********************************************************************函数名:RTInputByte()功能:实时时钟写入一字节说明:往DS1302写入1Byte数据 (内部函数)入口参数:d 写入的数据返回值:无设计:zhaojunjie********************************************************************* **/void RTInputByte(uchar d){uchar i;ACC = d;for(i=8; i>0; i--){T_IO = ACC0; /*相当于汇编中的 RRC */T_CLK = 1;T_CLK = 0;ACC = ACC >> 1;}}/********************************************************************函数名:RTOutputByte()功能:实时时钟读取一字节说明:从DS1302读取1Byte数据 (内部函数)入口参数:无返回值:ACC设计:zhaojunjie********************************************************************* **/uchar RTOutputByte(void){uchar i;for(i=8; i>0; i--){ACC = ACC >>1; /*相当于汇编中的 RRC */ACC7 = T_IO;T_CLK = 1;T_CLK = 0;}return(ACC);}/********************************************************************函数名:W1302()功能:往DS1302写入数据说明:先写地址,后写命令/数据 (内部函数)调用:RTInputByte() , RTOutputByte()入口参数:ucAddr: DS1302地址, ucData: 要写的数据返回值:无设计:zhaojunjie********************************************************************* **/void W1302(uchar ucAddr, uchar ucDa){T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr); /* 地址,命令 */RTInputByte(ucDa); /* 写1Byte数据*/T_CLK = 1;T_RST = 0;}/********************************************************************函数名:R1302()功能:读取DS1302某地址的数据说明:先写地址,后读命令/数据 (内部函数)调用:RTInputByte() , RTOutputByte()入口参数:ucAddr: DS1302地址返回值:ucData :读取的数据设计:zhaojunjie********************************************************************* **/uchar R1302(uchar ucAddr){uchar ucData;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr); /* 地址,命令 */ucData = RTOutputByte(); /* 读1Byte数据 */T_CLK = 1;T_RST = 0;return(ucData);}/********************************************************************函数名:BurstW1302T()功能:往DS1302写入时钟数据(多字节方式)说明:先写地址,后写命令/数据调用:RTInputByte()入口参数:pWClock: 时钟数据地址格式为: 秒分时日月星期年控制8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void BurstW1302T(uchar *pWClock){uchar i;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/{RTInputByte(*pWClock); /* 写1Byte数据*/pWClock++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstR1302T()功能:读取DS1302时钟数据说明:先写地址/命令,后读数据(时钟多字节方式)调用:RTInputByte() , RTOutputByte()入口参数:pRClock: 读取时钟数据地址格式为: 秒分时日月星期年7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void BurstR1302T(uchar *pRClock){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */for (i=8; i>0; i--){*pRClock = RTOutputByte(); /* 读1Byte数据 */pRClock++;}T_CLK = 1;}/********************************************************************函数名:BurstW1302R()功能:往DS1302寄存器数写入数据(多字节方式)说明:先写地址,后写数据(寄存器多字节方式)调用:RTInputByte()入口参数:pWReg: 寄存器数据地址返回值:无设计:zhaojunjie********************************************************************* **/void BurstW1302R(uchar *pWReg){uchar i;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xfe); /* 0xbe:时钟多字节写命令*/for (i=31; i>0; i--) /* 31Byte 寄存器数据 */{RTInputByte(*pWReg); /* 写1Byte数据*/pWReg++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstR1302R()功能:读取DS1302寄存器数据说明:先写地址,后读命令/数据(寄存器多字节方式)调用:RTInputByte() , RTOutputByte()入口参数:pRReg: 寄存器数据地址返回值:无设计:zhaojunjie********************************************************************* **/void BurstR1302R(uchar *pRReg){uchar i;T_CLK = 0;T_RST = 1;RTInputByte(0xff); /* 0xff:时钟多字节读命令 */for (i=31; i>0; i--) /*31Byte 寄存器数据 */{*pRReg = RTOutputByte(); /* 读1Byte数据 */pRReg++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:Set1302()功能:设置初始时间说明:先写地址,后读命令/数据(寄存器多字节方式)调用:W1302()入口参数:pClock: 设置时钟数据地址格式为: 秒分时日月星期年7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void Set1302(uchar *pClock){uchar i;uchar ucAddr = 0x80;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/for(i =7; i>0; i--){W1302(ucAddr,*pClock); /* 秒分时日月星期年*/pClock++;ucAddr +=2;}W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/}/********************************************************************函数名:Get1302()功能:读取DS1302当前时间说明:调用:R1302()入口参数:ucCurtime: 保存当前时间地址。
ds1302定时钟程序
dat|=0x80;
SCK=1;
}
RST=0;
dat=(dat/16*10)+(dat&0x0f);
return(dat);
}
void read_time() //读取DS1302的时间和日期
{
ctime.second=read(0x81);
di();
if(mod==4) //退出调节功能,返回正常显示
{
set_time();
mod=0;
}
}
}
if(key2==0) //调节加1,因为涉及到时分秒,年月日周和闹钟的调节,所以写的比较复杂,应该有更精简的代码。
{
{
uchar i,dat;
RST=0;
SCK=0;
RST=1;
for(i=0;i<8;i++)
{
SCK=0;
SDA=(bit)(addr&0x01);
addr>>=1;
SCK=1;
}
for(i=0;i<8;i++)
{
SCK=0;
dat>>=1;
disbuf[4]=0x40;
disbuf[5]=0x40;
disbuf[6]=0x40;
disbuf[7]=0x40;
break;
case 3:
disbuf[0]=table[asec%10];
disbuf[1]=table[asec/10];
sbit key1=P1^0; //按键定义,key1切换键,key2加,key3减,key4闹钟,年月日周
DS1302时钟芯片完整C语言应用程序_可直接调用
}
for(i=0;i<8;i++)
{
DS1302_CLK=0;
DS1302_DATA=DDATA&0X01;
DS1302_CLK=1;
DDATA=DDATA>>1; //传送数据。
}
DS1302_CLK=0;
DS1302_RST=0;
//使能端关闭。
}
/************************************************************/
uchar DS1302_Clock[8]={0x01,0x01,0x00,0x06,0x09,0x02,0x11,0}; //时钟缓存。秒、分、时、
日、月、周、年、控制寄存器。
void DS1302_Write(uchar CDATA,uchar DDATA); //写数据。
uchar DS1302_Read(uchar CDATA); //读数据。
#endif
/********DS1302_WriteClock()***********************************
函数名 :DS1302_WriteClock() 突发方式,写入所有时钟数据。
入口参数:无
出口参数:无
**************************************************************/
void DS1302_Write(uchar CDATA,uchar DDATA)
{
uchar i;
DS1302_RST=1;
//使能端有效,开始传送数据。
for(i=0;i<8;i++)
DS1302显示时钟程序
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit k1=P1^0; //开关的位置sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;sbit clk=P3^6; //时钟线sbit en=P3^5; //使能端sbit io=P3^4; //DS1302的IO口sbit lcden=P2^7; //液晶使能端sbit lcdrd=P2^6; //数据命令端sbit lcdwr=P2^5; //读写选择端sbit beep=P2^4; //蜂鸣器位置bit flag; //按键标志位uchar code t[]="LCD LOCK"; //第一行显示字符uchar code b[]="****"; //第二行显示字符uchar c[8] ={0x00}; //定义显示缓冲区uchar d[7] ={0,0,0x12,0,0,0,0}; //DS1302时间缓冲区,存放秒、分、时、日、月、uchar e[2]={0}; //用来存放分钟小时的中间值void delay(uint x) //延时函数{ uint i,j;for(i=0;i<x;i++)for(j=0;j<115;j++); //延时X*MS}void write_com(uchar com) //命令函数{ lcdrd=0; //选择命令端P0=com; //要写的命令送到P0口delay(5);lcden=1; //开启使能端delay(5);lcden=0; //关闭使能端}void write_data(uchar dat) //数据函数{ lcdrd=1; //数据选择端P0=dat;delay(5);lcden=1; //开使能delay(5);lcden=0;}bit busy() //忙碌检查函数{ bit result;lcdrd=0;lcdwr=1;lcden=1;_nop_(); //延时几微秒_nop_();_nop_();_nop_();result=(bit)(P0&0x80);lcden=0;return result;}void lcdclr() //LCD清屏函数{ write_com(0x01); //清零显示,数据指针清零delay(5);}void init() //初始化函数{ delay(15);write_com(0x38); //16*2显示,5*7点阵,8位数据delay(15);write_com(0x38);write_com(0x06); //写一个字符地址指针加1 delay(5);write_com(0x0c); //设置显示,不显示光标delay(5);write_com(0x01); //显示清零,数据指针清零}void write_byte(uchar date) //写一个字节函数{ uchar i;for(i=0;i<8;i++){ clk=0; //低电平改变数据if(date&0x01)io=1;elseio=0;clk=1; //高电平写入1302_nop_();date=date>>1;}}uchar read_byte() //读一个字节函数{uchar i,temp=0;io=1;for(i=0;i<7;i++){clk=0;if(io==1)temp=temp|0x80;elsetemp=temp&0x7f;clk=1; //产生下跳沿temp=temp>>1;}return temp;}void write1302(uchar com,uchar dat) //写1302函数在某个地址写数据{ clk=0;en=1;write_byte(com);write_byte(dat);clk=0;en=0;}uchar read1302(uchar add) //读1302函数,从地址读数据{ uchar d;clk=0;en=1;write_byte(add); //先写地址d=read_byte(); //后读数据clk=0;en=0;return d;}void set1302(uchar add,uchar *p,uchar n) //时间初始化{ write1302(0x80,0x00); //写控制,允许写操作for(;n>0;n--){ write1302(add,*p);p++;add=add+2;}write1302(0x8e,0x80); //写保护,不允许写操作}void get1302(uchar add,uchar *p,uchar n) //读取当前数据{ for(;n>0;n--){ *p=read1302(add);p++;add=add+2;}}void init1302() //初始化1302函数{ en=0;clk=0;write1302(0x80,0x00); //写秒寄存器write1302(0x90,0xab); //写充电器write1302(0x8e,0x80); //写保护,禁止写}void BEEP() //蜂鸣器函数{ beep=0; //响蜂鸣器delay(100); //响0.1sbeep=1;delay(100);}void lcdcon(uchar m1,m2,m3) //将数据转化成适合LCD显示的数据{ c[0]=m1/10+0x30; //小时十位数据c[1]=m1%10+0x30; //小时个位数据c[2]=m2/10+0x30; //分钟十位数据c[3]=m2%10+0x30; //分钟个位数据c[4]=m3/10+0x30; //秒十位c[5]=m3%10+0x30; //秒个位}void lcddis() //LCD显示函数{ write_com(0x44|0x80); //第二行第四列write_data(c[0]); //小时十位write_data(c[1]); //小时个位write_data(':'); //显示:write_data(c[2]); //显示分钟十位write_data(c[3]); //显示分钟个位write_data(':');write_data(c[4]); //显示秒十位write_data(c[5]); //显示秒个位}void keyscan() //按键函数{ uchar fen,shi; //定义两个16位分钟和小时write1302(0x8e,0x00); //1302写保护,允许写write1302(0x80,0x80); //时钟停止运行if(k2==0) //按键2被按下{ d elay(10); //去抖动if(k2==0) //确认被按下{ while(!k2); //等待按键释放BEEP(); //蜂鸣器函数d[2]=d[2]+1; //小时加1if(d[2]==24) //满24清零d[2]=0;shi=d[2]/10*16+d[2]%10; //将小时转化成16进制write1302(0x84,shi); //调整后写入1302}}if(k3==0) //按键3被按下{ delay(10); //抖动if(k3==0) //确认被按下{ while(!k3); //等待按键放开BEEP(); //蜂鸣器函数d[1]=d[1]+1; //分钟加1if(d[1]==60) //满60清零d[1]=0;fen=d[1]/10*16+d[1]%10; //将分钟转化为16进制write1302(0x82,fen); //调整后,写入1302}}if(k4==0) //按键4被按下{ d elay(10); //去抖动if(k4==0) //确认被按下{ while(!k4); //等待按键释放BEEP(); //蜂鸣器函数write1302(0x80,0x00); //调整后,启动时钟运行write1302(0x8e,0x80); //写保护,禁止写flag=0; //按键1标志位清零}}}void gettime() //读取当前时间,转化为10进制{ uchar miao,fen,shi;write1302(0x8e,0x00); //控制命令,0表示允许写write1302(0x90,0xab); //电流控制miao=read1302(0x81); //读取秒fen=read1302(0x83); //读取分shi=read1302(0x85); //读取小时d[0]=miao/16*10+miao%16; //转化为10进制d[1]=fen/16*10+fen%16; //转化为10进制d[2]=shi/16*10+shi%16; //转换为10进制}void main() //主函数{ uchar i;P0=0xff;P2=0xff;init1302(); //1302初始化函数lcdclr(); //1302清屏函数write_com(0x00|0x80); //第一行第0列i=0;while(t[i]!=0){ write_data(t[i]); //第一个字符显示i++;}write_com(0x40|0x80); //第二行显示第0列i=0;while(b[i]!=0);{ write_data(b[i]);i++;}init1302();while(1){ gettime();if(k1==0) //按键1按下{ delay(10); //去抖动if(k1==0) //确认按下{ while(!k1); //等待按键释放BEEP(); //蜂鸣器函数flag=1; //按键1标志位置位,进行时钟调整}}if(flag==1) //如为1,则进行调整keyscan();lcdcon(d[2],d[1],d[0]); //将1302的数据送到函数转换lcddis(); //调整LCD显示,显示小时,分钟,秒}}。
DS1302实时时钟芯片的C语言源程序
T_RST=0;
k=ucDa/16; //在将10进制的数转化为16进制的数。
ucDa=ucDa%16;
ucDa=ucDa+k*10;
return(ucDa);
}
void v_Set1302(uchar *pSecDa) /*设定初试时间*/
/* 时钟程序*/
/************************************/
sbit T_CLK=P3^6; /* 实时时钟的时钟线引脚*/
sbit T_IO=P3^7; /* 实时时钟的数据线*/
sbit T_RST=P3^5; /* 实时时钟的复位线引脚*/
}
void main1(void)
{ v_Get1302();
temp=ucCurtime[3]*10000+ucCurtime[2]*100+ucCurtime[1]; //temp里的值是为了显示到数码管里而设定的值.
display1();
}
void main2(void)
}
/*显示*/
void display1()
{
uchar c;
t2_10();
c=a[0]; //个位
P2=ledk[c]; //显示
gw=0;
unint a[6];//={0,0,0,0,0,0}; /*位段的数字*/
uchar code ledk[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
{
unsigned char ucDa,k;
ds1302时钟程序
#include <reg52.h>#define uint unsigned int#define uchar unsigned char#include <intrins.h>uchar table1[]="2013年02月07日4";uchar table2[]=" 23时59分44秒";uchar time_data[7]={13,4,2,7,23,59,44};//年周月日时分秒uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //写地址uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; //读地址uchar disp[14];uchar tim=0;sbit clk=P1^0;sbit io=P1^1;sbit rst=P1^2;sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_PSB=P2^3;sbit LCD_EN=P2^2;sbit LCD_RST= P2^4;void write_ds1302_byte(uchar dat);//写一个字节void write_ds1302(uchar add,uchar dat);//写地址写数据uchar read_ds1302(uchar add);//写地址读数据void set_rtc(void);//时间初始化void read_rtc(void);//读时间void time_pros(void);//时间处理void delay(uint x);void init(void);//液晶初始化void write_com(uchar com); //写指令void write_date(uchar date);//写数据void lcd_pos(uchar X,uchar Y);//void write_sfm(uchar add,uchar date);//时分秒的写void keyscan();sbit key1=P3^0; //移sbit key2=P3^1; //加sbit key3=P3^3; //减uchar s1num;char shi,fen,miao,zhou,yue,ri,nian;void main (){uchar i;// set_rtc();//时间初始化delay(30);init();//液晶初始化//LCD(0,'9');//在第一个位置显示9// LCD(1,'9');// LCD(2,'9');lcd_pos(2,0);for(i=0;i<16;i++){write_date(table1[i]);delay(20);}lcd_pos(3,0);for(i=0;i<16;i++){write_date(table2[i]);delay(20);}while(1){read_rtc(); //读数据keyscan(); //键盘扫描time_pros();//处理数据write_com(0x99); //秒地址write_date(0x30+disp[4]); //秒个位write_date(0x30+disp[5]); //秒十位write_com(0x9b);write_date(0x30+disp[2]);write_date(0x30+disp[3]);write_com(0x9d);write_date(0x30+disp[0]);write_date(0x30+disp[1]);write_com(0x8f);write_date(0x30+disp[10]);write_date(0x30+disp[11]);write_com(0x8d);write_date(0x30+disp[6]);write_date(0x30+disp[7]);write_com(0x8b);write_date(0x30+disp[8]);write_date(0x30+disp[9]);write_com(0x89);write_date(0x30+disp[12]);write_date(0x30+disp[13]);}}void keyscan(){uchar a,b;if(key1==0){delay(5);if(key1==0){s1num++;while(key1==0);if(s1num==1){// write_com(0c);// write_com(0x0f);// write_com(0x98+5); //写入光标位置// write_com(0x0f);}if(s1num==2){write_com(0x98+3);}if(s1num==3){write_com(0x98+1);}if(s1num==4){write_com(0x88+7);}if(s1num==5){write_com(0x88+5);}if(s1num==6){write_com(0x88+3);}if(s1num==7){write_com(0x88+1);}if(s1num>=8){ s1num=0;write_com(0x0c);write_ds1302(0x80,0x00);//时钟正常工作}}}if(s1num!=0){if(key2==0){delay(20);if(key2==0){while(!key2);if(s1num==1){ delay(20);if(s1num==1){time_data[6]=read_ds1302(0x81);//读取当前时间(bcd码) a=time_data[6]/16;b=time_data[6]%16;miao=a*10+b;miao++;if(miao==60)miao=0;a=miao/10;b=miao%10;time_data[6]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x80,time_data[6]);write_ds1302(0x8e,0x80);//加上写保护time_data[6]=read_ds1302(0x81);}}if(s1num==2){ delay(20);if(s1num==2){time_data[5]=read_ds1302(0x83);//读取当前时间(bcd码) a=time_data[5]/16;b=time_data[5]%16;fen=a*10+b;fen++;if(fen==60)fen=0;a=fen/10;b=fen%10;time_data[5]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x82,time_data[5]);write_ds1302(0x8e,0x80);//加上写保护time_data[5]=read_ds1302(0x81);}}if(s1num==3){ delay(20);if(s1num==3){time_data[4]=read_ds1302(0x85);//读取当前时间(bcd码) a=time_data[4]/16;b=time_data[4]%16;shi=a*10+b;shi++;if(shi==24)shi=0;a=shi/10;b=shi%10;time_data[4]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x84,time_data[4]);write_ds1302(0x8e,0x80);//加上写保护time_data[4]=read_ds1302(0x81);}}if(s1num==4){ delay(20);if(s1num==4){time_data[3]=read_ds1302(0x8b);//读取当前时间(bcd码) a=time_data[3]/16;b=time_data[3]%16;zhou=a*10+b;zhou++;if(zhou==8)zhou=1;a=zhou/10;b=zhou%10;time_data[3]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x8a,time_data[3]);write_ds1302(0x8e,0x80);//加上写保护time_data[3]=read_ds1302(0x81);}}if(s1num==5){ delay(20);if(s1num==5){time_data[2]=read_ds1302(0x87);//读取当前时间(bcd码) a=time_data[2]/16;b=time_data[2]%16;ri=a*10+b;ri++;if(ri==32)ri=1;a=ri/10;b=ri%10;time_data[2]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x86,time_data[2]);write_ds1302(0x8e,0x80);//加上写保护time_data[2]=read_ds1302(0x81);}}if(s1num==6){ delay(20);if(s1num==6){time_data[1]=read_ds1302(0x89);//读取当前时间(bcd码) a=time_data[1]/16;b=time_data[1]%16;yue=a*10+b;yue++;if(yue==13)yue=1;a=yue/10;b=yue%10;time_data[1]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x88,time_data[1]);write_ds1302(0x8e,0x80);//加上写保护time_data[1]=read_ds1302(0x81);}}if(s1num==7){ delay(20);if(s1num==7){time_data[0]=read_ds1302(0x8d);//读取当前时间(bcd码) a=time_data[0]/16;b=time_data[0]%16;nian=a*10+b;nian++;if(nian==99)nian=0;a=nian/10;b=nian%10;time_data[0]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x8c,time_data[0]);write_ds1302(0x8e,0x80);//加上写保护time_data[0]=read_ds1302(0x81);}}}}if(key3==0){delay(5);if(key3==0){while(!key3);if(s1num==1){ delay(20);if(s1num==1){time_data[6]=read_ds1302(0x81);//读取当前时间(bcd码) a=time_data[6]/16;b=time_data[6]%16;miao=a*10+b;miao--;if(miao==-1)miao=59;a=miao/10;b=miao%10;time_data[6]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x80,time_data[6]);write_ds1302(0x8e,0x80);//加上写保护time_data[6]=read_ds1302(0x81);}}if(s1num==2){delay(20);if(s1num==2){time_data[5]=read_ds1302(0x83);//读取当前时间(bcd码) a=time_data[5]/16;b=time_data[5]%16;fen=a*10+b;fen--;if(fen==-1)fen=59;a=fen/10;b=fen%10;time_data[5]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x82,time_data[5]);write_ds1302(0x8e,0x80);//加上写保护time_data[5]=read_ds1302(0x81);}}if(s1num==3){ delay(20);if(s1num==3){time_data[4]=read_ds1302(0x85);//读取当前时间(bcd码) a=time_data[4]/16;b=time_data[4]%16;shi=a*10+b;shi--;if(shi==-1)shi=24;a=shi/10;b=shi%10;time_data[4]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x84,time_data[4]);write_ds1302(0x8e,0x80);//加上写保护time_data[4]=read_ds1302(0x81);}}if(s1num==4){ delay(20);if(s1num==4){time_data[3]=read_ds1302(0x8b);//读取当前时间(bcd码) a=time_data[3]/16;b=time_data[3]%16;zhou=a*10+b;zhou--;if(zhou==0)zhou=7;a=zhou/10;b=zhou%10;time_data[3]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x8a,time_data[3]);write_ds1302(0x8e,0x80);//加上写保护time_data[3]=read_ds1302(0x81);}}if(s1num==5){ delay(20);if(s1num==5){time_data[2]=read_ds1302(0x87);//读取当前时间(bcd码) a=time_data[2]/16;b=time_data[2]%16;ri=a*10+b;ri--;if(ri==0)ri=31;a=ri/10;b=ri%10;time_data[2]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x86,time_data[2]);write_ds1302(0x8e,0x80);//加上写保护time_data[2]=read_ds1302(0x81);}}if(s1num==6){ delay(20);if(s1num==6){time_data[1]=read_ds1302(0x89);//读取当前时间(bcd码) a=time_data[1]/16;b=time_data[1]%16;yue=a*10+b;yue--;if(yue==0)yue=12;a=yue/10;b=yue%10;time_data[1]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x88,time_data[1]);write_ds1302(0x8e,0x80);//加上写保护time_data[1]=read_ds1302(0x81);}}if(s1num==7){ delay(20);if(s1num==7){time_data[0]=read_ds1302(0x8d);//读取当前时间(bcd码) a=time_data[0]/16;b=time_data[0]%16;nian=a*10+b;if(nian==0)nian=99;a=nian/10;b=nian%10;time_data[0]=a*16+b;write_ds1302(0x8e,0x00);//去除写保护write_ds1302(0x8c,time_data[0]);write_ds1302(0x8e,0x80);//加上写保护time_data[0]=read_ds1302(0x81);}}}}}}void write_ds1302_byte(uchar dat)//写一个字节{uchar i;for(i=0;i<8;i++){clk=0;io=dat&0x01;//准备数据dat=dat>>1; //移位clk=1;}}void write_ds1302(uchar add,uchar dat) //写地址写数据{rst=0;_nop_();clk=0;_nop_();rst=1;_nop_();write_ds1302_byte(add); //传地址write_ds1302_byte(dat); //传数据rst=0;_nop_();clk=1;}uchar read_ds1302(uchar add) //写地址读数据{uchar i,value;rst=0;_nop_();clk=0;_nop_();rst=1;_nop_();write_ds1302_byte(add); //写地址for(i=0;i<8;i++){clk=0; //低电平数据不变,数据可读value=value>>1;if(io)value=value|0x80;clk=1;}rst=0;_nop_();clk=0;_nop_();clk=1;io=1;return value;}// void set_rtc(void) //校准初始时间// {// uchar i,j;// for(i=0;i<7;i++) //十进制数转换为BCD码// {// j=time_data[i]/10;//十位// time_data[i]=time_data[i]%10;//个位// time_data[i]=time_data[i]+j*16;//十进制数转换为BCD码// }// write_ds1302(0x8e,0x00);//去除写保护// for(i=0;i<7;i++)// {// write_ds1302(write_add[i],time_data[i]);//写地址传数据// } //对时完成// // write_ds1302(0x8e,0x80);//加上写保护(防止误动作)// }void read_rtc(void) //读时间{uchar i;for(i=0;i<7;i++){time_data[i]=read_ds1302(read_add[i]); //读数据}}void delay(uint x){uint a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}void write_com(uchar com) //写指令数据{LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=com;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void write_date(uchar date) //写指令数据{LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=date;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void lcd_pos(uchar X,uchar Y){uchar pos;if(X==0){X=0x80;}else if(X==1){X=0x90;}else if(X==2){X=0x88;}else if(X==3){X=0x98;}pos=X+Y;write_com(pos);}void init() //液晶初始化{LCD_PSB=1;write_com(0x80);delay(5);write_com(0x0c);delay(5);write_com(0x01);}void time_pros(void) //处理(bcd码转换为十进制数) {disp[0]=time_data[6]/16; //4disp[1]=time_data[6]%16; //4disp[2]=time_data[5]/16; //5disp[3]=time_data[5]%16; //9disp[4]=time_data[4]/16; //2disp[5]=time_data[4]%16; //3disp[6]=time_data[3]/16; //0disp[7]=time_data[3]%16; //7disp[8]=time_data[2]/16; //0disp[9]=time_data[2]%16; //2disp[10]=time_data[1]/16; //0disp[11]=time_data[1]%16; //4disp[12]=time_data[0]/16; //1 disp[13]=time_data[0]%16; //3 }。
DS1302时钟芯片C语言程序
void ds1302set() //设置初始时间 {
uchar i; ds1302write(0x8e,0x00); //关写保护 for(i=0;i<7;i++) { ds1302write(0x80+i+i,time_date[i]); //将初始时间数 据写入 1302 对应的寄存器里 delay(5); }
}
}
lcdwrite_data('0'+((time_date[1]&0xf0)>>4)); // 显示分
lcdwrite_data('0'+(time_date[1]&0x0f)); lcdwrite_data(':'); lcdwrite_data('0'+((time_date[0]>>4)&0x0f)); // 显示秒 lcdwrite_data('0'+((time_date[0]&0x0f)));
ds1302write(0x8e,0x80); //开写保护 }
void ds1302get() //读取当前时间 {
uchar i; for(i=0;i<7;i++) { time_date[i]=ds1302read(0x81+i+i); 数据从 1302 对应的寄存器里读出来 delay(5); }
main() { lcdinit(); //初始化 1602
ds1302init(); //初始化 1302 ds1302set(); //设置初始时间
while(1) {
ds1302get();//读取当前时间 lcdwrite_com(0x80); lcdwrite_data('0'+((time_date[6]&0xf0)>>4)); // 显 示年 lcdwrite_data('0'+(time_date[6]&0x0f)); lcdwrite_data('/'); lcdwrite_data('0'+((time_date[4]&0xf0)>>4));// 显 示 月 lcdwrite_data('0'+(time_date[4]&0x0f)); lcdwrite_data('/'); lcdwrite_data('0'+((time_date[3]&0xf0)>>4));// 显 示 日 lcdwrite_data('0'+(time_date[3]&0x0f)); lcdwrite_data(' '); lcdwrite_data('0'+((time_date[5]&0xf0)>>4)); //显 示星期 lcdwrite_data('0'+(time_date[5]&0x0f)); lcdwrite_com(0x80+0x40); lcdwrite_data('0'+((time_date[2]&0xf0)>>4)); // 显 示时 lcdwrite_data('0'+(time_date[2]&0x0f)); lcdwrite_data(':');
时钟芯片DS1302数码管程序
{
uchar i;
dsclk=0;//清零时钟总线
dsdata=0;//清零数据总线
dsret=0;//片选端无效
dsret=1;//逻辑控制有效,可对1302操作
for(i=16;i>0;i++)
dsclk=1;
}
dsclk=1;//上升沿动作
dsret=0;//片选无效,不可进行操作
}
/*********** 时间显示函数**************/
void show(
{
uchar i;
for(i=0;i<8;i++) // 数码管有8位,因此需要循环8次
{
uchar code tab[8]={0xf7,0xfb,0Xfd,0Xfe,0x7f,0xbf,0xdf,0xef};//数码管显示位选端
uchar buf[8];//申请数据暂存空间
/********** 延时函数************/
void delay(uchar i)
{
while(--i);
address=address>>1;
if(dsdata)
address=address|0x80;
dsclk=1;//上升沿动作
dsclk=1;//等待
}
dsclk=1;//时钟置高
dsret=0;//片选无效
return (address);
}
/*********** 写 ***************/
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS1302 时钟芯片的程序/*********************************************************************公司名称:模块名称:DS1302.c功能:实时时钟模块时钟芯片型号:DS1302说明:程序设计:zhaojunjie设计时间:2002.03.02版本号: 20020302*********************************************************************/#includesbit T_CLK = P2^3; /*实时时钟时钟线引脚 */sbit T_IO = P1^4; /*实时时钟数据线引脚 */sbit T_RST = P1^5; /*实时时钟复位线引脚 */sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;void RTInputByte(uchar); /* 输入 1Byte */uchar RTOutputByte(void); /* 输出?1Byte */void W1302(uchar, uchar);uchar R1302(uchar);void Set1302(uchar *); /* 设置时间 */void Bcd2asc(uchar,uchar *);void Get1302(uchar curtime[]); /* 读取1302当前时间 *//********************************************************************函数名:RTInputByte()功能:实时时钟写入一字节说明:往DS1302写入1Byte数据 (内部函数)入口参数:d 写入的数据返回值:无设计:zhaojunjie 日期:2002-03-19修改:日期:***********************************************************************/void RTInputByte(uchar d){uchar i;ACC = d;for(i=8; i>0; i--){T_IO = ACC0; /*相当于汇编中的 RRC */T_CLK = 1;T_CLK = 0;ACC = ACC >> 1;}}/********************************************************************函数名:RTOutputByte()功能:实时时钟读取一字节说明:从DS1302读取1Byte数据 (内部函数)入口参数:无返回值:ACC设计:zhaojunjie 日期:2002-03-19修改:日期:***********************************************************************/ uchar RTOutputByte(void){uchar i;for(i=8; i>0; i--){ACC = ACC >>1; /*相当于汇编中的 RRC */ACC7 = T_IO;T_CLK = 1;T_CLK = 0;}return(ACC);}/********************************************************************函数名:W1302()功能:往DS1302写入数据说明:先写地址,后写命令/数据 (内部函数)调用:RTInputByte() , RTOutputByte()入口参数:ucAddr: DS1302地址, ucData: 要写的数据返回值:无设计:zhaojunjie 日期:2002-03-19修改:日期:***********************************************************************/ void W1302(uchar ucAddr, uchar ucDa){T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr); /* 地址,命令 */RTInputByte(ucDa); /* 写1Byte数据*/T_CLK = 1;T_RST = 0;}/********************************************************************函数名:R1302()功能:读取DS1302某地址的数据说明:先写地址,后读命令/数据 (内部函数)调用:RTInputByte() , RTOutputByte()入口参数:ucAddr: DS1302地址返回值:ucData :读取的数据设计:zhaojunjie 日期:2002-03-19修改:日期:***********************************************************************/ uchar R1302(uchar ucAddr){uchar ucData;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr); /* 地址,命令 */ucData = RTOutputByte(); /* 读1Byte数据 */T_CLK = 1;T_RST = 0;return(ucData);}/********************************************************************函数名:BurstW1302T()功能:往DS1302写入时钟数据(多字节方式)说明:先写地址,后写命令/数据调用:RTInputByte()入口参数:pWClock: 时钟数据地址格式为: 秒分时日月星期年控制8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie 日期:2002-03-19修改:日期:***********************************************************************/ void BurstW1302T(uchar *pWClock){uchar i;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/{RTInputByte(*pWClock); /* 写1Byte数据*/pWClock++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstR1302T()功能:读取DS1302时钟数据说明:先写地址/命令,后读数据(时钟多字节方式)调用:RTInputByte() , RTOutputByte()入口参数:pRClock: 读取时钟数据地址格式为: 秒分时日月星期年7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie 日期:2002-03-19修改:日期:***********************************************************************/ void BurstR1302T(uchar *pRClock){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */for (i=8; i>0; i--){*pRClock = RTOutputByte(); /* 读1Byte数据 */pRClock++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstW1302R()功能:往DS1302寄存器数写入数据(多字节方式)说明:先写地址,后写数据(寄存器多字节方式)调用:RTInputByte()入口参数:pWReg: 寄存器数据地址返回值:无设计:zhaojunjie 日期:2002-03-19修改:日期:***********************************************************************/ void BurstW1302R(uchar *pWReg){uchar i;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */for (i=31; i>0; i--) /* 31Byte 寄存器数据 */{RTInputByte(*pWReg); /* 写1Byte数据*/pWReg++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstR1302R()功能:读取DS1302寄存器数据说明:先写地址,后读命令/数据(寄存器多字节方式)调用:RTInputByte() , RTOutputByte()入口参数:pRReg: 寄存器数据地址返回值:无设计:zhaojunjie 日期:2002-03-19修改:日期:***********************************************************************/ void BurstR1302R(uchar *pRReg){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xff); /* 0xff:时钟多字节读命令 */for (i=31; i>0; i--) /*31Byte 寄存器数据 */{*pRReg = RTOutputByte(); /* 读1Byte数据 */pRReg++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:Set1302()功能:设置初始时间说明:先写地址,后读命令/数据(寄存器多字节方式)调用:W1302()入口参数:pClock: 设置时钟数据地址格式为: 秒分时日月星期年7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie 日期:2002-03-19修改:日期:***********************************************************************/void Set1302(uchar *pClock){uchar i;uchar ucAddr = 0x80;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/for(i =7; i>0; i--){W1302(ucAddr,*pClock); /* 秒分时日月星期年 */pClock++;ucAddr +=2;}W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/}/********************************************************************函数名:Get1302()功能:读取DS1302当前时间说明:调用:R1302()入口参数:ucCurtime: 保存当前时间地址。