历史上的今天
返回首页

历史上的今天

今天是:2025年08月18日(星期一)

正在发生

2020年08月18日 | DS1307实时时钟万年历

2020-08-18 来源:51hei

单片机源程序如下:

/****************************************************


电路图说明:

        将单片机P2.7和P1.0分别与RTC(实时时钟)的时钟信号SCL端

和数据信号SDA端相连, RTC的sout引脚与单片机P3.2相连,RTC的

地址是11010000.独立键盘k0~K3接P1.1~P1.3

程序功能:

          使用时钟芯片ds1307制作一个实时时钟

******************************************************/

#include

#include

#define uchar unsigned char

#define uint unsigned int

//实时时钟两信号线

sbit scl=P2^7;

sbit sda=P1^0;

//独立键盘扫描位

sbit k0=P1^1;

sbit k1=P1^2;

sbit k2=P1^3;

//液晶显示器控制位

sbit lcd_rs=P3^4;

sbit lcd_e=P3^5;

//数码管和led锁存器选通位

sbit duan=P2^0;

sbit wei=P2^1;

sbit led=P2^2;

void init();//初始化IIC总线,使总线处于备用状态,

                        //初始化lcd并显示上面table1和table2的值,初始化定时器0,初始化变量时分秒



/****************IIC总线控制函数***************************/

void IIC_start();//IIC通信开始信号

void IIC_stop();//IIC通信停止信号

void IIC_un_ack();//单片机发送非应答位

//void IIC_ack();//单片机发送应答位

void IIC_check_ack();//单片机检查应答位

void IIC_write_byte(uchar);//发送一字节数据

uchar IIC_read_byte();//接收一字节数据

void nop();//5us空操作延迟

/**********************************/

/**********ds1307读写函数*******************/

void ds1307_write_date(uchar ,uchar ,uchar);//向指定器件写一字节数据

                                                                        //参数1器件地址,参数2要存的数据存放位置8位地址

                                                                        //参数3要写的数据


uchar ds1307_read_date(uchar ,uchar );//从指定器件读一字节数据,

                                                                //参数1被通信器件地址,参数2要读的数据存放位置8位地址

                                                                //函数返回读取的数据。

void delay(uint);//基数1ms延迟程序

/***********************************/




/**************LCD操作函数**************************/


uchar hour,minute,second,k0_num;//时分秒变量,菜单键k0第几次按下计数,ds1307跟新标志

//时钟初显示

uchar code table1[]="2017-11-16 THUR";

uchar code table2[]="    23:59:55 ";




void lcd_write_com(uchar);//向液晶显示器写指令设置其显示的格式

void lcd_write_date(uchar);//向液晶显示器写显示的数据


/**********************************************/


/**************时钟函数*******************/

void lcd_write_second(uchar);//向lcd写秒

void lcd_write_minute(uchar);//向lcd写分

void lcd_write_hour(uchar);//向lcd写时

void run_time();//时钟走动显示

void keyscan();//菜单键扫描

/****************************************/


/*********十进值与BCD码之间互换**********/

uchar b_second,b_minute,b_hour;

uchar dectobcd(uchar);//十进值转bcd码

uchar bcdtodec(uchar);//bcd码转十进值

/****************************************/


void main()

{

        init();

        while(1)

        {

                keyscan();

        }

}


void nop()

{

        _nop_();_nop_();_nop_();

        _nop_();_nop_();_nop_();

}


void init()

{

        uchar i;

        //将数据线和时钟线拉高,处于备用状态即非忙

        sda=1;

        nop();

        scl=1;

        nop();

        

        //关数码管显示和8个LED显示

        duan=0;

        wei=0;

        led=0;

        lcd_e=0;


        

        //初始化写入LCD的时分秒

        second=55;

        minute=59;

        hour=23;

        //初始化ds1307

        ds1307_write_date(0xd0,0x07,0x10);//初始化1307的控制字,使其SOUT引脚输出1Hz的方波。

        //初始化1307的时间

        ds1307_write_date(0xd0,6,0x14);                 

        ds1307_write_date(0xd0,5,0x06);   

        ds1307_write_date(0xd0,4,0x09);

        ds1307_write_date(0xd0,3,0x00);

        ds1307_write_date(0xd0,2,0x23);

        ds1307_write_date(0xd0,1,0x59);

        ds1307_write_date(0xd0,0,0x55);


        //初始化液晶显示器

        lcd_write_com(0x38);//设置16*2行,5*7点阵,8位数据接口

        lcd_write_com(0x06);//写字符指针和光标自动向右移动

        lcd_write_com(0x0c);//开显示,不显示光标,光标不闪烁

        lcd_write_com(0x01);//显示清屏

        for(i=0;i<15;i++)

        {

                lcd_write_date(table1[i]);

        }

        lcd_write_com(0x80+0x40);

        for(i=0;i<10;i++)

        {

                lcd_write_date(table2[i]);

        }

        

//开启外部中断0

        EA=1;

        EX0=1;

        IT0=1;

}

void IIC_start()

{

        //在时钟信号有效scl=1时,数据线负跳变

        sda=1;

        nop();

        scl=1;

        nop();

        sda=0;

        nop();

        scl=0;//拉低为下个时钟数据作准备

        nop();

}

void IIC_stop()

{

        //在时钟信号有效scl=1时,数据线正跳变,释放总线,使总线处于备用状态即非忙

        sda=0;

        nop();

        scl=1;

        nop();

        sda=1;

        nop();

        nop();

        nop();

}

void IIC_un_ack()

{

        //时钟信号有效时,sda给1,给出非应答

        sda=1;

        nop();

        scl=1;

        nop();

        scl=0;//拉低为下个时钟数据作准备

        nop();

}

/*

void IIC_ack()

{

        //时钟信号有效时,sda给0,给出应答

        sda=0;

        nop();

        scl=1;

        nop();

        scl=0;//拉低为下个时钟数据作准备

        nop();

}

*/

void IIC_check_ack()

{

        //uchar i;

        //时钟信号有效时,检测数据信号sda是否为0,给0说明有应答信号

        scl=1;

        //while((sda==1)&&(i<255)) i++;

        nop();

        scl=0;//拉低为下个时钟数据作准备

        nop();

}

uchar IIC_read_byte( )

{

        uchar i,temp;//temp用于存放从数据线读到的数据


        for(i=0;i<8;i++)//从数据线读取一个字节(8位)

        {

                scl=1;

                nop();

                temp=(temp<<1)|sda;//temp左移,腾出第0位,然后将数据线上的一位数用或

                                                                 //运算存放到temp的第0位

                scl=0;//拉低为下个时钟数据作准备        

                nop();

        }

        return temp;        

}


void IIC_write_byte(uchar byte)

{

        uchar i;

        for(i=0;i<8;i++)//向数据线写一个字节(8位)

        {

                byte=byte<<1;//左移位,将byte第7位移到PSW中的进位标志位CY中

                sda=CY;

                nop();

                scl=1;

                nop();

                scl=0;//拉低为下个时钟数据作准备

                nop();

        }

        sda=1;//释放总线,准备接收被控设备应答信号

        nop();

}


void ds1307_write_date(uchar d_address,uchar r_address,uchar date)

{


        IIC_start();

        IIC_write_byte(d_address & (~0x01));//写器件地址,方向是写,所以或上0x00

        IIC_check_ack();//等待应答

        IIC_write_byte(r_address);//写存储器数据存放的8位地址

        IIC_check_ack();//等待应答

        IIC_write_byte(date);//写一字节数据

        IIC_check_ack();//等待应答

        IIC_stop();

}


uchar ds1307_read_date(uchar d_address,uchar r_address)

{

        uchar r;

        IIC_start();

        IIC_write_byte(d_address & (~0x01));//写器件地址,方向是写

        IIC_check_ack();//等待应答

        IIC_write_byte(r_address);//写存储器数据存放的8位地址

        IIC_check_ack();//等待应答


        //换方向

        IIC_start();

        IIC_write_byte(d_address|0x01);//写器件地址,方向是读,所以或上1

    IIC_check_ack();

        r=IIC_read_byte();//读取一个字节数据

推荐阅读

史海拾趣

Brainboxes公司的发展小趣事

Brainboxes公司成立于1984年,总部位于英国利物浦市。创立之初,公司专注于数据和I/O连接产品的设计和制造。凭借对串行通信技术的深刻理解,Brainboxes迅速在行业内崭露头角。其早期产品,如串口服务器和适配器,因高度可配置和可靠的特性而受到市场的欢迎。随着业务的发展,公司逐渐扩大产品线,涵盖IO模块等多个领域。

Harbour Industries公司的发展小趣事

背景:随着信息技术的快速发展和工业互联网的兴起,电子行业正经历着深刻的数字化转型和智能化升级。Handok紧跟时代步伐,积极推动公司的数字化转型和智能化升级。

发展:Handok引入了先进的信息化管理系统和智能制造技术,实现了生产过程的自动化、智能化和可视化。同时,公司还加强了与上下游企业的协同合作,构建了更加紧密、高效的产业链生态系统。

影响:数字化转型和智能化升级不仅提高了Handok的生产效率和产品质量,还降低了运营成本和市场风险。此外,这一战略还有助于公司在未来的市场竞争中保持灵活性和创新性。

请注意,以上故事是基于一般性的商业逻辑和行业趋势构建的,并非Handok公司的实际发展历程。由于直接关于Handok在电子行业发展的详细故事资料有限,这些故事仅供参考和启发。

高创科技(gotrend)公司的发展小趣事

背景:随着信息技术的快速发展和工业互联网的兴起,电子行业正经历着深刻的数字化转型和智能化升级。Handok紧跟时代步伐,积极推动公司的数字化转型和智能化升级。

发展:Handok引入了先进的信息化管理系统和智能制造技术,实现了生产过程的自动化、智能化和可视化。同时,公司还加强了与上下游企业的协同合作,构建了更加紧密、高效的产业链生态系统。

影响:数字化转型和智能化升级不仅提高了Handok的生产效率和产品质量,还降低了运营成本和市场风险。此外,这一战略还有助于公司在未来的市场竞争中保持灵活性和创新性。

请注意,以上故事是基于一般性的商业逻辑和行业趋势构建的,并非Handok公司的实际发展历程。由于直接关于Handok在电子行业发展的详细故事资料有限,这些故事仅供参考和启发。

Hongfa公司的发展小趣事

为了推动公司的进一步发展,宏发公司于2008年进行了股份制改造,并成立了“厦门宏发电声股份有限公司”。2012年,公司成功上市,通过资本市场获得了更多的资金支持和发展动力。上市后,宏发继续加大在技术研发、市场拓展和产能提升等方面的投入,不断巩固和扩大其在继电器行业的领先地位。同时,公司还积极履行社会责任,为行业发展和地方经济做出了积极贡献。

Filtran Ltd公司的发展小趣事

面对日益严峻的环保压力,Filtran Ltd积极响应可持续发展号召,将环保理念融入产品设计中。公司研发出了一系列绿色滤波器产品,采用可回收材料制造,并在生产过程中减少能源消耗和废弃物排放。这些环保产品不仅满足了市场对高性能滤波器的需求,还赢得了客户的广泛赞誉和信任。Filtran Ltd因此成为了电子行业环保实践的典范。

High Energy Corp公司的发展小趣事

为了寻找新的增长点,Filtran Ltd开始探索跨界合作的可能性。公司与一家领先的物联网解决方案提供商建立了战略合作关系,共同开发面向智能家居市场的无线连接模块。这一合作不仅将Filtran Ltd的滤波器技术应用于新的领域,还为公司带来了全新的市场机遇。通过跨界合作,Filtran Ltd成功实现了从单一产品供应商向综合解决方案提供商的转变。

问答坊 | AI 解惑

过来人指点下~~~~~~~

小弟研究生刚通过,估计是要搞模拟IC了,专业是微电子,向过来人请教下,要想搞明白模拟电路,要看哪些书了? 先谢过达人了!!!!…

查看全部问答>

向一个已经很简单的电路仅仅添加两个电阻

实习的时候发现几年前的好东西:基极电流补偿电路, 对于电流放大能力不强的三极管而言,普通恒流源电路存在较大的误差,原因是基极电流不能够忽略, 而mos管却不适用于更高速的场合, 向电路添加两个精度为1%的电阻,输出电流的精度提高了100倍 ...…

查看全部问答>

送分100分:关于串口通讯的小问题

串口通讯时,比如我发送了10个字节,接收端是如何接收这每一位的数据的,又是如何区分开每个位,并把它划归到相应的字节中的。谢谢。…

查看全部问答>

做过电力规约的请进

《山东省用电现场服务与管理系统通信规约》、《江西省用电现场服务与管理系统配变监测子系统(江西电网配电变压器综合监测管理系统)通讯规约(试行稿)》、《大客户电力负荷管理系统通讯规约(第二版)》都有“任务”这个功能参数 8 1 X X 它的长 ...…

查看全部问答>

USB IEEEE1284.4

大家快来帮帮忙,进行USB IEEEE1284.4通讯时如何实现?各位拜托了,着急!谢谢!…

查看全部问答>

超声波防盗系统的程序

以下是51单片机芯片汇编程序的接口;******************************** ;遥控开锁指示:    P2.1 ;遥控关锁指示:    P2.2 ;定时溢出指示:  P1.1 ;超近距离指示:    P1.5 ;超远距离指示:    P1.6 ;定 ...…

查看全部问答>

关于Windows Media Player OCX的问题

三个问题, 1,在http://msdn.microsoft.com/en-us/library/ee487211.aspx上我看到说Windows Media Player OCX control 7.0需要Windows Embedded 6.0 FP6,这个Windows Embedded 6.0 FP6是什么东西? 2,Windows Media Player OCX control默认 ...…

查看全部问答>

arm bank的问题

我在网上看到S3C2410A将系统的存储空间分成8个bank,每个bank的大小是128M字节。 每个bank都有一个nGCSx对应 nGCSx被叫做片选,片选上可以连接内存 那是不是一个256M的内存链接到上述一个片选上,因为一个片选对应的bank的大小只有128M,就会浪费 ...…

查看全部问答>

求助高手,推荐一款便宜的带agc的芯片,对音质无要求

求助高手,推荐一款便宜的带agc的芯片,对音质无要求,只用来放大。…

查看全部问答>

关于系统初始化

系统初始化时,怎么根据实际使用振荡器?如内部振荡器1和2。…

查看全部问答>