求一个AT89S51单片机电子时钟程序!急急急.......!

8位显示,分别显示时分秒,闹钟功能,数码管时共阳,作业呀!急急急!电路作好了,就差程序了!如果哪位好心人写的程序无须我再修改且实验正确,将再追加悬赏50分!万分感谢!... 8位显示,分别显示时分秒,闹钟功能,数码管时共阳,作业呀!急急急!
电路作好了,就差程序了!如果哪位好心人写的程序无须我再修改且实验正确,将再追加悬赏50分!万分感谢!
展开
 我来答
逆寒刀
推荐于2016-07-04 · TA获得超过781个赞
知道小有建树答主
回答量:302
采纳率:0%
帮助的人:121万
展开全部
  #include <reg52.h>
  #include <stdio.h>
  #include <absacc.h>
  #include <intrins.h>

  typedef unsigned char uchar;

  uchar g8563_Store[4]; /*时间交换区,全局变量声明*/
  uchar code c8563_Store[4]={0x50,0x59,0x07,0x01}; /*写入时间初值:星期一 07:59:40*/

  sbit CS=P1^4;
  sbit CLK=P1^7;
  sbit DIO=P1^6;
  sbit KEY=P3^2;

  sbit SDA=P1^1; // pcf8563时钟
  sbit SCL=P1^0; // pcf8563时钟

  bdata uchar com_data;
  sbit mos_bit=com_data^7;
  sbit low_bit=com_data^0;

  void delay_50us()
  {
  uchar i;
  for (i=0; i<6; i++){;}
  }

  void delay_8us()
  {
  uchar i;
  for (i=0; i<1; i++){;}
  }
  void delay_50ms()
  {
  uchar i,j;
  for(j=0;j<50;j++)
  for(i=0;i<125;i++){;}
  }
  void send(uchar sebuf)
  {
  uchar i;
  com_data=sebuf;
  CLK=0;
  CS=0;
  delay_50us();
  for(i=0;i<8;i++)
  {
  delay_8us();
  DIO=mos_bit;
  CLK=1;
  delay_8us();
  com_data=com_data<<1;
  CLK=0;
  }
  DIO=0;
  }
  uchar receive(void)
  {
  uchar i,rebuf;
  CLK=1;
  delay_50us();
  for(i=0;i<8;i++)
  {
  com_data=com_data<<1;
  low_bit=DIO;
  CLK=1;
  delay_8us();
  CLK=0;
  delay_8us();
  }
  rebuf=com_data;
  DIO =1;
  CS=1;
  return rebuf;
  }
  void reset(void)
  {
  DIO=1;
  delay_50ms();
  send(0xa4);
  CS=1;
  }
  /* 7289显示程序 */
  /* addr为显示位置 范围0~7 */
  /* dat为现实内容 */
  void display(uchar addr,uchar dat)
  {
  if(addr<0 || addr >7)
  return;
  send(0xc8 + addr);
  delay_50us();
  send(dat);
  CS=1;
  }
  /* 发送双字节命令 */
  void sendcommand(uchar addr,uchar dat)
  {
  send(addr);
  delay_50us();
  send(dat);
  CS=1;
  }
  /********************************************
  内部函数,延时1
  ********************************************/
  void Delay()
  {
  // {P10=1;_nop_();P10=0;}
  _nop_();
  _nop_(); /*根据晶振频率制定延时时间*/
  }
  /********************************************
  内部函数,I2C开始
  ********************************************/
  void Start()
  {
  EA=0;
  SDA=1;
  SCL=1;
  Delay();
  SDA=0;
  Delay();
  SCL=0;
  }
  /********************************************
  内部函数,I2C结束
  ********************************************/
  void Stop()
  {
  SDA=0;
  SCL=0;
  Delay();
  SCL=1;
  Delay();
  SDA=1;
  Delay();
  EA=1;
  }
  /********************************************
  内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
  ********************************************/
  void WriteACK(uchar ack)
  {
  SDA=ack;
  Delay();
  SCL=1;
  Delay();
  SCL=0;
  }
  /********************************************
  内部函数,等待ACK
  ********************************************/
  void WaitACK()
  {
  uchar errtime=20;
  SDA=1;
  Delay(); /*读ACK*/
  SCL=1;
  Delay();
  while(SDA)
  { errtime--; }
  SCL=0;
  Delay();

  }
  /********************************************
  内部函数.输出数据字节
  入口:B=数据
  ********************************************/
  void writebyte(uchar wdata)
  {
  uchar i;
  for(i=0;i<8;i++)
  {
  if(wdata&0x80) SDA=1;
  else SDA=0;
  wdata<<=1;
  SCL=1;
  Delay();
  SCL=0;
  }
  WaitACK(); //I2C器件或通讯出错,将会退出I2C通讯
  }
  /********************************************
  内部函数.输入数据
  出口:B
  ********************************************/
  uchar Readbyte()
  {
  uchar i,bytedata;
  SDA=1;
  for(i=0;i<8;i++)
  {
  SCL=1;
  bytedata<<=1;
  bytedata|=SDA;
  SCL=0;
  Delay();
  }
  return(bytedata);
  }
  /********************************************
  输出数据->pcf8563
  ********************************************/
  void writeData(uchar address,uchar mdata)
  {
  Start();
  writebyte(0xa2); /*写命令*/
  writebyte(address); /*写地址*/
  writebyte(mdata); /*写数据*/
  Stop();
  }
  /********************************************
  输入数据<-pcf8563
  ********************************************/
  uchar ReadData(uchar address) /*单字节*/
  {
  uchar rdata;
  Start();
  writebyte(0xa2); /*写命令*/
  writebyte(address); /*写地址*/
  Start();
  writebyte(0xa3); /*读命令*/
  rdata=Readbyte();
  WriteACK(1);
  Stop();
  return(rdata);
  }
  void ReadData1(uchar address,uchar count,uchar * buff) /*多字节*/
  {
  uchar i;
  Start();
  writebyte(0xa2); /*写命令*/
  writebyte(address); /*写地址*/
  Start();
  writebyte(0xa3); /*读命令*/
  for(i=0;i<count;i++)
  {
  buff[i]=Readbyte();
  if(i<count-1) WriteACK(0);
  }
  WriteACK(1);
  Stop();
  }
  /********************************************
  内部函数,读入时间到内部缓冲区
  ********************************************/
  void P8563_Read()
  {
  uchar time[7];
  ReadData1(0x02,0x07,time);
  g8563_Store[0]=time[0]&0x7f; /*秒*/
  g8563_Store[1]=time[1]&0x7f; /*分*/
  g8563_Store[2]=time[2]&0x3f; /*小时*/
  g8563_Store[3]=time[4]&0x07; /*星期*/
  }
  /********************************************
  读入时间到内部缓冲区----外部调用
  ********************************************/
  void P8563_gettime()
  {
  P8563_Read();
  if(g8563_Store[0]==0)
  P8563_Read(); /*如果为秒=0,为防止时间变化,再读一次*/
  }
  /********************************************
  写时间修改值
  ********************************************/
  void P8563_settime()
  {
  uchar i;
  for(i=2;i<=4;i++) { writeData(i,g8563_Store[i-2]); }
  writeData(6,g8563_Store[3]);
  }
  /********************************************
  P8563的初始化-----外部调用
  ********************************************/
  void P8563_init()
  {
  uchar i;

  for(i=0;i<=3;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
  P8563_settime();
  writeData(0x0,0x00);
  writeData(0xa,0x8); /*8:00报警*/
  writeData(0x1,0x12); /*报警有效*/
  writeData(0xd,0xf0);

  }

  main()
  {
  reset();
  P8563_init();
  while(1)
  {
  P8563_Read();
  display(0,g8563_Store[2] >> 4);
  display(1,g8563_Store[2] & 0x0f);
  sendcommand(0x82,0x0a);
  display(3,g8563_Store[1] >> 4);
  display(4,g8563_Store[1] & 0x0f);
  sendcommand(0x85,0x0a);
  display(6,g8563_Store[0] >> 4);
  display(7,g8563_Store[0] & 0x0f);
  }
  }
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
上海实邦电子科技
2025-08-04 广告
联系方式:13671592388上海实邦电子科技有限公司是一家专业电子产品开发与ODM/OEM/电子制造服务(EMS)企业,具有多年基于消费电子产品、工业自动化产品、机电控制产品的PCBA开发与生产经验,更有多年的单片机开发及工业控制电路设... 点击进入详情页
本回答由上海实邦电子科技提供
百度网友36c8ebb
2010-01-18 · TA获得超过104个赞
知道答主
回答量:272
采纳率:0%
帮助的人:71万
展开全部
你很懒,我也是
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_huyi_
2010-01-18 · TA获得超过134个赞
知道答主
回答量:172
采纳率:0%
帮助的人:0
展开全部
sodisni
自己写撒
我和楼上的一样懒
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式