以下是DS1302的驱动,显示采用LED数码管 /********************************************************* 模块名称:LCD试验模块 创 建 人:ZHCE 创建日期:2005年10月18日 功能描述:LCD演示 说 明:此模块在试验板1.0上验证通过,晶振使用11.0592M *********************************************************/ #include <REGX51.H> typedef unsigned char uchar; typedef unsigned int uint; //定义DS1302引脚 #define DS_CLK P1_0 //定义DS1302 时钟输入端口 #define DS_DAT P1_1 //定义DS1302 串行数据输入输出端口(双向) #define DS_RST P1_2 //定义DS1302 复位/片选端口 uchar code led[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; uchar code tab[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0XBF,0X7F}; uchar led_buf[8]; /*定义LED显示缓冲区*/ uchar DS1302Read(uchar address); void DS1302Write(uchar address,uchar number); void display(void); main() { P1_5=1; P1_6=0; //关闭继电器输出,防止数据输出时影响继电器 if ((DS1302Read(0x83)==0x00)&(DS1302Read(0x81)==0x80)) { DS1302Write(0x8E,0x00);//取消写保护 DS1302Write(0x80,0x00); DS1302Write(0x8E,0x80);//写保护 } while(1) { led_buf[0]=DS1302Read(0x85)/16; led_buf[1]=DS1302Read(0x85)%16; led_buf[2]=0x0A; led_buf[3]=DS1302Read(0x83)/16; led_buf[4]=DS1302Read(0x83)%16; led_buf[5]=0x0A; led_buf[6]=DS1302Read(0x81)/16; led_buf[7]=DS1302Read(0x81)%16; display(); } } /********************************************************* // delay(255); //当参数为char时时间为0.55881ms 参数 //为整形时时间为2.22005ms,基本上相当于4倍 // delay(100); //0.22244ms 0.87457ms // delay(200); //0.43945ms // delay(1); //3.26us *********************************************************/ void delay(uint n) { while(--n); } /******************************************************** 函数名称:DS1302单字节写函数 功能描述:读取某一地址的数据 全局变量:无 参数说明:address为地址变量;number为所送的数据 返回说明:返回指定地址的数据 设 计 人:ZHCE 版 本:1.0 说 明: ********************************************************/ uchar DS1302Read(uchar address) { uchar i; DS_CLK=0; //复位各脚 DS_DAT=0; DS_RST=0; DS_RST=1; //允许读写数据 for (i=8;i>0;i--) //地址输入,8位 { DS_CLK=0; //上升沿数据输入 DS_DAT=address&0x01; //送出一位数据 address>>=1; //右移一位 DS_CLK=1; //上升沿 } for (i=8;i>0;i--) //数据读出 { DS_CLK=0; //下降沿数据读出 address>>=1; //把数据右移 if (DS_DAT) address=address|0x80; //读取数据 DS_CLK=1; DS_CLK=1; } //时钟置高位 DS_CLK=1; //片选无效 DS_RST=0; return(address); } /******************************************************** 函数名称:DS1302单字节写函数 功能描述:读取某一地址的数据 全局变量:无 参数说明:address为地址变量;number为所送的数据 返回说明:返回指定地址的数据 设 计 人:ZHCE 版 本:1.0 说 明: ********************************************************/ void DS1302Write(uchar address,uchar number) { uchar i; DS_CLK=0; DS_DAT=0; DS_RST=0; DS_RST=1; /*地址输入*/ for (i=16;i>0;i--) { DS_CLK=0; if (i>8) { DS_DAT=address&0x01; address="address">>1; } else { DS_DAT=number&0x01; number>>=1; } DS_CLK=1; } DS_CLK=1; DS_RST=0; } /******************************************************** 函数名称:数码管显示函数 功能描述:读取某一地址的数据 全局变量:led_buf[] 参数说明:无 返回说明:无 设 计 人:ZHCE 版 本:1.0 说 明: ********************************************************/ void display(void) { unsigned char pos; for(pos=0;pos<8;pos++) { P0=led[led_buf[pos]]; P2=tab[pos]; delay(100); } } |
文章评论(0条评论)
登录后参与讨论