找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机之简易数字时钟

[复制链接]
跳转到指定楼层
楼主
ID:117061 发表于 2016-4-27 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/***************************************************/
#include<reg51.h>     //包含单片机寄存器的头文件
#include<intrins.h>   //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint  unsigned int
uchar temp,count=0;
/***********************************************************************
以下是DS1302芯片的操作程序
************************************************************************/
uchar code digit[10]={"0123456789"};   //定义字符数组显示数字
uchar *digit1[]={"SUN","MON","TUS","WEN","THU","FRI","SAT"}; //周日,周一到周六
sbit DATA=P3^7;   //位定义1302芯片的接口,数据输出端定义在P1.1引脚
sbit RST=P3^5;    //位定义1302芯片的接口,复位端口定义在P1.1引脚
sbit SCLK=P3^6;   //位定义1302芯片的接口,时钟输出端口定义在P1.1引脚
sbit key1=P3^0;          //停止按钮
sbit key2=P3^1;          //开始按钮
sbit add=P2^4;          //加值
sbit subtract=P2^5;//减值
sbit tiaoshi=P3^4; //定位
/*****************************************************
函数功能:延时若干微秒
入口参数:n
***************************************************/
void delaynus(uchar n)
{
uchar i;
for(i=0;i<n;i++)
      ;
}

/*****************************************************
函数功能:向1302写一个字节数据
入口参数:x
***************************************************/
void Write1302(uchar dat)
{
  uchar 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位,准备写入下一个数据位
          }
       
}
/*****************************************************
函数功能:根据命令字,向1302写一个字节数据
入口参数:Cmd,储存命令字;dat,储存待写的数据
***************************************************/
void WriteSet1302(uchar Cmd,uchar dat)
{
    RST=0;           //禁止数据传递
    SCLK=0;          //确保写数居前SCLK被拉低
        RST=1;           //启动数据传输
        delaynus(2);     //稍微等待,使硬件做好准备
        Write1302(Cmd);  //写入命令字
        Write1302(dat);  //写数据
        SCLK=1;          //将时钟电平置于已知状态
        RST=0;           //禁止数据传递
}
/*****************************************************
函数功能:从1302读一个字节数据
入口参数:x
***************************************************/
uchar Read1302(void)
{
           uchar 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;        //将读出的数据返回
}  ....................................

LCD数字时钟.zip

79.77 KB, 下载次数: 10, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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