#include
#include"p24Fxxxx.h"
#define uchar unsigned char
#define uint unsigned int
/////////////////////////////////////////////
#define USER_DEINED_1 0x00
#define USER_DEINED_2 0x02
#define USER_DEINED_3 0x04
#define USER_DEINED_4 0x06
#define RS https://www.wendangku.net/doc/5810748718.html,TD5//串口时为CS 2^6;
#define RW https://www.wendangku.net/doc/5810748718.html,TD7//串口为SID 2^5;
#define E https://www.wendangku.net/doc/5810748718.html,TF0 //串口为时钟SCLK 2^4; #define PSB https://www.wendangku.net/doc/5810748718.html,TD6
#define RST https://www.wendangku.net/doc/5810748718.html,TB5 // P2^0;
#define Lcm_Data LATE
////////////////////////////////////////////
unsigned char jicunqi,jicun,second,min,hour;
uchar table_shizhong[7];
#define RST_1302 https://www.wendangku.net/doc/5810748718.html,TD11
#define SCLK https://www.wendangku.net/doc/5810748718.html,TD9
//#define IO https://www.wendangku.net/doc/5810748718.html,TD10
#define IO PORTDbits.RD10
void delay(void)
{
unsigned int i=10000;
while(i--);
}
void delay_us(void)
{
unsigned int i=1000;
while(i--);
}
//////////////////////////////////////////////
void Delay_1ms(uint x)//1ms延时
{
unsigned char j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
void Lcm_Delay(void)
{
uchar i=100;
while(i--);
}
void Lcm_Rd_Status(void) //读忙状态
{
RS=0;
RW=1;
E=0;
Lcm_Delay();
E=1;
Lcm_Data=(LATE&0xFF00);
while(PORTEbits.RE7==1);
//while(1)
//{
//break;
//}
}
void Lcm_Wr_Data(uchar wrdata) //写数据
{
Lcm_Rd_Status();
RS=1;
RW=0;
Lcm_Data=wrdata;
E=1;
Lcm_Delay();
E=0;
}
void Lcm_Wr_Command(uchar wrcommand) //写指令{
Lcm_Rd_Status();
RS=0;
RW=0;
Lcm_Data=wrcommand;
E=1;
Lcm_Delay();
E=0;
}
void Wr_Cgram(uchar addr,uchar *table)
{
uchar i;
Lcm_Wr_Command(addr); //设定CGRAM地址
for(i=0;i<32;i++)
Lcm_Wr_Data(*table++);
}
//选定坐标
void Lcm_GotoXY(uchar pos_X,uchar pos_y)
{
uchar addr;
if((pos_X>7)||(pos_y>3))
return;
if(pos_y==0)
addr=0x80+pos_X;
else if(pos_y==1)
addr=0x90+pos_X;
else if(pos_y==2)
addr=0x88+pos_X;
else if(pos_y==3)
addr=0x98+pos_X;
Lcm_Wr_Command(addr);//设定DDRAM地址
}
//显示字符串
void Lcm_Disp_String(uchar *string)
{
while (*string != '\0')
Lcm_Wr_Data(*string++);
}
void Wr_Gdram(uchar pos_x,uchar pos_y,uint length,uchar width,uchar *table) {
uchar i,j;
Lcm_Wr_Command(0x34);//选择扩充指令
Lcm_Wr_Command(0x36);
for(j=pos_y;j { Lcm_Wr_Command(0x80+j); //Y总坐标,即第几行 Lcm_Wr_Command(0x80+pos_x);//X坐标,16个点进1 for(i=0;i Lcm_Wr_Data(*table++); } Lcm_Wr_Command(0x30);//返回基本指令 } //显示单个字符 void Lcm_Disp_Onechar(uchar onechar) { Lcm_Wr_Data(onechar); } //显示自定义的字符 void Disp_Cgram(uchar addr_data) { Lcm_Wr_Data(0x00); Lcm_Wr_Data(addr_data); } //清除GDRAM void Clean_Gdram(void) { uchar i,j; Lcm_Wr_Command(0x34); for(j=0;j<32;j++) { Lcm_Wr_Command(0x80+j); Lcm_Wr_Command(0x80); for(i=0;i<32;i++) Lcm_Wr_Data(0); } Lcm_Wr_Command(0x36); Lcm_Wr_Command(0x30); } void fill_full_Gdram(void) { uchar i,j; Lcm_Wr_Command(0x34); for(j=0;j<32;j++) { Lcm_Wr_Command(0x80+j); Lcm_Wr_Command(0x80); for(i=0;i<32;i++) Lcm_Wr_Data(0xff); } Lcm_Wr_Command(0x36); Lcm_Wr_Command(0x30); } //开显示,设置,清屏 void Lcm_Init(void) { Delay_1ms(50); RST=1; Delay_1ms(10); RST=0; Delay_1ms(10); RST=1; Lcm_Wr_Command(0x30); Delay_1ms(5); Lcm_Wr_Command(0x30); Delay_1ms(5); Lcm_Wr_Command(0x0c); //开显示及光标设置Delay_1ms(5); Lcm_Wr_Command(0x01); //显示清屏 Delay_1ms(10); Lcm_Wr_Command(0x06); //显示光标移动设置Delay_1ms(5); } /////////////////////////////////////////////// void write_DS1302(uchar Date) { uchar i; for(i = 0;i < 8;i++) { IO = 0; SCLK = 0; if(Date & 0x01) IO = 1; else IO = 0; Date = Date >> 1; SCLK = 1; } SCLK = 0; } //////////////////////////////////////////// uchar read_DS1302() { uchar i,Temp = 0; TRISDbits.TRISD10=1; for(i = 0;i < 8;i++) { SCLK = 0; Temp = Temp >> 1; if(IO == 1) Temp = Temp | 0x80; SCLK = 1; } TRISDbits.TRISD10=0; SCLK = 0; Temp = Temp / 16 * 10 + Temp % 16; return Temp; } ////////////////////////////////////////////////// void init_1302(void) { SCLK = 0; RST_1302=0; RST_1302=1; write_DS1302(0x8e); write_DS1302(0x00); RST_1302=0; } void set_time() { SCLK = 0; RST_1302=0; RST_1302=1; write_DS1302(0xbe); write_DS1302(0x00); write_DS1302(0x58); write_DS1302(0x12); write_DS1302(0x08); write_DS1302(0x03); write_DS1302(0x06); write_DS1302(0x06); write_DS1302(0x00); RST_1302=0; } void get_time(void) { uchar i; SCLK = 0; RST_1302=0; RST_1302=1; write_DS1302(0xbf); for(i=0;i<7;i++) { table_shizhong[i]=read_DS1302(); } RST_1302=0; } lcd_display(void) { uchar i,a; for(i=0;i<7;i++) { a=table_shizhong[i]; Lcm_GotoXY(0,i); Lcm_Disp_Onechar(a/100+'0'); Lcm_Disp_Onechar(a%100/10+'0'); Lcm_Disp_Onechar(a%100%10+'0'); } } lcd_display1(void) { uchar i,a,a_baiwei,a_shiwei,a_gewei; for(i=0;i<7;i++) { a=table_shizhong[i]; Lcm_GotoXY(0,3+i); Lcm_Disp_String("a"); } } void main(void) { uchar i; TRISDbits.TRISD9=0; //RF3 SDO1 shuchu TRISDbits.TRISD11=0; //RF6 SCK1 shuchu TRISDbits.TRISD10=0; //RF6 SDI1 shuru ODCDbits.ODD10=1; /////////////////////////////////////////////////// TRISE=0x00; TRISDbits.TRISD5=0; TRISDbits.TRISD6=0; TRISDbits.TRISD7=0; TRISBbits.TRISB5=0; TRISFbits.TRISF0=0; Lcm_Init(); Clean_Gdram(); ////////////////////////////////////////////////// init_1302(); delay(); set_time(); ///////////////////////////////////////////////// while(1) { get_time(); lcd_display(); } } 随笔/mcu51 发表于2007-06-17, 21:53 /*---------------------------------------------- DS1302读写一体化C51源程序 HotPower@https://www.wendangku.net/doc/5810748718.html, ------------------------------------------------*/ //打开DS1302 void TimeSpiOpen(void) { TIMECLK = 0; TIMERST = 0;//禁止DS1302 TIMEIO = 1;//释放数据总线 TIMERST = 1;//使能DS1302 } //关闭DS1302 void TimeSpiClose(void) { TIMERST = 0;//禁止DS1302 TIMEIO = 1;//释放数据总线 TIMECLK = 1; } //读写DS1302 unsigned char TimeSpiReadWrite(unsigned char val) { unsigned char i; ACC = val;//取8位数据 for (i = 8;i > 0; i--) { TIMECLK = 0;//时钟下降沿输入数据(DS1302读) _nop_();//延时 CY = TIMEIO;//接收串行数据到CY _rrca_();//右移一位数据到CY(先存后取) TIMEIO = CY;//发送串行数据 TIMECLK = 1;//时钟上升沿打入数据(DS1302写) TIMEIO = 1;//释放数据总线 } val = ACC; return val; } //读DS1302字节 unsigned char TimeByteRead(unsigned char address) { TimeSpiOpen();//打开DS1302 TimeSpiReadWrite(address);//写入DS1302命令 address = TimeSpiReadWrite(0xff);//读入DS1302数据 TimeSpiClose();//关闭DS1302 return address;//返回数据 } //读DS1302RAM字节 unsigned char TimeRamByteRead(unsigned char address) { TimeSpiOpen();//打开DS1302 TimeSpiReadWrite((address << 1) | 0xc1);//写入DS1302命令 address = TimeSpiReadWrite(0xff);//读入DS1302数据 TimeSpiClose();//关闭DS1302 return address;//返回数据 } DS1302时钟芯片读写详解 2008-09-26 13:07 /*DS1302读写程序(C51)*/ sbit DS13CLK =P1^5; /*DS1302的SCLK脚脉冲*/ sbit DS13IO =P1^6; /*DS1302的IO脚数据*/ sbit DS13CS =P1^7; /*DS1302的RST脚片选*/ /*向DS1302写一个字节*/ void _wds13byte(uchar _code) { uchar i; DS13CLK =0; DS13CLK =0; for(i=0;i<8;i++) { if(_code&0x01) DS13IO =1; else DS13IO =0; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; _code =_code >> 1; } } /*从DS1302读一个字节*/ uchar _rds13byte(void) { uchar i,_code; _code=0; DS13CLK =0; DS13CLK =0; DS13IO =1; for(i=0;i<8;i++) { _code =_code >>1; if(DS13IO) _code =_code|0x80; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; } return _code; } /*读功能_code读功能命令*/ uchar readds1302(uchar _code) { DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(_code); /*读代码*/ _code=_rds13byte(); /*返回读取数字*/ DS13CLK =1; DS13CS =0; /*关闭DS1302*/ return _code; } /*写功能fp写的地址,_code写的内容*/ void writeds1302(uchar fp,uchar _code) { DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(fp); /*写控制命令*/ _wds13byte(_code); /*写入数据*/ DS13CLK=1; DS13CS =0; /*关闭DS1302*/ } /*******DS1302设置快速充电***************/ void ds13_charg(void) { writeds1302(0x8e,0x00); /*解除写保护*/ writeds1302(0x90,0xa5); /*单二极管2K电阻充电*/ writeds1302(0x8e,0x80); /*置位写保护*/ } ;;;DS1302读写程序(汇编);;; ;******************************************************************* **/ T_CLK Bit P1.5 ;实时时钟时钟线引脚 T_IO Bit P1.6 ;实时时钟数据线引脚 T_RST Bit P1.7 ;实时时钟复位线引脚 ;********************************************************** ;子程序名:Set1302 ;功能:设置DS1302 初始时间,并启动计时。 ;说明: ;调用:RTInputByte ;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续) ;出口参数:无 ;影响资源:A B R0 R1 R4 R7 ds1302时钟程序详解,ds1302程序流程图(C程序) ds1302时钟程序详解 DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始 输出。 2.3 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从 低位0位到高位7。 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日 历、时间寄存器及其控制字见表1。 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RA M的31个字节,命令控制字为FEH(写)、FFH(读)。 ds1302程序流程图 3.2 DS1302实时时间流程 图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基 本操作进行编程: dsl302时钟程序详解经典 dsl302时钟程序详解 DS1302的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始 2.3数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0 位到高位7o 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位 为BCD码形式,其日历、 时间寄存器及其控制字见表1。 ? I日历?別间襦存祁及凡担制孑 fir* 野擅"itwtr 収他总cn - T ?fsy网 移 e S』3 2 1 0 林斶 son8!ll00-59 f.H IUSVX SIX X2H S3II oum(1Mh、 MH K4H851101 \2A12 24? 10 IIH HK MhH M7II01 -2S.2V, W-Jl ?o imiAre 8SH WII03 - !2(11) 0 IUM MOYI1I AAII8HH ni(i II ? 0 0h\V 8LH Mill OQ ? 9910YLAH 此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器 及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH, FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 dsl302程序流程图 DS1302 时钟芯片的原理与应用 1 写保护寄存器操作 当写保护寄存器的最高位为0 时,允许数据写入寄存器,写保护寄存器可以通过命令字节8E 8F 来规定禁止写入/读出。写保护位不能在多字节传送模式下写入Write_Enable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#00h 数据内容为0 写入允许 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 当写保护寄存器的最高位为1 时禁止数据写入寄存器 Write_Disable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#80h 数据内容为80h 禁止写入 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面 的程序亦使用了这个模块 2 时钟停止位操作 当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始 Osc_Enable: MOV Command,#80h ; 命令字节为80 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#00h 数据内容为0 振荡器工作允许 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 当把秒寄存器的第7 位时钟停止位设置为1 时,时钟振荡器停止DS1320 进入低功耗方式 Osc_Disable: MOV Command,#80h ;命令字节为80 MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#80h 数据内容为80h 振荡器停止 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 3. 多字节传送方式 #include 以下资料摘自电子发烧友网感谢作者,版权归网站所有,资料仅供参考 ds1302时钟程序详解 DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 2.3 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 ds1302程序流程图 3.2 DS1302实时时间流程 图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基本操作进行编程: 51 单片机ds1302 时钟芯片 #define uint unsigned int #define uchar unsigned char sbit lcdrs = P1^0; sbit lcdrw = P1^1; sbit lcden = P1^2; sbit key0 = P2^0;//功能键,选择时分秒 sbit key1 = P2^1;//加1键 sbit key2 = P2^2;//减1键 sbit key4 = P2^4; sbit clk_1302 = P1^5; //1302芯片位定义sbit io_1302 = P1^6; sbit rst_1302 = P1^7; uchar bdata dat; sbit dat0 = dat^0; sbit dat7 = dat^7; uchar key0_count;//按键0被按的次数(0~3) uchar flag; char hour,minute,second; uchar table_date[] = "2009-4-12 Mon"; uchar table_time[] = "00:00:00"; /****** 函数申明********/ void write_cmd_1602(uchar cmd); void write_data_1602(uchar dat); void write_add(uchar add,uchar dat); void init1602(); void delay(uint z); 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); 主程序 #include #include /************************************************************************/ // huaqinMCU DS1302 实验程序数码管显示时钟设置说明 // "8键"为时钟设置、时分切换、保存"0键"为加"4键"为减 /************************************************************************/ #include 早就已经不在学校了,可是前几天突然有老童学问我有没有保存这方面的资料,赶紧翻了一下我的电脑,呵呵,还是找到了一些资料,顺便共享出来,有需要的同学们拿走后留个言吧——可以的话。最后感谢无名的原作者。 DS1302的特点 DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。 各引脚的功能 Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。SCLK:串行时钟,输入;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。 DS1302的几组寄存器以及有关RAM的地址 (1)DS1302有关日历、时间的寄存器 DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如图3所示。 (2)小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM。在24小时模式时、位5是第二个10小时位。 (3)秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。(4)控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。 (5)DS1302中附加31字节静态RAM的地址如图4所示。 (6)DS1302的工作模式寄存器 所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如图5所示 DS1302 时钟芯片的程序 /********************************************************************* 公司名称: 模块名称:DS1302.c 功能:实时时钟模块时钟芯片型号:DS1302 说明: 程序设计:zhaojunjie 设计时间:2002.03.02 版本号: 20020302 *********************************************************************/ #include sbit 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 修改:日期: ***********************************************************************/ #include 本文件包含C语言程序以及仿真原理图! 程序: #include<> #include<> #define uchar unsigned char #define uint unsigned int sbit sclk=P3^0; sbit dio=P3^1; sbit ce=P3^2; sbit s0=P2^0; sbit s1=P2^1; uchar d[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar a[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; uchar shi,fen,miao; uint x=1; void show(uchar shi,uchar fen,uchar miao); void delay(uint z) { uint x,y; for(y=z;y>0;y--) for(x=110;x>0;x--); } void display(uchar shu,uchar wei) { s0=0;s1=0; P1=0XFF; P1=a[wei]; s1=1; s1=0; if(x%2==0)//小数点显示判定 {P1=d[shu]&0x7f; x++; } else {P1=d[shu]; x++; } if(x==6) x=0; delay(2); s0=0; } void write(uchar add,uchar date) { uchar temp,t; ce=0; sclk=0; ce=1; temp=add; for(t=0;t<8;t++)//地址控制 { if((temp&0x01)==1) { dio=1; #ifndef __DS1302_H__ #define __DS1302_H__ #define uchar unsigned char #define uint unsigned int #include #include "ds1302.h" /************************************************************** 函數名稱:DS1302_Write_Byte(uchar Date) 函數功能:单字节写 輸入參數:写的字节 輸出參數:无 備注: **************************************************************/ void DS1302_Write_Byte(uchar Date) { uchar i; for(i = 0;i < 8;i++) { if(Date & 0x01) IO = 1; else IO = 0; SCLK = 1; Date = Date >> 1; SCLK = 0; } } /************************************************************** 函數名稱:uchar DS1302_Read_Byte() 函數功能:单字节读 輸入參數:无 輸出參數:读出的数据 備注: **************************************************************/ uchar DS1302_Read_Byte() { DS1302驱动程序详解 DS1302引脚介绍 特性介绍 驱动程序详解 sbit IO=P1^0; //DS1302数据线 sbit SCLK=P1^1; //DS1302时钟线 sbit RST=P1^2; //DS1302复位线 uchar WEEK[][4]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"}; //亦可定义成指针数组*WEEK[] uchar LCD_DSY_BUFFER1[]={"DA TE 00-00-00 "}; uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00 "}; uchar DateTime[7]; void Initialize_LCD(); void Display_LCD_String(uchar p,uchar *s); void DelayMS(uint ms); //------------------------------------------------------------------ //向DS1302写入一个字节 //------------------------------------------------------------------ void Write_A_Byte_TO_DS1302(uchar x) { uchar i; SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备 for (i=0;i<8;i++) { IO=x & 0x01; //取出x的第0位数据写入1302 SCLK=1; //上升沿写入数据 SCLK=0; //重新拉低SCLK,形成脉冲 x >>=1; //将x的各数据位右移1位,准备写入下一个数据位 } } //------------------------------------------------------------------ //从DS1302读取一个字节, //注意:DS1302中所存放的数据是BCD码,在读写时要注意转换 // //------------------------------------------------------------------ uchar Get_A_Byte_FROM_DS1302() { uchar i,b=0x00; for (i=0;i<8;i++) { b |= _crol_((uchar)IO,i);//将uchar类型的IO数据左移i位 SCLK=1; //将SCLK置于高电平,为下降沿读出 单片机原理课程设计 课题名称:基于DS1302的数码管显示数字钟 专业班级:电子信息工程 学生学号:0414070126 学生姓名:张向阳 指导教师:张云马崇霄 设计时间:2010年6月21日--2010年6月25日 目录 摘要................................................................................... 1 设计任务和要求..................................................................... 2 方案论证........................................................................... 3 系统硬件设计....................................................................... 3.1 系统总原理图 ............................................................... 3.2 元器件清单.................................................................................... .................................................. 3.3 PCB板图.................................................................................... ................................................... 3.4 Proteus仿真图.............................................................. 3.5 分电路图及原理说明......................................................... 3.5.1 主控部分(单片机MCS-51).................................................................... .......... 3.5.2 计时部分(实时时钟芯片DS1302).................................................................. 3.5.3 显示部分(共阳极数码管)....................................................................... ......... 3.5.4 调时部分(按键)....................................................................... ......................... 4 系统软件设计....................................................................... 4.1 程序流程图.................................................................. 4.2 程序源代码................................................................... 5 心得体会........................................................................... #includeDS1302读写程序
DS1302时钟芯片读写详解
ds1302时钟程序详解-ds1302程序流程图(C程序)
ds1302时钟程序详解经典
DS1302时钟芯片的原理与应用
单片机ds1302程序
最新ds1302时钟程序详解 含电路图 源程序 注释资料
51单片机DS1302日历时钟程序
DS1302程序
DS1302数码管显示程序
ds1302时钟原理介绍
DS1302 时钟芯片的程序
DS1302读写程序
DS1302时钟程序
DS1302时钟芯片51单片机c语言程序
DS1302驱动程序详解
ds1302时钟数码管显示时分秒
DS1302+1602时钟程序