>
首 页文章中心单片机论坛电脑援救中心杀毒软件下载电子元件速查集成电路速查客户留言下载中心商品展示频道繁體中文
设为首页
加入收藏
联系我们
您当前的位置:中国单片机网 -> 单片机讲座 -> 文章内容 退出登录 用户管理
栏目导航
· 经典软件 · 单片机讲座
· 电源技术 · 称重技术
· 硬件与电路 · 资料下载
· 淘宝商品 · 轻松一刻
· 金华电大资讯 · 胡老师招生
· l
热门文章
· [图文] 本站承接单片..
· 金华广播电视大学(金..
· 关于金华广播电视大..
· 关于金华广播电视大..
· [组图] 三极管s8050管..
· [组图] 9014三极管管..
· [组图] 三极管9012引..
· [组图] 中央广播电视..
· [组图] 三极管9013管..
· [组图] 万用表的使用..
相关文章
· 基于DS18B20温度传感..
· [组图] 基于MCU和DSP..
· ds1302汇编程序(推..
· 实时时钟DS1302程序..
· 实时时钟模块DS1302..
· DS1302的读写程序(..
· 时钟芯片DS1302程序..
· DS1302 在ATmega8下..
· [组图] 实时时钟电路..
· DS18B20测温(C语言..
DS1302时钟芯片显示时间C51程序
作者:中国单片机网  来源:中国单片机网  发布时间:2009-10-22 14:56:25  发布人:admin

减小字体 增大字体

DS1302时钟芯片显示时间C51程序

/*
程序效果:通过DS1302芯片显示时间,本程序主要是要理解
       DS1302芯片的协议,这样便于编写程序。
       当然时间显示也可以用单片机的定时器来控制,比起延时
       子函数来说较精准。
*/
#include<reg52.h>  //头文件
#include<intrins.h>
#define uchar unsigned char //宏定义
sbit scl2=P1^3; //位声明
sbit sda2=P1^4;
sbit rst2=P1^5;
uchar tmpdata[8]={0x00,0x3b, //显示的时间值
0x17,0x1f,0x0c,0x08,0x09,0x00};
uchar tmpdisplay[8];
code uchar write_rtc_address[7]={  //写入时间的地址
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
code uchar read_rtc_address[7]={   //读取时间的地址
0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
code unsigned char table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,  //共阴数码管 0-9
0x40,0x00}; //    '-' '熄灭‘表
void delay();
void display(uchar *lp,uchar lc); //显示子函数
void write_ds1302(uchar address,uchar dat); //写子函数
uchar read_ds1302(uchar address);//读子函数
void read_rtc();
void set_rtc();
void main()
{
   rst2=0;
   set_rtc();
   while(1)
   {
      read_rtc();
      switch(tmpdata[0]/5)  // 设计每隔5秒交替显示年月日 时分秒
      {  
         case 0:   //显示时分秒
         case 2:
         case 4:
         case 6:
         case 8:
         case 10:
               tmpdisplay[0]=tmpdata[2]/16;
               tmpdisplay[1]=tmpdata[2]&0x0f;
               tmpdisplay[2]=10; //在时与分之间加一个“-”
               tmpdisplay[3]=tmpdata[1]/16;
               tmpdisplay[4]=tmpdata[1]&0x0f;
               tmpdisplay[5]=10;
               tmpdisplay[6]=tmpdata[0]/16;
               tmpdisplay[7]=tmpdata[0]&0x0f;
               break;
         case 1:  //显示年月日
         case 3:
         case 5:
         case 7:
         case 9:
         case 11:
               tmpdisplay[0]=tmpdata[6]/16;
               tmpdisplay[1]=tmpdata[6]&0x0f;
               tmpdisplay[2]=10;
               tmpdisplay[3]=tmpdata[4]/16;
               tmpdisplay[4]=tmpdata[4]&0x0f;
               tmpdisplay[5]=10;
               tmpdisplay[6]=tmpdata[3]/16;
               tmpdisplay[7]=tmpdata[3]&0x0f;
               break;
         default :
             break;
        }
      display(tmpdisplay,8);
   }
}
void display(uchar *lp,uchar lc) //lp为数组的首地址,lc为显示的个数
{
   uchar i;  //定义局部变量
   P2=0;  //清零端口,准备显示
   P1=P1&0xf8; //不影响P1口的高5位,低三位用于控制哪个数码管亮
   for(i=0;i<lc;i++) //循环显示
   {
      P2=table[lp[i]];//查表获得相应的数值
      delay();  //延时,使数码管更加亮
      P2=0;  //清零端口,准备显示下一位
      P1++;  //点亮下一个数码管
   }
}
void delay()  //延时子函数
{
   uchar i;   //i的值的大小可以决定数码管的亮暗的程度
   for(i=20;i>0;i--); //但i的值要适中,并不是越大越好
}
void write_ds1302_byte(uchar temp) //写子函数
{
   uchar i;
   for(i=0;i<8;i++)  //循环8次,写入数据
   {
      scl2=0;
      sda2=temp&0x01; //每次传输低字节
      temp>>=1;   //右移一位
      scl2=1;
   }
}
void write_ds1302(uchar address,uchar dat) //根据ds1302协议编写的程序
{
   rst2=0;
   _nop_();
   scl2=0;
   _nop_();
   rst2=1;
   _nop_();  //从此后开始发送数据
   write_ds1302_byte(address);//发送地址
   write_ds1302_byte(dat);  //发送数据
   rst2=0;  //停止发送数据
}
uchar read_ds1302(uchar address)  //根据ds1302编写的程序
{
   uchar i,temp=0;
   rst2=0;
   _nop_();
   scl2=0;
   _nop_();
   rst2=1;
   _nop_();
   write_ds1302_byte(address);
   for(i=0;i<8;i++)   //循环8次,读取数据
   {
      scl2=1;
      _nop_();
      if(sda2)
       temp|=0x80;//每次传输低字节
       scl2=0;
       temp>>=1; // 右移一位
   }
   rst2=0;
   _nop_();
   scl2=1;
   sda2=0;
   return temp;   //返回 temp值
}
void  read_rtc() //读取日历
{
   uchar i,*p;
   p=read_rtc_address; //传递地址
   for(i=0;i<7;i++) //分七次读取年月日 时分秒 星期
   {
      tmpdata[i]=read_ds1302(*p);
      p++;
   }
}
void set_rtc()    //设定日历
{
   uchar i,*p,tmp;
   for(i=0;i<7;i++)
 {
    tmp=tmpdata[i]/10;
    tmpdata[i]=tmpdata[i]%10;
    tmpdata[i]=tmpdata[i]+tmp*16;
 }
   write_ds1302(0x8e,0x00);

   p=write_rtc_address; //传递地址
   for(i=0;i<7;i++)  //分七次写入年月日 时分秒星期
   {
      write_ds1302(*p,tmpdata[i]);
      p++;
   }
   write_ds1302(0x8e,0x80);
}
如果程序无法编译,请删除所有前导空白.

[本站www.chinadpj.com(中国单片机网),摘自      http://www.51hei.com/mcu/721.html      作者    ]

[] [返回上一页] [打 印] [收 藏]
下一篇文章:单片机百科知识
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
  评论人:Keven   打分:85 分  发表时间:2019-8-21 6:32:00
· Thanksfunnysitehttp://thumbzilla.fun/thumbzillapornCanadian-...
  评论人:Walton   打分:85 分  发表时间:2019-8-20 22:36:16
· Whatarethehoursofwork?http://xnxxredtube.in.net/xnxxporno"It...
  评论人:Buster   打分:85 分  发表时间:2019-8-20 13:42:18
· Sorry,youmusthavethewrongnumberhttp://xhamster.in.net/xhamst...
  评论人:Reinaldo   打分:85 分  发表时间:2019-8-20 12:35:08
· Iworkwithcomputershttp://xnxx.photography/xnxxpornDeeppublic...
  评论人:Donnell   打分:85 分  发表时间:2019-8-20 10:22:08
· Iworkherehttp://livejasmin.in.net/livejasminSo?That芒聙聶snotwh...
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 管理登录
Copyright © 2002-2009 www.chinadpj.com. All Rights Reserved. 浙ICP备06040125号
Powered by:NewAsp SiteManageSystem Version 2.1 SP1 1030