文档库 最新最全的文档下载
当前位置:文档库 › DS1302数码管显示程序

DS1302数码管显示程序

/************************************************************************/ // huaqinMCU DS1302 实验程序数码管显示时钟设置说明

// "8键"为时钟设置、时分切换、保存"0键"为加"4键"为减

/************************************************************************/ #include

#define uchar unsigned char

#define uint unsigned int

//===以下IO定义请根据您硬件的连接修改===

sbit T_RST=P3^5;//ds1302-5

sbit T_IO=P3^4;//ds1302-6

sbit T_CLK=P3^6;//ds1302-7

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;//累加器A 51单片机原理中有介绍

sbit up=P3^1;

sbit down=P3^2;

sbit set=P3^0;

uchar a,b,clock_ss,clock_sg,clock_fs,clock_fg,clock_ms,clock_mg;

int hour,mie,sei;

uchar clk_time[3]; //秒,分,时寄存器初始值

code uchar ledmap[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x40};

//数码管段码

/******************DS1302:写入操作(上升沿)*********************/

void write_byte(uchar da)

{

uchar i;

ACC=da;

for(i=8;i>0;i--)

{

T_IO=ACC0;

T_CLK=0;

T_CLK=1;

ACC=ACC>>1;

}

}

/******************DS1302:读取操作(下降沿)*****************/

uchar read_byte(void)

{

uchar i;

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

{

ACC=ACC>>1;

T_CLK = 1;

T_CLK = 0;

ACC7 = T_IO;

}

return(ACC);

}

/******************DS1302:写入数据(先送地址,再写数据)***************************/ void write_1302(uchar addr,uchar da)

{

T_RST=0; //停止工作

T_CLK=0;

T_RST=1; //重新工作

write_byte(addr); //写入地址

write_byte(da);

T_RST=0;

T_CLK=1;

}

/******************DS1302:读取数据(先送地址,再读数据)**************************/ uchar read_1302(uchar addr)

{

uchar temp;

T_RST=0; //停止工作

T_CLK=0;

T_RST=1; //重新工作

write_byte(addr); //写入地址

temp=read_byte();

T_RST=0;

T_CLK=1; //停止工作

return(temp);

}

/***********************延时程序=a*1ms**************************************/

void delay(uchar a)

{

uchar i;

while(a-- !=0)

{ // led_disp();

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

}

}

/***********************显示程序**********************************************/

/* DS1302秒,分,时寄存器是BCD码形式:用16求商和余进行"高4位"和"低4位"分离*/ /****************************************************************************/

void led_disp()

{ uchar cant1,cant2;

if(b==0)

{

cant1=0;cant2=0;

clock_ms=clk_time[0]/ 16; clock_mg=clk_time[0]%16;

clock_fs=clk_time[1]/ 16; clock_fg=clk_time[1]%16;

mie=clock_fs*10+ clock_fg;

clock_ss=clk_time[2]/ 16; clock_sg=clk_time[2]%16;//BCD*to*10

hour=clock_ss*10+ clock_sg; //用16求商和余进行"高4位"和"低4位"分离}

if(b==1)

{

cant1++;

cant2=0;

clock_ss=hour/ 10; clock_sg=hour%10;

clock_fs=mie/ 10; clock_fg=mie%10;

clock_ms=sei/10; clock_mg=sei%10;

}

if(b==2)

{ cant1=0;

cant2++;

clock_ss=hour/ 10; clock_sg=hour%10;

clock_fs=mie/ 10; clock_fg=mie%10;

clock_ms=sei/10; clock_mg=sei%10;

}

if(cant1<=3)

{

P2=0;

P0=ledmap[clock_ss];

delay(1);

P0=0X00;

P2=1;

P0=ledmap[clock_sg];//时个位

delay(1);P0=0X00;}

if(cant1==5)

cant1=0;

P2=2;

P0=ledmap[10];//显示"-"数组里的0x40

delay(1);

P0=0X00;

if(cant2<=3)

{

P2=3;

P0=ledmap[clock_fs];//分十位

delay(1);

P0=0X00;

P2=4;

P0=ledmap[clock_fg];//时个位

delay(1);P0=0X00;

}

if(cant2==5)

cant2=0;

P2=5;

P0=ledmap[10];//显示"-"数组里的0x40

delay(1);

P0=0X00;

P2=6;

P0=ledmap[clock_ms];//秒十位

delay(1);

P0=0X00;

P2=7;

P0=ledmap[clock_mg];

delay(1);P0=0X00;

}

/***********************按键延时程序=a*1ms**************************************/ void delayAJ(uchar a)

{

uchar i;

while(a--)

{

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

{

led_disp();

}

}

}

void key()

{

uchar clock_s1, clock_s2, clock_f1, clock_f2;

delayAJ(5);

if(set==0)

{

delayAJ(5);//消抖

if(set==0)

{

b++;

delayAJ(5);

}

while(!set)

{

delayAJ(5);

}

}

if(b!=0)//时分设定

{

if(up==0)

{

delayAJ(5);//消抖

if(up==0)

{

if(b==1)

{

hour++;

if(hour>=24)

{

hour=0;

}

delayAJ(10);

}

if(b==2)

{

mie++;

if(mie>=60)

{

mie=0;

}

delayAJ(10);

}//以上时钟+设定

}

}

if(down==0)

{

delayAJ(5);//消抖

if(down==0)

{

delayAJ(5);

if(b==1)

{

hour--;

if(hour<0)

{

hour=23;

}

delayAJ(10);

}

if(b==2)

{

mie--;

if(mie<0)

{

mie=59;

}

delayAJ(10);

}//以上时钟-设定

}

}

//********************以下是转BCD码的程序DS1302认BCD码

clock_s1=hour/10;

clock_s2=hour%10;

clock_s1=clock_s1&0xff;

clock_s2=clock_s2&0xff;

clock_s1<<=4;

clock_s1=clock_s1|clock_s2;// 10to16

clock_f1=mie/10;

clock_f2=mie%10;

clock_f1=clock_f1&0xff; //全1出1 与运算

clock_f2=clock_f2&0xff;

clock_f1<<=4;

clock_f1=clock_f1|clock_f2;// 10to16

//*******************************************转BCD码的程序DS1302认BCD码}

if(b==3)

{

b=0;

write_1302(0x8e,0x00); //WP=0 写操作

write_1302(0x80,0x01);//0x80是写秒数据此处写进"01"秒

write_1302(0x82,clock_f1);//0x82是写分数据

write_1302(0x84,clock_s1);//0x84是写时数据

write_1302(0x8e,0x80); //WP=1 写保护

delay(255);

}

}

/************************主程序**********************************************/ void main(void)

{

uchar temp=0x80;

uchar i;

b=0;

P3=0xff;

while(1)

{

temp=0x81;//读的初始地址

for(i=0;i<3;i++)//分别把秒分时数据读出分3次读好一次地址加2" temp+=2;"

{

clk_time[i]=read_1302(temp);

temp+=2;

}

key();//键盘扫描

}

}

DS1302时钟芯片与液晶1602的程序

DS1302测试程序 晶振:11.0592MHZ /*********************************包含头文件********************************/ #include "reg51.h" #include /*********************************端口定义**********************************/ sbit DS1302_CLK = P1^0; sbit DS1302_IO = P1^1; sbit DS1302_RST = P1^2; /******************************定义全局变量*********************************/ unsigned char second,minute,hour,week,day,month,year; //秒、分、时、星期、日、月、年 unsigned char time[]={0x06,0x03,0x14,0x03,0x12,0x30,0x00}; //初始时间数组 /**************************************************************************** 函数功能:数码管扫描延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay1(void) { int k; for(k=0;k<400;k++); } /***************************************************************************** 函数功能:向DS1302送一字节数据子程序 入口参数: 出口参数: *****************************************************************************/ void InputByte(unsigned char byte1) { char i; for(i=8;i>0;i--) { DS1302_IO=(bit)(byte1&0x01); DS1302_CLK=1; _nop_(); DS1302_CLK=0;

基于DS1302的电子时钟设计

基于DS1302的电子时钟设计

2012~ 2013 学年第二学期 《单片机》 课程设计报告题目:基于DS1302的电子时钟设计专业:电气工程系自动化 班级: 10自动化(2)班 姓名:费孝斌洪建勇刘云飞 桑乐陆欢欢魏笑 指导教师:林开司 电气工程系 2013年5月12日

任务书

摘要 电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。 本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。 本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。本设计应用AT89C52芯片作为核心,6位LED数码管显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。 该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。 关键词:电子时钟;多功能;AT89C52;时钟日历芯片

目录 摘要 一、引言 (4) 二、基于单片机的电子时钟硬件选择分析 (5) 2.1主要IC芯片选择 (5) 2.1.1微处理器选择 (5) 2.1.2 DS1302简介 (6) 2.1.3 DS1302引脚说明 (7) 2.2电子时钟硬件电路设计 (8) 2.2.1时钟电路设计 (9) 2.2.2整点报时功能 (10) 三、protel软件画原理图 (11) 3.1系统工作流程图 (12) 3.2原理图 (13) 四、proteus软件仿真及调试 (14) 4.1电路板的仿真 (15) 4.2软件调试 (16) 五、源程序 (17) 六、参考文献 (18)

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)2009-10-19 16:47 经过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。目前还不能修改时间与日期,只是以预定时间以始。 适用于开发板:51单片机(AT89S52)+带字库液晶12864(ST7920)+DS1302(实时时钟) 实现功能:简单,数字时钟+日期(以后会不断完美)。 C语言源程序如下: #include #include #define uchar unsigned char #define uint unsigned int /*DS1302 端口设置 */ sbit SCK=P3^6; //DS1302时钟 sbit SDA=P3^4; //DS1302 IO sbit RST = P3^5; // DS1302复位 bit ReadRTC_Flag; //读DS1302全局变量 /* 12864端口定义*/ #define LCD_data P0 //带字库液晶12864数据口 sbit LCD_RS = P2^4; //寄存器选择输入 sbit LCD_RW = P2^5; //液晶读/写控制 sbit LCD_EN = P2^6; //液晶使能控制 sbit PSB=P2^1; //并口控制 sbit RES=P2^3; uchar code dis1[] = {" 电子设计天地"}; //液晶显示的汉字 uchar code dis2[] = {"有志者,事竟成!"}; uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'}; unsigned char temp; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void lcd_pos(uchar X,uchar Y); //确定显示位置 unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分时日月周年 09-10-19 16:07:00 code unsigned char

数码管万年历ds1302

/ZPF(新)//2012//4/29 #include #include #define uint unsigned int #define uchar unsigned char uchar k,s,aa,Nshi,Nfen;//,miao,nian,yue,ri,zhou; uchar number[8]; uchar dif_flag; //测温度定义 uint temp; float f_temp; //温度值variable of temperature bit flag; sbit w1=P1^2; sbit w2=P1^3; sbit w3=P1^4; sbit w4=P1^5; sbit DQ=P1^7; sbit dula=P1^0; sbit wela=P1^1; sbit DS1302_CLK = P3^7; //实时时钟时钟线引脚 sbit DS1302_IO = P3^6; //实时时钟数据线引脚 sbit DS1302_RST = P3^5; //实时时钟复位线引脚 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; sbit key=P1^6; sbit key1=P3^0; sbit key2=P3^1; sbit key3=P3^2; sbit key4=P3^3; sbit key5=P3^4; uchar read[7]; uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00 };//共阴数码管0-9 uchar week_value[2]; //void dis_delay(void); void delay(uint x); void display(unsigned char a,unsigned char b,unsigned char c); void show_time(); //显示程序 void Write1302(unsigned char ucAddr, unsigned char ucDa); void keyscan();

DS1302数字钟实验

实验十四、DS1302数字钟实验 (一)、实验目的: DS1302 是美国DALLAS 公司推出的一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能, 工作电压为2.5V~5.5V。采用三线接口与CPU 进行同步通信,并可采用突发方式 一次传送多个字节的时钟信号或RAM数据。 将DS1302与单片机连接可以方便的取得时间信息,与全软件的数字时钟相比,编程简单、易于调整、使用方便。该实验的目的就是使使用者通过实验例程的学习,掌握单片机控制系统的实时时钟/日历电路的使用方法,由于DS1302与单片机连接 时采用SPI接口,故该实验可以使使用者了解和学习SPI的通讯协议和编程方法。(二)、实验接线和步骤: 1、在DS1302芯片附近,将“P33”、I/O”跳线短接,将“P23”、“SCK”跳线短接, 即完成DS1302和单片机的接口连接。 2、将液晶屏12864接到串行接口,将U13(上面的8位拨码开关)的“6”、“7”、“8” 三位拨到“ON”位置。这三位是控制和串行数据接口。 3、短路块短接实验板左侧7289模块的四路跳线“CS1、CLK1、DIO1、INT1”(“KEY” 插座附近),然后将7289模块和实验板“KEY”插座相连接。 4、上电下载程序。 5、7289键盘数码管模块对应调时间的按键如下: “1”键调“年”;“2”键调“月”;“3”键调“日”;“A”键调“周”; “7”键调“时”;“8”键调“分”;“9”键调“秒”; 所有按键的调节都是单方向增加模式,关于双方向增减模式的调节可以自行修改程序完成。 7289模块数码管上显示的是7289模块按键的键值(不是时间的设置值,时间的设置变化值显示在12864液晶屏上)。 说明一:如果程序下载后运行液晶出现乱码现象,可以按单片机重启按钮重启单片机,还是不行则需要重新启动实验板电源。 说明二:因程序例程篇幅过长,不方便以书面形式列出,为方便使用者,例程的原代码及工程文件所有文档均已附在电子文档“简单端口实验”文件夹中。使用者可在例程程 序的基础上改变某些参数以观察不同的实验效果。

ds1302时钟数码管显示时分秒

ds1302时钟数码管显示时分秒

单片机原理课程设计 课题名称:基于DS1302的数码管显示数字钟 专业班级:电子信息工程 学生学号:0414070126

学生姓名:张向阳 指导教师:张云马崇霄 设计时间:2010年6月21日--2010年6月25日 目录 摘要 ................................................................................... 1 设计任务和要求 ........................................................... 2 方案论证 ....................................................................... 3 系统硬件设计 ............................................................... 3.1................................................................. 系统总原理图 3.2元器件清单...................................................................................... ................................................ 3.3 PCB板图...................................................................................... .................................................

基于单片机及时钟芯片DS1302的电子时钟设计

基于单片机及时钟芯片DS1302的电子时钟设计 一、概述 二、电子时钟的基本原理 电子时钟是一种以单片机为核心的智能电子产品,采用数字电路来显示时间。电子时钟的核心部件是一个定时器,通过周期性的计数来确定时间,然后再将计数器的结果通过数码管等显示装置进行显示。除此之外,电子时钟还需要一个能够准确计时的时钟芯片,如本文所使用的时钟芯片DS1302。 三、电子时钟的设计方法 本文设计的电子时钟采用AT89C52单片机和时钟芯片DS1302,并通过外围的驱动电路和数码管来实现时间的显示。该电子时钟具有以下特点: 1.可进行24小时制和12小时制的切换:电子时钟可以通过按键实现24小时制和12小时制的切换,可按需选择。 2.自动夏令时判断:电子时钟可自动识别夏令时,并根据设定值进行切换,方便易用。 3.温度显示:电子时钟的DS1302时钟芯片自带温度探测器,可实现温度的实时显示。 本文所设计的电子时钟的硬件设计方案如下: 1.主控芯片:采用AT89C52单片机 2.显示装置:采用数码管进行时分秒的显示,共4位数码管。 3.时钟芯片:采用DS1302时钟芯片,保证时间的准确性。 5.电源:采用开关电源或锂电池供电。锂电池供电时,电子时钟可实现断电后不重置的功能。 1.初始化:在电子时钟启动时,需要对各个模块进行初始化,如DS1302时钟芯片的读写口、数码管和按键都需要进行初始化。 2.频率切换:按下切换按键后,电子时钟的频率从24小时制切换到12小时制。 3.设定夏令时:按下设定按键后,可以进行夏令时设定。设定值以秒为单位存储,在夏季过渡期改变时,只需修改设定值即可。

5.时间的显示:通过程序将DS1302时钟芯片中的时间读出并在数码管上显示,实现实时显示的功能。 五、总结 本文设计的基于单片机及时钟芯片DS1302的电子时钟,可通过按键实现24小时制和12小时制的切换、自动夏令时判断、温度显示等多种功能,实现了电子时钟的多种要求和需求。该设计方案具有简单实用、成本低廉、易于维护等优点,可广泛应用于各个领域。

利用单片机及DS1302制作电子时钟_实习报告 精品

单片机原理及应用——基于Proteus和Keil C 实习报告 课程名:利用单片机及DS1302制作电子时钟

摘要 为了进一步熟悉51单片机的编程以及学习电子时钟的相关设计方法,在老师的指导下我们进行了本次电子时钟的设计。 我们在实习期间基于51单片机——AT89C51和时钟芯片DS1302设计并实 现了电子时钟显示。在PCB板制作完成并且调试成功之际,为了进一步提高自己的动手能力和编程能力,对这次电子时钟的设计和制作的过程中遇到的问题及设计思路做一次总结。 本电子时钟是一种利用时钟芯片DS1302及51单片机来显示时、分、秒和年、月的装置。默认显示为时间,由四个按键分别控制定时设置、时间调整、分钟调整、日期显示;设计电路工作电源为5V;由4位LED数码管显示时间,格式为时时分分,中间点每隔1S亮暗;有备用电池,掉电后再上电能正常显示时间。 电子时钟大体可以分为三大模块,数码管的显示模块、DS1302时钟芯片与单片机的时钟模块和按键与单片机的模块。 单片机在5V电压下,各个模块正常工作。单片机从DS1302芯片中读出一组时间日期数据,同时单片机通过按键设置当前要求显示的信息给单片机。单片机接收到各个数据时,把各个数据显示出来。

目录 一、总体设计 (4) 1.1 设计目的 (4) 1.2 硬件功能描述 (4) 1.3 设计方案选择 (4) 1.4 设计任务及要求 (4) 二、电子时钟软件和硬件设计 (5) 2.1 硬件电路设计 (5) 2.1.1 工作原理 (5) 2.1.2 单元模块电路 (5) 2.1.3 元器件清单 (6) 2.2 软件设计 (7) 2.2.1 程序设计流程 (7) 三、电路调试 (7) 四、心得体会 (8) 五、参考文献 (9) 附录Ⅰ: (10) 附录Ⅱ:程序清单 (11) 附录Ⅲ: (19)

DS1302时钟 数码管显示

DS1302时钟芯片,大家都知道是什么来的。。。不懂的百度下就知道了。。。 这个只是读取出时间,其它功能没有写出来,用了四位共阳数码管显示。 具体电路和仿真可以到中国电子DIY之家论坛搜索 /********************************** * DS1302简单时间显示* * 数码管显示* ***********************************/ #include #define uchar unsigned char #define uint unsigned int #define W P2 //位选 #define D P0 //段选 sbit IO=P1^0; //数据口 sbit SCLK=P1^1; //控制数据时钟 sbit RST=P1^2; //使能端、复位端 /************按键引脚定义***********/ sbit s1=P1^5; //按键加 sbit s2=P1^6; //按键减 sbit s3=P1^7; //按键选择 char knum=0,snum,fnum; /***********写时分秒地址************/ #define write_shi 0x84 #define write_fen 0x82 #define write_miao 0x80 /***********读时分秒地址************/ #define read_shi 0x85 #define read_fen 0x83 #define read_miao 0x81 char shi,fen,miao; //读出数据存储变量 uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //不带小数点 uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点 void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms. { //delay(500);大约延时500ms. uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } uchar read_1302(uchar add) //读函数 { uchar i,date;

DS1302程序设计实例

时钟芯片DS1302汇编程序 interval equ 5000;Timer0 定时常数Flag05s bit 00h ;0.5秒标志 T_RST Bit P1.2;实时时钟复位线引脚T_CLK Bit P1.1;实时时钟时钟线引脚T_IO Bit P1.0 ;实时时钟数据线引脚;DS1302内部参数,0.5秒读一次SECOND EQU 30H MINUTE EQU 31H HOUR EQU 32H DAY EQU 33H MONTH EQU 34H WEEK EQU 35H YEAR EQU 36H DspBuf EQU 40H ;显示缓冲区SeleDIG equ 44h ;位扫描 Ti5ms EQU 45H ;系统时钟每4ms加"1" Ti05S EQU 46H P2BUF EQU 47H ;输出口内部寄存器STATE EQU 48H StTmr equ 49h ORG 0000H AJMP START ORG 0BH AJMP ITimer0 ORG 80H SEGCODE: ;db 01h,02h,04h,08,10h,20h,40h, 80h DB 3FH,06H,5BH,4FH,66H ;段码表 DB 6DH,7DH,07H,7FH,6FH DB 7BH,7CH,39H,5EH,79H,71H DB 00H ORG 100H START: MOV IE,#00H clr A MOV R0,#0FFH START1: MOV @R0,A DJNZ R0,START1 MOV SP,#0C0H ;修改堆栈 MOV TMOD,#11H MOV TH0,#HIGH(65536-interval) MOV TL0,#LOW(65536-interval) SETB TR0 MOV SECOND,#02H ;初始时间设为12:00:00 MOV MINUTE,#01H MOV HOUR,#20H MOV DAY,#30H ;初始日期设为08年1 月1日第一周 MOV MONTH,#10H MOV WEEK,#01H MOV YEAR,#09H LCALL SETDS1302 MOV SELEDIG,#00H MOV IE,#02H SETB EA mov r6,#51h mov r7,#0CDh call UpdateBuf LOOP: nop jnb Flag05s,loop01 clr Flag05s inc Ti05s LCALL GET1302 call ChgSt call display loop01: nop nop nop LJMP LOOP ;状态转换,;5秒转换一次,state=0, 显示“年”;1===“月日”;2===“时 分”;3===“分秒” ChgSt: mov a,Ti05s clr c subb a,StTmr cjne a,#10,$+3 jc ChgSt00 mov StTmr,Ti05s inc State ChgSt00: ret Display: mov a,State anl a,#03h cjne a,#00h,Display01 mov r6,#20h mov r7,year ajmp Display00 display01: cjne a,#01h,Display02 mov r6,month mov r7,day ajmp Display00 display02: cjne a,#02h,Display03 mov r6,hour mov r7,minute ajmp Display00 display03: cjne a,#03h,Display04 mov r6,minute mov r7,second Display00: call UpdateBuf ret display04:mov state,#0ffh ret ;更新显示缓冲区 ;将R6R7的内容显示在LED上,R6 为高8位,显示在左边两个LED ;R0,ACC,DPTR UpdateBuf: mov dptr,#segcode mov r0,#dspbuf mov a,r6 anl a,#0f0h swap a movc a,@a+dptr mov @r0,a inc r0 mov a,r6 anl a,#0fh movc a,@a+dptr mov @r0,a inc r0 mov a,r7 anl a,#0f0h swap a movc a,@a+dptr mov @r0,a inc r0

DS1302电子钟制作解读

引言 芯片简介 2.1 DS1302简介 DS1302[1]是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片, 它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达 2.5〜5.5V。时钟可工作在24小时格式或12小时(AM/PM )格式。DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31$的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 2.1.1DS1302引脚功能与内部结构 DS1302的引脚功能如表1所示,外形及内部结构如图1所示[2]: 表

图1 DS1302管脚图及内部结构图 2.1.2 DS1302的控制字 DS1302的控制字节如图2所示: 图2 DS1302 控制字节的含义 控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302 中。位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 2.1.3 DS1302的复位引脚

SCLK RST I/O nnnnnnnnnnnnnnt 通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供了终止单字节 或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302 进行操作。如果在传送过程中置RST为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc》2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST 置为高电平。 2.1.4 DS1302的数据输入输出 在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302 的数据, 读出数据时从低位0位至高位7,数据读写时序如图3所示: 图3数据读写时序 2.1.5 DS1302的寄存器 DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD 码形式。其日历、时间寄存器及其控制字见表2。 此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM 相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的内容。 DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H--FDH其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 DATA I/O BYTE1 DATA I/O BYTE2

基于单片机的DS1302时钟芯片液晶显示时钟汇编程序

;************由1602显示ds1302时钟********************* rs bit p1.2 rw bit p1.3 e bit p1.4 dio bit p2.6 clk bit p2.5 rst bit p2.7 miao equ 30h ;为秒,分,时,日,月,周,年,分配储存单元fen equ 31h shi equ 32h day equ 33h yue equ 34h zhou equ 35h nian equ 36h bcd equ 37h ;bcdh equ 38h ;bcdl equ 39h hex equ 40h org 0000h ljmp start org 0030h ;****初始化时间为:12:00:00,11年03月16日,周三*** start: ;mov sp,#60h mov shi,#15h ;初始化数据 mov fen,#59h mov miao,#55h mov day,#10h mov yue,#3h mov zhou,#3h mov nian,#12h ;lcall r_ram ;调用读1302数据的子程序 ;********************初始化lcd1602************************************* mov e,#0 mov p2,#0f0h ;关数码管 MOV P0,#01H ;清屏并光标复位 LCALL WR_CODE ;调用写入命令子程序 MOV P0,#02H ;光标回车 LCALL WR_CODE ;调用写入命令子程序 MOV P0,#038H ;5x7的点阵字符 LCALL WR_CODE ;调用写入命令子程序

基于DS1302的电子时钟设计报告

常熟理工学院 电气与自动化工程学院 《微机原理与接口技术》课程设计题目:基于DS1302的电子钟设计 *名:*** 学号:********* 班级:测控122班 指导教师:*** 起止日期:2015年7月

摘要 .......................................................................................................................... - 1 - 一、《微机原理与接口技术》课程设计任务书 .................................................. - 2 - 二、总体设计方案 (2) 2.1 设计框图..................................................................................................... - 2 - 2.2 模块说明..................................................................................................... - 3 - 2.2.1 DS1302模块 (3) 三、硬件电路设计 (4) 3.1 单片机最小系统......................................................................................... - 4 - 3.1.1 系统结构 (4) 3.1.2 系统特点............................................................................................................ - 5 - 3.2 时钟电路设计............................................................................................. - 5 - 3.3 数码管显示设计 (5) 3.4 键盘电路 (5) 四、软件设计 .......................................................................................................... - 6 - 4.1 主程序流程................................................................................................. - 6 - 4.2 时钟电路设计 (8) 五、程序调试与运行结果 ............................................................ 错误!未定义书签。 5.1 程序调试...........................................................................错误!未定义书签。 5.2 日历显示...........................................................................错误!未定义书签。 5.2.1 日历显示子程序 (9) 5.3 时间显示...........................................................................错误!未定义书签。 5.3.1 时间显示子程序 (10) 六、附录 (11) 七、心得与体会 (16) 八、参考文献 ........................................................................................................ - 17 -

DS1302数码管电子闹钟程序

/******************************************* **********/ 数码管+3个独立按键// // 精确定时// // /*****************************************************/ /****************************************************************/ // 利用ds1302精确定时,同时按键可调时间。// // 每操作一次时钟,都会有蜂鸣器响大约200ms,以提示操作。// /***************************************************************/ #include #include"ds1302.h" uchar code tab[]={ 0x3F,/*0*/ 0x06,/*1*/ 0x5B,/*2*/ 0x4F,/*3*/ 0x66,/*4*/ 0x6D,/*5*/ 0x7D,/*6*/

0x07,/*7*/ 0x7F,/*8*/ 0x6F,/*9*/ } ;//共阴码 char clock1[3]={0}; int i,j=0,flag1=0; void delay(uint xms) { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); } void init()//初始化 { //RST=0; //SCLK=0; //write_1302(0x80,0x00);//写控制字,允许写

DS1302设计的可调万年历(实测正常-附有程序)

DS1302设计的可调万年历(实测正常-附有程序)

DS1302设计的可调万年历 (本制作所用数码管全为共阳数码管)我刚开始想做万年历的时候是上网找别人的程序,可是发现找了很多都不理想,要不就没日历和时间一起显示,要不就不能调时间的,后来我研究了两天,自己终于把程序编了出来。好了,废话我就不多说,本制作我已经把实物做了出来,保证没问题!下面附有仿真图和实物图。

x81}; void write_ds1302_byte(uchar dat) { uchar i; for(i=0;i<8;i++) { sck=0; io=dat&0x01; dat=dat>>1; sck=1; } } void write_ds1302(uchar add,uchar dat) { rst=0;_nop_(); sck=0;_nop_(); rst=1;_nop_(); write_ds1302_byte(add); write_ds1302_byte(dat); rst=0;_nop_(); io=1;

sck=1; } uchar read_ds1302(uchar add) { uchar i,value; rst=0;_nop_(); sck=0;_nop_(); rst=1;_nop_(); write_ds1302_byte(add); for(i=0;i<8;i++) { value=value>>1; sck=0; if(io) value=value|0x80; sck=1; } rst=0;_nop_(); sck=0;_nop_(); sck=1; io=1;

51单片机ds1302DS18b20温度时钟(电路图C语言程序)

时钟电路图: PCB板: 单片机程序: /*=========================================================== ========= 调试要求:

1.MCU:AT89S52芯片或AT89C52 2.晶振:12MHz 功能:多功能时钟+温度计 ============================================================= =======*/ #include #include #define uchar unsigned char #define uint unsigned int sbit dis_bit1=P2^7;//定义数码管控制口 sbit dis_bit2=P2^6;//定义数码管控制口 sbit dis_bit3=P2^4;//定义数码管控制口 sbit dis_bit4=P2^3;//定义数码管控制口 sbit dis_bit5=P2^1;//定义数码管控制口 sbit dis_bit6=P2^0;//定义数码管控制口 sbit led1_bit=P2^2;//定时LED的控制口 sbit led2_bit=P2^5;//定时LED的控制口 sbit s1_bit=P1^0; //定义S1控制口 sbit s2_bit=P1^1; //定义S2控制口 sbit s3_bit=P1^2; //定义S3控制口 sbit dq_ds18b20=P3^3;//定义控制DS18B20 sbit speak=P3^7; //定义蜂鸣器控制口 sbit clk_ds1302=P3^6;//定义控制DS1302的时钟线 sbit io_ds1302=P3^5;//定义控制DS1302的串行数据 sbit rest_ds1302=P3^4; #define smg_data P0//定义数码管数据口 void delay_3us();//3US的延时程序 void delay_8us(uint t);//8US延时基准程序 void delay_50us(uint t);//延时50*T微妙函数的声明 void display1(uchar dis_data);//数码管1显示子程序 void display2(uchar dis_data);//数码管2显示子程序 void display3(uchar dis_data);//数码管3显示子程序 void display4(uchar dis_data);//数码管4显示子程序 void display5(uchar dis_data);//数码管5显示子程序 void display6(uchar dis_data);//数码管6显示子程序 void init_t0();//定时器0初始化函数 void dis_led();//LED处理函数 void judge_s1();//S1按键处理函数 void judge_s2();//S2按键处理函数 void judge_s3();//S3按键处理函数 void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1);//显示子程序 void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san);//闪烁显示子程序

基于51单片机的ds1302程序

#include #include #define uchar unsigned char #define uint unsigned int sbit SCK=P3^6; sbit SDA=P3^4; sbit RST=P3^5;// DS1302复位 sbit set=P3^0;//定义按键端口 sbit s1=P3^1; sbit s2=P3^2; sbit s3=P3^3; /************液晶口定义*******/ sbit RS=P2^4;//RS为数据/指令选择1/0 sbit RW=P2^5;//读写 sbit E=P2^6;//E为使能信号 bit flag;//是否读取时间的标志位 uchar setn=0;//复位键、增加键、减少键按下次数 uchar code time0[]="DATE: - - "; uchar code time1[]="TIME: : : "; uchar l_tmpdate[7]={0,55,16,22,8,6,9};//秒分时日月周年// 可随时更改uchar code write_add[7]={0x80,0x82,0x84,0x86, 0x88,0x8a,0x8c}; //秒分时日月周年写的寄存器地址 uchar code read_add[7]={0x81,0x83,0x85,0x87, 0x89,0x8b,0x8d}; //秒分时日月周年读的寄存器地址 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d ,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管0-9加'-'熄灭表 void delay(uint z) { while(--z); } void write_com(uchar com)//液晶写命令函数 { RS=0;//写命令使能 RW=0;//写 delay(5000); /****在高脉冲下命令输入*****/ E=0; P0=com; delay(500); E=1; delay(500); E=0; } void write_data(uchar dat)//液晶写数据函数

相关文档
相关文档 最新文档