参考文献
1. 王静霞. 单片机应用技术(C语言版),北京:电子工业出版社,2009.5. 2. 彭伟. 单片机C语言程序设计实训100例,北京:电子工业出版社,2009.6. 3. 刘守义.单片机应用技术(第二版),北京:西安电子科技大学出版社,2007.8.
4. 戴佳. 51单片机C语言应用程序设计实例精讲[M],北京:电子工业出版 社,2006.4.
25
附表A 程序
//基于DS1302的日历时钟
#include
/*************************************************************** DS1302与单片机接口
***************************************************************/ sbit DATA = P1^1; //DS1302数据传输端定义在P1.1引脚 sbit RST = P1^0; //DS1302复位端口定义在P1.0引脚
sbit SCLK = P1^2; //DS1302时钟输入端口定义在P1.2引脚
/*************************************************************** 按键与单片机接
***************************************************************/ sbit xiugai_rq = P3^0 ; // S2按键进入时间修改 sbit jia = P3^1 ; // S3按键加1
sbit qiehuan = P3^2 ; // S1按键对时间和日期之间的切换,对日
期修改 中断0
sbit xiugai_sj = P3^3 ; // S4按键修改日期
/*************************************************************** 全局变量定义
**************************************************************/ UcharcodeTab_Num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80
,0x90};//0-9数字
Uchar Time_miao=0,Time_fen=0,Time_shi=12,Time_ri=11,Time_yue=11,
Time_nian=10; //分别储存秒、分、小时 , 日,月,年
uchar ReadValue; //暂时储存从1302读取的数据 uchar timdata, rtimdata ; //时间和日期时钟修改位置标志
bit secbit; // 时钟秒修改标志?secbit=1,正在修改时钟秒 bit minbit ; // 时钟分修改标志 minbit=1,正在修改时钟秒 bit hourbit ; // 时钟时修改标志 hourbit=1,正在修改时钟秒 bit daybit ; // 时钟日修改标志 daybit=1,正在修改时钟秒 bit monbit ; // 时钟月修改标志 monbit=1,正在修改时钟秒 bit yearbit ; // 时钟年修改标志 yearbit=1,正在修改时钟秒 /***************************************************** 函数功能:延时若干微秒 入口参数:n
***************************************************/ void delaynus(unsigned char n) {
unsigned char i; for(i=0;i 26 ; } /***************************************************** 函数功能:延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) } /************************************************************** 函数功能:延时若干毫秒 入口参数:n **************************************************************/ void delaynms(unsigned char n) { unsigned char i; for(i=0;i /*************************************************************** 以下是DS1302芯片的操作程序 ***************************************************************/ /************************************************************** 函数功能:向1302写一个字节数据 入口参数:x **************************************************************/ void Write1302(unsigned char dat) { unsigned char i; SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备 delaynus(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续写8个二进制位数据 { DATA=dat&0x01; //取出dat的第0位数据写入1302 delaynus(2); //稍微等待,使硬件做好准备 SCLK=1; //上升沿写入数据 delaynus(2); //稍微等待,使硬件做好准备 SCLK=0; //重新拉低SCLK,形成脉冲 dat>>=1; //将dat的各数据位右移1位,准备写入下一 个数据位 } 27 } /************************************************************ 函数功能:根据命令字,向1302写一个字节数据 入口参数:Cmd,储存命令字;dat,储存待写的数据 ************************************************************/ void WriteSet1302(unsigned char Cmd,unsigned char dat) { RST=0; //禁止数据传递 SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 delaynus(2); //稍微等待,使硬件做好准备 Write1302(Cmd); //写入命令字 Write1302(dat); //写数据 SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递 } /************************************************************ 函数功能: 1302进行初始化设置 ************************************************************/ void Init_DS1302(void) { WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((Time_miao/10)<<4|(Time_miao))); //根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((Time_fen/10)<<4|(Time_fen))); //根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((Time_shi/10)<<4|(Time_shi))); //根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((Time_ri/10)<<4|(Time_ri))); //根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((Time_yue/10)<<4|(Time_yue))); //根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,((Time_nian/10)<<4|(Time_nian))); //根据写小时寄存器命令字,写入年的初始值 } /*************************************************************** 函数功能:从1302读一个字节数据 入口参数:x ***************************************************************/ unsigned char Read1302(void) 28 { unsigned char i,dat; delaynus(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续读8个二进制位数据 { dat>>=1; //将dat的各数据位右移1位, if(DATA==1) //如果读出的数据是1 dat|=0x80; //将1取出,写在dat的最高位 SCLK=1; //将SCLK置于高电平,为下降沿读出 delaynus(2); //稍微等待 SCLK=0; //拉低SCLK,形成脉冲下降沿 delaynus(2); //稍微等待 } return dat; //将读出的数据返回 } /************************************************************* 函数功能:根据命令字,从1302读取一个字节数据 入口参数:Cmd *************************************************************/ unsigned char ReadSet1302(unsigned char Cmd) { unsigned char dat; RST=0; //拉低RST SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 Write1302(Cmd); //写入命令字 dat=Read1302(); //读出数据 SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递 return dat; //将读出的数据返回 } /************************************************************** 以下是1302数据的显示程序 **************************************************************/ /************************************************************* 函数功能:显示秒 入口参数:x *************************************************************/ void DisplaySecond(unsigned char x) { unsigned char i,j; //i,j分别储存拆开的十位和个位 i=x/10; //取十位 j=x; //取个位 29 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于DS1302的万年历毕业论文 数码管显现 附程序 硬件电路图(7)在线全文阅读。
相关推荐: