基于DS1302与数码管设计的电子万年历

合集下载

基于单片机和DS1302的电子万年历设计报告

基于单片机和DS1302的电子万年历设计报告

基于单片机和DS1302的电子万年历设计报告一、设计意义随着科技的不断进步和发展,单片机的使用已经渗透到我们日常生活当中的各个领域,几乎很难找到有哪个领域没有使用单片机的踪迹。

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,以及程控玩具、电子宠物等等,这些都离不开单片机,更不用说自动控制领域的机器人、智能仪表、医疗器械了。

本文设计的电子万年历属于小型智能家用电子产品。

利用单片机进行控制,实时时钟芯片进行记时,外加掉电存储电路和显示电路,可实现时间的调整和显示。

电子万年历既可广泛应用于家庭,也可应用于银行、邮电、宾馆、饭店、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。

因而,此设计具有相当重要的现实意义和实用价值。

二、设计方案本设计以AT89S52单片机为核心,构成单片机控制电路,结合DS1302时钟芯片和24C02 FLASH存储器,显示阳历的年、月、日、星期、时、分、秒和阴历的年、月、日,在显示阴历时间时,能标明是否闰月,同时完成对它们的自动调整和掉电保护,全部信息用液晶显示出来。

输入接口由三个按键来实现,用这三个按键可以对日期和时间进行调整,并可以对闹铃的开关和闹铃的时间进行设置。

闹铃功能通过蜂鸣器来实现。

软件控制程序实现所有的功能。

整机电路使用+5V稳压电源,可稳定工作。

系统框图如图2-1所示,其软硬件设计简单,时间记录准确,可广泛应用于长时间连续显示的系统中。

三、硬件电路设计按照系统设计功能的要求,初步确定设计系统由主控模块、时钟模块、存储模块、键盘接口模块、显示模块和闹铃模块共6个模块组成,电路系统构成框图如图3-1所示。

主控芯片使用52系列AT89S52单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302,存储模块采用美国ATMEL公司生产的低功耗CMOS串行EEPROM存储芯片AT24C02。

数码管万年历ds1302

数码管万年历ds1302

/ZPF(新)//2012//4/29#include <REGX55.H>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar 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-9uchar 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();void Display_18b20(uint temp);/***********DS1302时钟部分子程序******************/typedef struct __SYSTEMTIME__{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;}SYSTEMTIME; //定义的时间类型SYSTEMTIME CurrentTime;#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 0x8Cvoid DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)(4) {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) //实时时钟读取一字节(内部函数)(5) {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;//只有在clk为低时,才能将rst置高DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;//上升沿将数据写入DS1302内部移位寄存器DS1302_RST = 0;}unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据(3){unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;//启动数据传送DS1302InputByte(ucAddr|0x01); // 地址,命令,读操作(4)ucData = DS1302OutputByte(); // 读1Byte数据,应在上升沿前读取(5)DS1302_CLK = 1;DS1302_RST = 0;return(ucData);}void naozhong(uchar x){uchar c = 0;c = 4 * x;Nfen = 0xc1 + c;Nshi = 0xc3 + c;}/***********DS1302按键部分子程序******************/void jia(uchar p, uchar max, uchar com)//p读取时间单位的值,max进制,com地址{p = ((p & 0x70) >>4 ) * 10 + (p & 0x0f);p ++;if(p / max)p =0 ;p = (p / 10) * 16 + p % 10;Write1302(com, p);}void jian(uchar p, uchar max, uchar com)//p读取秒的值,max进制,com地址{p = ((p & 0x70) >>4 ) * 10 + (p & 0x0f);p --;if(p == 255)p = max ;p = (p / 10) * 16 + p % 10;Write1302(com,p);}void keyscan(){if(!key1){delay(5);if(!key1 ){k++;Write1302(0x8e,0x00);if(k==4)k=0, Write1302(0x8e,0x80);while(!key1);}}if(!key2){delay(5);if(!key2){if(dif_flag == 0){switch(k){case 1:jia(Read1302(DS1302_SECOND), 60, 0x80); break;case 2:jia(Read1302(DS1302_MINUTE), 60, 0x82); break;case 3:jia(Read1302(DS1302_HOUR), 24, 0x84); break;}}if(dif_flag == 1){switch(k){case 1:jia(Read1302(DS1302_DAY), 32, 0x86); break;case 2:jia(Read1302(DS1302_MONTH), 13, 0x88); break;case 3:jia(Read1302(DS1302_YEAR), 100, 0x8c); break;}}if(dif_flag == 2){if(k == 1)jia(Read1302(DS1302_WEEK), 8, 0x8a);}while(!key2);}}if(!key3){delay(5);if(!key3){if(dif_flag == 0){switch(k){case 1:jian(Read1302(DS1302_SECOND), 60, 0x80); break;case 2:jian(Read1302(DS1302_MINUTE), 60, 0x82); break;case 3:jian(Read1302(DS1302_HOUR), 24, 0x84); break;}}if(dif_flag == 1){switch(k){case 1:jian(Read1302(DS1302_DAY), 32, 0x86); break;case 2:jian(Read1302(DS1302_MONTH), 13, 0x88); break;case 3:jian(Read1302(DS1302_YEAR), 100, 0x8c); break;}}if(dif_flag == 2){if(k == 1)jian(Read1302(DS1302_WEEK), 8, 0x8a);}while(!key3);}if(key5 ==0);//key5 = 1;}void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组(2){unsigned char ReadV alue;ReadValue = Read1302(DS1302_SECOND);//(3)Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//16进制转为10进制ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadV alue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);}void show_time() //液晶显示程序(1){uchar f=2;DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据(2)read[0]=CurrentTime.Second;read[1]=CurrentTime.Minute;read[2]=CurrentTime.Hour;read[3]=CurrentTime.Week;read[4]=CurrentTime.Day;read[5]=CurrentTime.Month;read[6]=CurrentTime.Year;read[7]=0x00;if(!key){delay(5);if(!key)dif_flag++;while(!key)if(!key5){Write1302(0x8e,0x00);//写写保护寄存器禁止写保护Write1302(0x80,0x00);//写秒Write1302(0x90,0xab);//写充电寄存器Write1302(0x82,0x00);//分Write1302(0x84,0x12);//时Write1302(0x86,0x01);//日Write1302(0x88,0x05);//月Write1302(0x8a,0x02);//周Write1302(0x8c,0x12);//年Write1302(0x8e,0x80);//写保护}}}if(dif_flag==3)dif_flag=0;for(f=2;f>0;f--){if(dif_flag==0)display(read[0],read[1],read[2]);else if(dif_flag==1)display(read[4],read[5],read[6]);else if(dif_flag==2)display(read[3],read[7],read[7]);}}//显示延时函数void dis_delay(uchar x){uchar i;for(i=0;i<x;i++);}void delay(uint x){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}/*****************DS18B20******************/void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command {uint i;DQ = 0; //单片机拉低总线i=70;while(i>0)i--;DQ = 1; //释放总线,即拉高了总线i=4;while(i>0)i--;}bit Read_One_bit() //读取一个字节的数据read a byte date//读数据时,数据以字节的最低有效位先从总线移出{uint i;bit dat;DQ=0;i++;DQ=1;i++;i++;dat=DQ;i=5;while(i>0)i--;return (dat);}uchar Read_One_Byte(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=Read_One_bit();dat=(j<<7)|(dat>>1);}return (dat);}void Write_One_Byte(uchar dat){uint i;uchar j;bit testb;show_time();for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){DQ=0;i++;i++;DQ=1;i=5;while(i>0)i--;}else{DQ=0;i=5;while(i>0)i--;DQ=1;i++;i++;}}}void tmpchange(void){uchar f;Init_Ds18b20();f=70;while(f>0)f--;Write_One_Byte(0xcc); //忽略ROM指令Write_One_Byte(0x44); //温度转换指令}uint Get_Tmp() //获取温度get the temperature{uchar a,b,f;Init_Ds18b20(); //初始化f=70;while(f>0)f--;show_time();Write_One_Byte(0xcc); //忽略ROM指令Write_One_Byte(0xbe); //温度转换指令a = Read_One_Byte(); //读取到的第一个字节为温度LSBb = Read_One_Byte(); //读取到的第一个字节为温度MSBshow_time();if(b>127){flag=1;a=~a;b=~b;a+=0x01;}else{flag=0;}temp = b; //先把高八位有效数据赋于temptemp <<= 8; //把以上8位数据从temp低八位移到高八位temp = temp|a; //两字节合成一个整型变量f_temp = temp*0.0625; ////temp = (f_temp*10+0.5)*0.9; //放大十倍//0.9调试加上理论不需要temp = f_temp*10+0.5;//f_temp=f_temp+0.5; // //同时进行一个四舍五入操作。

基于DS1302时钟芯片的电子万年历设计

基于DS1302时钟芯片的电子万年历设计

基于DS1302时钟芯片的电子万年历设计【摘要】本文阐述了一种基于DS1302时钟芯片的电子万年历软硬件设计方法。

绘制了电路图,并给出了该电子万年历的部分C语言源代码。

【关键词】DS1302;时钟芯片;单片机0.引言时钟芯片被广泛应用于需要时间信息的电路设计领域中。

当今市场上的时钟芯片种类繁多,比如DS1302、DS12C887、PCF8485、SB2068等。

其中DS1302具有价格低、功耗小、易操作等优点,故本文选用DS1302作为本次设计的时钟芯片。

1.电路连接电路连接图如图1所示,主要包括STC89C52单片机、DS1302、12864液晶屏和3个独立按键等电子元器件。

1.1 DS1302简介及其与单片机的接口电路DS1302是DALLAS公司推出的涓流充电时钟芯片,可提供秒、分、时、日、月、年、周等时间信息,通过串行接口与单片机进行通信,并且仅需用到3个口线,功率小于1mW,被广泛应用于便携式仪器及其他电池供电的仪器仪表。

下面阐述DS1302的电路连接问题:DS1302一共有8个管脚,其中第1脚接5V电源,4脚接地;2脚和3脚跨接一个32.768KHz的无源晶振,该晶振作为DS1302的正常工作提供时钟脉冲;8脚为外部备用电源输入端,本文使用一个3.3V的纽扣电池作为备用电源,当系统掉电后,备用电源立即给DS1302供电,可以避免DS1302内部时间信息的丢失;5脚、6脚、7脚为DS1302的3个控制端,分别接至单片机的P3.7、P3.6、P3.5口,5脚REST为复位端,低电平有效,6脚I/O为数据输入输出口,7脚CLK为串行时钟信号输入端,该时钟信号由单片机提供。

1.2 独立按键接口电路本文在设计时使用到了3个独立按键,其一端共同接地,另外一端分别接至单片机P1.0、P1.1、P1.2。

当按键被按下时,对应的单片机端口将出现低电平,单片机通过判断该低电平信号来获知相应按键被按下,本文通过这3个按键来设定时间。

DS1302万年历

DS1302万年历

#define DS1302_IO_HIGH io_DS1302_IO = 1 ;
#define DS1302_IO_LOW io_DS1302_IO = 0 ;
#define DS1302_IO_READ io_DS1302_IO
sbit key4=P3^3; //减
sbit key5=P3^4; //返回
int main_flag=0;//,exit_flag,up_flag,down_flag;
void Time0_int()
{
TMOD=0X01;
TH0=0XF8; //@11.0592MHz 定时2ms
/*****************************************************************************
功能:显示时间日期万年历。上电显示时间,格式:小时-分钟-秒。
按下key1显示日期,格式:月-天-星期
按下key2调节闪烁位置,进行更改时间操作
#define KEY_PRESS 0x80 //1000 0000
#define KEY_LONG 0x40 //0100 0000
#define KEY_STATE_INIT 0
#define KEY_STATE_PRESS 1
#define KEY_STATE_LONG 2
#define DS1302_WEEK_WRITE 0x8A
#define DS1302_DAY_WRITE 0x86
#define DS1302_MONTH_WRITE 0x88
#define DS1302_YEAR_WRITE 0x8C

基于单片机DS1302的时钟万年历

基于单片机DS1302的时钟万年历

#include<>#define uchar unsigned char#define uint unsigned intsbit lcdws=P2^1; //1602管脚定义sbit lcden=P2^0;sbit lcdrs=P2^2;sbit key1=P2^3; //闹钟设置键sbit key2=P2^4;sbit key3=P1^5;//功能键定义sbit key4=P1^6;//增大键定义sbit key5=P1^7;//减小键定义uchar shi,fen,miao,ashi,afen,amiao,year,month,day,week; uchar s1num=0,s1num2=0,temp;bit flag;float f_temp;uint i,d;uchar code table2[]={0x20,0x20,0x2e,0x20,0xdf,0x43}; uchar code table[]="20 - - ";uchar code table1[]=" : : ";sbit ds=P1^0;//ds18b20信号线sbit beep=P1^4; //蜂鸣器管脚定义sbit ACC_7 = ACC^7; //位寻址寄存器定义sbit SCLK = P1^2; // DS1302时钟信号sbit DIO= P1^1; // DS1302数据信号sbit CE = P1^3;//地址、数据发送子程序//void delay2(uint ms)// {// uchar t;// while(ms--); for(t=0;t<120;t++);//}// void playmusic()// {// uint i2=0,j2,k2;// while(jiepai[i2]!=0||song[i2]!=0)// {// for(j2=0;j2<jiepai[i2]*20;j2++)// {// beep=~beep;// for(k2=0;k2<song[i2]/3;k2++);// }// delay2(10);// i2++;// }// }void write_1302( uchar addr,uchar dat ){uchar i,temp;CE=0; //CE 引脚为低,数据传送中止 SCLK=0; //清零时钟总线CE = 1; //CE 引脚为高,逻辑控制有效 //发送地址for ( i=8; i>0; i-- ) //循环8次移位{SCLK = 0;temp = addr;DIO = (bit)(temp&0x01); //每次传输低字节 addr >>= 1; //右移一位SCLK = 1;}//发送数据for ( i=8; i>0; i-- ){SCLK = 0;temp = dat;DIO = (bit)(temp&0x01);dat >>= 1;SCLK = 1;}CE = 0;}//数据读取子程序uchar Read1302 ( uchar addr ){unsigned char i,temp,dat1,dat2;CE=0;SCLK=0;CE = 1;//发送地址for ( i=8; i>0; i-- ) //循环8次移位 {SCLK = 0;temp = addr;DIO = (bit)(temp&0x01); //每次传输低字节 addr >>= 1; //右移一位 SCLK = 1;}//读取数据for ( i=8; i>0; i-- ){ACC_7=DIO;SCLK = 1;ACC>>=1;SCLK = 0;}CE=0;dat1=ACC;dat2=dat1/16; //数据进制转换//十六进制转十进制dat1=dat1%16;dat1=dat1+dat2*10;return (dat1);}//初始化 DS1302void Initial(void) //初始化1302 2010年09月30日23点58分56秒星期一{write_1302 (0x8e,0x00); //允许写保护write_1302 (0x80,0x56); //秒位初始化write_1302 (0x82,0x58); //分钟初始化write_1302 (0x84,0x23); //小时初始化write_1302 (0x86,0x30); //日初始化write_1302 (0x88,0x09); //月初始化write_1302 (0x8c,0x10); //年初始化write_1302 (0x8a,0x01); //日期始化write_1302 (0x8e,0x80); //禁止写保护}void delay(uint z)//延时1ms{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com)//1602写命令{lcdrs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date)//1602写数据{lcdrs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void dsreset(void) //DS18B20,初始化函数{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit tempreadbit(void)//读1位数据函数{uint i;bit dat;ds=0;i++;ds=1;i++;i++;//i++起到延时作用dat=ds;i=8;while(i>0)i--;return(dat);}uchar tempread(void) //读一个字节数据函数{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1);}return(dat);}void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb)//写1{ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}else{ds=0; //写0i=8;while(i>0)i--;ds=1;i++;i++;}}}void tempchange(void) //DS18B20开始获取温度并转换{dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0x44);}uint get_temp() //获取温度{uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread(); //读高8位b=tempread(); //读低8位temp=b;temp<<=8; //两个字节组合成1个字节temp=temp|a;f_temp=temp*;temp=f_temp*10+;f_temp=f_temp+; //温度在寄存器中为12位,分辨率为^ return temp;}void display(uchar addr,uchar dat){write_com(0x80+0x40+addr);write_data(0x30+dat);delay(5);}void dis_temp(uint t){uchar i;i=t/100;display(10,i);i=t%100/10;display(11,i);i=t%100%10;display(13,i);}void init()//初始化程序{uchar num;flag=1;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num++){write_data(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<8;num++){write_data(table1[num]);delay(5);}write_com(0x80+0x40+10);for(num=0;num<6;num++){write_data(table2[num]);delay(10);}}void di()//蜂鸣器响函数{beep=0;delay(100);beep=1;}void write_sfm(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}void write_nyrz(uchar add,uchar date)//显示年,月,日,周{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}void display_week(uchar we){write_com(0x80+12);switch(we){case 1: write_data('M');delay(5);write_data('O');delay(5);write_data('N');break;case 2: write_data('T');delay(5);write_data('U');delay(5);write_data('E');break;case 3: write_data('W');delay(5);write_data('E');delay(5);write_data('D');break;case 4: write_data('T');delay(5);write_data('H');delay(5);write_data('U');break;case 5: write_data('F');delay(5);write_data('R');delay(5);write_data('T');break;case 6: write_data('S');delay(5);write_data('A');delay(5);write_data('T');break;case 7: write_data('S');delay(5);write_data('U');delay(5);write_data('N');break;}}void keyscan()//按键设置{if(key3==0)//功能键按下{flag=0;delay(5);if(key3==0){s1num++;while(!key3);di();switch(s1num)//光标闪烁定位{case 1:write_com(0x80+0x40+7);//定位到秒的位置write_com(0x0f);break;case 2:write_com(0x80+0x40+4);//定位到分的位置write_com(0x0f);break;case 3:write_com(0x80+0x40+1);//定位到小时的位置write_com(0x0f);break;case 4:write_com(0x80+0x0e);//定位到星期的位置write_com(0x0f);break;case 5:write_com(0x80+0x9);//定位到日的位置write_com(0x0f);break;case 6:write_com(0x80+0x6);//定位到月的位置write_com(0x0f);break;case 7:write_com(0x80+0x3);//定位到年的位置write_com(0x0f);break;case 8: s1num=0;//复位,时钟走write_com(0x0c);flag=1;write_1302 (0x8e,0x00); //允许写保护 write_1302 (0x80,miao); //秒位初始化 write_1302 (0x82,fen); //分钟初始化write_1302 (0x84,shi); //小时初始化 write_1302 (0x86,day); //日初始化write_1302 (0x88,month); //月初始化write_1302 (0x8c,year); //年初始化write_1302 (0x8a,week); //日期始化write_1302 (0x8e,0x80); //禁止写¥break;}}}if(s1num!=0)//只有功能键按下后,增大,增小建才有效{if(key4==0)//增大建{delay(5);if(key4==0){while(!key4);di();switch(s1num){case 1: miao++;if(miao==60)miao=0;write_sfm(6,miao);//write_1302(write_second,miao);write_com(0x80+0x40+7);break;case 2: fen++;if(fen==60)fen=0;write_sfm(3,fen);//write_1302(write_minute,fen);write_com(0x80+0x40+4);break;case 3: shi++;if(shi==24)shi=0;write_sfm(0,shi);write_com(0x80+0x40+1);break;case 4: week++;if(week==8)week=1;display_week(week);write_com(0x80+14);break;case 5: day++;if(day==31)day=1;write_nyrz(8,day);write_com(0x80+9);break;case 6: month++;if(month==13)month=1;write_nyrz(5,month);write_com(0x80+6);break;case 7: year++;if(year==99)year=0;write_nyrz(2,year);write_com(0x80+3);break;}}}if(key5==0)//减小键{delay(5);if(key5==0){while(!key5);di();switch(s1num){case 1: miao--;if(miao==-1)miao=59;write_sfm(6,miao);write_com(0x80+0x40+7);break;case 2: fen--;if(fen==-1)fen=59;write_sfm(3,fen);write_com(0x80+0x40+4);break;case 3: shi--;if(shi==-1)shi=23;write_sfm(0,shi);write_com(0x80+0x40+1);break;case 4: week--;if(week==-1)week=7;display_week(week);write_com(0x80+14);break;case 5: day--;if(day==0)day=31;write_nyrz(8,day);write_com(0x80+9);break;case 6: month--;if(month==0)month=12;write_nyrz(5,month);write_com(0x80+6);break;case 7: year--;if(year==-1)year=99;write_nyrz(2,year);write_com(0x80+3);break;}}}}}void set_alarm(){if(key1==0)//功能键按下{delay(5);if(key1==0){while(!key1);flag=0;s1num2++;write_sfm(6,amiao);write_com(0x80+0x40+7);write_sfm(3,afen);write_com(0x80+0x40+4);write_sfm(0,ashi);write_com(0x80+0x40+1);di();switch(s1num2)//光标闪烁定位{case 1:write_com(0x80+0x40+7);//定位到秒的位置write_com(0x0f);break;case 2:write_com(0x80+0x40+4);//定位到分的位置write_com(0x0f);break;case 3:write_com(0x80+0x40+1);//定位到小时的位置write_com(0x0f);break;case 4: s1num2=0;//复位,时钟走write_com(0x0c);flag=1;// write_1302(0x8e,0x00);//允许写保护write_1302 (0x8e,0x80);break;}}}if(s1num2!=0)//只有功能键按下后,增大,增小建才有效{if(key2==0)//增大建{delay(5);if(key2==0){while(!key2);di();switch(s1num2){case 1: amiao++;if(amiao==60)amiao=0;write_sfm(6,amiao);write_com(0x80+0x40+7);break;case 2: afen++;if(afen==60)afen=0;write_sfm(3,afen);write_com(0x80+0x40+4);break;case 3: ashi++;if(ashi==24)ashi=0;write_sfm(0,ashi);write_com(0x80+0x40+1);break;}}}}}void main()//主函数{Initial();lcdws=0;init();// IntConfiguration();tempchange();for(i=10;i>0;i--){dis_temp(get_temp());}while(1){keyscan();//按键扫描// while((key1&&key2&&key3&&key4&&key5)&&((fen==afen)&&(shi==ashi))) // {// beep=0;// delay(500);// beep=1;// }if(flag==1){miao=Read1302(0x81);//显示秒write_sfm(6,miao);fen=Read1302(0x83);//显示分write_sfm(3,fen);shi=Read1302(0x85);//显示小时write_sfm(0,shi);day=Read1302(0x87);//显示日write_nyrz(8,day);month=Read1302(0x89);//显示月write_nyrz(5,month);year=Read1302(0x8d);//显示年write_nyrz(2,year);week=Read1302(0x8b);//显示日期display_week(week);}else{write_1302(0x80,0x80);//时钟振荡器停止}set_alarm();}}。

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

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

DS1302设计的可调万年历(实测正常,附有程序)ds1302设计的可调万年历(本制作所用数码管全为共阳数码管)我刚开始想要搞万年历的时候就是玩游戏打听别人的程序,可是辨认出打听了很多都不理想,必须不就没有日历和时间一起表明,必须不就无法阳入时间的,后来我研究了两天,自己终于把程序编成了出。

不好了,废话我就不多说道,本制作我已经把实物搞了出,确保没问题!下面附有仿真图和实物图。

拍摄的效果不够好,但实物是不错的,本人实物中用三级管代替了仿真图的74hc04非门,用哪个都是可以的……请注意:本程序分后两个c文件的,如果不能编成,可以q我:1107588997我轻易播发程序过去给你……软件源程序:(初始化程序只在已经开始时用一次,之后必须把它屏蔽掉)#include#include#includeuchartime_data[7]={0,0,0,0,0,0,0};ucharwrite_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};ucharread_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};voidwrite_ds1302_byte(uchardat){uchari;for(i=0;i<8;i++){sck=0;io=dat&0x01;dat=dat>>1;sck=1;}}voidwrite_ds1302(ucharadd,uchardat){rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);write_ds1302_byte(dat);rst=0;_nop_();io=1;sck=1;}ucharread_ds1302(ucharadd){uchari,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;returnvalue;}voidread_rtc(void){uchari;for(i=0;i<7;i++){time_data[i]=read_ds1302(read_add[i]);}}voidtime_pros(void){nian=time_data[0]/16*10+time_data[0];yue=time_data[2]/16*10+time_data[2];ri=ti me_data[3]/16*10+time_data[3];xi=time_data[1]/16*10+time_data[1];shi=time_data [4]/16*10+time_data[4];fen=time_data[5]/16*10+time_data[5];miao=time_data[6]/1 6*10+time_data[6];}voidmain(){//init_ds1302();//初始化while(1){read_rtc();time_pros();display();button();}}//----------------------------zichengxu.c----------------------------------------------#defineduan1p2#defineduan2p3#defineweip0#defineuintunsignedint#defineucharunsignedcharsbitsck=p1^1;sbitio=p1^0;sbitrst =p1^2;sbitk1=p1^4;sbitk2=p1^5;sbitk3=p1^6;sbitk4=p1^7;ucharshi,fen,miao,nian,yue,ri,xi,menu,y;unsignedcharcodequan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; voidwrite_ds1302_byte(uchardat);voidwrite_ds1302(ucharadd,uchardat);ucharread_ds1302(ucharadd);//voidinit_ds1302(void);//初始化voidread_rtc(void);voidtime_pros(void);voiddisplay(void);voidbutton(void);voiddelay(uintz){ucharx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*(voidinit_ds1302(void)//初始化{write_ds1302(0x8e,0x00);write_ds1302(0x80,0x00);write_ds1302(0x82,0x20);write_ ds1302(0x84,0x09);write_ds1302(0x86,0x25);write_ds1302(0x88,0x12);write_ds1302 (0x8a,0x06);write_ds1302(0x8c,0x10);write_ds1302(0x90,0x01);write_ds1302(0xc0, 0xf0);write_ds1302(0x8e,0x80);}*/voiddisplay(void){wei=0;duan1=quan[2];if(menu==3&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0){duan2=0xff;}elseduan2=quan[shi/10];delay(2);duan1=0xff;duan2=0xff;wei=1;duan1=quan[0];if(menu==3&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0){duan2=0xff;}elseduan2=quan[shi];delay(2);duan1=0xff;duan2=0xff;。

基于时钟日历芯片DS1302的万年历设计

基于时钟日历芯片DS1302的万年历设计

基于时钟日历芯片DS1302的万年历设计黄豪民摘要随着科学技术的发展,万年历的设计也层出不穷。

本设计以单片机AT89C51和DS1302为核心,结合译码器74HC154和驱动芯片74LS244,以及模拟键盘,LED 显示电路等构成一个可控及显示精确的万年历时间系统。

DS1302为一个实时时钟芯片,具有较高时间精度,它与单片机进行串口通信,单片机通过与它的通信,取出其时间寄存器中的值,再通过相应的电路,把时间值通过LED显示,如果显示的值与标准时间不同,此系统就经过模拟键盘灵活控制,调节DS1302中时间寄存器中的值,达到与标准时间同步。

关键词AT89C51,DS1302ABSTRACTAlong with science and technology's development, the designs of the perpetual calendar have many meanings. This design uses the microprocessor AT89C51 and the chip DS1302, with the decoder chip 74HC154, the drive chip 74LS244, the simulative keyboard, the LED display and so on to constitute the perpetual calendar system which can control and display precisely.DS1302 is a real-time clock chip and has the high time precision, it communicates with the microprocessor via the serial interface. The microprocessor takes out DS1302’s time register value by the communication, at last the LED displays the time value by the corresponding circuit. If the time value is different from the standard time, the simula tion keyboard can adjust conveniently DS1302’s time register value, achieving with the standard time synchronously.Keywords AT89C51,DS1302目录摘要 (I)ABSTRACT (II)1 绪论 (1)2 功能要求 (3)3 方案论证 (3)3.1 显示器的选择 (3)3.1.1 VFD显示器 (3)3.1.2 LED显示器 (3)3.1.3 LCD液晶显示器 (4)3.2 编程语言的选择 (4)3.2.1 单片机汇编语言 (4)3.2.2 单片机C语言 (4)3.3 微处理器的选择 (5)4 硬件电路 (6)4.1 DS1302时钟芯片 (7)4.1.1 DS1302简介 (7)4.1.2 DS1302的控制字节 (8)4.1.3 数据的输出 (9)4.1.5 DS1302的寄存器 (9)4.1.6 DS1302的读写方式 (11)4.1.7 DS1302时序图 (12)4.1.8 DS1302电路 (13)4.2 单片机AT89C51 (14)4.2.1 单片机AT89C51简介 (14)4.2.2 单片机引脚简介 (15)4.2.3 低功耗模式 (18)4.3 模拟键盘的设计 (19)4.4 LED显示器的设计 (20)4.5 74LS244芯片 (21)5 软件设计 (25)5.1 系统软件设计原理 (25)5.2 键盘扫描子程序 (25)5.3 显示子程序 (26)5.4 DS1302控制子程序 (27)5.5 主函数 (27)6 软件平台 (28)6.1 Proteus软件 (28)6.2 KEIL软件 (31)7 结论 (33)参考文献 (34)附录A:部分单片机源程序 (35)致谢 (38)1 绪论在科技日新月异发展的今天,人们对时间概念的认识显得尤为深刻,“时间就是金钱”,“时间就是生命”等警句更是激励着人们努力工作,把握时间。

基于DS1302的万年历

基于DS1302的万年历

基于DS1302的万年历(N个数码管显示)2009-06-11 18:49#include <reg51.h>code unsigned char key_code[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x88,0x83,0xc6,0xa1,0x86,0x 8e,0xff};unsigned int code TAB1[13]={0,0,31,59,90,120,151,181,212,243,273,304,334};unsigned int code TAB2[13]={0,0,31,60,91,121,152,182,213,244,274,305,335};unsigned char sec,min,hour,day,week,month,year,moth;old_day,old_month;unsigned char w=0,led[19],typ,l_day,h_day;unsigned char DS1302_ADDR _at_ 0x32;unsigned char DS1302_DA TA _at_ 0x31;unsigned char outkey _at_ 0x70;unsigned char tt=0;bit sett=1,g,h=0,leap;//读void read(){#pragma asmCLR P2.7NOPNOPSETB P2.5NOPMOV A,32HMOV R4,#08HREAD1:RRC ANOPMOV P2.6,CNOPNOPNOPSETB P2.7NOPNOPNOPCLR P2.7NOPNOPDJNZ R4,READ1MOV R4,#08HREAD2:CLR P2.7NOPNOPNOPMOV C,P2.6NOPNOPNOPNOPNOPRRC ANOPNOPNOPNOPSETB P2.7NOPDJNZ R4,READ2MOV 31H,ACLR P2.5#pragma endasm}//写void write(){#pragma asmCLR P2.7NOPSETB P2.5NOPMOV A,32HMOV R4,#8WRITE1:RRC ANOPNOPCLR P2.7NOPNOPNOPMOV P2.6,CNOPNOPNOPSETB P2.7NOPNOPDJNZ R4,WRITE1CLR P2.7NOPMOV A,31HMOV R4,#8WRITE2:RRC ANOPCLR P2.7NOPNOPMOV P2.6,CNOPNOPNOPSETB P2.7NOPNOPDJNZ R4,WRITE2CLR P2.5#pragma endasm}//延时void delay(void){unsigned char i,j;for(i=0;i<5;i++)for(j=0;j<255;j++);}//读键unsigned char got_key(){ unsigned char ks_1,ks_2;ks_1=~P1;ks_1=(ks_1&0x0f);//保留p1.0/p1.1/p1.2/p1.3 delay();ks_2=~P1;ks_2=(ks_2&0x0f);//保留p1.0/p1.1/p1.2/p1.3 if(ks_1==ks_2) return(ks_1);else return(0);}//输出void outof(){#pragma asmMOV A,70HMOV R4,#8OUT_1:RRC AACALL DELCLR P3.1ACALL DELMOV P3.0,CACALL DELSETB P3.1ACALL DELDJNZ R4,OUT_1SJMP OUT_2DEL: MOV R1,#30DJNZ R1,$RETOUT_2:#pragma endasm}//更新void newh_1(unsigned char *p){ DS1302_ADDR=0x8d;//年read();p[0]=DS1302_DA TA;DS1302_ADDR=0x8b;//星期read();p[1]=DS1302_DA TA;DS1302_ADDR=0x89;//月read();p[2]=DS1302_DA TA;DS1302_ADDR=0x87;//日read();p[3]=DS1302_DA TA;}void newh(){unsigned char i,new_1[4],new_2[4];while(i<4){newh_1(new_1);delay();newh_1(new_2);for(i=0;i<4;i++) {if(new_1[i]!=new_2[i]) break;} }year=new_1[0];week=new_1[1];month=new_1[2];day=new_1[3];}void newl(){ DS1302_ADDR=0x85;//时read();hour=DS1302_DATA;DS1302_ADDR=0x83;//分read();min=DS1302_DATA;DS1302_ADDR=0x81;//秒read();sec=DS1302_DATA;}void newd_1(unsigned char *p)//更新安全天数{ DS1302_ADDR=0xc7;read();p[0]=DS1302_DA TA;DS1302_ADDR=0xc9;read();p[1]=DS1302_DA TA;DS1302_ADDR=0xcb;read();p[2]=DS1302_DA TA;DS1302_ADDR=0xcd;read();p[3]=DS1302_DA TA;}void newd(){unsigned char i,new_1[4],new_2[4];while(i<4){newd_1(new_1);delay();newd_1(new_2);for(i=0;i<4;i++) {if(new_1[i]!=new_2[i]) break;} }l_day=new_1[0];h_day=new_1[1];old_day=new_1[2];old_month=new_1[3];}//数据存储void updata(){DS1302_ADDR=0x8e;DS1302_DATA=0x00;//允许写入write();DS1302_ADDR=0x8c;DS1302_DATA=year;//写入年write();DS1302_ADDR=0x88;DS1302_DATA=month;//写入月write();DS1302_ADDR=0x86;DS1302_DATA=day;//写入日write();DS1302_ADDR=0x8a;DS1302_DATA=week;//写入星期write();DS1302_ADDR=0x84;DS1302_DATA=hour;//写入时write();DS1302_ADDR=0x82;DS1302_DATA=min;//写入分write();DS1302_ADDR=0x80;DS1302_DATA=sec;//写入秒write();DS1302_ADDR=0x8e;DS1302_DATA=0x80;//禁止写入write();}void updatad()//写入安全天数{DS1302_ADDR=0x8e;DS1302_DATA=0x00;//允许写入write();DS1302_ADDR=0xc6;DS1302_DATA=l_day;write();DS1302_ADDR=0xc8;DS1302_DATA=h_day;write();DS1302_ADDR=0xca;DS1302_DATA=day;write();DS1302_ADDR=0xcc;DS1302_DATA=month;write();DS1302_ADDR=0x8e;DS1302_DATA=0x80;//禁止写入write();}//中断显示void out() interrupt 1{unsigned char i;TR0=0;TH0=0x3c;TL0=0xb0;TR0=1;tt=tt+1;if(tt==10) g=1;if(tt>=20) {tt=0;g=0;typ+=1;}if(sett){newl();if(sec!=0) h=0;if (hour==0&&min==0&&sec==0&&!h){newh();l_day+=1;if(l_day==100){l_day=0;h_day+=1;}h=1;updatad();}}led[0]=l_day%10;led[1]=l_day/10;led[2]=h_day%10;led[3]=h_day/10;led[4]=hour/16;led[5]=hour%16;led[6]=2;led[7]=0;led[8]=year/16;led[9]=year%16;led[10]=month/16;led[11]=month%16;led[12]=day/16;led[13]=day%16;led[14]=min/16;led[15]=min%16;led[16]=sec/16;led[17]=sec%16;led[18]=week;for(i=0;i<19;i++){if (!sett && h && !g && ((w==7 && (i<4))||(w==6 && (i==6||i==7||i==8||i==9))||(w==5 && (i==10||i==11))||(w==4 && (i==12||i==13))||(w==3 && (i==4||i==5))||(w==2 &&(i==14||i==15))||(w==1 && (i==16||i==17)))) outkey=key_code[16];else outkey=key_code[led[i]];outof();}#pragma asmCLR P3.5NOPNOPSETB P3.5#pragma endasm}//判断闰年void judge_year(unsigned char x){unsigned int y=2000+x;if((y%4==0&&y%100!=0)||(y%400==0))leap=1;elseleap=0;}//计算星期void weekday(){ unsigned char temp,i=0,j=0,mon;for(temp=0;temp<(year/16*10+year%16);temp++){ judge_year(temp);if(leap==1)i+=1;elsej+=1;}mon=month/16*10+month%16;judge_year(year/16*10+year%16);if(leap==1)week=((i*366+j*365+ TAB2[mon]+(day/16*10+day%16-1))%7+6)%7;elseweek=((i*366+j*365+ TAB1[mon]+(day/16*10+day%16-1))%7+6)%7;if(week==0) week=7;}//时钟设置void switch_add(){switch(w){case 6:year+=1;if(year%16==10) year=year+6;if(year/16==10) year=0;judge_year(year);break;case 5:month+=1;if(month%16==10) month=month+6;if(month>=19) month=1;break;case 4:day+=1;if(day%16==10) day=day+6;if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==16)||(month==18)) moth=1;else if((month==4)||(month==6)||(month==9)||(month==17)) moth=2;else moth=0;switch(moth){case 0:if(leap==0){if(day>=41) day=1;}elseif(day>=48) day=1;break;case 1:if(day>=50) day=1;break;case 2:if(day>=49) day=1;break;default:break;}break;case 3:hour+=1;if(hour%16==10) hour=hour+6;if(hour>=36) hour=0;break;case 2:min+=1;if(min%16==10) min=min+6;if(min>=96) min=0;break;case 1:sec+=1;if(sec%16==10) sec=sec+6;if(sec>=96) sec=0;break;default:break;}}void switch_sub(){ switch(w){case 6:year-=1;if(year%16>=10) year=year-6;if(year>=154) year=153;judge_year(year);break;case 5:month-=1;if(month%16>=10) month=month-6;if(month==0) month=18;break;case 4:day-=1;if(day%16>=10) day=day-6;if(day==0){if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==16)||(month==18)) moth=1;else if((month==4)||(month==6)||(month==9)||(month==17)) moth=2;else moth=0;switch(moth){case 0:if(leap==0) day=40;else day=41;break;case 1:day=49;break;case 2:day=48;break;default:break;}}break;case 3:hour-=1;if(hour%16>=10) hour=hour-6;if(hour>=36) hour=35;break;case 2:min-=1;if(min%16>=10) min=min-6;if(min>=96) min=89;break;case 1:sec-=1;if(sec%16>=10) sec=sec-6;if(sec>=96) sec=89;break;default:break;}}void set1(){unsigned char key;w=6;while(w>0){h=1;key=got_key();if(key==1) {w=0;while (key!=0) key=got_key();}if(key==2) {--w;while (key!=0) key=got_key();}if(key==4){switch_add();typ=0;while (key!=0){key=got_key();if(typ>=2){h=0;while (key!=0){if(key==4 && tt%5==0) {switch_add();while (tt%5==0);}key=got_key();}}}}if(key==8){switch_sub();typ=0;while (key!=0){key=got_key();if(typ>=2){h=0;while (key!=0){if(key==8 && tt%5==0) {switch_sub();while (tt%5==0);}key=got_key();}}}}}weekday();updatad();sett=1;}//安全天数设置day_add(){l_day+=1;if(l_day>=100){l_day=0;h_day+=1;}if(h_day>=100) h_day=0;}day_sub(){l_day-=1;if(l_day>=100){l_day=99;h_day-=1;}if(h_day>=100) h_day=99;}void set_d(){unsigned char key;sett=0;w=7;w=7;h=1;h=1;while (key!=0) key=got_key();while(w>6){h=1;key=got_key();if(key==1) {w=0;while (key!=0) key=got_key();}if(key==2) {l_day=0;h_day=0;while (key!=0) key=got_key();}if(key==4){day_add();typ=0;while (key!=0){key=got_key();if(typ>=2){h=0;while (key!=0){if(key==4 && tt%5==0) {day_add();while (tt%5==0);}key=got_key();}}}if(key==8){day_sub();typ=0;while (key!=0){key=got_key();if(typ>=2){h=0;while (key!=0){if(key==8 && tt%5==0) {day_sub();while (tt%5==0);}key=got_key();}}}}}updatad();sett=1;}//主程序void main(){unsigned char key;unsigned int num_1,num_2;delay();delay();newl();newl();newh();newh();newd();newd();judge_year(year/16*10+year%16);if(leap==1){num_1=(TAB2[month]+(day/16*10+day%16-1));num_2=(TAB2[old_month]+(old_day/16*10+old_day%16-1)); }else{num_1=(TAB1[month]+(day/16*10+day%16-1));num_2=(TAB1[old_month]+(old_day/16*10+old_day%16-1)); }h_day=(num_1-num_2)/100+h_day;l_day=(num_1-num_2)%100+l_day; updatad();SCON=0;IE=0x82;TMOD=0x01;TH0=0xfc;TL0=0x18;TR0=1;while(1){key=got_key();if(key==1){typ=0;while (key!=0){key=got_key();if(typ>=4) {sett=0;set_d();}}}if(key==2){sett=0;while (key!=0) key=got_key();set1();}}}。

基于DS1302的万年历毕业论文 数码管显现 附程序 硬件电路图

基于DS1302的万年历毕业论文 数码管显现 附程序 硬件电路图

XX学院毕业论文作者:学号: .学系:电子信息工程与技术系 .专业:应用电子 .题目:电子万年历指导者:2011 年 01月长沙XX学院专科生毕业论文评语系部:电子信息工程与技术专业:应用电子学生姓名:班级学号题目:电子万年历题目:电子万年历论文摘要单片机应用技术飞速发展,纵观我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。

单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

而51系列单片机是各单片机中最为典型和最有代表性的一种。

这次毕业设计通过对它的学习和应用,从而达到学习、设计、开发软、硬的能力。

本文通过对一个基于单片机实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关方面的应用。

系统由主控制器AT89C51、时钟电路DS1302、显示电路、按键电路、和复位电路等部分构成,能实现时钟日历显示的功能,通过按键能对年、月、日、时、分、秒进行修改。

这种实现方法的优点是电路简单,性能可靠,实时性好,时间精度高,操作简单,编程容易。

该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。

关键词:万年历,AT89C51,时钟日历芯片Title:Electronic calendar papersAbstractMicrocomputer application technology rapid development, throughout our lives is widely used in all kinds of intelligent IC card, electronic pets, etc, these are inseparable from microcontroller. SCM is set for the CPU, RAM, ROM, time, count and multiple interface in the integration of micro controller. Its small size, low cost, the function is strong, widely used in intelligent industry and industrial automation. And 51 series microcontroller is the most typical and various microcontroller most representative one. The graduation design through to its learning and application, thus achieved the study, design, development, soft and hard ability.This article through to one based on SCM realizing calendar function electronic clock design, so as to achieve the learning, single-chip technique related applications. System consists of the main controller AT89C51, clocking circuit DS1302, display circuit, key circuits, and reset circuit etc components, can realize the function of clock calendar displays, through the keys to date and time, minutes and seconds modified. The approach is the advantage of circuit is simple, reliable performance, good real-time, high precision time, simple operation and programming of easy.The electronic clock can be applied to general life and work, also can improve performance by disguised himself, and adding new functions, thus to people's life and work to bring more convenient.Keywords: calendar, AT89C51,clock calendar chip目录一、设计要求与方案论证 (1)1.1 设计要求 (1)1.2 方案设计与论证 (1)1.2.1单片机芯片的选择方案和论证 (1)1.2.2 显示模块选择方案和论证 (1)1.2.3时钟芯片的选择方案和论证 (2)1.2.4 电路设计最终方案决定 (2)二、基于单片机的万年历硬件设计 (2)2.1 主要IC芯片选择 (2)2.1.1单片机 (2)2.1.2 DS1302 (4)2.2 万年历硬件电路设计 (8)2.2.1时钟电路设计 (9)2.2.2显示电路 (9)2.2.3按键电路 (10)2.2.4复位电路 (11)三、万年历软件设计 (13)3.1 主程序设计 (13)3.2 子程序设计 (14)3.2.1 实时时钟日历子程序设计 (14)3.2.2 显示子程序设计 (14)3.2.3 中断0子函数设计 (14)3.2.4 时间设置函数ftion0 (14)3.2.5 加1修改时间功能函数cum (15)3.2.6 日期设置函数ftion1 (15)3.2.7 加1修改日期功能函数cum1 (15)四、系统调试 (20)4.1 单片机基础电路测试 (21)4.2 显示电路调试 (21)4.3 DS1302电路调试 (22)结论 (23)致谢 (24)参考文献 (25)附录A 程序 (26)附录B万年历硬件电路原理图 (38)第一章设计要求与方案论证1.1 设计要求:(1)基本要求①显示准确的北京时间(时、分、秒),可用24小时制式;②随时可以调校时间。

基于单片机DS1302的时钟万年历

基于单片机DS1302的时钟万年历
向DS18B20写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
sbit key3=P1A5;//功能键定义
sbit key4=P1A6;//增大键定义
sbit key5=P1A7;//减小键定义
uchar shi,fen,miao,ashi,afen,amiao,year,month,day,week;
uchar s1num=0,s1num2=0,temp;
bit flag;
{
write_1302 (0x8e,0x00);//write_1302 (0x80,0x56);
write_1302 (0x82,0x58);//write_1302 (0x84,0x23);//
write_1302 (0x86,0x30);//
write_1302 (0x88,0x09);//
write_1302 (0x8c,0x10);//write_1302 (0x8a,0x01);//write_1302 (0x8e,0x80);
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
写命令
delay(5);
lcden=0;
void write_data(uchar date)//1602写数据
{
lcdrs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;}
SCLK= 0;}CE=0;
dat1=ACC;
dat2=dat1/16;//

毕业设计——基于DS1302的电子万年历设计

毕业设计——基于DS1302的电子万年历设计

基于DS1302的电子万年历设计专业班级:学生姓名:指导教师:职称:讲师摘要:现在是一个知识爆炸的新时代,新产品、新技术层出不穷,电子技术的发展更是日新月异。

可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。

在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。

因此我们需要一个定时系统来提醒这些忙碌的人,而数字化的钟表给人们带来了极大的方便。

由于单片机具有灵活性强、成本低、功耗低、保密性好等特点,所以电子日历时钟一般都以DS1302为核心,外加一些外围设备来实现。

近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。

多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。

单片机在多功能数字钟中的应用已是非常普遍的,人们对数字钟的功能及工作顺序都非常熟悉。

但是却很少知道它的内部结构以及工作原理。

由单片机作为数字钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来,通过按键可以进行定时、校时功能。

输出设备显示器可以用液晶显示技术和数码管显示技术。

关键词:DS1302 实时钟万年历The Design of The Simple Logic Controller Based on SCMAbstract:Now a new era of knowledge explosion, new products, new technologies emerge in endlessly, the development of electronic technology is changing. It is no exaggeration to say, electroni c technology applications everywhere, electronic technology is changing our life, and our world. In this fast development, the time is more precious to people in the fast pace of life, people often forgotten when time, once encounter something important and forget time, this will bring great loss. So we need a regular system to remind those busy people, and digital clocks bring great convenience. Due to the microcontroller has flexibility, low cost, low power consumption, the secrecy is good wait for a characteristic, so the electronic calendar clocks are generally based on DS1302, plus some peripheral equipment to achieve.In recent years, with the development of science and technology and the progress of the society, the people of a digital clock higher requirements, the traditional clock already cannot satisfy the demands of the people. Multi-functional digital clock in performance or in style have undergone a qualitative change, electronic alarm clock, number, etc. Microcomputer in the multi-function digital clock application is very common, and has the function of digital clock and work order is very familiar with. But few know its internal structure and work principle. By single chip microcomputer as the core controller, digital clock through its clock signal timing realize its function, the clock time data using SCM outputs, display, through the buttons can be regularly, school when function. Output devices with LCD monitors can display technology of digital technology and the pipe.Keywords: DS1302 calendar clock.目录引言 (1)第一章系统概述 (2)1.1 设计要求 (2)1.2 设计方案 (2)1.3 器件选择 (2)1.4 系统概述 (3)第二章系统的硬件设计 (4)2.1时钟接口电路设计 (4)2.1.1简介 (4)2.1.2内部实时时钟RTC 和RAM地址分配 (6)2.1.3 时钟和日历 (6)2.1.4 控制寄存器 (7)2.2 键盘接口电路设计 (7)2.2.1 键盘的分类 (8)2.2.2 键盘开关的抖动 (8)2.2.3 键盘电路 (9)2.3 八段数码管显示电路设计 (10)2.3.1 数码管的结构 (10)2.3.2 数码管的分类 (11)2.3.3 数码管的显示方式 (12)2.3.4 数码管显示图 (13)2.4 AT89C51简单电路设计 (13)2.4.1 AT89C51简介 (13)2.4.2单片机接口电路图 (17)第三章系统软件设计 (18)3.1 系统软件程序图 (18)3.2 接口软件 (18)3.3 按键 (21)第四章仿真软件介绍及其仿真 (23)4.1 仿真软件概述 (23)4.2 程序运行效果图 (24)结论 (25)致谢 (26)参考文献 (27)引言本论文是基于DS1302的电子万年历设计。

万年历(ds1302+dht11)

万年历(ds1302+dht11)

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//sbit ACC7=ACC^7; //累加器位寻址寄存器定义//sbit ACC0=ACC^0;sbit dula=P1^0; //数码管段选位sbit wela=P1^1; //数码管位选位sbit line=P1^3;//点阵行控制端sbit led=P1^2;//流水灯锁存器锁存端sbit clk=P2^3; //DS1302时钟管脚定义sbit tda=P2^2; //数据输入输出7脚sbit rst=P2^1; //片选(复位)5脚sbit lcdrs=P1^5; //液晶位定义sbit lcdrw=P1^6; //液晶读写控制端sbit lcden=P1^7; //液晶始能端(复位端)sbit dht11=P2^0; //湿度传感器端口定义sbit been=P3^7; //蜂鸣器//时钟按键定义sbit s1=P2^4; //功能选择键sbit s2=P2^5; //增加键sbit s3=P2^6; //减小键uchar code riqi[]=" 20 - - "; //定义液晶初始上电时的默认显示状态uchar code shijian[]=" : : "; //定义液晶上电时间显示格式uchar value_array[5];//全局变量部分uchar flag,s1num,status;uchar status;char miao,fen,shi,ri,yue,nian,week;int humi_value,wedu_value;//延时函数单位:毫秒void delay(uint z){uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}//湿度延时函数void delay_10us(void) //延迟10微妙{uchar i;i--;i--;i--;i--;i--;}//蜂鸣器发声函数void di(){been=0;delay(40);been=1;}//液晶1602显示模块void write_com(char com) //液晶写命令{lcdrw=0;lcdrs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;lcdrw=1;}void write_date(char date) //液晶写数据lcdrw=0;lcdrs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;lcdrw=1;}/******************DS1302:写入一字节(上升沿写入)*****************/ /*void write_byte(char da){uchar i;ACC=da;for(i=8;i>0;i--){tda=ACC0;clk=0;clk=1;ACC=ACC>>1;}}*/void write_byte(char da){uchar i;for(i=8;i>0;i--){tda=(bit)(da&0x01);_nop_();clk=0;_nop_();clk=1;_nop_();da>>=1;}}/******************DS1302:读取一字节(下降沿读出)*****************/ /*uchar read_byte(void){uchar i;for(i=0;i<8;i++){ACC=ACC>>1;clk = 1;clk = 0;ACC7 = tda;}return(ACC);}*/uchar read_byte(void){uchar i,j,AC;for(i=0;i<8;i++){clk = 1;_nop_();clk = 0;_nop_();j=tda; //之所以这样做是因为tda为位变量,不能直接使用移位运算,故先将其值存入为0的j中_nop_();AC =(j<<7)|(AC>>1);}return(AC);}/******************DS1302:写入操作(上升沿)*********************/void write1302(char addr,char da){rst=0; //停止工作clk=0;rst=1; //重新工作write_byte(addr); //写入地址write_byte(da);rst=0;clk=1;/******************DS1302:读取操作(下降沿)*****************/char read1302(char addr){char temp;rst=0; //停止工作clk=0;rst=1; //重新工作write_byte(addr); //写入地址temp=read_byte();rst=0;clk=1; //停止工作return(temp);}//初始化DS1302void init1302(void) //DS1302只识别BCD码{write1302(0x8e,0X00);//首先禁止写保护,否则写不进去数据//以下所写均为BCD码形式write1302(0x80,0X00);//秒位初始化00//以下所写均为BCD码形式write1302(0x82,0X00);//分钟初始化00write1302(0x84,0X00);//小时初始化(设为24小时制)write1302(0X8a,0X06); //向DS1302内写周寄存器8aH写入初始周数据周六write1302(0X86,0X22); //向DS1302内写日期寄存器86H写入初始日期数据07write1302(0X88,0X06); //向DS1302内写月份寄存器88H写入初始月份数据01write1302(0X8C,0X12); //向DS1302内写年份寄存器8cH写入初始年份数据12write1302(0xc0,0x05); //设立初始化查询标志位,使其只首次上电才初始化(标志为向0xc0写入0x05);write1302(0x8e,0X80); //打开写保护,防止误写数据;}//写时,分,秒的函数void write_sfm(uchar add,char date){uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi); //注意:1602液晶的字库中的数字以0x30+偏移量而形成得到数字write_date(0x30+ge);}//写年,月,日的函数void write_nyr(uchar add,char date){char shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi); //数字加上30即为其在液晶1602中对应的字形码write_date(0x30+ge);}//写星期几的函数void write_week(uchar we){write_com(0x80+12);switch(we){case 1: write_date('M');delay(5);write_date('O');delay(5);write_date('N');break;case 2: write_date('T');delay(5);write_date('U');delay(5);write_date('E');break;case 3: write_date('W');delay(5);write_date('E');delay(5);write_date('D');break;case 4: write_date('T');delay(5);write_date('H');delay(5);write_date('U');break;case 5: write_date('F');delay(5);write_date('R');delay(5);write_date('I');break;case 6: write_date('S');delay(5);write_date('A');delay(5);write_date('T');break;case 7: write_date('S');delay(5);write_date('U');delay(5);write_date('N');break;}}//十进制码转BCD码转换函数char bcd(char a){uchar b,c;b=a/10;c=a%10;b=b&0x0f;c=c&0x0f;b<<=4;a=b|c;return(a);}//BCD码转十进制的函数;char deci(char c){char d,e;d=c/16;e=c%16;c=d*10+e;return(c);}//整体初始化函数void init(){uchar num;P0=0X00;dula=0; //关闭数码管段选锁存器line=0;P0=0XFF;led=0;lcden=0;wela=1;P0=0XFF;wela=0;s1num=0; //s1按键计数定义if(deci((read1302(0xc1)))!=0x05){init1302(); //第一次上电初始化DS1302(读取0xc1中的数值,看其是否为0x05;若是,则不初始化)。

基于DS1302的万年历

基于DS1302的万年历
《单片机原理》实训任务书
年级:07级面向专业:电子信息工程学时:3周
项目名称:
基于DS1302的万年历
项目类型
硬件设计与制作
特殊要求

承担学生姓名
学号
专业
联系电话
项目设计要求:
基本功能要求:
1、采用DS1302实现数字钟功能;
2、具备掉电时钟保持功能;
3、8位数码管动态显示,显示功能交替显示;
4、能显示时、分、秒、年、月、日;
地点:EDA实验室
项目验收方式:
1、在实训期间进行作品验收,验收后交实训论文及实训的资料打印稿及电子文稿。
2、设计报告要符合桂林电子科技大学毕业设计论文统一格式。
项目开始时间:
2009-12-14
项目结束时间:
2009-12-31
任务下达:
符强、严素清、卜波涛
2009年12月14~15日:完成查找资料、方案论证、确定方案的过程;
地点: EDA实验室
2009年12月16~18日:完成原理图及PCB图的绘制;地点: EDA实验室
2009年12月21~22日:完成电路板的制作及测试;地点:电子制作中心
2009年12月23~25日:软件编程及调试;地点: EDA实验室
2009年12月28~29日:完成软件编程及调试;地点: EDA实验室
2009年12月30~31日:完成论文撰写;地点: EDA实验室
2009年12月31日:①上交作品并通过指导教师的验收;地点:EDA实验室、电子制作中心
②独立撰写字数在5000字以上的实训论文,统一按桂林电子科技大学课程设计论文格式编写,并上交论文及实训资料(包括论文的电子文稿及打印稿,任务书,Protel电子设计文件等);

基于51单片机DS1302万年历课程设计报告

基于51单片机DS1302万年历课程设计报告

课程名称:微机原理课程设计题目:基于DS1302芯片万年历摘要DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路.提供秒、分、时、日、日期.、月、年的信息,每月的天数和闰年的天数可自动调整时钟。

本次课程设计的是使用专门的时钟芯片DS1302在数码管上显示的数字电子钟,并能通过按键对其进行调时和校准以及实现年月日。

DS1302是一种高性能、低功耗、带RAM的实时时钟芯片,它能够对时,分,秒进行精确计时,它与单片机的接口使用同步串行通信,仅用3条线与之相连接,就可以实现STC-51单片机对其进行读写操作,把读出的时间数据送到数码管上显示。

程序运行时,数码管将从当前时间开始显示,通过调节K2键和K3键可以分别对小时和分钟进行调整,调整后,时钟以新的时间为起点继续刷新显示,通过调节K1键可以切换年月日和时钟显示。

关键字:STC-51单片机,DS1302,数码管,动态扫描,调时,切换,秒闪;目录一、设计任务与要求 (4)1.1设计任务 (4)1.2设计要求 (4)1.3发挥部分 (4)1.4创新部分 (4)二、方案总体设计 (5)2.1设计目的 (5)2.2硬件功能描述 (5)2.3设计方案选择 (5)2.4总体设计 (6)2.5总体方案及基本工作原理 (6)三、硬件设计 (7)3.1 STC89C51芯片 (7)3.2电源模块及晶振模块 (7)3.3 DS1302 (8)3.4数码管显示模块 (9)3.5蜂鸣器部分 (10)3.6按键部分 (11)四、软件设计 (13)4.1软件流程图 (13)4.2 软件设计 (13)主函数部分: (13)五、系统仿真和调试 (15)5.1 仿真软件简介 (15)5.2硬件调试 (15)5.3软件调试 (15)5.4使用说明 (16)六、设计总结与体会 (18)6.1学习方面 (18)6.2工作方面 (18)七、参考文献 (19)一、设计任务与要求1.1设计任务DS1302万年历;1.2设计要求利用DS1302生成万年历,时钟可调,通过四位数码管显示,并可实现秒闪功能,同时蜂鸣器闹铃;1.3发挥部分设置按键K3用来切换显示时钟和年月日;1.4创新部分只设置了两个按键K1和K2来调节时分,时钟到24归零,分钟到60归零,分钟有长按迅速调节功能。

基于51单片机电子万年历设计

基于51单片机电子万年历设计

一、引言电子万年历是一种以数字形式实时显示日期、星期和时间等信息的电子设备。

在现代人日常生活中,万年历是一种常见的小型电子产品。

本文将基于51单片机设计一款简单实用的电子万年历。

二、设计原理1.时钟模块:采用DS1302实时时钟模块。

DS1302通过三线式串行接口与51单片机进行通信,可以实时获取日期、星期和时间等信息。

2.显示模块:使用数码管显示日期、星期和时间等信息。

共使用四块共阳数码管,采用数码管模块进行驱动,通过IO口进行数据传输。

3.按键模块:设计四个按键,分别为设置、上、下和确定。

通过按键来调整日期、星期和时间等信息。

4.闹钟功能:加入闹钟功能,可以设定闹钟时间,到达设定时间时,会有提示音。

5.温湿度传感器:加入温湿度传感器,可以实时监测环境温湿度,并在数码管上进行显示。

6.外部电源:由于51单片机工作电压较高,需要使用外部电源进行供电。

三、硬件设计1.电源电路:使用稳压电源芯片LM7805进行5V稳压,将稳压后的电压供给单片机和各个模块。

2.时钟模块:DS1302模块与单片机通过串行通信进行连接。

时钟模块上的时钟信号、数据信号和复位信号分别与单片机的IO口相连。

3.数码管显示模块:共有四块共阳数码管,通过595芯片进行驱动。

单片机的IO口与595芯片的串行、时钟和锁存引脚相连,595芯片的输出引脚与数码管的各段相连。

4.按键模块:通过电阻分压来实现按键功能,按下按键时,相应的IO口会被拉低。

5.闹钟功能:使用蜂鸣器来产生提示音,通过IO口与单片机相连。

6.温湿度传感器:使用DHT11温湿度传感器。

传感器的数据引脚通过IO口与单片机相连。

四、软件设计1.时钟显示:通过DS1302获取日期、星期和时间等信息,将其转化为数码管需要的编码格式,并通过595芯片进行显示。

2.按键操作:对按键进行扫描,根据按键的不同操作进行相应的处理。

例如按下设置键进行日期和时间的设置,按下上下键进行数值的变化,按下确定键进行数值的确认。

基于ds1302的万年历

基于ds1302的万年历

单片机课程设计报告——基于DS1302模块单片机控制的可调电子日历、电子时钟系统的实现目录一、实验目的二、实验要求三、实验内容四、实验原理1、微控制器AT89C512、时钟电路模块DS13023、时钟控制4、数码管显示五、实验步骤1、Proteus 7.12仿真原理图2、程序流程图3、系统程序六、实验结果Proteus 7.12仿真结果图七、实验总结八、程序清单九、参考文献一、实验目的1.进一步熟悉和掌握单片机的结构及工作原理;2.通过课程设计,掌握以单片机核心的电路设计的基本方法和技术;3.了解有关电路参数的计算方法培养综合运用单片机课程课题及有关选修课程的基本知识去解决实际问题的基本训练;4.掌握单片机的接口技术及相关外围芯片的外特性,控制方,从而加深对该课程知识的理解;5.熟悉Ptoteus及Keil软件的调试和仿真,通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。

二、实验要求1、实时显示年、月、日等(可自动或手动设置显示)2、实时显示秒、分、时等3、能调整时间、日期4、时钟走时误差一天少于1分钟三、实验内容此次实验设计主要利用软件Keil uVision3进行程序调试,利用Proteus 7.12进行硬件仿真。

1、选择合适器件,微控制器AT89C51,时钟电路模块DS1302、数码管等,画出原理图,利用Proteus 7.12仿真连接。

2、画出程序流程图,用汇编语言写出程序,利用Keil uVision3进行程序编译、调试。

3、利用Keil uVision3生成hex文件,用Proteus 7.12进行硬件仿真。

实现电子日历、电子时钟的显示。

四、实验原理1、微控制器AT89C51AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS 8位微处理器。

各管脚功能如下:VCC:供电电压;GND:接地;P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

基于DS1302的万年历设计

基于DS1302的万年历设计

摘要随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。

它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和还具有时间校准等功能。

该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

关键词:时钟电钟;DS1302;动态扫描;单片机AbstractAlong with the rapid development of technology, the passage of time, from concept to thesun,until now electric clock, human pendulum clocks are continuously research and constant innovation of records. American DALLAS company launched with Juan fine current charge oflow-power real-time clock circuit DS1302. It can to year, month, day, Sunday, when, minutes and seconds on the clock and also has a leap year compensation and other functions, and DS1302 of long service life and small error. For digital electronic calendar by using object digital display, can also shows that year, month, day, Sunday, when, minutes and seconds and still have timecalibration, and other functions.This circuit adopts AT89S52 SCM as the core, low consumption, can in the low voltage 3V work, voltage can choose 3 ~ 5V voltage power supply .To sum up the calendar has read convenient, direct display, functional diversity, simple circuit, low cost, and many other advantages, conform to the trend of the development of electronic instruments, and has a broad market prospect.Key words:Clock actuated;DS1302;Dynamic scanning;MCU目录引言 (4)1设计要求与方案论证 (4)1.1 设计要求 (4)1.2系统基本方案选择和论证 (4)1.2.1单片机芯片的选择方案和论证 (4)1.2.2 显示模块选择方案和论证 (4)1.2.3 时钟芯片的选择方案和论证 (5)1.3 电路设计最终方案决定 (5)2 系统的硬件设计与实现 (5)2.1 电路设计框图 (5)2.2 系统硬件概述 (5)2.3 主要单元电路的设计 (6)2.3.1单片机主控制模块的设计 (6)2.3.2 时钟电路模块的设计 (6)2.3.3 电路原理及说明 (7)2.3.4 显示模块的设 (9)3 系统的软件设计 (9)3.1 程序流程框图 (10)3.2 程序的设计 (11)4 指标测 (11)4.1 测试仪器 (22)4.2 硬件测试 (22)4.3 软件测试 (22)4.4 测试结果分析与结论 (22)4.4.1 测试结果分析 (23)4.4.2 测试结论 (23)5作品总结 (23)致谢词 (24)参考文献 (25)附录一:系统电路图 (26)引言随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆续出现在我们的生活当中。

基于DS1302与数码管设计的电子万年历

基于DS1302与数码管设计的电子万年历

交通职业技术学院毕业论文毕业论文题目:基于DS1302与数码管设计的电子万年历学生:金如学号:1213223217院(系):机电工程学院专业:机电一体化(自动化技术)班级:一体化123班指导教师:建起止时间: 2014 年11 月—— 2014 年 12 月基于DS1302与数码管设计的电子万年历摘要:单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以与我们生活中广泛使用的各种智能IC卡、电子产品等,这些都离不开单片机。

单片机是将CPU、RAM、ROM、定时器、计数器和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上,而51系列单片机是各单片机中最为典型和最有代表性的一种。

本文通过对一个基于DS1302与数码管的电子万年历的设计,从而达到学习、了解单片机相关指令在各方面的应用。

系统由主控制器AT89C51、实时钟电路DS1302、显示电路组成,能实现时钟日历显示的功能,能进行时、分、秒的显示。

关键词:单片机;DS1302;数码管;电子万年历目录1 引言42 设计方案与要求42.1 功能要求42.2 系统基本方案选择和论证42.2.1单片机芯片的选择和论证 (4)2.2.2显示模块的选择和论证 (5)2.2.3时钟芯片的选择和论证 (5)2.3 电路设计最终方案决定52.4 各硬件基本原理与介绍52.4.1AT89C51单片机原理与介绍 (5)2.4.2LED数码管显示原理与介绍 (6)2.4.3DS1302原理与介绍 (6)2.4.474HC573原理与介绍 (6)3 硬件设计部分73.1 电路设计框图73.2 系统硬件概述73.3 主要单元电路的设计73.3.1单片机主控制模块的设计 (7)3.3.2时钟电路DS1302的设计 (8)3.3.3显示模块的设计 (10)3.3.4锁存器模块的设计 (11)4 软件设计部分114.1 软件设计概述114.2 Keil C51和Proteus介绍124.2.1Keil C51的介绍 (12)4.2.2Proteus的介绍 (12)4.3 整体设计125 结束语141 引言随着微电子技术的高速发展,随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。

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

广东交通职业技术学院毕业论文毕业论文题目:基于DS1302与数码管设计的电子万年历学生姓名:***学号:**********院(系):机电工程学院专业:机电一体化(自动化技术)班级:一体化123班指导教师:**起止时间:2014 年11 月—— 2014 年 12 月基于DS1302与数码管设计的电子万年历摘要:单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子产品等,这些都离不开单片机。

单片机是将CPU、RAM、ROM、定时器、计数器和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上,而51系列单片机是各单片机中最为典型和最有代表性的一种。

本文通过对一个基于DS1302与数码管的电子万年历的设计,从而达到学习、了解单片机相关指令在各方面的应用。

系统由主控制器AT89C51、实时钟电路DS1302、显示电路组成,能实现时钟日历显示的功能,能进行时、分、秒的显示。

关键词:单片机;DS1302;数码管;电子万年历目录1引言 (4)2 设计方案与要求 (4)2.1 功能要求 (4)2.2 系统基本方案选择和论证 (4)2.2.1单片机芯片的选择和论证 (4)2.2.2显示模块的选择和论证 (5)2.2.3时钟芯片的选择和论证 (5)2.3 电路设计最终方案决定 (5)2.4 各硬件基本原理及介绍 (5)2.4.1AT89C51单片机原理及介绍 (5)2.4.2LED数码管显示原理及介绍 (6)2.4.3DS1302原理及介绍 (6)2.4.474HC573原理及介绍 (7)3 硬件设计部分 (7)3.1 电路设计框图 (7)3.2 系统硬件概述 (7)3.3 主要单元电路的设计 (8)3.3.1单片机主控制模块的设计 (8)3.3.2时钟电路DS1302的设计 (8)3.3.3显示模块的设计 (10)3.3.4锁存器模块的设计 (11)4软件设计部分 (11)4.1 软件设计概述 (11)4.2 Keil C51和Proteus介绍 (12)4.2.1Keil C51的介绍 (12)4.2.2Proteus的介绍 (12)4.3 整体设计 (12)5结束语 (14)1 引言随着微电子技术的高速发展,随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。

单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。

而电子万年历作为电子类小设计,是单片机实验中一个很常用的题目。

因为它有很好的开放性和可发挥性,不仅考察了对单片机的掌握能力更加强了对单片机扩展的应用。

而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。

电子万年历已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用,壁挂式LED数码管显示的万年历逐渐受到人们的欢迎。

采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特可靠。

在软件设计过程中,应对硬件部分有相关的了解,这样有助于对设计更深刻的了解,有助于软件设计。

2 设计方案与要求2.1 功能要求本电子万年历的功能:能动态显示年、月、日、小时、分钟、秒2.2 系统基本方案选择和论证2.2.1单片机芯片的选择和论证方案一:采用AT89S52芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。

方案二:采用AT89C51,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89S52的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。

结论:采用AT89C51作为主控制系统.2.2.2显示模块的选择和论证方案一:采用LED液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字、图形。

但是价格昂贵,需要的接口线多,所以在此设计中不采用LED液晶显示屏。

方案二:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。

结论:采用LED数码管作为显示。

2.2.3时钟芯片的选择和论证方案一:直接采用单片机定时计数器提供脉冲信号,使用程序实现年、月、日、时、分、秒计数。

采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。

方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、月、年进行计数,而且精度高。

结论:采用DS1302作为时钟芯片。

2.3 电路设计最终方案决定综上各方案所述,对此次作品的方案选定: 采用AT89C51作为主控制系统、DS1302提供时钟、LED数码管动态扫描作为显示。

2.4 各硬件基本原理及介绍2.4.1 AT89C51单片机原理及介绍单片机是一种集成电路芯片,是采用超大规模集成电路技术把CPU、随机存储器RAM、ROM、多种I/O接口和中断系统、定时器/计数器、A/D转换器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。

AT89C51单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O 口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。

AT89C51引脚如图所示2.4.2LED数码管显示原理及介绍LED显示是绝大多数单片机应用系统必备的部件之一,发光二极管组成的LED显示是单片机应用产品中最常用的廉价输出设备。

它由若干个发光二极管按一定的规律排列而成。

当某一个发光二极管导通时,相应的一个点或一笔画被点亮,控制不同组合的二极管导通,就能显出各种字符。

发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的成为共阴显示器。

1位显示器由8个发光二极管组成,其中7个发光二极管a~g控制7个笔画的亮或暗,另一个控制一个小数点的亮和暗。

引脚如图所示2.4.3DS1302原理及介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗的电子万年历芯片,附加31字节静态RAM,采用SPI三线接口与CPU一进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

电子万年历可提供秒、分、时、日、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

工作电压宽达2.5V~5.5V。

采用双电源供电(主电源和备用电源)。

DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。

引脚如图所示2.4.4 74HC573原理及介绍当锁存使能端LE 为高时,这些器件的锁存对于数据是透明的,当锁存使能端LE 为低时,符合建立时间和保存时间的数据会被锁存。

引脚如图所示3 硬件设计部分3.1 电路设计框图3.2 系统硬件概述本设计是由AT89C51单片机为控制核心,具有在线编程功能,低功耗,能在3V 超低压工作。

时钟电路由DS1302提供,采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM 数据。

具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能,本电路采用DS1302单字节传送方式实现与主控机之间数据的传送。

显示部分由LED 数码管动态扫描来显示。

时钟电路 DS1302主控制器 AT89C51 显示电路 LED 数码管3.3 主要单元电路的设计3.3.1单片机主控制模块的设计单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端为输入端,XTAL2接外部晶振和微调电容的另一端为输出端。

第9引脚为复位输入端,接上电容,电阻及开关后构成复位电路。

主控制系统1.内部结构按功能分为8部分:CUP,程序存储器,数据存储器,时钟电路,串行口,并行I/O口,中断系统,定时/计数器。

2.引脚定义及功能Vcc:接+5V 电源Vss:接地XTAL1和XTAL2:时钟引脚,外接晶体引线端。

RST/Vpq:RST是复位信号输入端,Vpd是备用电源输入端。

I/O口引脚:P0.0~P0.7:P0口8位双向I/O口;P1.0~P1.7:P1口8位准双向I/O口;P2.0~P2.7:P2口8位准双向I/O口;P3.0~P3.7:P3口8位准双向I/O口。

3.3.2时钟电路DS1302的设计1.引脚功能及结构DS1302 的电路图如下,其中Vcc1 为后备电源,VCC2 为主电源。

在主电源关闭的情况下,也能保持时钟的连续运行。

DS1302 由Vcc1 或Vcc2 两者中的较大者供电。

X1 和X2 是振荡源,外接32.768kHz 晶振。

RST 是复位/片选线,通过把RST 输入驱动置高电平来启动所有的数据传送。

RST 输入有两种功能:首先,RST 接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST 提供终止单字节或多字节数据的传送手段。

只有在SCLK 为低电平时,才能将RST 置为高电平。

I/O 为串行数据输入输出端(双向), SCLK 始终是输入端。

DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚。

DS1302电路图2.读写时序说明DS 1302是SPI总线驱动方式。

它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。

DS1302的控制字如图:DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲。

控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

位6:如果为0则表示存取日历时钟数据,为1表示存取RAM数据位5至位1(A4-A0):指示操作单元的地址位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。

相关文档
最新文档