文档库 最新最全的文档下载
当前位置:文档库 › 数码管万年历ds1302

数码管万年历ds1302

/ZPF(新)//2012//4/29

#include

#include

#define uint unsigned int

#define uchar unsigned char

uchar k,s,aa,Nshi,Nfen;//,miao,nian,yue,ri,zhou;

uchar number[8];

uchar dif_flag;

//测温度定义

uint temp;

float f_temp; //温度值variable of temperature bit flag;

sbit w1=P1^2;

sbit w2=P1^3;

sbit w3=P1^4;

sbit w4=P1^5;

sbit DQ=P1^7;

sbit dula=P1^0;

sbit wela=P1^1;

sbit DS1302_CLK = P3^7; //实时时钟时钟线引脚

sbit DS1302_IO = P3^6; //实时时钟数据线引脚

sbit DS1302_RST = P3^5; //实时时钟复位线引脚

sbit ACC0 = ACC^0;

sbit ACC7 = ACC^7;

sbit key=P1^6;

sbit key1=P3^0;

sbit key2=P3^1;

sbit key3=P3^2;

sbit key4=P3^3;

sbit key5=P3^4;

uchar read[7];

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00

};//共阴数码管0-9

uchar week_value[2];

//void dis_delay(void);

void delay(uint x);

void display(unsigned char a,unsigned char b,unsigned char c);

void show_time(); //显示程序

void Write1302(unsigned char ucAddr, unsigned char ucDa);

void keyscan();

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 0x8C

void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)(4) {

unsigned char i;

ACC = d;

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

{

DS1302_IO = ACC0; //相当于汇编中的RRC

DS1302_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; //相当于汇编中的RRC

ACC7 = 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

}

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(); //读取到的第一个字节为温度LSB

b = Read_One_Byte(); //读取到的第一个字节为温度MSB

show_time();

if(b>127)

{

flag=1;

a=~a;

b=~b;

a+=0x01;

}

else

{

flag=0;

}

temp = b; //先把高八位有效数据赋于temp

temp <<= 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; // //同时进行一个四舍五入操作。

return temp;

}

main()

{

uchar f=2;

aa=0xfe;

while(1)

{

tmpchange();

show_time();

Display_18b20(Get_Tmp());

keyscan();

for(f=2;f>0;f--)

{

show_time(); //液晶显示数据

}

}

}

void display(unsigned char a,unsigned char b,unsigned char c)

{

if(dif_flag == 2)

{

number[0]=0x00;

number[1]=0x00;

number[2]=0x00;

number[3]=0x00;

number[4]=0x00;

number[5]=0x00;

number[6]=0x00;

}

else

{

number[0]=table[c/10];

if(k == 3)

number[1]=table[c%10 + 10];

else number[1]=table[c%10];

number[2]=0x40;

number[3]=table[b/10];

if(k == 2)

number[4]=table[b%10+10];

else

number[4]=table[b%10];

number[5]=0x40;

number[6]=table[a/10];

}

if(k == 1)

number[7]=table[a%10+10];

else

number[7]=table[a%10];

// number[8]=0x00;

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

{

P0=0x00;

dula=1;

P0=number[s];

dula=0;

P0=0xff;

wela=1;

P0=aa;

wela=0;

dis_delay(50);

Display_18b20(temp);

aa=_crol_(aa,1);

wela=1;

P0=0xff;

wela=0;

}

}

void Display_18b20(uint temp) //显示程序{

uchar A1,A2,A3;

A1 = temp/100; //百位

A2 = temp%100/10; //十位

A3 = temp%10; //个位

if(flag)

{

w1=0;

P2 =0x40;

dis_delay(13);

w1=1;

P2=0x00;

}

w2=0;

P2 = table[A1]; //显示百位

dis_delay(13);

w2=1;

P2=0x00;

w3=0;

P2 = table[A2+10]; //显示十位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)

dis_delay(13);

w3=1;

P2=0x00;

w4=0;

P2 = table[A3]; //显示个位

//已调试成功做出两个数码管时钟

基于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、液晶显示原理:液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成

基于DS1302的电子时钟设计

基于DS1302的电子时钟设计

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

任务书

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

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

数码管万年历ds1302

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

ds1302时钟数码管显示时分秒

ds1302时钟数码管显示时分秒

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

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

基于DS1302的多功能数字钟

多功能数字钟 一、多功能数字钟硬件电路简介 该数字钟是一款基于STC89C52单片机控制的多功能数字钟,利用串行时钟芯片DS1302进行精确计时,并有纽扣电池作为其备用电源,保证在单片机系统掉电后,时间依然准确无误。使用LED数码管作为显示器件,设计简单可靠,外观显示效果清晰明了,使用两片74LS373作为数码管的驱动电路,保证LED数码管的亮度很高,即使在室外强光条件下,显示依然清晰。该数字钟的声光提示部分,使用了一路继电器控制蜂鸣器和一个高亮度LED,蜂鸣器的驱动方波来源于一个555定时器芯片,并由一个可调电阻来根据需要,调节方波频率。作息时间或定时闹钟时间到后,可以产生清晰明了的声光提示,并采用了反射式红外发送接收传感器,以实现非接触止闹,通过调试,传感距离可达10cm左右,效果明显,使用方便。 二、多功能数字钟功能简介 该数字钟具有时间,日期,星期显示和调节功能,操作简单可靠,按键都采用了防抖动程序,以防按一次造成多次输入。该数字钟可对预设的18个作息时间点进行准确声光提示,提示时间为10秒,在该声光提示期间,将手放在电路板上方(与电路板的距离不能大于15cm),可实现非接触止闹,使用相当方便。该数字钟还带有一个定时闹钟,可以自定闹钟时间与闹钟开关。该数字钟具有断电时间保护功能,当单片机系统掉电后,纽扣电池可以保持至少两个月的准确时间,一般来说,数字钟的时间设置一次后,以后几乎不用再次设置。 三、多功能数字钟硬件电路图 1、非接触止闹部分 ST178实物图ST178属于反射式红外传感器,它由一个红外发射管和一个红外三极管组成,工作的时候,红外发射管发射红外线,当它前方一定范围内有障碍物的时候,发射出的红外线遇到障碍物发射回去,被红外三极管接受,红外三极管由断开变为导通,P32端口上的电压变为低电平,从而被单片机检测到。其中电阻

基于利用时钟芯片DS1302实现万年历,1602LCD显示电子表

电子设计大赛培训第二阶段 第**组报告 《基于利用时钟芯片DS1302实现万年历,1602LCD显示电子表》 成员姓名:*** 学号:****** 成员姓名:HG**学号:****** 成员姓名:*** 学号:******* 一、主要功能 1、在1602液晶上显示年、月、日、星期、时、分、秒以及实

时温度,并且实时更新显示; 2、通过按键随时调节各显示参数,分别实现光标定位、数值增大、数值减小、闹钟和温度上下限查看的功能; 3.在时间出现乱码的情况下,具有一键初始化时间的功能。二、电路图 三、实物图 1.开关模块

2、显示模块 3、at89c52模块

4、总体连接图

四、心得体会 本次设计是我们遇到过的较大的设计,所以遇到的问题也比较的多,尤其是以前没有接触过如此复杂的硬件电路以及软件编程,在软、硬件设计和调试中遇到了不少的困难,在同学的帮助才逐一克服了难题,学习到了不少的专业知识。 在整个设计过程之前,我已经在网上找了相关方面的资料,万事开始难,一开始不知道从哪里下手。后来慢慢学会分析系统,将系统模块化,各个模块可以在软件或者硬件上实现。在确保各个模块的硬件电路和与之相搭配的程序能够正常工作后在把它们组成一个系统。在今后的日子里,我会进一步加强自己的动手能力,丰富自己的知识面。 总之,这次设计给我的最大感触就是,在以后的学习中勤动脑,多动手。 附录:

1、元件清单 AT89C52一块 LCD 一个 排阻 3个 DS1302一个 DS18B20一个 开关 5个 晶振2个 瓷片电容2个, 30PF 电解电容一个,33Uf 插针若干 杜邦线若干 2、程序 #include #include //#include "LCD1602.h" //#include "DS1302.h" #define uint unsigned int #define uchar unsigned char sbit DS1302_CLK = P1^7; //实时时钟时钟线引脚sbit DS1302_IO = P1^6; //实时时钟数据线引脚sbit DS1302_RST=P1^5; //实时时钟复位线引脚 sbitwireless_1 = P3^0; sbit wireless_2=P3^1; sbit wireless_3 = P3^2;

基于DS1302点阵万年历显示屏

题目基于DS1302的点阵万年历显示屏 分院: 专业:电子信息工程 班级: 学号: 学生姓名: 指导教师: 起讫日期:2009.2——2009.6 I

摘要 在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每个人都受到时间的影响。为了更好的利用我们自己的时间,我们必须对时间有一个度量,因此产生了钟表。钟表的发展是非常迅速的,从刚开始的机械式钟表到现在普遍用到的数字式钟表,即使现在钟表千奇百怪,但是它们都只是完成一种功能——计时功能,只是工作原理不同而已,在人们的使用过程中,逐渐发现了钟表的功能太单一,没有更大程度上的满足人们的需求。因此在这里,我想能不能把一些辅助功能加入钟表中去。在此设计中所设计的钟表不但具有普通钟表的功能,它还能实现额外的功能:万年历显示与查询、文字的显示。 本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行,此外结合供电电路。本方案设计出的万年历可以显示日期时间以及文字信息。 关键词:万年历单片机 DS1302 AT89S51 II

Abstract In the contemporary busy work and the life, the time all has the extremely close relationship with our each people, each people all receive the time the influence.In order to better uses our time, we must have a measure to the time, therefore has produced the clock and watch.The clock and watch development was extremely rapid, from uses generally the mechanical clock and watch which just started the digital clock and watch which to the present, even if present clock and watch all sorts of strange and unusual, but they all only complete one kind of function - - time function, only was the principle of work different, in people's use process, had discovered gradually the clock and watch function too was unitary, does not have in the greater degree satisfied people's demand.Therefore in here, I wants to be able to join some assistance function in the clock and watch.The clock and watch designs which in this design not only has the ordinary clock and watch function, it also can realize the extra function: Ten thousand calendar demonstrations and inquiry, Chinese character demonstration. This system has used take the widespread use monolithic integrated circuit technology as the core, the software and hardware union, causes the hardware part is greatly the simplification, enhanced the system stability, and uses the LED display circuit, the keyboard electric circuit, causes man-machine interaction easy to do and easy, in addition unifies the watch-dog and the feed circuit.This project design ten thousand calendars may demonstrate the date time as well as the writing information. Key words: Ten Thousand Calendars;Monolithic Integrated Circuit;DS1302;AT89S51 III

DS1302程序设计实例

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

用DS1302与LCD1602可调数字万年历课程设计

数字开发与实践 课 程 设 计 题目:用DS1302与LCD1602 设计可调式电子日历时钟 班级: 姓名: 学号: 学院: 二O一二年六月五日

用DS1302与LCD1602设计 的可调式电子日历时钟 一、总体设计 1.1、设计目的 为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与DS1302 设计可调式电子日历时钟。 1.2、设计要求 (1)显示:年、月、日、时、分、秒和星期; (2)设置年、月、日、时、分、秒和星期的初始状态; (3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期; 完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内 容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。 控制程序的编写等。 备注:本程序另外添加了每到上午8:10和下午2:10的闹钟提醒功能。 1.3、系统基本方案选择和论证 1.3.1、单片机芯片的选择方案 方案一: 采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。 方案二: 采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全

兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。但造价较高。 1.3.2 、显示模块选择方案和论证: 方案一: 采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。所以不用此种作为显示。 方案二: 采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。所以也不用此种作为显示。 方案三: 采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。LCD1602可实现显示2行十六个字符。 1.3.3、时钟芯片的选择方案和论证: 方案一: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。 方案二: 采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、星期、月、年以及闰年补偿的年进行计数,而且精度高,31*8位的RAM做为数据暂存区,工作电压范围为2.5V~5.5V,2.5V时耗电小于300nA。 1.3.4、电路设计最终方案决定 综上各方案所述,对此次作品的方案选定:采用80C51作为主控制系统;DS1302提供时钟;LCD1602液晶带汉字库显示屏作为显示部分。

(完整word版)万年历(DS1302+LCD1602【程序、仿真、完整】)

基于52单片机的万年历显示(采用实时芯片DS1302芯片+LCD1602液晶显示)仿真图: /************************************************************-- THE LCD1602 DISPLAY LIB -— COPYRIGHT (C) 2014 BY LLH -— ALL RIGHTS RESERVED —- ATTENTION:延时不能过长,否则无法与DS1302同步(最好小于1ms) *************************************************************/#ifndef __LCD1602_DIS_H__ #define __LCD1602_DIS_H__ #define uint unsigned int #define uchar unsigned char sbit lcd_rs=P2^0; sbit lcd_rw=P2^1; sbit lcd_en=P2^2; /**********延时子程序************/

void delay(uint z) { uint x,y; for(x=z;x〉0;x—-) for(y=65;y〉0;y--);//60刚好和DS1302同步 } /***********写命令子程序**********/ void write_com(uchar com) { lcd_rs=0; lcd_rw=0; P0=com; delay(1); lcd_en=1; delay(1); lcd_en=0; } /***********写数据子程序**********/ void write_data(uchar date) { lcd_rs=1; lcd_rw=0; P0=date; delay(1); lcd_en=1; delay(1); lcd_en=0; } /**********初始化子程序************/ void init_LCD1602() { lcd_en=0; write_com(0x38); //显示模式设置:16*2显示,5*7点阵,8位数据接口write_com(0x0c); //开显示,不显示光标 write_com(0x06); //指针、光标自动加一,整屏不移动 write_com(0x80); //初始位置设置 } /*********显示子程序***********/ void display(uchar *str) { while(*str!='\0’) { write_data(*str); str++;

[万年历,系统]简析基于DS1302和LCD1602的万年历系统设计

简析基于DS1302和LCD1602的万年历系统设计 0引言 在日常生活中,无论哪一行业,哪一领域,时间授时都是不可或缺的。从古老的钟表到现代的电子设备都提供时间授时的功能。因此,对于单片机学习者来说,设计并实现一款低成本的,有操作性的,提供年,月,日,小时,分,秒,星期等基本计时功能的万年历系统,显得特别实用,特别有意义。 1总体设计及原理图 万年历的基本功能一是要提供年月日等基本时间项的授时;二是可以修改时间项。基于以上两个功能,我们万年历总体设计方案。 万年历有时钟计时模块,显示模块,调整时钟模块和控制器4部分组成。接下来的任务就是对以上模块进行选型。低成本,可操作是选型的标准。对于控制器,选择最常用的C51系列单片机STC89C52。 STC89C52是由宏品科技生产的是一种低功耗8位基于经典C51内核的微处理器,具有8 KhyteFLASH存储器,512 byte RAM , 4 KByte EEPROM , 32位通用IO接口,可以直接用串口下载程序。 时钟模块选择由dallas公司生产的时钟芯片DS1302,DS1302是一款支持年月日,小时分秒,星期,闰年补偿的实时时钟芯片;其简单三线结构可以很方便地与单片机通用IO相连,进行串行总线读写传输。 显示模块选择16x2的字符点阵模块LCD 16020LC D 1602的控制器以Hitachi公司生产的HD44780芯片最为常见。LC D 1602引脚主要包括3类,第1类是电源。第2类是8位数据I/0通道,用于读写LC D 1602。第3类是3根控制线,RS,R/W和E,其中,RS和R/W是用于实现LCD不同操作的。 E是作为读写的启动信号,有点类似一个时钟信号,数据要写人LC D 1602或从LCD 1602读出数据均需要首先置E信号为高至少1 s,然后置低。 调整时钟模块设计了4个轻触开关,用于设定和修改时间项。 根据总体设计方案和各个模块的特性。设计了万年历的原理图STC89C52的PO口作为通过IO来用,连接上拉电阻。时钟芯片DS1302由32.768 Khz的品振作为时钟源,用于串行数据传输的SCLK,SDA,RST分别于STC89C52的P0.3,P0.4,P0.5相连。显示模块LC D 1602的8位数据通道DO,D7与STC89C52的P2相连,其控制引脚RS,RW,E分别于STC89C52的P0.1 , P0.2 , P0.3相连。P1.O}P1.4连接4个上拉电阻和轻触开关,未按下为高电平,按下为低电平。 2软件设计

ds1302_万年历

/*************************************************************** 系统名称:电子万年历 日期:2008,7,18 功能描述:LCD12864串行模式显示,DS1302读取时间年月份, 18B20 读取温度 ****************************************************************/ #include #include #include #define uchar unsigned char #define uint unsigned int /*------------LCD12864相关声明-----------------------------*/ #define com 0 #define dat 1 sbit cs =P1^6; sbit sid=P1^4; sbit sck=P1^2; uchar code TAB1[]={"电字钟w418781840"};//第一行初始化. uchar code TAB2[]={"20 年月日"}; //第二行 uchar code TAB3[]={"星期: : "}; //第三行 uchar code TAB4[]={"室温: ℃"}; //第四行 /*----------------------DS1302相关声明-------------------------*/ char TAB_1302[]={ 0x00,0x29,0x02, //秒:分:时. 0x18,0x06,0x06,0x08}; //日:月:星期:年. uchar code TAB_XQ[]={"一二三四五六日"};//把DS1302数字日期转换为中文字符. sbit T_CLK=P2^4; /* 实时时钟的时钟线引脚*/ sbit T_IO=P2^5; /* 实时时钟的数据线*/ sbit T_RST=P2^6; /* 实时时钟的复位线引脚*/ uchar bdata datbyte; sbit datbyte0=datbyte^0; sbit datbyte7=datbyte^7; /*--------------18B20相关声明-------------------------------*/ uchar dis1[16]; sbit DQ=P1^0; /*DS18B20温度检测*/ /*----------键盘相关声明-------------------------------------*/ sbit key=P3^2; //功能键 sbit key1=P3^3; //只有加1键 uchar sum,keyflag=0; //调用时,分,秒,标志,调用键盘处理标志. /*--------------以下为LCD12864相关函数--------------------------*/ /************************************************************** 函数名称:void delay1ms(uint x) 函数功能: 延时1MS ***************************************************************/

电子万年历设计(基于AT89C51单片机和DS1302时钟芯片)1.doc

随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。 二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步…… 我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。 本设计为软件,硬件相结合的一组设计。在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目的更深了解,有助于软件设计。基本的要了解一些主要器件的基本功能和作用。 除了采用集成化的时钟芯片外,还有采用MCU的方案,利用AT89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。AT89C51是由ATMEL 公司推出的一种小型单片机。95年出现在中国市场。其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。 本文介绍了基于AT89C51单片机设计的电子万年历。 首先我们在绪论中简单介绍了单片机的发展与其在中低端领域中的优

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

基于时钟日历芯片DS1302的万年历设计 基于时钟日历芯片DS1302的万年历 设计 黄豪民 摘要 随着科学技术的发展,万年历的设计也层出不穷。本设计以单片机AT89C51和DS1302为核心,结合译码器74HC154和驱动芯片74LS244,以及模拟键盘,LED显示电路等构成一 个可控及显示精确的万年历时间系统。 DS1302为一个实时时钟芯片,具有较高时间精度,它与单片机进行串口通信,单片机通过与它的通信,取出其时间寄存器中的值,再通过相应的电路,把时间值通过LED显示,如果显示的值与标准时间不同,此系统就经过模拟键盘灵活控制,调节DS1302中时间寄 存器中的值,达到与标准时间同步。 关键词 AT89C51,DS1302 I ABSTRACT Along 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 simulation keyboard can adjust conveniently DS1302’s time register value, achieving with the standard time synchronously. Keywords AT89C51, DS1302 II 目录 摘 要 ........................................................................... ................................................. I ABSTRACT ..................................................................... ............................................... II 1 绪 论 ........................................................................... .............................................. 1 2 功能要 求 ........................................................................... ...................................... 3 3 方案论 证 ........................................................................... .. (3) 3.1 显示器的选 择 ........................................................................... . (3) 3.1.1 VFD显示 器 ...........................................................................

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

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

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

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

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

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