找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 305|回复: 3
打印 上一主题 下一主题
收起左侧

这有个问题找不到,麻烦帮我看一下,谢谢了

[复制链接]
跳转到指定楼层
楼主
ID:1095516 发表于 2023-12-5 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <REGX52.H>
#include <intrins.h>
#define SomeNOP() _nop_();_nop_();_nop_();_nop_()
#define SM_DAT P0
#define SM_CS  P2
sbit TIME_CE=P1^2;
sbit SDA    =P1^0;
sbit SCL    =P1^1;

UBYTE code  dis_add[6]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd};
UBYTE code  dis_data[10]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0-9数字

UBYTE Sec,Min,Hou;
UBYTE data_buffer[6]={0,0,0,0,0,0};

/*********************************************************************
* 名称: v_RTInputUBYTE
* 说明:
* 功能: 往DS1302写入1UBYTE数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputUBYTE(UBYTE ucDa)
{
  BYTE i;
  ACC = ucDa;
  for(i=8; i>0; i--)
  {
    SDA = a0;
    SCL = 1;
    SCL = 0;
    ACC = ACC >> 1;
  }
}
/********************************************************************
*
* 名称: UBYTE uc_RTOutputUBYTE
* 说明:
* 功能: 从DS1302读取1UBYTE数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
UBYTE uc_RTOutputUBYTE(void)
{
  BYTE i;
  ACC=0;
  TIME_CE=1;
  for(i=8; i>0; i--)
  {
    ACC = ACC >>1;
    a7 = SDA;
    SCL = 1;
    SCL = 0;
  }
  return(ACC);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputUBYTE()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(UBYTE ucAddr, UBYTE ucDa)
{
  TIME_CE = 0;
  SCL = 0;
  TIME_CE = 1;
  v_RTInputUBYTE(ucAddr); /* 地址,命令 */
  v_RTInputUBYTE(ucDa); /* 写1UBYTE数据*/
  SCL = 1;
  TIME_CE =0;
}
/********************************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputUBYTE() , uc_RTOutputUBYTE()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
UBYTE uc_R1302(UBYTE ucAddr)
{
  UBYTE ucDa;
  TIME_CE = 0;
  SCL = 0;
  TIME_CE = 1;
  v_RTInputUBYTE(ucAddr); /* 地址,命令 */
  ucDa = uc_RTOutputUBYTE(); /* 读1UBYTE数据 */
  SCL = 1;
  TIME_CE =0;
  return(ucDa);
}
/********************************************************************
*
* 名称: msec
* 说明:
* 功能: 延时程序
* 调用:
* 输入:        延时多少时间
* 返回值: 无
***********************************************************************/
void msec(UWORD x)         
{
UWORD j;
while (x--)
{
  for(j=0;j<125;j++);
}
}
/********************************************************************
*
* 名称: data_buff
* 说明:
* 功能: 数据处理
* 调用:
* 输入:
* 返回值: 无
***********************************************************************/
void data_buff(void)
{   UBYTE h,m,s;
        h=Hou&0xf0;
        h>>=4;
        data_buffer[0]=h;
        data_buffer[1]=Hou&0x0f;
          m=Min&0xf0;
        m>>=4;
        data_buffer[2]=m;
        data_buffer[3]=Min&0x0f;
        s=Sec&0xf0;
        s>>=4;
        data_buffer[4]=s;
        data_buffer[5]=Sec&0x0f;
}
/********************************************************************
*
* 名称: dis_play
* 说明:
* 功能: 数码管显示
* 调用: mse()
* 输入:
* 返回值: 无
***********************************************************************/
void dis_play(void)
{        UBYTE i;
        UBYTE dat=0;
   for(i=0;i<6;i++)
        {
         P2=dis_add[5-i];
         dat=data_buffer[i];
                if(i%2==0)
                {
                        P0=dis_data[dat];
                }                       
                else if(i==5)
                {
                        P0=dis_data[dat];
                }
                else
                   P0=dis_data[dat]|0x80;
         SomeNOP();
         msec(2);
        }
}
/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
*                               7UBYTE (BCD码) 80 82 84 86 88 8a   8c         写状态
                                                                               81 83 85 87 89 8b   8d    读状态
* 返回值: 无
***********************************************************************/
void v_Set1302(void)
{
  v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
  Sec=0x00;
  Min=0x43;
  Hou=0x17;
  v_W1302(0x80,Sec);
  v_W1302(0x82,Min);
  v_W1302(0x84,Hou);
  v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/
}
/********************************************************************
*
* 名称: main
* 说明:
* 功能: 设置时间初始值,读取DS1302时间通过数码管显示
* 调用:  v_Set1302(),uc_R1302(),data_buff(),dis_play()
* 输入:
* 返回值: 无
***********************************************************************/
void main(void)
{
TIME_CE=0;
//v_Set1302();/*设置时间初始值*/
//v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/
  while(1)
    {
      Sec= uc_R1302(0x81);/* 秒 */

          Min= uc_R1302(0x83);/* 分 */

      Hou= uc_R1302(0x85);/* 时 */

          data_buff();
      dis_play();
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:712097 发表于 2023-12-5 16:05 | 只看该作者
所以,具体是什么问题?
回复

使用道具 举报

板凳
ID:227818 发表于 2023-12-5 16:06 | 只看该作者
你最好说明有什么问题,大家才好入手,不然大家看的一头雾水。
回复

使用道具 举报

地板
ID:94031 发表于 2023-12-5 18:57 | 只看该作者
关于Keil开发C51单片机的头文件“REGX52.H“问题。https://blog.csdn.net/XIAO_LUGG/article/details/129973769
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表