DS1302和51单片机设计电子钟数码管显示

合集下载

ds1302数码管显示

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写入时间。

51单片机数码管时钟电路的设计

51单片机数码管时钟电路的设计

51单片机数码管时钟电路的设计设计一个51单片机数码管时钟电路,让我们开始吧。

一、设计思路该数码管时钟电路的设计主要包括以下几个方面:1.使用DS1302时钟芯片获取真实时间;2.使用I2C总线方式将DS1302时钟芯片与51单片机连接;3.使用74HC595芯片驱动数码管显示;4.使用按键控制时钟的设置和调节;5.使用蜂鸣器发出报警声;6.使用LED指示灯显示时钟状态。

二、硬件设计部分数码管显示部分:1.使用4位共阳数码管作为时分显示器,使用1位共阳数码管作为秒显示器;2.使用8片74HC595芯片级联起来,将时分秒数据传输到数码管显示;3.设置共阳数码管的通阳管为P0口,设置74HC595的DS(串行数据输入)、SH(上升沿锁存)、STCP(74HC595的8位锁存输出)引脚接到P1.2、P1.3、P1.4端口;4.设置8个控制引脚接到P1.5~P1.12端口。

实时时钟部分:1.使用DS1302时钟芯片连接到P2.0、P2.1、P2.2、P2.3、P2.4、P2.5、P2.6、P2.7端口;2.设置时钟复位引脚接到P0.1端口,时钟传输使能引脚接到P0.2端口。

按键输入部分:1.设置按键S1接到P3.2端口,按键S2接到P3.3端口;2.设置按键的上拉电阻,使其处于高电平状态;3.设置按键的下降沿触发外部中断,以便检测按键的按下事件。

其他部分:1.设置蜂鸣器接到P0.0端口,并使用普通电阻限流;2.设置LED指示灯接到P0.7端口。

三、软件设计部分1.初始化函数:初始化P0、P1、P2、P3口的状态;2.DS1302驱动函数:包括初始化DS1302芯片和读写DS1302寄存器的函数;3.74HC595驱动函数:包括初始化74HC595芯片,以及向74HC595芯片发送8位数据的函数;4.数码管显示函数:将时分秒数据按位转换为对应的数字和状态,并调用74HC595驱动函数显示;5.按键检测函数:检测按键的按下事件,并根据按键事件的不同触发不同的操作;6.报警函数:当设定时间到达时,将触发报警声,并控制LED灯闪烁;7.主函数:循环读取DS1302时间,并更新数码管显示,检测按键事件,触发报警。

基于51单片机DS1302LCD1602数字时钟显示

基于51单片机DS1302LCD1602数字时钟显示
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]="I LIKE MCU!";
sbit RS=P2^0;
dispaly_string(0x00,lcd_buffer1);
dispaly_string(0x40,lcd_buffer2);
}
}
delay(5);
}
void write_a_byte_tods1302(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
IO=x&0x01;
sclk=1;
sclk=0;
x=x>>1;
}
}
uchar get_a_byte_fromds1302()
{
uchar i,b=0x00;
for(i=0;i<8;i++)
uchar lcd_buffer2[]={"TIME 00:00:00 "};
uchar datetime[7];
void delay(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<120;i++);
}
//忙检测
uchar busy()
{
uchar test;
RW=1;
{

作息时间控制器(基于51单片机和DS1302的时钟).

作息时间控制器(基于51单片机和DS1302的时钟).

课程设计(论文)题目:作息时间控制器院(系):电子工程与自动化学院专业:测控技术与仪器学生姓名:吉哲学号: 0900820413指导教师:徐翠锋职称:讲师2012年12月27日摘要本次作息时间控制器设计是采用AT89S52单片机作为系统的核心元件,在其最小系统基础上与DS1302时钟芯片配合,四个独立按键控制,六位七段数码管显示,无源蜂鸣器发声。

单片机最小系统作为核心处理和控制单元;时钟芯片用来实现实时时间的精准输出和闹钟信息的存储,并可用纽扣电池供电以保持时间的连续运行;独立按键用于进行时间及闹钟的设定;数码管用于显示时间及闹钟信息;蜂鸣器用于在达到设定的时间后进行及时提醒。

关键词:时间控制;AT89S52;单片机;DS1302;时钟芯片;闹铃;定时报警AbstractThis work and rest time controller design is to use AT89S52 SCM as the core of the system components, in its minimum system with DS1302 clock chip based on coordination, four independent key control, six seven period of digital tube display, passive buzzer sound. Single chip microcomputer minimum system as the core processing and control unit; Clock chip to realize real-time time accurate output and alarm information storage, and use button batteries to keep continuous operation time, Independent key for time and alarm clock Settings; Digital tube is used to display the time and alarm information; Buzzer to reach a set time for timely remind.Key words:Time control; AT89S52 devices; SCM; DS1302; Clock chip; Alarm; Timing alarm目录引言 (1)1 课程设计任务及要求 (1)2 硬件设计 (1)2.1 总体设计思路及系统框图 (1)2.2 中央处理控制器 (2)2.3 晶振电路 (3)2.4 时钟信号产生电路 (3)2.5 显示电路 (4)2.6 控制电路 (6)2.7 闹铃电路 (8)2.8 电源及下载电路 (8)3 程序设计 (9)3.1 主程序流程图 (9)3.2 按键扫描程序流程图 (9)3.3 响铃扫描程序 (10)4 制板、组装与调试 (11)4.1 PCB制作 (11)4.2 制作PCB板流程 (11)4.3 调试 (11)5 方案总结 (11)心得体会 (12)谢辞 (13)参考文献 (14)附录 (15)引言时间是人类生活必不可少的重要元素,从古至今它都扮演着一个非常重要的角色。

51单片机_DS1302时钟芯片_共阴数码管_时钟实例【中为电子科技工作室.】

51单片机_DS1302时钟芯片_共阴数码管_时钟实例【中为电子科技工作室.】
read_dat |= 0x80; rtcCK = 1; _nop_(); rtcCK = 0; _nop_(); } return read_dat; }
Page: 3
E:\Demo\Keil3\IS_EB51M_V100_DEMO\12时钟\ds1302.c
//================DS1302读数据函数================// uchar Ds1302Read(uchar read_addr) {
void Ds1302Write(uchar write_addr, uchar write_dat)
{
rtcCE = 0;
rtcCK = 0;
Ds1302WriteByte(write_addr);
//先写地址
Ds1302WriteByte(write_dat);
//再写数据
rtcCK = 0;
rtcCE = 0;
CkntDisplay(ckntSeg[hourL],ckntDig[2]); CkntDisplay(ckntSeg[hourH],ckntDig[3]); }
if(isSetHour == 1) {
blinkHour++; if(blinkHour < 250) {
CkntDisplay(ckntSeg[hourL],ckntDig[2]); CkntDisplay(ckntSeg[hourH],ckntDig[3]); } else if((blinkHour >= 250) && (blinkHour < 500)) { CkntDisplay(ckntSeg[hourL],ckntDig[4]); CkntDisplay(ckntSeg[hourH],ckntDig[4]); } else

51单片机 ds1302万年历 时钟显示

51单片机 ds1302万年历 时钟显示

//DS1302时钟芯片程序#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit CLK=P2^3; //定义口sbit IO=P2^4;sbit RST=P2^5;sbit ACC7=ACC^7;sbit ACC0=ACC^0;uchar a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}, //定义数码管显示码b[8]={0x00,0x00,0x12,0x23,0x11,0x07,0x08,0xbe},//写入时钟数据,最后be突发访问c[7],s,s1,ml1,mh1,ml2,mh2,ml3,mh3; //c存放读.出时钟数据void delay(uint z) // 延时{uint i;uchar j;for(i=z;i>0;i--)for(j=200;j>0;j++);}// 显示子程序void display(uchar mh1,uchar ml1,uchar mh2,uchar ml2,uchar mh3,uchar ml3){uchar x,k,r;for(k=0;k<80;k++){for(r=0;r<8;r++){x=P2&0XF8;P2=x+r ;if(r==2||r==5){ P0=0XBF;delay(3);}//------秒-------if(r==0){P0=a[ml1] ;delay(3) ;}if(r==1){P0=a[mh1] ;delay(3) ;}//------fen---------if(r==3){P0=a[ml2] ;delay(3) ;}if(r==4){P0=a[mh2] ;delay(3) ;}//-----shi---------if(r==6){P0=a[ml3] ;delay(3) ;}if(r==7){P0=a[mh3] ;delay(3) ;}delay(3);}}}//********DS1302读写程序************void w(uchar u) //写入1位字节{uchar i;ACC = u;for(i=8; i>0; i--){IO = ACC0;CLK = 1;CLK = 0;ACC = ACC >> 1;}}uchar r(void) //读出1位字节{uchar i;for(i=8; i>0; i--){ACC = ACC >>1;ACC7 = IO;CLK = 1;CLK = 0;}return(ACC);}void W1302(uchar ucAddr, uchar ucDa){RST = 0;CLK = 0;RST = 1;w(ucAddr); // 地址,命令w(ucDa); //写1Byte数据CLK = 1;RST = 0;}void wclock(uchar *p) //写入时钟多字节数据{uchar i;// W1302(0x80,0x00); //停止时钟W1302(0x8e,0x00); // 允许写RST=0;CLK=0;RST=1;w(0xbe); //写多字节命令for(i=8;i>0;i--){w(*p); //按数组指针逐个写入,写入数据在主函数调用时指向b数组p++;}W1302(0x00,0x50); //启动定时器CLK=1;RST=0;}void rclock(uchar *p) //读出时钟多字节数据{uchar i;RST=0;CLK=0;RST=1;w(0xbf);for(i=7;i>0;i--){*p=r();p++;}CLK=1;RST=0;}void main(void){uchar mh,ml,fh,fl,sh,sl,z,v,q,e,y,t,k;wclock(b);while(1){rclock(c);mh=(c[0]&0xf0)>>4;ml=c[0]&0x0f;fh=(c[1]&0xf0)>>4;fl=c[1]&0x0f;sh=(c[2]&0xf0)>>4;sl=c[2]&0x0f;display(mh,ml,fh,fl,sh,sl);if(mh==3&&ml==0){ for(k=0;k<3;k++){z=(c[3]&0xf0)>>4;v=c[3]&0x0f;q=(c[4]&0xf0)>>4;e=c[4]&0x0f;y=(c[6]&0xf0)>>4;t=c[6]&0x0f;display(z,v,q,e,y,t);}}}}。

基于ds1302的51单片机简易实时时钟-1602显示-源程序

基于ds1302的51单片机简易实时时钟-1602显示-源程序

==================主程序================= #include <reg51.h>。

#include "ds1302.h"#include "LCD1602.h"void change();uchar times[9];uchar date[9];main(){LCD_init();//LCD初始化init_1302(time_1302);gotoxy(1,1);LCD_display("Time:");gotoxy(1,2);LCD_display("Date:");times[8]='\0';//date[8]='\0';while(1){get_1302(time_1302);change();gotoxy(7,1);LCD_display(times);gotoxy(7,2);LCD_display(date);}}/*=========================== 转换子程序===========================*/void change(){// 时间的转换times[0]=time_1302[2]/10+'0';times[1]=time_1302[2]%10+'0';times[2]=':';times[3]=time_1302[1]/10+'0';times[4]=time_1302[1]%10+'0';times[5]=':';times[6]=time_1302[0]/10+'0';times[7]=time_1302[0]%10+'0';// 日期的转换date[0]=time_1302[6]/10+'0';date[1]=time_1302[6]%10+'0';date[2]='-';date[3]=time_1302[4]/10+'0';date[4]=time_1302[4]%10+'0';date[5]='-';date[6]=time_1302[3]/10+'0';date[7]=time_1302[3]%10+'0';}======================================================DS1302驱动程序=============#define uchar unsigned charuchar time_1302[7]={0x00,0x00,0x00,0x03,0x07,0x03,0x08};//设置时间初始值数组// 秒分时号月份星期年sbit T_IO=P1^0; //与硬件相关的连线clk为DS1302的时钟信号线sbit T_CLK=P1^1; //DAT为DS1302的I/O数据线sbit T_RST=P1^2; //RST为DS1302的RST信号线uchar bdata datbyte;sbit datbyte0=datbyte^0;sbit datbyte7=datbyte^7;void get_1302(uchar time[]);void write_ds1302(uchar dat);uchar r_1302(uchar add);void w_1302(uchar add,uchar dat);uchar read_ds1302(void);void init_1302(uchar *time);/*==========================================D S 1 3 0 2 初始化===========================================*/void init_1302(uchar *time){uchar i, add;//uchar time_bcd[7];add=0x80;//0写入,1读出w_1302(0x8e,0x00);for(i=0;i<7;i++){w_1302(add,*time);add+=2;time++;}w_1302(0x8e,0x80);}//===========================// 读取当前时间//===========================void get_1302(uchar time[]){uchar i;uchar add=0x81;w_1302(0x8e,0x00);for(i=0;i<7;i++){time[i]=r_1302(add);add+=2;}w_1302(0x8e,0x80);}/*================================= DS1302写入一个字节(上升沿有效)=================================*/void write_ds1302(uchar dat){uchar i;datbyte=dat;for(i=0;i<8;i++){T_IO=datbyte0;T_CLK=1;T_CLK=0;datbyte=datbyte>>1;}}/*======================================= DS1302读取一个字节(下降沿有效)=======================================*/uchar read_ds1302(void){uchar i;for(i=0;i<8;i++){datbyte=datbyte>>1;datbyte7=T_IO;T_CLK=1;T_CLK=0;}return(datbyte);}/*========================================= 指定位置读取数据=========================================*/uchar r_1302(uchar add){uchar temp,dat1,dat2;T_RST=0;T_CLK=0;T_RST=1;write_ds1302(add);temp=read_ds1302();T_CLK=1;T_RST=0;dat1=temp/16;dat2=temp%16;temp=dat1*10+dat2;return(temp);}/*========================================== 指定位置写入数据==========================================*/void w_1302(uchar add,uchar dat){T_RST=0;T_CLK=0;T_RST=1;write_ds1302(add);write_ds1302(dat/10<<4|dat%10);T_CLK=1;T_RST=0;}=========================================== =============LCD1602驱动程序================#define LCD_DB P0//定义LCD的数据端口sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_E=P2^2;#define uchar unsigned char#define uint unsigned int//===========延时子函数======================== void delay_lcd(uint x){uint i,j;for(i=x;i>0;i--)for(j=0;j<2;j++);}//==================写指令函数================= void LCD_write_command(uchar command){LCD_DB=command;LCD_RS=0;//指令LCD_RW=0;//写入LCD_E=1;LCD_E=0;delay_lcd(1);//等待执行完毕。

DS1302和51单片机设计电子钟数码管显示

DS1302和51单片机设计电子钟数码管显示

DS1302和51单片机设计电子钟数码管显示2010-09-03 10:39DS1302和51单片机设计电子钟数码管显示(未作出防真)#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar dis[16]={0,0,0,0,10,10,0,0,7,2,9,0,9,0,0,2};uchar P2_scan[4]={0xf7,0xfb,0xfd,0xfe}; //位选择显示扫描ucharP0_scan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //数字显示不带小数点ucharP0_scan1[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f} ;//数字显示带小数点char clock[7]={4,0,15,10,27,9,9};uchar tiao,m=0,n=8,S;bit time=0,p=0;sbit CLK = P1^0;sbit IO = P1^1;sbit RST = P1^2;sbit P32 = P3^2;sbit P33 = P3^3;sbit P34 = P3^4;sbit P35 = P3^5;/**************************** 延时函数 **************************/ void delay(uchar time)//延时0.1ms{uchar i,j;do{for(i=0;i<10;i++)for(j=0;j<20;j++);time--;}while (time>0);}/***************************** 复位函数******************************/void reset(){CLK = 0;RST = 0;RST = 1;}/****************************** 字节写入函数***************************/void wbyte(uchar W_Byte){uchar i;for(i =0;i<8;++i){IO=0;if(W_Byte&0x01)IO=1;CLK=0;CLK=1; //一次上升沿写一位,zwj注 W_Byte>>=1;}}/****************************** 字节读取函数****************************/uchar rbyte(){uchar i;uchar R_Byte;uchar TmpByte;R_Byte=0x00;IO=1;for(i=0;i<8;++i){CLK=1;CLK=0;TmpByte=(uchar)IO; //读IO口TmpByte<<=7;R_Byte>>=1 ;R_Byte|=TmpByte;}return R_Byte;}/**************************** DS1302初始化函数**************************/void initialize_DS1302(void){reset();wbyte(0x8e); // 写保护控制寄存器wbyte(0); // 允许写入reset();wbyte(0x90); // 涓流充电控制寄存器wbyte(0xab); // 允许充电, 双二极管, 8K 电阻reset();wbyte(0xbe); // 以多字节突发方式写入时钟数据(8个字节)wbyte(clock[1]); //秒wbyte(clock[2]); //分wbyte(clock[3]); //时wbyte(clock[4]); //日wbyte(clock[5]); //月wbyte(clock[0]); //星期wbyte(clock[6]); //年wbyte(0x00); // 以多字节突发方式写入时钟数据时,必须对写保护控制寄存器写入0值reset();}/**************************** 显示函数 **************************/ void scan(void)//显示函数{uchar k;for (k=0;k<4;k++){if(S>4) P0=~P0_scan[dis[k+S]];else P0=~P0_scan[dis[k+S]];P2=P2_scan[k];delay(5);P0=0x00;P2=0xff;}}/**************************** BCD-非BCD **************************/ void transform(void){uchar k;for(k=0;k<7;++k){clock[k]=(((clock[k] >> 4) * 10) + (clock[k] & 0xf));}}/**************************** 非BCD-BCD **************************/ void transform_1(void){uchar k;for(k=0;k<7;++k){clock[k]=(((clock[k] / 10) << 4) | (clock[k] % 10));}}/**************************** 定时器中断0 **************************/ void timer0(void) interrupt 1{TR0=0 ;if(p==0){reset();wbyte(0xbf); // 以多字节突发方式从DS1302读取时钟数据 clock[1] = rbyte(); // 秒clock[2] = rbyte(); // 分clock[3] = rbyte(); // 小时clock[4] = rbyte(); // 日期clock[5] = rbyte(); // 月份clock[0] = rbyte(); // 星期此程序不用clock[6] = rbyte(); // 年reset();transform();}dis[0]=clock[1]%10;dis[1]=clock[1]/10;dis[2]=clock[2]%10;dis[3]=clock[2]/10;dis[6]=clock[3]%10;dis[7]=clock[3]/10;dis[8]=clock[4]%10;dis[9]=clock[4]/10;dis[10]=clock[5]%10;dis[11]=clock[5]/10;dis[12]=clock[6]%10;dis[13]=clock[6]/10;scan();TH0=0xff ; TL0=0x38 ; TR0=1 ;}/**************************** 主函数 **************************/void main(void){TMOD=0x01 ; TH0=0xff ; TL0=0x38 ; ET0=1 ; EA=1 ; transform_1();initialize_DS1302();TR0=1 ;while(1){if(!P32) //K0键被按下{delay(1); //按键消抖if(!P32){S+=4;if(S == 16) S = 0;while(!P32); //等待按键弹起delay(1);}}}}。

基于51与DS1302时钟芯片数码管显示万年历

基于51与DS1302时钟芯片数码管显示万年历
{
year=read_ds1302(0x8d);//年
mon=read_ds1302(0x89);//月
day=read_ds1302(0x87);//日
week=read_ds1302(0x8b);//星期
hour=read_ds1302(0x85);//时
min=read_ds1302(0x83);//分
void main()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
while (1)
{
set_rtc();//按键
read_rtc();//读取时间
display();//延时函数
dsbz();//判断函数
TR0=1;
}
}
/****************************************判断语句*******************************************************/
void dsbz();//判断语句定义
/**********************************DS1302单字节写入***********************************/
void write_ds1302_byte(uchar dat)
{
uchar i;
for (i=0;i<8;i++)
void set_rtc()
{
if (shi==0)
delay(100);
if (shi==0)
{
hour=(hour>>4)*10+(hour&0x0f);

基于MCS-51和DS1302时钟电路设计

基于MCS-51和DS1302时钟电路设计

基于MCS-51和DS1302时钟电路设计摘要随着现代科技的快速发展,时间的不断流逝,从观太阳、摆钟到现在的电子时钟,人类凭借非凡的智慧不断研究又创造出新的纪录。

美国Dallas公司推出了一种具有涓细电流充电能能力的低功耗实时时钟芯片DS1302,可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。

本设计采用AT89C51单片机作为控制器,功耗小,电压可选用4.5-5.5V供电。

用8位数码管显示年月日也比较直观。

再运用Proteus仿真平台将硬件电路和软件程序结合起来测试验证,最终完成时钟电路设计。

综上所述本文对时钟电路设计的研究具有读取方便、显示直观、功能多样、电路简单、成本低廉优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

关键字:时钟,单片机,DS1302,Proteus目录摘要 (I)目录 (II)1 绪论 (1)1.1课题研究背景 (1)1.2 课题研究的目的与意义 (1)1.3 课题主要研究内容 (1)2 系统设计方案 (2)2.1 单片机芯片选择 (2)2.2 显示模块的选择 (3)2.3 时钟模块的选择 (3)3 硬件电路设计 (3)3.1 电路结构框图 (3)3.2 单片机最小系统设计 (4)3.3 时钟模块电路设计 (5)3.4 显示模块电路设计 (8)4 软件程序设计 (9)5 仿真系统设计 (10)结论 (12)致谢 (13)参考文献 (14)1 绪论1.1课题研究背景万年历在我国已有一千多年的历史,相传为商朝的万年所创,为纪念他的功绩而将该历法命名为“万年历”。

万年历古时通称时宪书或通书,是按照某一特定历法的推算法则编排年、月、日、节气等以供查考的工具书,是人类创造的文化成果之一。

据文学记载,历书大约在距今1100多年前,就已经在中国出现了。

帝制年代,它是皇帝的“垄断品”,所以历书又叫“皇历”。

但真正古老的历书产生于唐顺宗永贞元年(公元805年),之后又包含干支、月令、节气以及各种忌日、星相吉凶、符咒、卜卦等内容。

利用单片机及DS1302制作电子时钟

利用单片机及DS1302制作电子时钟

单片机原理及应用——基于Proteus和Keil C实习报告课程名:利用单片机及DS1302制作电子时钟指导教师:专业:年级:组员:设计时间:XXX大学 XXX学院摘要为了进一步熟悉51单片机地编程以及学习电子时钟地相关设计方法,在老师地指导下我们进行了本次电子时钟地设计.我们在实习期间基于51单片机——A T89C51和时钟芯片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)五、参考文献 (10)附录Ⅰ: (12)附录Ⅱ:程序清单 (13)附录Ⅲ: (21)一、总体设计此电子时钟利用A T89C51单片机和时钟芯片DS1302 设计完成.1.1 设计目地1、通过对电子时钟地设计,进一步熟练掌握单片机编程方法及思想.2、通过对电子时钟地设计,掌握实时时钟芯片DS1302地使用方法.3、通过对电子时钟地设计,进一步掌握独立式键盘地编程控制并认识独立式键盘在实际中地运用.4、通过对电子时钟地设计,增强对单片机地兴趣及动手能力.并在此过程中学会对程序地逐步调试.1.2 硬件功能描述数字钟能够完成24 小时制计时,计时初始化值为00:00:00,用户可以通过按键调整时钟地初值实现校时功能,并且可以通过按键设定一个24 小时以内任意时刻地闹铃,用户可以手动选择闹铃地开或者关两种状态.1.3 设计方案选择计时方案:方案1:采用实时时钟芯片现在市场上有许多实时时钟集成电路,如:DS1287、DS2887、ds1302等.这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据地更新每秒自动进行一次,不需要程序干预.因此,在工业实时测控系统中多采用这这一类专用芯片来实现实时时钟功能.方案2:是用单片机内地可编程定时器.利用单片机内部地定时计数器进行中断定时,配合软件延时实现时分秒地计时.该方案节省硬件成本,但程序设计较复杂.显示方案:一个良好地显示模块对一个系统非常重要,所有操作结果和计时结果,都要通过显示模块来显示出来.同时显示模块提供了良好地人机交互平台.常用地显示模式有LED 7段数码管显示、点阵显示和液晶显示.液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点.但由于液晶其成本偏高.在使用时,不能有静电干扰,否则易烧坏液晶地显示芯片.鉴于LED 7段数码管成本低,也比较容易实现地特点,最终确定使用共阳极数码管来显示.1.4 设计任务及要求任务:设计一个可调时及日期显示地电子时钟要求:1、用DS1302来实现对时间地计算2、用7段LED来显示时间3、加独立式键盘来进行调时二、电子时钟软件和硬件设计2.1 硬件电路设计2.1.1 工作原理此电子时钟可显示地时间范围为:2000年1月1日0点至2100年12月31日23时59分.此时钟在正常计时模式下具有自动调整每月地天数地变化,并用内接电池对时间保持.时间为24小时至.接通电源对时间进行调整,按定时设置键确定被修改位地值.用时钟芯片记忆当前时间并保持,待下次接通电源无须调整能正确显示当前时间.定时设置:菜单按键,松开按键时有效此按键实现闹铃功能,设定一个时间,此时四位数码管第四位地小数点亮起,表示有闹铃设置;当闹铃是可按此键结束闹铃.时、分调整: 加一键,松开按键有效当定时设置键选中要修改地位时,如分(分闪烁时),按此键可以使分地值从当前值开始加一,加至60时变为00(59过后即显示00,不显示60);而时则在加至24时变为00(23过后即显示0,不显示24);日在加至32时变为00(即31过后即显示0,不显示32)。

基于DS1302与单片机的实时电子时钟设计_cqupt

基于DS1302与单片机的实时电子时钟设计_cqupt

目 录
课程分析
方案论证
方案实现
电路与程序设计
测试方案与测试结果
致谢
课程分析
此次课程设计,要求利用51单片机和DS1302设计一个实时电子 时钟。 基本要求: 1.在8位数码管上显示准确的北京时间(09-21-06),采用24 小时制; 2.设置按键可以进行时间校准,按键利用51学习板上的矩阵按键 ,结合实际矩阵键盘的分布,为了方便对键值的处理,初步设计 矩阵键盘的各个功能键的分布如下:
方案论证-比较与选择
• 现有的资源是MC51单片机,要实现的是实 时时间的显示,可以采用两种方案, • 一种是软件的方法,利用中断或者软件延 时来实现时间的产生。由于是采用的纯软 件的方法,时间的误差比较大。 • 另一种方案是采用专用的时钟芯片,来精 确的产生时间。然后用单片机控制数码管 来显示产生的时间。 下一页
实时电子时钟
0110907 左学 李婷 周媛
摘 要
这次所做的实时电子时钟的主体部件包括 MCS-51单片机,数码管,按键,蜂鸣器,DS1302芯片。 其中DS1302是美国DALLAS公司推出的一种高性能、低功耗 的实时时钟芯片,工作电压宽2.5~5.5V,简单的三线接口为 单片机节省大量资源; AT89C51是美国ATMEL公司生产的低功耗,高性能CMOS 8 位单片机. 整体思路是 通过对AT89C51单片机写入程序实现对DS1302读写,读写 出正确的时分秒信息,然后数据用LED显示出来。通过键盘扫 描得到的键值进行键值处理可以进行定时、校时功能以及闹钟 功能。 关键字:MCS-51 数码管 按键 DS1302 蜂鸣器
B)软件部分的测试方案主要测试: 语法格式错误、 全局变量及局部变量的混乱使用、 逻辑上的错误 下一页

电子时钟设计(DS1302)简述基于51单片机

电子时钟设计(DS1302)简述基于51单片机

安康学院单片机课程设计报告书课题名称:电子时钟的设计(DS1302)姓名:学号:院系:电子与信息工程系专业:电子信息工程指导教师:时间:2012年6月设计项目成绩评定表设计报告书目录一、设计目的 (1)二、设计思路 (1)三、设计过程 (1)3.1系统设计结构图 (1)3.2 MCU微控制器电路 (2)3.3 LCD液晶显示电路 (4)3.4 实时时钟电路 (5)3.5 复位电路 (5)3.6 晶振电路 (6)四、系统调试与结果 (6)五、主要元器件与设备 (6)六、课程设计体会 (7)七、参考文献 (7)一、设计目的1、掌握电子时钟的基本工作方式。

2、进一步熟悉DS1302芯片的特性。

3、通过使用各基本指令,进一步熟练掌握单片机的编程和程序调试。

二、设计思路利用AT89C52的特点及DS1302的特点,设计一种基于DS1302单片机控制,再利用数码管显示的数字钟。

本系统硬件利用AT89S52作为CPU进行总体控制,通过DS1302时钟芯片获取准确详细的时间(年、月、日、周、日、时、分、秒准确时间),对时钟信号进行控制,同时利用液晶显示芯片LCD1602对时间进行准确显示年、月、日、周、日、时、分、秒。

三、设计过程3.1系统设计结构图图1系统设计结构图图2 系统软件流程图根据系统设计的要求和设计思路,确定该系统的系统设计结构图。

如图1所示。

硬件电路主要由MCU微处理控制器单元、DS1302时钟电路、储存器、复位电路、晶振电路、数码管显示模块构成。

3.2MCU微控制器电路AT89S52作为系统的核心控制元件,只有它能正常工作后才能使其它的元件进入正常工作状态。

因此,下面对AT89S52进行必要的说明,AT89S52的管脚如图3所示。

图3 AT89S52的管脚1)VCC:40脚,供电电压,一般接+5V电压。

2)GND:20脚,接工作地。

3)P0口:1~8脚,P0口是一个8位漏极开路的双向I/O口。

作为输出口,每位能驱动8个TTL逻辑电平。

DS1302时钟数码管显示

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();}}。

基于51单片机的电子时钟设计

基于51单片机的电子时钟设计

基于51单片机的电子时钟设计
电子时钟是一种使用电子元件和计算机技术制造的时计,它可以显示年、月、日、时、分、秒等时间信息,并且具有显示精确、功能齐全、操
作简便等特点。

本文将基于51单片机设计一个电子时钟。

一、硬件设计:
1.时钟模块:我们可以使用DS1302时钟模块作为实时时钟芯片,它
可以提供精确的时间信息,并且可以通过单片机与之进行通信。

2.显示模块:我们可以使用共阳数码管进行时间的显示,将时钟设计
成6位7段显示器。

3.按键模块:我们可以使用按键作为输入方式,通过按键调整时间信息。

二、软件设计:
1.初始化:首先,我们需要初始化时钟模块和显示模块,使它们正常
工作。

同时,设置时钟的初始时间为系统当前时间。

2.获取时间:通过与时钟模块的通信,获取当前的时间信息,包括年、月、日、时、分、秒等。

3.显示时间:将获取到的时间信息通过显示模块显示出来,分别显示
在6个数码管上。

4.时间调整:通过按键模块的输入,判断用户是否需要调整时间。


果需要,可以通过按键的不同组合来调整时、分、秒等时间信息。

5.刷新显示:通过不断更新显示模块的输入信号来实现时钟的流动性,保持秒针不断运动的效果。

6.时间保存:为了保证时钟断电后依然能够保持时间,我们需要将时
钟模块获取到的时间信息保存在特定的EEPROM中。

7.闹钟功能:可以通过按键设置闹钟,当到达闹钟时间时,会通过蜂
鸣器发出响声。

以上就是基于51单片机的电子时钟设计方案。

通过对硬件和软件的
综合设计,我们可以实现一个功能齐全的电子时钟。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DS1302和51单片机设计电子钟数码管显示
2010-09-03 10:39
DS1302和51单片机设计电子钟数码管显示(未作出防真)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar dis[16]={0,0,0,0,10,10,0,0,7,2,9,0,9,0,0,2};
uchar P2_scan[4]={0xf7,0xfb,0xfd,0xfe}; //位选择显示扫描uchar
P0_scan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //数字显示不带小数点
uchar
P0_scan1[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f} ;//数字显示带小数点
char clock[7]={4,0,15,10,27,9,9};
uchar tiao,m=0,n=8,S;
bit time=0,p=0;
sbit CLK = P1^0;
sbit IO = P1^1;
sbit RST = P1^2;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
/**************************** 延时函数 **************************/ void delay(uchar time)//延时0.1ms
{
uchar i,j;
do{
for(i=0;i<10;i++)
for(j=0;j<20;j++);
time--;
}while (time>0);
}
/***************************** 复位函数
******************************/
void reset()
{
CLK = 0;
RST = 0;
RST = 1;
}
/****************************** 字节写入函数
***************************/
void wbyte(uchar W_Byte)
{
uchar i;
for(i =0;i<8;++i)
{
IO=0;
if(W_Byte&0x01)IO=1;
CLK=0;
CLK=1; //一次上升沿写一位,zwj注 W_Byte>>=1;
}
}
/****************************** 字节读取函数
****************************/
uchar rbyte()
{
uchar i;
uchar R_Byte;
uchar TmpByte;
R_Byte=0x00;
IO=1;
for(i=0;i<8;++i)
{
CLK=1;
CLK=0;
TmpByte=(uchar)IO; //读IO口
TmpByte<<=7;
R_Byte>>=1 ;
R_Byte|=TmpByte;
}
return R_Byte;
}
/**************************** DS1302初始化函数
**************************/
void initialize_DS1302(void)
{
reset();
wbyte(0x8e); // 写保护控制寄存器
wbyte(0); // 允许写入
reset();
wbyte(0x90); // 涓流充电控制寄存器
wbyte(0xab); // 允许充电, 双二极管, 8K 电阻
reset();
wbyte(0xbe); // 以多字节突发方式写入时钟数据(8个字节)
wbyte(clock[1]); //秒
wbyte(clock[2]); //分
wbyte(clock[3]); //时
wbyte(clock[4]); //日
wbyte(clock[5]); //月
wbyte(clock[0]); //星期
wbyte(clock[6]); //年
wbyte(0x00); // 以多字节突发方式写入时钟数据时,必须对写保护控制寄存器写入0值
reset();
}
/**************************** 显示函数 **************************/ void scan(void)//显示函数
{
uchar k;
for (k=0;k<4;k++)
{
if(S>4) P0=~P0_scan[dis[k+S]];
else P0=~P0_scan[dis[k+S]];
P2=P2_scan[k];
delay(5);
P0=0x00;
P2=0xff;
}
}
/**************************** BCD-非BCD **************************/ void transform(void)
{
uchar k;
for(k=0;k<7;++k)
{
clock[k]=(((clock[k] >> 4) * 10) + (clock[k] & 0xf));
}
}
/**************************** 非BCD-BCD **************************/ void transform_1(void)
{
uchar k;
for(k=0;k<7;++k)
{
clock[k]=(((clock[k] / 10) << 4) | (clock[k] % 10));
}
}
/**************************** 定时器中断0 **************************/ void timer0(void) interrupt 1
{
TR0=0 ;
if(p==0)
{
reset();
wbyte(0xbf); // 以多字节突发方式从DS1302读取时钟数据 clock[1] = rbyte(); // 秒
clock[2] = rbyte(); // 分
clock[3] = rbyte(); // 小时
clock[4] = rbyte(); // 日期
clock[5] = rbyte(); // 月份
clock[0] = rbyte(); // 星期此程序不用
clock[6] = rbyte(); // 年
reset();
transform();
}
dis[0]=clock[1]%10;dis[1]=clock[1]/10;
dis[2]=clock[2]%10;dis[3]=clock[2]/10;
dis[6]=clock[3]%10;dis[7]=clock[3]/10;
dis[8]=clock[4]%10;dis[9]=clock[4]/10;
dis[10]=clock[5]%10;dis[11]=clock[5]/10;
dis[12]=clock[6]%10;dis[13]=clock[6]/10;
scan();
TH0=0xff ; TL0=0x38 ; TR0=1 ;
}
/**************************** 主函数 **************************/
void main(void)
{
TMOD=0x01 ; TH0=0xff ; TL0=0x38 ; ET0=1 ; EA=1 ; transform_1();
initialize_DS1302();
TR0=1 ;
while(1)
{
if(!P32) //K0键被按下
{
delay(1); //按键消抖
if(!P32)
{
S+=4;
if(S == 16) S = 0;
while(!P32); //等待按键弹起
delay(1);
}
}
}
}。

相关文档
最新文档