基于DS1302的数码管显示数字钟
基于DS1302和LCD1602的可调数字钟
学习情境2-可调式数字钟之基于DS1302和LCD1602的可调数字钟☆点名,复习1、DS1302的引脚及其功能,以及DS1302与单片机的硬件连接?2、如何对DS1302读写数据,如何得到DS1302的时钟?☆新课讲授2.3 基于DS1302与LCD1602设计的可调数字钟上堂课程我们学会了使用DS1302,知道了如何在单片机系统中的连接,也详细的学习了如何得到DS1302的时钟,并且我们使用了16个数码管把年月日和时分秒实时地显示出来。
但数码管的显示毕竟有其自身的缺陷,现在在工业控制的各个环节,都使用液晶进行人机联系。
在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通用器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED 数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在单片机系统中应用液晶显示器作为输出器件有以下几个优点:(1)显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
(2)数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
(3)体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
(4)功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
2.3.1 LCD1602技术资料2.3.1.1 液晶显示简介1、液晶显示原理:液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
基于DS1302设计的数字钟原理图与PCB教程
基于DS1302设计的数字钟任务一电路原理图的设计1、最小系统电路步骤一:新建设计。
双击桌面PROTEUS软件图标,打开软件,单击工具栏“File”,出现如下图所示下拉菜单。
单击“New Design”菜单,弹出如下对话框。
选择绘图模板,我们选择DEFAULT模板,单击DEFAULT图标,单击“OK”按钮。
进入原理图编辑界面,如下图所示。
步骤二:文件命名和保存。
在绘制电路原理图应当先对文件进行命名,然后保存。
单击保存图标,弹出对话框,选择文件存储路径。
如下图所示:我们把文件保存在桌面的“电路原理图”这个文件夹内。
单击“保存”按钮弹出对话框,在“文件名”编辑框中填写电路原理图名称,“基于DS1302设计的数字钟”。
如下图所示。
单击“保存”按钮,回到原理图编辑页面。
同时在文件夹“电路原理图”中出现电路原理图标,如下图所示。
步骤三:选择主控元器件。
在编辑框最左边的工具栏中选择图标,进入器件模式,然后单击图标,弹出“Pick Device”对话框,如下图所示:在Category下拉框中选择Microprocessor ICs,然后选择芯片AT89C51或AT89C51单片机,如下图所示:单击OK按钮,单片机芯片选择完成,这时在对象选择器和预览窗口中均出现了所选择的芯片AT89C52,在对象选择器单击芯片名称,如AT89C52,再把鼠标移至编辑窗口区(工作区),右击鼠标,主控芯片AT89C52就拖入了工作区。
单片机芯片选择完毕。
如下图所示:步骤四:时钟振荡电路的设计。
51单片机的18和19引脚外接2个皮法级的电容和晶振就可以构成时钟振荡电路。
按照上一步骤选择AT89C52芯片的方法一一从元器件库中选择2个30pf的电容、12M的晶振,还有一个地。
如下图所示:步骤五:复位电路设计。
单片机的9引脚外接复位电路,本系统中用按键k1、2个电阻R1、R2和电容组成,具体电路结构如下图所示:此外,还有电源电路,单片机的20引脚、40引脚分别接电源的地和电。
ds1302数码管显示
DS1302应用刚学单片机,好多好奇,所以想做个简单的时钟。
下面是PROTEUS仿真电路和电路图,简单易懂。
文笔不好,说了多余。
下面是程序。
#include<reg52.h>#include<intrins.h>#include<ds1302.h>#define uint unsigned int#define uchar unsigned char#define BCDTUAN(str) (str/10*16+str%10) //定义宏,将要写入DS1302的时间转化为BCD码#define Write_Sec 0x80#define Write_Min 0x82#define Write_Hou 0x84#define Write_Dat 0x86#define Write_Mon 0x88#define Write_day 0x8a#define Write_Yea 0x8c#define Write_WP 0x8e //写保护位#define Write_TCR 0x90#define Read_Sec 0x81#define Read_Min 0x83#define Read_Hou 0x85#define Read_Dat0x87#define Read_Mon 0x89#define Read_Day 0x8b#define Read_Yea 0x8d#define CLK_BurstW 0xbf //时钟突发模式写#define CLK_BurstR 0xbf //时钟突发模式读#define Write_RAM_Begin 0xc0 //RAM第一个字节写指令#define Read_RAM_Begin 0xc1 //RAM第一个字节读指令#define RAM_BurstW 0xfe //突发模式写RAM#define RAM_BurstR 0xff //突发模式读RAMsbit _74hc154_A = P1^0;sbit _74hc154_B = P1^1;sbit _74hc154_C = P1^2;sbit _74hc154_D = P1^3;sbit CE =P1^6;sbit SCLK=P1^5;sbit IO =P1^4;uchar code scan[][4]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}};uchar scanbuff[]={0,0,0,0,0,0,0,0,0,0,0,0};uchar code dispdate[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void WriteDS1302(void); //向DS1302写入时间。
基于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)五、程序调试与运行结果 ............................................................ 错误!未定义书签。
基于DS1302的数字时钟
实现功能:以DS1302数字时钟芯片为基础的时钟程序,用LED1602显示当前时间,功能键能显示年月日和星期。
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit SCK=P3^6; //时钟端口sbit SDA=P3^4; //数据端口sbit RST=P3^5; //复位端口sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EP = P2^7;sbit key=P2^0;uchar code write_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年uchar code read_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};uchar code a[]={" The time is:"};uchar code w1[]={" Monday"};uchar code w2[]={" Tuesday"};uchar code w3[]={" Wednesday"};uchar code w4[]={" Thursday"};uchar code w5[]={" Friday"};uchar code w6[]={" Saturday"};uchar code w7[]={" Sunday"};uchar init_time[] = {10,10,22,19,7,2,11}; //秒分时日月周年11-07-19 22:10:10uchar buff[7];uchar buff1[8];uchar buff2[13];uchar buff3;delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}/******DS1302部分*****/void write_byte(uchar n){uint i;for(i=0;i<8;i++){SCK=0;SDA=n&0x01;n=n>>1;SCK=1;}}uchar read_byte(){uint i;uchar n;for(i=0;i<8;i++){if(SDA)n=n|0x80;SCK=0;n=n>>1;_nop_();_nop_();SCK=1;}return n;}void write_DS1302(uchar address,uchar n) {RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_();write_byte(address);write_byte(n);SCK=1;RST=0;}uchar read_DS1302(uchar address){uchar n;RST=0;_nop_();_nop_();SCK=0;_nop_();RST=1;write_byte(address);n=read_byte();_nop_();RST=0;_nop_();_nop_();_nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return n;}void get_data(){unsigned char i,*p;p=read_address;for(i=0;i<7;i++){buff[i]=read_DS1302(*p);p++;}}void set_DS1302(){unsigned char i,*p,n;for(i=0;i<7;i++) //转换成BCD码{n=init_time[i]/10;init_time[i]=init_time[i]%10;init_time[i]=init_time[i]+n*16;}write_DS1302(0x8E,0X00);p=write_address;for(i=0;i<7;i++){write_DS1302(*p,init_time[i]);p++;}write_DS1302(0x8E,0x80);}bit lcd_bz(){ // 测试LCD忙碌状态bit result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0 & 0x80);LCD_EP=0;return result;}lcd_wcmd(uchar cmd){ // 写入指令数据到LCD while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_pos(uchar pos){ //设定显示位置lcd_wcmd(pos|0x80);}lcd_wdat(uchar dat){ //写入字符显示数据到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_init(){ //LCD初始化设定lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据delay(1);lcd_wcmd(0x0c); //显示开,关光标delay(1);lcd_wcmd(0x06); //移动光标delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}void dispaly(){uint i;if(0==key)delay(5);if(0==key){lcd_wcmd(0x01);while(0==key){buff2[0]=0x20;buff2[1]=0x20;buff2[2]=0x20;buff2[3]=0x32;buff2[4]=0x30;buff2[5]=buff[6]/16+0x30;buff2[6]=(buff[6]&0x0f)+0x30;buff2[7]=0x2d;buff2[8]=buff[4]/16+0x30;buff2[9]=(buff[4]&0x0f)+0x30;buff2[10]=0x2d;buff2[11]=buff[3]/16+0x30;buff2[12]=(buff[3]&0x0f)+0x30;lcd_pos(0);for(i=0;i<13;i++){lcd_wdat(buff2[i]);delay(5);}buff3=buff[5]&0x0f;lcd_pos(0x40);if(buff3==1){i = 0;while(w1[i]!= '\0'){lcd_wdat(w1[i]);i++;delay(5);}}else if(buff3==2){i = 0;while(w2[i]!= '\0'){lcd_wdat(w2[i]);i++;delay(5);}}else if(buff3==3){i = 0;while(w3[i]!= '\0'){lcd_wdat(w3[i]);i++;delay(5);}}else if(buff3==4){i = 0;while(w4[i]!= '\0'){lcd_wdat(w4[i]);i++;delay(5);}}else if(buff3==5){i = 0;while(w5[i]!= '\0'){lcd_wdat(w5[i]);i++;delay(5);}}else if(buff3==6){i = 0;while(w6[i]!= '\0'){lcd_wdat(w6[i]);i++;delay(5);}}else if(buff3==7){i = 0;while(w7[i]!= '\0'){lcd_wdat(w7[i]);i++;delay(5);}}}lcd_wcmd(0x01);}else{lcd_pos(0);i = 0;while(a[i]!= '\0'){lcd_wdat(a[i]);i++;delay(5);}buff1[0]=buff[2]/16;buff1[1]=buff[2]&0x0f;buff1[2]=0x0a;buff1[3]=buff[1]/16;buff1[4]=buff[1]&0x0f;buff1[5]=0x0a;buff1[6]=buff[0]/16;buff1[7]=buff[0]&0x0f;lcd_pos(0x44);for(i=0;i<8;i++){lcd_wdat(buff1[i]+0x30);delay(5);}}}void main(){lcd_init();set_DS1302();while(1){get_data();dispaly();}}。
基于单片机及时钟芯片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多功能数字钟电子电工课程设计
物理与电子科学学院电子电工实验基于DS1302多功能数字时钟--万年历实验报告实验名称:基于DS1302多功能数字钟实验日期: 2014年 01 月 05 日专业:电子信息工程*名:**班级:物电 1105 班学号: *************一、设计理念:电子万年历是一个应用非常广泛地实用日常计时工具,带有显示温度,显示世纪,年,月,日,星期,时,分,秒和按键可调时间及其按键设置闹钟地功能,同时具有月末自动更新,闰年补偿功能,整点报时等多种功能.环境温度检测系统在日常生活和工业应用非常广泛,能实时采集周围地温度信息进行显示.此系统是基于STC89C52单片机设计地,包含液晶显示模块,DS1302实时时钟模块,DS18B20温度采集模块,键盘扫描模块,蜂鸣器报警模块.STC89C52作为控制核心,具有功耗低,功能强等特点,电压可选3到5V电源供电.显示模块采用1602液晶动态显示,相对数码管而言经济实用,占用空间小,对于显示数字、字母最为合适,而且与单片机连线简单,占用IO口相对较少.实时时钟芯片DS1302是一款经济实惠功能强大地较新型产品,该器件提供RTC/日历,可外加器件实现定时闹钟等功能,如果检测到主电源故障,该器件可自动切换到备用电源供电,可以保证在断电情况下精准走时,计时.温度检测显示模块采用数字式温度传感器DS18B20,该芯片具有精度高,测量范围广等优点,易与单片机连接,模块电路组成简单并同时具有温度报警功能.关键词:STC89C52,DS1302,DS18B20,1602液晶显示,电子万年历,采集设备周围环境温度、整点报时,闹钟时分通过按键设置,时、分、秒、年、月、日、星期通过按键进行调节校准……二、设计思路:核心控制体:STC89C52单片机实时时钟芯片:DS1302数字式温度传感器:DS18B20总共设有四个按键,为节约资源考虑,每个按键都有多种功能.四个按键分别标号为key1,key2,key3,key4.第一次按下key2,key3,key4都没有反应,首先按下key1键可选择指针位置,key2键为加键,key3为减键,key4键为闹钟设置清零键.操作简单,按键灵活.整点报时功能,可以按下key4键终止报警.系统设计框图:系统硬件需求介绍:STC89C52单片机一片,DS1302实时时钟芯片一个,DS18B20数字式温度传感器一个,+5V无源蜂鸣器一个,12MHZ、32KHZ晶振各一个,多个按键和开关,常用电容电阻,连接线,三极管,二极管若干,滑动变阻器一个,+3V纽扣电池一个.三、实施方案:1、单片机核心控制模块:核心控制器件选用STC89C52单片机.STC89C52单片机为40管脚双列直插芯片,它是一种高性能,低功耗地8位CMOS微处理器芯片,市场应用最多.而且价格便宜,控制方便,便于应用有4个I/O口分别为P1,P2,P3,P4.其中每一个管脚都能做独立地输入输出管脚,它地第9脚位复位管脚,接上电容和上拉电阻再带个开关构成复位电路.18,19管脚接外部晶振和两个微调电容构成外部晶振电路.单片机,复位电路,晶振,5V电源构成单片机最小系统.其中与AT89C52单片机管脚连接如下图:2、实时时钟电路模块:DS1302引脚排列:如下图引脚说明:1)1脚,Vcc2:后备电源,此设计中接+3V纽扣电池;8脚,VCC1:主电源,接+5V.在主电源关闭地情况下,也能保持时钟地连续运行.DS1302由Vcc1或Vcc2两者中地较大者供电.当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电.当Vcc2小于Vcc1时,DS1302由Vcc1供电.2)X1、X2即2脚3脚:振荡源,外接32.768kHz晶振.3)4脚END,接地端.4)5脚RST:复位/片选线,通过把RST输入驱动置高电平来启动所有地数据传送.RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据地传送手段.当RST为高电平时,所有地数据传送被初始化,允许对DS1302进行操作.如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态.上电运行时,在Vcc>2.0V之前,RST必须保持低电平.只有在SCLK为低电平时,才能将RST置为高电平.5)I/O为串行数据输入输出端(双向).6)SCLK为时钟输入端.**特别注意:5,6,7脚在硬件电路实现中,必须接上拉电阻,接+5V.3、DS18B20 工作模块: DS18B20 地温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强.其一个工作周期可分为两个部分,即温度检测和数据处理.DS18B20 地主要特征:全数字温度转换及输出.先进地单总线数据通信.最高 12 位分辨率,精度可达土 0.5摄氏度.12 位分辨率时地最大工作周期为 750 毫秒.可选择寄生工作方式.检测温度范围为–55°C ~+125°C (–67°F ~+257°F)内置 EEPROM,限温报警功能.64 位光刻 ROM,内置产品序列号,方便多机挂接.多样封装形式,适应不同硬件系统.4、液晶显示模块:1602字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,本设计采用16列*2行地字符型LCD1602带背光地液晶显示屏.引脚接口说明:第1脚:VSS为地电源.第2脚:VDD接5V正电源.第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K地电位器调整对比度.第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器.第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作.当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据.第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令.第7~14脚:D0~D7为8位双向数据线.第15脚:背光源正极.第16脚:背光源负极.5、蜂鸣器电路模块本实验设计中蜂鸣器用CS8050三极管驱动,蜂鸣器用5V地无源蜂鸣器,并接一个发光二极管作为指示灯,同时在负极串接一个限流电阻,数据端口接P3^7.四、Proteus仿真原理总框图:五、硬件电路实现:六、源程序:Shuzizhong.c#include <reg51.h>#include"ds18b20.h"#define uchar unsigned char#define uint unsigned intuchar shi,fen,miao,ringshi,ringfen,nian,yue,ri,week,temp,count,m。
基于DS1302芯片的数字时钟设计
路 蜂 鸣 电 , \
二 二 二 : > l 数 码 管 显 示
DS 1 3 0 2 是 美 国D AL L AS 公司研 发 的实 时 时钟 电 路 , 带R AM芯片、 低功耗、 高性能等特点, 可以采用各种方
法对时间进行精确显示, 具有对闰年和非闰年的判断功能, 2 . 5 ~5 . 5 V电压为芯片的工作电压范 围。 最大特点是C P U与 图1系统 总体 结 构 2 . 3 系统硬 件 电路 设计 芯片的三线接 口可以进行 同步通信, 一次可以传送 若干个字 ( 1 ) 整体 电路设计。 系统的实时时钟 电路 的部分由单片 节 的R A M数据 。 2 硬件设计 机A T 8 9 S 5 2 的P 1 接 口与DS 1 3 0 2 时钟芯片相连接而成, 将键 2 . 1设 计 思路 盘与单片机的P 3 . 2 接 口和P 3 . 3 接 口连接 组成 系统的按键 电 用来对显示器的控制, 数码管与单片机的P 0 接 口连接构 利用A T 8 9 S 5 2 进行全局的控制, 用数码管来 显示时、 分、 路, 秒, 时、 分、 秒从 DS 1 3 0 2 上 读 取 出来 。 由于要设 置 时 间所 以装 成系统 的显示, 最后用三极管连接数码管与P 2 接口。 了两个按键。 一个用来 选中所要修改的时间, 一个进行修改 ( 2 ) DS 1 3 0 2 时钟电路设计。 芯片的供 电电路是将V C C 2 ( 就是+ 1 ) , 为了使定时闹钟 能够 实现 , 又加了个蜂鸣器 , 当 接电源, 将晶振分别与x. , x 引脚相连 ; 芯片的复位引脚 电路 时 间走到设定的时间时, 蜂 鸣器开始发 出声音, 该数字时钟 是将单片机P 1 . 2 收引脚与R S T  ̄ J I 脚相连接; 芯片的时钟端电路 是将单片机的P 1 . 0 引脚与芯片的S L K 引脚相连组成; 芯片的I / 硬件 电路简单、 使用灵活、 功能稳定。 2 . 2 系统 结 构 及 总 流 程设 计 o端口的电路是将单片机的P 1 . 1 引脚与I / o 引脚相连 组成。 根据系统设计的要求和设计思路, 确定该系统的系统设 ( 3 ) 显示电路。 将数码显示管 的段选端与单片机 的P 0 由于数码 管采用的是动态显示 , 所 以通过对P 0 的 计 结构图。 系统总体结构 如图1 所 示。 硬件 电路主要由MC U 接 口相连, 微处理控制器单元 、 DS 1 3 0 2 时钟电路、 储存 器、 复位 电路、 8 位二进制数据 的不断改变使数码显示 管不断的动态显示;
基于DS1302的实时数字钟设计
基于DS1302的多功能实时数字钟控制摘要:本系统采用STC89C52 单片机和DS1302 配合,实现实时时间日期和星期的保存和显示。
系统中还有一块1602显示屏,用以显示系统中所需的符号和时间日期。
另外系统中还装有4个独立式键盘,用于系统操作与控制。
并接一个直流蜂呜器和一个交流蜂呜器,用以进行音响提示。
DS1302可以实现对系统是的时、分、秒,日期和星期等信息的保存,使系统在掉电的情况下仍然能够准确的保存并运行时间信息。
利用单片机的定时器,实现了倒计时和秒表功能的设计。
关键字:单片机;DS1302;数字钟Based on DS1302 control of multi-purpose real-time digitalclockAbstract:The system uses the microcontroller and the DS1302 with STC89C52, real-time time date and week of preservation and display. There is also a 1602 display system to display the system date and time required for the symbol. Another system is also equipped with 4 separate keyboard for the system operation and control. And then a DC and an AC buzzer buzzer, used for audio prompts. DS1302 can be achieved on the system is the hours, minutes, seconds, date, and save information such as a week, the system in case of power-down will still be able to save and run-time and accurate information. Use of microcomputer timer, countdown and stopwatch functions to achieve the design.Key words:Single Chip Microcomputer; DS1302; digital clock目录1 绪论 (1)2 系统方案选择和论证 (1)2.1 设计要求 (1)2.2 各模块方案选择和论证 (2)2.2.1 主控模块的选择说明 (2)2.2.2 时钟芯片的选择和说明 (3)2.2.3 显示模块的选择和说明 (5)2.3 最终选择方案 (7)3 系统硬件设计及实现 (7)3.1 单片机外围电路设计 (7)3.2 DS1302与单片机的接口设计 (8)3.3 LCD1602与单片机的接口设计 (8)3.4 按键电路设计 (9)3.5 闹铃电路设计 (9)3.6 电源设计 (10)4 软件设计 (11)4.1 主程序设计 (11)4.2 DS1302子程序的设计 (11)4.4 键盘扫描子程序的设计 (14)4.5 闹钟子程序的设计 (14)5 系统调试 (14)5.1 软件调试 (15)5.2 硬件调试 (15)5.2.1 显示电路调试 (16)5.2.2 DS1302电路调试 (16)5.2.3 按键电路的调试 (16)6 总结 (16)致谢 (18)参考文献 (19)附录 (20)附录一:电路板实物图 (20)附录二:设计总电路图 (22)附录三:仿真图 (23)基于DS1302的多功能实时数字钟控制***班 ***指导教师 ***1 绪论在实时监控系统的设计中,要对各个控制信号进行实时监控,更重要的是在发生事故的情况下准确记录下故障数据,以便准确分析排除错误。
基于DS1302的数码管时钟电路设计
单片机与可编程器件LED数码管时钟电路采用24h计时方式,时、分、秒用六位数码管显示,其中小时、分、秒之间用小数点分开。
该电路采用AT89C52单片机和DS1302实时时钟芯片,使用5V电源进行供电,使用两个按键进行调时,调整过程中被调节的分钟或时钟将进入闪亮状态,看上去非常直观,另外,本设计还具有快速调时功能,当按键一直被按下时,便进入快速调时状态。
由于本时钟电路的计时是由芯片DS1302来完成的,计时准确 ,单片机通过串行通信来控制DS1302工作,同时进行键盘和显示的控制。
DS1302芯片介绍1.DS1302的功能及其结构DS1302芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它采用串行通信方式,只需3条线便可以和单片机通信,并且其片内均含RAM,可增加系统的RAM,DS1302的时钟校准比较容易,若采用专用的晶体振荡器,几乎无须调整即可以达到国家要求的时钟误差标准。
DS1302有两个电源输入端,其中的一个用来做备用电源,这样避免了由于突然停电而造成时钟停止,因此它非常适合于长时间无人职守的监测控制系统或需经常记录某些具有特殊意义的数据及对应时间的场合。
DS1302提供秒、分、时、日、星期、月、年的信息,每月的天数和闰年的天数可自动调整,并可通过AM/PM 指示决定采用24 或12 小时格式。
DS1302串行时钟芯片主要由移位寄存器、控制逻辑、振荡器、实时时钟及31B的RAM组成。
在数据传送前,必须把RST置为高电平,且把提供地址和命令信息的8位装入到移位寄存器。
在进行单字节传送或多字节传送时,开始的8位命令字节用于指定40B(前31B RAM和9B时钟寄存器)中哪个将被访问。
在开始的8个时钟周期把命令装入移位寄存器之后,另外的时钟在读操作时输出数据,在写操作时输入数据。
DS1302的封装引脚示意图和内部结构图分别见图1和图2。
其中,X1、X2接32.768kHz 晶振,GND为地,复位线驱动至高电平,启动所有的数据传送。
基于DS1302电子钟的设计
《单片机技术》课程设计任务书(二)题目:基于DS1302的电子钟设计一、课程设计任务DS1302是DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿功能,工作电压为2.5~5.5V。
DS1302采用三线接口,与CPU进行同步通信,并可采用突发方式一次传送多个字节的时间数据或RAM数据。
DS1302内部有一个31X8的用于临时性存放数据的RAM存储器。
本课题要求设计一基于DS1302的电子钟,该系统要求包含时钟显示模块(可用数码管或液晶显示)和键盘输入模块等。
按1键可以查看当前的时间,按2键可以修改当前的时间,按3键可以设置控制的时间,按4键可以查看及删除所设置的时间,当设定的控制时间到时,铃声响起。
二、课程设计目的通过本次课程设计使学生掌握:1)专用时钟芯片DS1302与单片机的接口及DS1302的编程;2)矩阵式键盘的设计与编程;3)经单片机为核心的系统的实际调试技巧。
从而提高学生对微机实时控制系统的设计和调试能力。
三、课程设计要求1、要求可以从键盘上接收相关信息,按1键可以查看当前的时间,按2键可以修改当前的时间,按3键可以设置控制的时间,按4键可以查看及删除所设置的时间,当设定的控制时间到时,铃声响起。
2、能实时显示时钟。
四、课程设计内容1、人机“界面”设计;2、单片机端口及外设的设计;3、硬件电路原理图、软件清单。
五、课程设计报告要求报告中提供如下内容:1、目录2、正文(1)课程设计任务书;(2)总体设计方案(3)针对人机对话“界面”要有操作使用说明,以便用户能够正确使用本产品;(4)硬件原理图,以便厂家生成产(可手画也可用protel软件);(5)程序流程图及清单(子程序不提供清单,但应列表反映每一个子程序的名称及其功能);(6)调试、运行及其结果;3、收获、体会4、参考文献六、课程设计进度安排七、课程设计考核办法本课程设计满分为100分,从课程设计平时表现、课程设计报告及课程设计答辩三个方面进行评分,其所占比例分别为20%、40%、40%。
基于DS1302的数字时钟设计
一、设计目的 (1)二、设计思路 (1)三、设计过程 (1)五、主要元器件与设备 (10)六、课程设计体会 (10)七、参考文献 (10)一、设计目的1、掌握电子时钟的基本工作方式。
2、进一步熟悉DS1302芯片的特性。
3、通过使用各基本指令,进一步熟练掌握单片机的编程和程序调试。
二、设计思路利用AT89C52的特点及DS1302的特点,设计一种基于DS1302单片机控制,再利用数码管静态显示的可调可定时数字钟。
本系统硬件利用AT89S52作为CPU 进行总体控制,通过DS1302时钟芯片获取准确详细的时间(年、月、日、周、日、时、分、秒准确时间),对时钟信号进行控制,同时利用数码管对时间进行准确显示年、月、日、周、日、时、分、秒。
三、设计过程3.1系统设计结构图图1系统设计结构图根据系统设计的要求和设计思路,确定该系统的系统设计结构图。
如图1所示。
硬件电路主要由MCU微处理控制器单元、DS1302时钟电路、储存器、复位电路、晶振电路、数码管显示模块构成。
3.2 MCU微控制器电路AT89S52作为系统的核心控制元件,只有它能正常工作后才能使其它的元件进入正常工作状态。
因此,下面对AT89S52进行必要的说明,AT89S52的管脚如图3所示。
图3 AT89S52的管脚1)VCC:40脚,供电电压,一般接+5V电压。
2)GND:20脚,接工作地。
3)P0口:1~8脚,P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上电阻。
但是P0口在程序校验作为输出指令字节时,需要外部加上拉电阻,一般上拉电阻选4.7K~10K为宜。
本设计中用5.1K的排阻对P0口进行上拉电平。
4)P1口:32~39脚,P1口是一个内部具有上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。
DS1302时钟数码管显示
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 0x81char shi,fen,miao; //读出数据存储变量uchard[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //不带小数点uchardd[]={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;RST=0; //禁止读写数据for(i=0;i<8;i++){RST=1;SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++){if(IO)date=date|0x80;elsedate=date|0x00;SCLK=1;date>>=1;SCLK=0;}RST=0;date=date/16*10+date%16; //进制转换16转10进制IO=0; //数据读完后,IO口必须为0,不然小时一直显示85 return date;}void write_1302(uchar add,uchar dat) //写函数{uchar i;RST=0; //禁止读写数据// SCLK=0;for(i=0;i<8;i++) //写地址{RST=1; //允许读写数据SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++) //写数据{RST=1; //允许读写数据SCLK=0;IO=dat&0x01;dat>>=1;SCLK=1;}RST=0;}void init_1302() //初始化函数设置时间{write_1302(0x8e,0x00); //保护取消,可以进行读写操作write_1302(write_miao,0x56);write_1302(write_fen,0x49);write_1302(write_shi,0x14);write_1302(0x8e,0x80); //保护启动,不能进行读写操作}void display(uchar shi,uchar fen,uchar miao) //显示函数{if(knum==0){snum=30;fnum=30;}if(knum==1){fnum++;snum=30;}if(knum==2){snum++;fnum=30;}if(snum>=30){W=0x01; //位选D=d[shi/10]; //段选delay(5);D=0XFF; //消隐if(miao%2==0) //小数点闪烁{W=0x02;D=dd[shi%10];delay(5);D=0XFF; //消隐}else{W=0x02;D=d[shi%10];delay(5);D=0XFF; //消?}if(snum==60)snum=0;}if(fnum>=30){W=0x04;D=d[fen/10];delay(5);D=0XFF; //消隐W=0x08;D=d[fen%10];delay(5);D=0XFF; //消隐if(fnum==60)fnum=0;}}void read_sf(){shi=read_1302(read_shi);fen=read_1302(read_fen);miao=read_1302(read_miao);display(shi,fen,miao);}void keyscan() //按键扫描函数{if(s3==0) //选择按键按下{delay(10);if(s3==0){while(!s3)display(shi,fen,miao); //加上这句,按键按下就不会闪knum++; if(knum==1) //分闪烁{write_1302(0x8e,0x00); //保护取消write_1302(write_miao,0x80);}if(knum==3) //时钟启动{knum=0;write_1302(write_miao,0x00);write_1302(0x8e,0x80); //保护启动}}}if(knum==1) //分钟调节{if(s1==0) //加{delay(10);if(s1==0){while(!s1)display(shi,fen,miao); //加上这句,按键按下就不会闪fen++; fen=fen/10*16+fen%10; //转为16进制if(fen==0x60)fen=0x00;write_1302(write_fen,fen); //写入1302read_sf(); //读出时间,然后显示}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen,miao); //加上这句,按键按下就不会闪fen--; fen=fen/10*16+fen%10; //转为16进制if(fen==-1)fen=0x59;write_1302(write_fen,fen);read_sf();}}}if(knum==2){if(s1==0){delay(10);if(s1==0){while(!s1)display(shi,fen,miao); //加上这句,按键按下就不会闪shi++; shi=shi/10*16+shi%10; //转为16进制if(shi==0x24)shi=0x00;write_1302(write_shi,shi);read_sf();}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen,miao); //加上这句,按键按下就不会闪shi--;shi=shi/10*16+shi%10; //转为16进制if(shi==-1)shi=0x23;write_1302(write_shi,shi);read_sf();}}}}void main(){// init_1302();while(1){read_sf();keyscan();}}。
基于DS1302的单片机数字时钟
源程序如下:#include <at89x52.h>#include <DS1302.h>//定义共阳极字型码0123456789-//unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned char time[]={0,0,0,0,0,0,0,0};//用来储存时间unsigned char date[]={0,0,0,0,0,0,0,0};//用来储存日期SYSTEMTIME time1; //在ds1302.h文件中已经定义了一个名字为SYSTEMTIME的结构体,在这里我们定义一个变量名//为time的SYSTEMTIME结构体void delay(unsigned char i) //延时子程序{unsigned char j;while((i--)!=0){for(j=123;j>0;j--);}}unsigned char button_time(n,x,y) //时钟调整子程序unsigned char n,x,y;{if(P1_7==0){delay(50);if(P1_7==0){n++;if(n==x)n=0;while(P1_7==0);}}if(P1_5==0){delay(50);if(P1_5==0){if(n==0)n=y;elsen--;while(P1_5==0);}return n;}unsigned char button_date(n,x,y) //日期调整子程序unsigned char n,x,y;{if(P1_7==0){delay(50);if(P1_7==0){n++;if(n==x)n=1;while(P1_7==0);}}if(P1_5==0){delay(50);if(P1_5==0){if(n==1)n=y;elsen--;while(P1_5==0);}}return n;}void display(second10,second1,minute10,minute1,hour10,hour1) //显示子程序unsigned char second10,second1,minute10,minute1,hour10,hour1;{P2=0xfe;P0=dispcode[second10];//显示秒的十位delay(1);P2=0xfd;P0=dispcode[second1]; //显示秒的个位P2=0xfb;P0=dispcode[10]; //显示"-"delay(1);P2=0xf7;P0=dispcode[minute10];//显示分的十位delay(1);P2=0xef;P0=dispcode[minute1]; //显示分的个位delay(1);P2=0xdf;P0=dispcode[10]; //显示"-"delay(1);P2=0xbf;P0=dispcode[hour10]; //显示时的十位delay(1);P2=0x7f;P0=dispcode[hour1]; //显示时的个位delay(1);}void main(){unsigned char flag;Initial_DS1302(); //初始化DS1302这个时钟芯片, while(1){DS1302_GetTime(&time1); //读取时间参数time[5]=(time1.Second)%10; //把秒的个位数据存入time[5]time[4]=(time1.Second)/10; //把秒的十位数据存入time[4]time[3]=(time1.Minute)%10; //把分的个位数据存入time[3]time[2]=(time1.Minute)/10; //把分的十位数据存入time[2]time[1]=(time1.Hour)%10; //把时的个位数据存入time[1]time[0]=(time1.Hour)/10; //把时的十位数据存入time[0] date[5]=(time1.Day)%10;date[4]=(time1.Day)/10;date[3]=(time1.Month)%10;date[2]=(time1.Month)/10;date[1]=(time1.Year)%10;date[0]=(time1.Year)/10;if(P1_4==0) //如果按下Time Start键一下,时钟开始正常显示时间,再按一下,显示日期{delay(50);if(P1_4==0){flag++;if(flag>1){flag=0;}}while(P1_4==0);}if(P1_6==0) //如果按下Time Set键一下,开始显示日期,再按一下进入日期跟时钟的调节模式{delay(50);if(P1_6==0){flag++;if(flag>7){flag=0;}}while(P1_6==0);}switch(flag){case 0:display(time[0],time[1],time[2],time[3],time[4],time[5]); //调用子函数display,把存入数组time的数据给显示出来break;case 1:display(date[0],date[1],date[2],date[3],date[4],date[5]); //调用子函数display,把存入数组date的数据给显示出来break;case 2:time1.Year=button_date(time1.Year,100,99); //调整年DS1302_SetTime(0x8c,time1.Year);display(date[0],date[1],10,10,10,10);break;case 3:time1.Month=button_date(time1.Month,13,12); //调整月DS1302_SetTime(0x88,time1.Month);display(10,10,date[2],date[3],10,10);break;case 4:time1.Day=button_date(time1.Day,32,31); //调整日DS1302_SetTime(0x86,time1.Day);display(10,10,10,10,date[4],date[5]);break;case 5:time1.Hour=button_time(time1.Hour,24,23); //调整时DS1302_SetTime(0x84,time1.Hour);display(time[0],time[1],10,10,10,10);break;case 6:time1.Minute=button_time(time1.Minute,60,59); //调整分DS1302_SetTime(0x82,time1.Minute);display(10,10,time[2],time[3],10,10);break;case 7:time1.Second=button_time(time1.Second,60,59); //调整秒DS1302_SetTime(0x80,time1.Second);display(10,10,10,10,time[4],time[5]);break;}}}头文件ds1302.h程序如下:#ifndef _REAL_TIMER_DS1302_2003_7_21_#define _REAL_TIMER_DS1302_2003_7_21_#include <at89x52.h>sbit DS1302_CLK = P1^0; //实时时钟时钟线引脚sbit DS1302_IO = P1^1; //实时时钟数据线引脚sbit DS1302_RST = P1^2; //实时时钟复位线引脚sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;typedefstruct __SYSTEMTIME__{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString[9];unsigned char TimeString[9];}SYSTEMTIME; //定义的时间类型#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_SECOND 0x80 //秒寄存器#define DS1302_MINUTE 0x82 //分寄存器#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8C#define DS1302_RAM(X)(0xC0+(X)*2) //用于计算DS1302_RAM 地址的宏void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数) {unsigned char i;ACC = d;for(i=8; i>0; i--){DS1302_IO = ACC0; //相当于汇编中的RRCDS1302_CLK = 1;DS1302_CLK = 0; //发一个高跳变到低的脉冲ACC = ACC >> 1;}}unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数) {unsigned char i;for(i=8; i>0; i--){ACC = ACC >>1; //相当于汇编中的RRCACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0; //发一个高跳变到低的脉冲}return(ACC);}void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据{DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0; //RST 0->1->0,CLK 0->1}unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据{unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1; //enableDS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1; //RST 0->1->0,CLK 0->1DS1302_RST = 0;return(ucData);}void DS1302_SetProtect(bit flag) //是否写保护{if(flag)Write1302(0x8E,0x10); //WP=1,不能写入elseWrite1302(0x8E,0x00);//WP=0,可以写入}void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数{DS1302_SetProtect(0);Write1302(Address, ((Value/10)<<4 | (Value%10))); //高4位为十位,低4位为个位}void DS1302_GetTime(SYSTEMTIME *Time){unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//转换成10进制的秒ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F);}/*voidDateToStr(SYSTEMTIME *Time){Time->DateString[0] = Time->Year/10 + '0'; //数字类型转化为字符类型Time->DateString[1] = Time->Year%10 + '0';Time->DateString[2] = '-';Time->DateString[3] = Time->Month/10 + '0';Time->DateString[4] = Time->Month%10 + '0';Time->DateString[5] = '-';Time->DateString[6] = Time->Day/10 + '0';Time->DateString[7] = Time->Day%10 + '0';Time->DateString[8] = '\0';}voidTimeToStr(SYSTEMTIME *Time){Time->TimeString[0] = Time->Hour/10 + '0'; //数字类型转化为字符类型Time->TimeString[1] = Time->Hour%10 + '0';Time->TimeString[2] = ':';Time->TimeString[3] = Time->Minute/10 + '0';Time->TimeString[4] = Time->Minute%10 + '0';Time->TimeString[5] = ':';Time->TimeString[6] = Time->Second/10 + '0';Time->TimeString[7] = Time->Second%10 + '0';Time->DateString[8] = '\0';}*/void Initial_DS1302(void){unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) //如果第七为1(表明没有启动), 则启动时钟DS1302_SetTime(DS1302_SECOND,0);}/****************************************************************************** **void BurstWrite1302(unsigned char *pWClock) //往DS1302写入时钟数据(多字节方式) {unsigned char i;Write1302(0x8e,0x00); // 控制命令,WP=0,写操作?DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(0xbe); // 0xbe:时钟多字节写命令for (i = 8; i>0; i--) //8Byte = 7Byte 时钟数据+ 1Byte 控制{DS1302InputByte(*pWClock); // 写1Byte数据pWClock++;}DS1302_CLK = 1;DS1302_RST = 0;}void BurstRead1302(unsigned char *pRClock) //读取DS1302时钟数据(时钟多字节方式) {unsigned char i;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(0xbf); // 0xbf:时钟多字节读命令for (i=8; i>0; i--){*pRClock = DS1302OutputByte(); // 读1Byte数据pRClock++;}DS1302_CLK = 1;DS1302_RST = 0;}void DS1302_TimeStop(bit flag) // 是否将时钟停止{unsigned char Data;Data=Read1302(DS1302_SECOND);DS1302_SetProtect(0);if(flag)Write1302(DS1302_SECOND, Data|0x80);//停止elseWrite1302(DS1302_SECOND, Data&0x7F);不停止}******************************************************************************* */#endif。
(完整版)DS1302数码管显示程序
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;
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;
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)
delayAJ(5);
}
while(!set)
{
delayAJ(5);
}
}
if(b!=0)//时分设定
{
if(up==0)
课程设计——DS1302数码管显示数字钟的设计1
××大学××学院××系课程设计报告××大学××学院××系××课程设计DS1302数码管显示数字钟的设计学生姓名学号所在系专业名称班级指导教师成绩××大学××学院二〇一二年六月摘要:本课程设计要求基于STC89C52单片机实现用8位数码管进行时钟显示。
采用STC89C52单片机和DS1302实时时钟芯片,使用5V电源供电。
时钟可以通过按键切换,数码管显示时、分、秒以及年、月、日,并且可以实现时钟的校准功能。
包括时钟芯片驱动程序,数码管显示及驱动程序。
关键字:单片机,DS1302,时钟电路,数码管显示Abstract: This course is designed 8 digital tube clock display requirements based STC89C52 microcontroller. Using STC89C52 microcontroller and DS1302 real time clock chip, using a 5V power supply. Design of the clock by means of the key switches, digital tube display hours, minutes, seconds, and the year, month, day, and can achieve clock calibration function. Including the driver of the clock chip, digital display and driver.Key words: single chip macrocomputer;DS1302;clock circuit;digital tube display目录1. 总体设计方案 (1)1.1 电子钟功能介绍1.1.1 基本功能介绍 (1)1.1.2 扩展功能介绍 (1)1.2 总体设计方案 (1)1.2.1 计时方案 (1)1.2.2 按键方案 (1)1.2.3 显示方案 (2)2. 单元模块设计 (2)2.1 硬件总电路设计 (2)2.2 显示模块电路设计 (2)2.3 按键调时电路设计 (3)2.4 时钟芯片通信电路 (3)3. 软件模块设计 (4)3.1 主程序设计 (4)3.2 时钟芯片 (5)3.2.1 DS1302内部结构 (5)3.2.2 DS1302的读时序 (6)3.2.3 DS1302的写时序 (6)3.3 键盘调时 (7)4. 设计总结 (8)5. 参考文献 (8)6. 附录 (9)前言数字钟是采用数字电路实现对时、分、秒及数字显示的计时装置,广泛用于个人家庭、车站、办公室等公共场所,成为人们日常生活中的必需品。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理课程设计课题名称:基于DS1302的数码管显示数字钟专业班级:电子信息工程学生学号:学生姓名:指导教师:设计时间:2010年6月21日--2010年6月25日目录摘要........................................................................................................................................................................1 设计任务和要求............................................................................................................................................2 方案论证........................................................................................................................................................3 系统硬件设计................................................................................................................................................3.1 系统总原理图 ................................................................................................................................3.2 元器件清单......................................................................................................................................3.3 PCB板图.......................................................................................................................................3.4 Proteus仿真图 ...............................................................................................................................3.5 分电路图及原理说明...................................................................................................................3.5.1 主控部分(单片机MCS-51)..............................................................................3.5.2 计时部分(实时时钟芯片DS1302)..................................................................3.5.3 显示部分(共阳极数码管)................................................................................3.5.4 调时部分(按键)................................................................................................4系统软件设计................................................................................................................................................4.1 程序流程图.....................................................................................................................................4.2 程序源代码........................................................................................................................................ 5心得体会........................................................................................................................................................ 6参考文献........................................................................................................................................................ 7结束语............................................................................................................................................................基于DS1302的数码管显示数字钟设计摘要本次课程设计的是使用专门的时钟芯片DS1302在数码管上显示的数字电子钟,并能通过按键对其进行调时和校准。
DS1302是一种高性能、低功耗、带RAM的实时时钟芯片,它能够对时,分,秒进行精确计时,它与单片机的接口使用同步串行通信,仅用3条线与之相连接,就可以实现MCS-51单片机对其进行读写操作,把读出的时间数据送到数码管上显示。
程序运行时,数码管将从当前时间开始显示,通过调节K1键和K2键可以分别对小时和分钟进行调整,调整后,时钟以新的时间为起点继续刷新显示。
关键字:MCS-51单片机、DS1302,数码管,按键,动态扫描,调时,校准;1设计任务和要求1. 应用MCS-51单片机设计单片机实现数字钟(LED显示小时:分:秒)电路;2. 选用八位LED数码显示,实时显示时、分、秒,采用按键式实现时钟对表和快慢调整;3. 硬件设计部分,根据设计的任务选定合适的单片机,根据控制对象设计接口电路。
设计的单元电路必须有工作原理,器件的作用,分析和计算过程;4. 软件设计部分,根据电路工作过程,画出软件流程图,根据流程图编写相应的程序,进行调试并打印程序清单;5.原理图设计部分,根据所确定的设计电路,利用Protel工具软件绘制电路原理图、PCB板图、提供元器件清单。
2方案论证实现数字电子钟的设计有以下两种基本方案,现就两种基本方案的优劣进行具体论证,从而说明选择方案二的理由。
方案一:直接用单片机的内部定时器来实现时间。
该方案以MCS-51单片机为主控芯片,以MCS-51的内部定时器产生的1s中断作为时钟的驱动,然后再通过8个74LS245缓冲器驱动8个独立的数码管来组成数字钟电路。
该电路由于数码管和缓冲器的数目较多,所以在连线方面比较复杂,而且用到的分压电阻也比较多。
但是此方案最大的缺点在于单片机89C51产生的1s中断存在误差,如果工作时间长的话,数字时钟显示的时间将会出现严重的偏差,不够精确。
方案二:使用串行接口时钟芯片DS1302设计时钟电路。
该设计方案以MCS-51单片机为主控芯片,以串行时钟芯片DS1302为核心计时芯片,然后再通过一个74LS245缓冲器驱动两组数码管组(每个数码管组由四个数码管连在一起组成)组成数字时钟电路。
更重要的是,DS1302时钟芯片的加入大大提高了数字钟时间的准确性,而且该电路在断电后不丢失时间和数据信息时也使得该方案的研究与提升更具有开发的意义。
3 系统硬件设计3.1系统总原理图图1 数字钟总原理图3.2 元件清单元件序号型号或主要参数数量封装元件序号型号或主要参数数量封装R1100Ω 1 AXIAL0.3 U1AT89C51 1 DIP40 R21kΩ 1 AXIAL0.3 U274S15 1 DIP14 RP1 1KΩ 1 SIP9 U4DS1302 1 DIP8 C1 22pF 3 RAD2.54 U374LS245 1 DIP20 C4 104uF 1 RAD2.54 Y1 CRYSTAL 1 STAL3 DS SM41C564 2 数码管*4 Y2 CRYSTAL 1 STAL2 K 按键 4 按键4.5*6.53.3PCB板图图2 总电路PCD板图3.4Proteus仿真图图3 proteus仿真图3.5分电路图及原理说明本次设计的硬件电路由主控部分(单片机MCS-51)、计时部分(实时时钟芯片DS1302)、显示部分(数码管)、调时部分(按键)4个部分组成。
各部分之间相互协作,构成一个统一的有机整体,实现数字时钟的计时功能。
现就各部分的硬件电路设计作出如下论述:3.5.1 主控部分(单片机MCS-51)MCS-51单片机作为主控芯片,控制整个电路的运行。
其外围电路主要有两部分:复位电路和晶体振荡器。
复位电路的功能是:系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号。
为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。
该设计采用含有二极管的复位电路,复位电路可以有效的解决电源毛刺和电源缓慢下降(电池电压不足)等引起的问题,在电源电压瞬间下降时可以使电容迅速放电,一定宽度的电源毛刺也可令系统可靠复位。