文档视界 最新最全的文档下载
当前位置:文档视界 › 1602、18b20、ds1302电子时钟

1602、18b20、ds1302电子时钟

1602、18b20、ds1302电子时钟
1602、18b20、ds1302电子时钟

目录

1 仿真实验环境 (1)

1.1采用Proteus6_9_SP5实现单片机及外围器件的仿真 (1)

1.2使用Keil uVision3编写本日历程序(C语言) (1)

2 原理图 (2)

2.1各部分功能实现: (2)

3 程序分析及代码 (3)

3.1程序分析: (3)

3.1.1 程序的优点: (3)

3.1.2 程序的缺点: (3)

3.1.3 总结: (3)

3.2源代码: (4)

3.2.1 Calendar.c程序文件: (4)

3.2.2 LM016L.h程序文件: (6)

3.2.3 DS1302.h程序文件: (7)

3.2.4 DS18B20.h程序文件: (11)

3.2.5 KeyScan.h程序文件: (14)

3.2.6 OPEN.h程序文件: (17)

3.2.7 MODE.h程序文件: (18)

4 效果图 (19)

4.1 上电显示 (19)

4.2 正常显示 (20)

4.3功能模式(调时) (20)

4.4闹钟模式 (21)

4.5温度报警(小灯闪烁) (21)

1 仿真实验环境

1.1采用Proteus6_9_SP5实现单片机及外围器件的仿真如图:

1.2使用Keil uVision3编写本日历程序(C语言)

如图:

2 原理图

2.1各部分功能实现:

1.以AT89C52作为控制核心,通过P0口连接LM016L液晶的并行数据输入/输出端进行显示数据以及命令的发送与接收。P

2.0、P2.1和P2.2分别连接液晶的数据/命令选择端、读/写控制以及使能端。通过对这三个端口的操作,来实现液晶的正确显示。

2.DS18B20数字温度传感器以单总线的方式连接到P2.3口,通过正确的时序操作,与单片机进行双向通信,把温度值以串行数字形式发送给单片机。再正确显示在LCD上。

3.LED灯连接P2.4口,在相应的时间或温度触发下通过电平的高低变化闪烁。

4.单片机的P2.5、P2.6、P2.7分别连接DS1302时钟芯片的复位端、时钟信号以及I/O端。在相应时序信号的控制下,读出芯片中的内容,并显示在LCD上。

5.该日历的功能操作通过连接在P3.0~P3.3的四个按键实现,四个按键分别为:进入/退出模式键、功能选择键、时加/温度加一键、分加/温度减一键。

6.因为P0口没有上拉电阻,所以加了排阻。

3 程序分析及代码

3.1程序分析:

3.1.1 程序的优点:

1.以模块化的形式把程序分为若干个独立部分。

2.在程序中使用了指针、数组、函数等结合的方法,简化了部分程序。

3.程序中首次使用了二维字符数组的相关操作。

3.1.2 程序的缺点:

1.程序总体上写的不够简练。

2.程序的部分功能操作麻烦,如调时或闹钟设置时对时、分的操作只能加。

3.程序的稳定性有待于提高。

4.过多的变量、标志位的定义降低了程序的可读性。

3.1.3 总结:

通过该日历程序的编写,自身发现了许多的问题,现总结如下:

1.在编写程序的过程中一定要做好程序的备份。

2.在编写某功能函数之前要想好流程再写,最好写出流程图。

3.一定要多写注释,不然连自己都读不懂自己的程序。

4. 在编写该日历程序过程中,首次出现了内存不够的情况,以后需引起注意。

3.2源代码:

3.2.1 Calendar.c程序文件:

/******使用LCD1602、DS1302时钟芯片、DS18B20温度传感器完成该日历*******/

#include

//以下的顺序不能任意放

#define uint unsigned int //宏定义

#define uchar unsigned char

#include"LM016L.h"

#include"DS1302.h"

#include"DS18B20.h"

#include"KeyScan.h"

#include"MODE.h"

#include"OPEN.h"

////////以下为几个标志位///////////

// flag,select,alarm,temperature,limit

/*分别为模式标志位、功能选择标志位、闹钟、温度正负标志位以及温度上限值(整型)其中alarm有三种状态:0为禁止进入,1为允许进入,2为正在闹钟模式下*/

void open(); //上电显示

void KeyScan(); //键盘扫描

void SetTime_Mode(); //调时

void SetRing_Mode(); //闹钟设置

void SetTemp_Mode(); //温度上限设置模式

/******************************日历主函数************************************/ void main()

{

init(); //初始化LCD

Set_RTC(l_tmpdate1);//初始化时钟芯片

open(); //上电显示函数

write_com(0x01); //清屏

while(1)

{

time_date(); //时间处理

KeyScan(); //键盘扫描

if(ring_time[1]==l_tmpdate[1]&&ring_time[2]==l_tmpdate[2]&&flag==0&&alarm!=0)//判断是否到闹钟设置的时间,是的话执行相应动作

{

uchar i;

alarm=2; //正在闹钟响应模式下

if(ring_time[0]==l_tmpdate[0])//相等的那一时刻清屏,循环清屏会导致闪烁

write_com(0x01);

led=0; //小灯闪烁

delay(100);

led=1;

write_com(0x80+0x01); //写入“Time To Get Up”

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

{

write_date(ringtable[i]);

}

if(l_tmpdate[0]==0x59) //自动退出闹钟模式时清屏

write_com(0x01);

continue; //跳出本次的While循环

}

if(flag==0) //正常显示模式下

{

tempchange(); //温度转换命令

display(l_tmpdisplay,8);//显示时间

Temp_Display(); //显示温度

deal(); //温度处理

}

if(flag==1) //功能选择模式下

{

uchar i;

write_com(0x80+0x4); //选择菜单

for(i=0;menu[select][i]!='\0';i++)

{

write_date(menu[select][i]);

}

if(select==0) //调试模式

{

SetTime_Mode();

}

if(select==1) //闹钟设置

{

SetRing_Mode();

}

if(select==2) //设置温度上限

{

SetTemp_Mode();

}

}

}

}

/***************END***********END******************************/ 3.2.2 LM016L.h程序文件:

/********************LCD相关程序***************************/

sbit rs=P2^0; // LCD数据/命令选择端

sbit rw=P2^1; //LCD读写选择端

sbit e=P2^2; //LCD使能信号

void delay(uchar z); //延时函数

void init(); // LCD初始化函数

void write_com(uchar com); //LCD写命令

void write_date(uchar date); //LCD写数据

void init() //LCD初始化函数

{ e=0;

write_com(0x38);//显示模式的设置

delay(1);

write_com(0x0c);//开显示,光标显示

delay(1);

write_com(0x06);//光标位置

delay(1);

write_com(0x01); //清显示

delay(1);

}

void write_com(uchar com) //LCD写命令

{

rs=0;

rw=0;

P0=com;

delay(1);

e=1;

delay(1);

e=0;

}

void write_date(uchar date) //LCD写数据

{

rs=1;

rw=0;

P0=date;

delay(1);

e=1;

delay(1);

e=0;

}

void delay(uchar z) //延时函数

{

uchar x,y;

for(x=0;x

for(y=0;y<110;y++);

}

/***************END***********END******************************/ 3.2.3 DS1302.h程序文件:

/***************时钟芯片相关程序*************************/

sbit rst=P2^5; //时钟芯片复位端

sbit sck=P2^6; // 时钟信号

sbit io=P2^7; // 时钟输入/输出端

void Write_Ds1302_Byte(uchar temp);//写入一个字节

void Write_Ds1302(uchar address,uchar dat);//写入

uchar Read_Ds1302 ( uchar address ); //读取时间

void Read_RTC(void); //读取日历

void Set_RTC(uchar *p); //设定日历

void time_date(); //时间数据处理

void display(uchar *lp,uchar lc); //显示时间

uchar code table0[]="0123456789-";

uchar code table1[]="MONTUEWEDTHUFRISA TSUN";

uchar code table2[]="0123456789:";

code uchar write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};

//写入时钟芯片的地址,顺序同上

code uchar read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

//以上是读出数据的地址

uchar code l_tmpdate1[7]={0x50,0x30,0x15,0x12,0x06,0x04,0x09};

/*初始化时钟芯片,依次是秒分时日月星期年,用16进制的BCD码表示*/ uchar l_tmpdate[7],l_tmpdisplay[18],SetTime[18],ring_time[7];

void Write_Ds1302_Byte(uchar temp) //写入一字节数据

{

uchar i;

for (i=0;i<8;i++) //循环8次写入数据,上升沿写入

{

sck=0;

io=temp&0x01; //每次传输低字节

temp>>=1; //右移一位

sck=1;

}

}

void Write_Ds1302(uchar address,uchar dat)//写入

{

rst=0;

delay(1);

sck=0;

delay(1);

rst=1;

delay(1); //启动

Write_Ds1302_Byte(address); //发送地址

Write_Ds1302_Byte(dat); //发送数据

rst=0; //恢复

}

uchar Read_Ds1302 (uchar address) //读取时间

{

uchar i,time=0x00;

rst=0;

delay(1);

sck=0;

delay(1);

rst=1;

delay(1);

Write_Ds1302_Byte(address);

for (i=0;i<8;i++) //循环8次读取数据

{

if(io)

time|=0x80; //每次传输低字节

sck=1; //时钟下降沿读入数据

time>>=1; //右移一位

sck=0;

}

rst=0;

delay(1); //以下为DS1302复位的稳定时间

rst=0;

sck=0;

delay(1);

sck=1;

delay(1);

io=0;

delay(1);

io=1;

delay(1);

return (time);

}

void Read_RTC() //读取日历

{

uchar i,*p;

p=read_rtc_address; //地址传递

for(i=0;i<7;i++) //分7次读取年月日时分秒星期

l_tmpdate[i]=Read_Ds1302(*p);

p++;

}

}

void Set_RTC(uchar *P1302) //设定日历

{

uchar i,*p;

Write_Ds1302(0x8E,0X00); //允许写入

p=write_rtc_address; //传地址

for(i=0;i<7;i++) //7次写入年月日时分秒星期

{

Write_Ds1302(*p,P1302[i]);

p++;

}

Write_Ds1302(0x8E,0x80); //禁止写入

}

void time_date() //时间数据处理

{

Read_RTC();

l_tmpdisplay[0]=l_tmpdate[2]/16;//时

l_tmpdisplay[1]=l_tmpdate[2]&0x0f;

l_tmpdisplay[2]=10; //加入":"

l_tmpdisplay[3]=l_tmpdate[1]/16;//分

l_tmpdisplay[4]=l_tmpdate[1]&0x0f;

l_tmpdisplay[5]=10;

l_tmpdisplay[6]=l_tmpdate[0]/16;//秒

l_tmpdisplay[7]=l_tmpdate[0]&0x0f;

l_tmpdisplay[8]=2; //显示2008的2

l_tmpdisplay[9]=0; //显示2008的第一个0

l_tmpdisplay[10]=l_tmpdate[6]/16; //年

l_tmpdisplay[11]=l_tmpdate[6]&0x0f;

l_tmpdisplay[12]=10; //加入“-”

l_tmpdisplay[13]=l_tmpdate[4]/16;//月

l_tmpdisplay[14]=l_tmpdate[4]&0x0f;

l_tmpdisplay[15]=10;

l_tmpdisplay[16]=l_tmpdate[3]/16;//日

l_tmpdisplay[17]=l_tmpdate[3]&0x0f;

}

void display(uchar *lp,uchar lc) //显示时间

{

unsigned char i; //定义变量

write_com(0x82); //液晶第一行显示时间和星期for(i=0;i

{

write_date(table2[lp[i]]);

delay(1);

}

write_com(0x80+0x0b);

switch(l_tmpdate[5]) //用英文缩写显示星期{

case 0: write_date(table1[0]);

write_date(table1[1]);

write_date(table1[2]);

break;

case 1: write_date(table1[3]);

write_date(table1[4]);

write_date(table1[5]);

break;

case 2: write_date(table1[6]);

write_date(table1[7]);

write_date(table1[8]);

break;

case 3: write_date(table1[9]);

write_date(table1[10]);

write_date(table1[11]);

break;

case 4: write_date(table1[12]);

write_date(table1[13]);

write_date(table1[14]);

break;

case 5: write_date(table1[15]);

write_date(table1[16]);

write_date(table1[17]);

break;

case 6: write_date(table1[18]);

write_date(table1[19]);

write_date(table1[20]);

break;

}

write_com(0x80+0x40); //第二行显示年

for(i=8;i

{

write_date(table0[lp[i]]);

delay(1);

}

}

/***************END***********END******************************/ 3.2.4 DS18B20.h程序文件:

/***************温度传感器相关程序******************/

sbit ds=P2^3; //温度传感器信号线

sbit led=P2^4; //小灯位定义

uchar temperature;

uint temp,limit=800; // 整型温度值

float f_temp; //浮点型温度值

uint get_temp(); //获得温度

void tempchange(void); //转换温度

void dsreset(void); //DS18B20复位

bit tempreadbit(void); //读DS118B20一位

uchar tempreadbyte(void); //读DS18B20一个字节

void tempwritebyte(uchar dat); //写入DS18B20一个字节

void deal(); //温度处理函数

void Temp_Display(); //温度显示

uchar code table[]="0123456789.C ";

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) //读一位数据函数

{

uint i;

bit dat;

ds=0;i++; //i++起延时的作用

ds=1;i++;i++;

dat=ds;

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

return(dat);

}

uchar tempreadbyte(void) //读一个字节数据函数

{

uchar i,j,dat;

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

{

j=tempreadbit();

dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面}

return(dat);

}

void tempwritebyte(uchar dat)

{ //写一个字节数据函数uint i;

char 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 //写0

{

ds=0;

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

ds=1;

i++;i++;

}

}

}

void tempchange(void) //DS18B20开始获取温度并转换{

dsreset();

delay(1);

tempwritebyte(0xcc); //写跳过读ROM指令

tempwritebyte(0x44); //写温度转换指令

}

uint get_temp() //读取寄存器中存储的温度数据{

uchar a,b;

dsreset();

tempwritebyte(0xcc); //跳过RAM,适用于一个从机工作

tempwritebyte(0xbe); //读RAM内部9字节的温度数据

a=tempreadbyte(); //读低8位

b=tempreadbyte(); //读高8位

temp=b;

temp<<=8;

temp=temp|a; //两个字节组合为一个字

if((b&0x80)!=0) //判断温度是否为负

{

temperature=1; //temperature为1表示温度为负

temp=~temp+1; //若温度为负,则取其补

}

else temperature=0;

f_temp=temp*0.0625; // 温度在寄存器中为12位,分辨率为0.0625

temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入// f_temp=f_temp+0.05;

return temp;

}

void Temp_Display() //温度显示函数

{

if(get_temp()/1000==1) //温度上百时

{

write_com(0x80+0x40+0x0a); //温度的百位

write_date(table[get_temp()/1000]);

write_com(0x80+0x40+0x0b);

write_date(table[get_temp()%1000/100]); //十位

}

if(get_temp()/1000==0) //温度未上百

{

write_com(0x80+0x40+0x0a);

if(temperature==1)

write_date('-'); //若温度为负则前面显示“-”

else

write_date(' '); //若温度的百位为0且正则不显示

write_com(0x80+0x40+0x0b);

write_date(table[get_temp()/100]); //十位

}

write_com(0x80+0x40+0x0c);

write_date(table[get_temp()%100/10]); //个位

write_com(0x80+0x40+0x0d);

write_date(table[10]);

write_com(0x80+0x40+0x0e);

write_date(table[get_temp()%10]); //十分之一位

write_com(0x80+0x40+0x0f);

write_date(table[11]);

}

void deal() //温度处理函数

{

if(get_temp()>limit) //当温度超过设定的上限值时

{

led=0;

delay(100);

led=1;

}

}

/***************END***********END******************************/ 3.2.5 KeyScan.h程序文件:

/****************键盘扫描函数***********************/

sbit key1=P3^0; //键盘位定义

sbit key2=P3^1;

sbit key3=P3^2;

sbit key4=P3^3;

uchar flag,select,alarm=1;

void KeyScan()

{

/////////进入/退出模式键被按下///////////

if(key1==0)

{

write_com(0x01); //清屏

if(alarm==2) //闹钟到时间

{

alarm=0; //退出闹钟模式,并且禁止进入

}

else

{

flag++; //模式间的转换

if(flag>=2) { flag=0; select=0;}

}

while(!key1); //检测键盘是否释放,下同

}

/////////功能选择键被按下///////////

if(key2==0&&flag==1)

{

write_com(0x01); //清屏

select++;

if(select>=3) { select=0; write_com(0x01); }

while(!key2);

}

/////////时加/温度加一键被按下///////////

if(key3==0)

{

if(select==0&flag==1) //调试模式下

{ uchar j,shi1,shi2;

for(j=0;j<6;j++) //重新读当前时间

{

SetTime[j]=l_tmpdate[j];

}

shi1=SetTime[2]>>4; shi2=SetTime[2]&0x0f;

shi2++;

if(shi2>9)

{

shi2=0;

shi1++;

}

if(shi1==2&&shi2==4) { shi1=0; shi2=0; }

SetTime[2]=16*shi1+shi2; //写入数组

Set_RTC(SetTime);

}

if(select==1&&flag==1) // 闹钟设置模式下

{

uchar shi1,shi2;

alarm=1; //允许进入闹钟模式

shi1=ring_time[2]>>4; shi2=ring_time[2]&0x0f;

shi2++;

if(shi2>9)

{

shi2=0;

shi1++;

}

if(shi1==2&&shi2==4) { shi1=0; shi2=0; }

ring_time[2]=shi1*16+shi2; //写入数组}

if(select==2&&flag==1) //上限温度值加一

{

limit+=10;

if(limit>1270) limit=0;

write_com(0x01);

}

while(!key3);

}

/////////分加/温度减一键被按下///////////

if(key4==0) //分加一键

{

if(select==0&flag==1) //调时模式下

{

uchar j,fen1,fen2;

for(j=0;j<6;j++) //重新读当前时间

{

SetTime[j]=l_tmpdate[j];

}

fen1=SetTime[1]>>4; fen2=SetTime[1]&0x0f;

fen2++;

if(fen2>=10)

{

fen2=0;

fen1++;

}

if(fen1>=6) {fen1=0;}

SetTime[1]=fen1*16+fen2; //写入数组

Set_RTC(SetTime);

}

if(select==1&&flag==1) // 闹钟设置模式下

{

uchar fen1,fen2;

alarm=1; //允许进入闹钟模式

fen1=ring_time[1]>>4; fen2=ring_time[1]&0x0f;

fen2++;

if(fen2>9)

{

fen2=0;

fen1++;

}

if(fen1>=6) { fen1=0; }

ring_time[1]=fen1*16+fen2; //写入数组}

if(select==2&&flag==1) //温度上限值减一

{

limit-=10;

if(limit<=0) limit=1270;

write_com(0x01);

}

while(!key4);

}

}

/***************END***********END******************************/ 3.2.6 OPEN.h程序文件:

/********************上电显示函数***************************/ uchar code opens[]="XingTai"; //定义上电显示字符数组

uchar code opens1[]="Institute";

void open()

{ uchar num;

write_com(0x80+0x10);

for(num=0;opens[num]!='\0';num++) //把数组中的内容写完

{

write_date(opens[num]);

delay(20);

}

for(num=0;num<16;num++) //整屏右移16

{

write_com(0x1c);

delay(200);

}

for(num=0;num<5;num++) //整屏左移5

{

write_com(0x18);

delay(200);

}

for(num=0;num<4;num++) //整屏右移4

{

write_com(0x1c);

delay(200);

}

for(num=0;num<3;num++) //整屏左移3

{

write_com(0x18);

delay(200);

}

for(num=0;num<2;num++) //整屏右移2

{

write_com(0x1c);

delay(200);

}

for(num=0;num<1;num++) //整屏左移1

{

write_com(0x18);

delay(100);

}

write_com(0x80+0x53); //写入第二行数据

for(num=0;opens1[num]!='\0';num++)

{

write_date(opens1[num]);

delay(500);

}

}

/***************END***********END******************************/ 3.2.7 MODE.h程序文件:

/*********************功能模式函数*****************************/ uchar code menu[3][9]={{"Time Set"},{"Ring Set"},{"Temp Set"}};

uchar code ringtable[14]="Time To Get Up"; //闹钟显示

void SetTime_Mode() //调时模式

{

uchar i;

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

{

SetTime[i]=l_tmpdate[i];

}

write_com(0xc0+5);

write_date(table2[SetTime[2]>>4]); //读时的第一位

write_date(table2[SetTime[2]&0x0f]); //读时的第二位

write_date(':');

write_date(table2[SetTime[1]>>4]); //读分的第一位

write_date(table2[SetTime[1]&0x0f]); //读分的第二位

}

void SetRing_Mode() //闹钟设置

{

write_com(0xc0+5);

write_date(table2[ring_time[2]>>4]); //读时的第一位

write_date(table2[ring_time[2]&0x0f]); //读时的第二位

write_date(':');

write_date(table2[ring_time[1]>>4]); //读分的第一位

write_date(table2[ring_time[1]&0x0f]); //读分的第二位

}

void SetTemp_Mode() //温度上限设置模式

{

if(limit/1000) //若温度百位为0则不显示

{

write_com(0xc0+5);

write_date(table[limit/1000]);

}

write_com(0xc0+6);

write_date(table[limit%1000/100]);

write_com(0xc0+7);

write_date(table[limit%100/10]);

write_com(0xc0+8);

write_date('.');

write_com(0xc0+9);

write_date('0');

write_com(0xc0+0x0a);

write_date('C');

}

/***************END***********END******************************/

4 效果图

4.1 上电显示

DS1302时钟芯片读写详解

DS1302时钟芯片读写详解 2008-09-26 13:07 /*DS1302读写程序(C51)*/ sbit DS13CLK =P1^5; /*DS1302的SCLK脚脉冲*/ sbit DS13IO =P1^6; /*DS1302的IO脚数据*/ sbit DS13CS =P1^7; /*DS1302的RST脚片选*/ /*向DS1302写一个字节*/ void _wds13byte(uchar _code) { uchar i; DS13CLK =0; DS13CLK =0; for(i=0;i<8;i++) { if(_code&0x01) DS13IO =1; else DS13IO =0; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; _code =_code >> 1; } } /*从DS1302读一个字节*/ uchar _rds13byte(void) { uchar i,_code; _code=0; DS13CLK =0; DS13CLK =0; DS13IO =1; for(i=0;i<8;i++) { _code =_code >>1; if(DS13IO) _code =_code|0x80; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; } return _code; } /*读功能_code读功能命令*/ uchar readds1302(uchar _code)

{ DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(_code); /*读代码*/ _code=_rds13byte(); /*返回读取数字*/ DS13CLK =1; DS13CS =0; /*关闭DS1302*/ return _code; } /*写功能fp写的地址,_code写的内容*/ void writeds1302(uchar fp,uchar _code) { DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(fp); /*写控制命令*/ _wds13byte(_code); /*写入数据*/ DS13CLK=1; DS13CS =0; /*关闭DS1302*/ } /*******DS1302设置快速充电***************/ void ds13_charg(void) { writeds1302(0x8e,0x00); /*解除写保护*/ writeds1302(0x90,0xa5); /*单二极管2K电阻充电*/ writeds1302(0x8e,0x80); /*置位写保护*/ } ;;;DS1302读写程序(汇编);;; ;******************************************************************* **/ T_CLK Bit P1.5 ;实时时钟时钟线引脚 T_IO Bit P1.6 ;实时时钟数据线引脚 T_RST Bit P1.7 ;实时时钟复位线引脚 ;********************************************************** ;子程序名:Set1302 ;功能:设置DS1302 初始时间,并启动计时。 ;说明: ;调用:RTInputByte ;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续) ;出口参数:无 ;影响资源:A B R0 R1 R4 R7

基于stc51单片机的LCD1602显示时间_的电子万年历(显示当前温度)

1 课设所需软件简介 1.1 Keil uVision4的简要介绍 2009年2月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。新版本支持更多最新的ARM芯片,还添加了一些其他新功能。 2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本的Keil uVision4,其编译器、调试工具实现与ARM器件的最完美匹配。 Keil C51开发系统基本知识Keil C51开发系统基本知识 1. 系统概述 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。 2. Keil C51单片机软件开发系统的整体结构 C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

时钟芯片DS1302的用法

单片机玩到此时,很想玩TFT真彩屏,但如果不玩一玩汉显字符液晶屏,就总觉得少了些什么,说实话,我对时钟制作并不很感兴趣,因为家里走针的、蹦字的计时器、定时器大小有七八个,还不算手机和电脑的时钟,而要想玩汉显屏,则做时钟算是最合适的了,也难怪杜洋老师会在这上下功夫,毕竟没有那家公司会让咱初学者去搞工控或商品。前些时,在网上淘了一只LCD-12864模块,已经点亮并通过了简单的测试,准备做杜洋的时钟,准备技术资料时,在网上找到了一篇关于时钟芯片DS1302的应用文章,觉得不错,转帖于此以资共享。 时钟芯片DS1302可靠起振的方法 作者:不详出处:不详 DS1302是Dallas公司生产的一种实时时钟芯片。它通过串行方式与单片机进行数据传送,能够向单片机提供包括秒、分、时、日、月、年等在内的实时时间信息,并可对月末日期、闰年天数自动进行调整;它还拥有用于主电源和备份电源的双电源引脚,在主电源关闭的情况下,也能保持时钟的连续运行。另外,它还能提供31字节的用于高速数据暂存的RAM。鉴于上述特点,DS1302已在许多单片机系统中得到应用,为系统提供所需的实时时钟信息。 一、 DS1302的主要特性 1. 引脚排列 图1 DS1302引脚排列图(见附图) DS1302的引脚排列如图1所示,各引脚的功能如下: X1,X2——32768Hz晶振引脚端; RST——复位端; I/O——数据输入/输出端; SCLK——串行时钟端; GND——地; VCC2,VCC1——主电源与后备电源引脚端。 2. 主要功能: DS1302时钟芯片内主要包括移位寄存器、控制逻辑电路、振荡器、实时时钟电路以及用于高速暂存的31字节RAM。DS1302与单片机系统的数据传送依靠RST,I/O,SCLK三根端线即可完成。其工作过程可概括为:首先系统RST引脚驱动至高电平,然后在作用于SCLK时钟脉冲的作用下,通过I/O引脚向DS1302输入地址/命令字节,随后再在SCLK时钟脉冲的配合下,从I/O引脚写入或读出相应的数据字节。因此,其与单片机之间的数据传送是十分容易实现的。 二、时钟的产生及存在的问题 (1) 在实际使用中,我们发现DS1302的工作情况不够稳定,主要表现在实时时间的传送有时会出现误差,有时甚至整个芯片停止工作。我们对DS1302的工作电路进行了分析,其与单片机系统的连接如图2所示。从图中可以看出,DS1302的外部电路十分简单,惟一外接的元件是32768Hz 的晶振。通过实验我们发现:当外接晶振电路振荡时,DS1302计时正确;当外接晶振电路停振时,DS1302计时停止。因此,我们认为32768Hz晶振是造成DS1302工作不稳定的主要原因。 图2 DS1302与单片机系统的连接图(见附图) (2) DS1302时钟的产生基于外接的晶体振荡器,振荡器的频率为32768Hz。该晶振通过引脚X1、X2直接连接至DS1302,即DS1302是依靠外部晶振与其内部的电容配合来产生时钟脉冲的。

ds1302时钟程序详解-ds1302程序流程图(C程序)

ds1302时钟程序详解,ds1302程序流程图(C程序) ds1302时钟程序详解 DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始 输出。 2.3 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从 低位0位到高位7。 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日 历、时间寄存器及其控制字见表1。 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RA M的31个字节,命令控制字为FEH(写)、FFH(读)。

ds1302程序流程图 3.2 DS1302实时时间流程 图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基 本操作进行编程:

基于LCD1602电子时钟

信息与电子工程学院课程设计报告

录目 一、课程设计概 述 (3) 1.1 课程设计背 景 (3) 1.2 课程设计内 容 (3) 1.3 课程设计技术指 标 (3) 二、方案的选择及确 定 (3) 2.1 单片机芯片的选 择 (3) 2.2 显示模块的选 择 (4) 2.3 实时时间计算模块的选择.4 2.4 实时环境温度采集模块选 择 (4) 2.5 电路设计最终方案决 定 (5) 三、系统硬件设 计 (5) 3.1 主控模 块 (5) 3.2LCD显示模块设 计 (6) 3.3 时间计算模块设 计 (6) 3.4 实时环境温度检测模 块 (7) 3.5 报警模 块 (7) 3.6 设置模 块 (8) 3.7 电源接口部

分 (8) 四、系统软件设 计 (8) 4.1 主函 数 (8) 4.2 设置模 块 (9) 4.31602 液晶 屏 (10) 4.4 软件原理 图 (11) 五、系统调试过 程 (11) 5.1 软件调 试 (11) 5.2 硬件调 试 (12) 六、结 论 .................................. 12 七、遇到的问题及解决方法和总 结 (12) 7.1 硬件方 面 (12) 7.2 软件方 面 (13) 7.3 总 结 (13) 1 八、参考文 献 (13) 九、附 录 (14)

课程设计概述 1.1 课程设计背景随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。 而电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的题目。因为它有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。 1.2 课程设计内容 利用单片机、时钟芯片DS1302温度传感器DS18B20 16O2液晶屏等实现日期、时间、温度的显示,即是一个电子时钟。具体的功能如下: (1)通过DS1302能够准确的计时,时间可调并在液晶屏上显示出来。 (2)通过DS18B2C能够实时、准确的检测当前环境温度。 (3)利用程序控制单片机实现闹钟功能。 1.3 课程设计技术指标 (1)LCD液晶每行刷新显示。 (2)实时时钟可提供年、月、日、时、分和秒,每月的天数可以自动调整,且具有闰年补偿功能。 (3)时间是24小时制;年限2000年~2099年。 (4)测量温度范围为0 C ~+ 60 C,误差为土0.5 ° C。

DS1302时钟芯片的原理与应用

DS1302 时钟芯片的原理与应用 1 写保护寄存器操作 当写保护寄存器的最高位为0 时,允许数据写入寄存器,写保护寄存器可以通过命令字节8E 8F 来规定禁止写入/读出。写保护位不能在多字节传送模式下写入Write_Enable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#00h 数据内容为0 写入允许 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 当写保护寄存器的最高位为1 时禁止数据写入寄存器 Write_Disable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#80h 数据内容为80h 禁止写入 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面 的程序亦使用了这个模块 2 时钟停止位操作 当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始 Osc_Enable: MOV Command,#80h ; 命令字节为80 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#00h 数据内容为0 振荡器工作允许 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 当把秒寄存器的第7 位时钟停止位设置为1 时,时钟振荡器停止DS1320 进入低功耗方式 Osc_Disable: MOV Command,#80h ;命令字节为80 MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#80h 数据内容为80h 振荡器停止 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 3. 多字节传送方式

基于DS1302的数码管显示数字钟

单片机原理课程设计 课题名称:基于DS1302的数码管显示数字钟 专业班级:电子信息工程 学生学号: 学生姓名: 指导教师: 设计时间:2010年6月21日--2010年6月25日

目录 摘要........................................................................................................................................................................ 1 设计任务和要求............................................................................................................................................ 2 方案论证........................................................................................................................................................ 3 系统硬件设计................................................................................................................................................ 3.1 系统总原理图 ................................................................................................................................ 3.2 元器件清单...................................................................................................................................... 3.3 PCB板图....................................................................................................................................... 3.4 Proteus仿真图 ............................................................................................................................... 3.5 分电路图及原理说明................................................................................................................... 3.5.1 主控部分(单片机MCS-51).............................................................................. 3.5.2 计时部分(实时时钟芯片DS1302).................................................................. 3.5.3 显示部分(共阳极数码管)................................................................................ 3.5.4 调时部分(按键)................................................................................................ 4系统软件设计................................................................................................................................................ 4.1 程序流程图..................................................................................................................................... 4.2 程序源代码........................................................................................................................................ 5心得体会........................................................................................................................................................ 6参考文献........................................................................................................................................................ 7结束语............................................................................................................................................................

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

基于单片机的LCD1602电子时钟设计 一、设计任务和目的 1.1、设计任务 (1):用单片机设计基于LCD1602的电子时钟,显示时间和日期; (2):误差精度控制在1s/天; (3):具有时间和日期的校准功能; (4):能区分某年是闰年或平年,并对应显示2月份的天数; (5):根据月份的不同显示不同的最大日数; (6):搭建仿真电路图,模拟单片机要实现的功能; (7):焊接单片机开发板; (8):编写程序,下载并调试,实现要求的功能。 1.2、设计目的 (1):熟练掌握KEIL软件的使用方法; (2):熟练掌握PROTEUS软件的使用方法; (3):掌握单片机I/O接口的工作原理; (4):掌握LCD显示器的工作原理及编程方法; (5):掌握独立式键盘的工作原理及编程使用方法; (6):掌握单片机的下载使用方法。 二、设计思路和方案论证 2.1、设计思路 电路总体上分为控制和显示部分。以单片机最小系统作为核心控制电路,控制LCD显示,具体显示内容及方式由软件来完成;由于有时钟和日期的调节功能需要校准电路和基本的复位电路,复位电路采用按键复位,调节键、加1键、减1键三个按键完成,共需四个按键;计时功能由固定频率的晶振完成(采用11.0592MHz);显示部分主要采用LCD1602作为显示。 2.2、方案论证 (1):时钟芯片的选择和论证 方案一:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、月、年以及闰年补偿的年进行计数,精度也较高,工作电压2.5V~5.5V范围内,功耗也较低,但价格比较贵。 方案二:直接采用单片机定时计数器提供秒信号,使用程序实现秒、分、时、日、月、年计数。采用此方案实现虽然有一定的时间误差,但可减少芯片的使用,节约成本,易于实现,符合现实选用,所以采用此种作为时钟信号发生器。 (2):显示模块选择方案和论证: 方案一:采用点阵式图形LCD12864液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,但是价格昂贵,需要的接口线多,所以在此设计中不采用点阵式图形LCD12864液晶显示屏。 方案二:采用点阵式字符型LCD1602液晶显示屏,LCD1602是专门用于显示字母、数字、符号等的点阵型液晶显示模块,分4位和8位数据传输方式。提供“5×7点阵+光标”和“5×10点阵+光标”的显示模式。价格现对便宜,所以用此种作为显示。

ds1302时钟程序详解经典

dsl302时钟程序详解经典 dsl302时钟程序详解 DS1302的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始 2.3数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0 位到高位7o 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位 为BCD码形式,其日历、 时间寄存器及其控制字见表1。

? I日历?別间襦存祁及凡担制孑 fir* 野擅"itwtr 収他总cn - T ?fsy网 移 e S』3 2 1 0 林斶 son8!ll00-59 f.H IUSVX SIX X2H S3II oum(1Mh、 MH K4H851101 \2A12 24? 10 IIH HK MhH M7II01 -2S.2V, W-Jl ?o imiAre 8SH WII03 - !2(11) 0 IUM MOYI1I AAII8HH ni(i II ? 0 0h\V 8LH Mill OQ ? 9910YLAH 此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器 及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH, FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 dsl302程序流程图

基于51系列单片机及DS1302时钟芯片的电子时钟Proteus仿真_报告

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

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

一、引言 时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。致力于计时器的研究和充分发挥时钟的作用,将有着重要的意义。 1.1 多功能电子时钟研究的背景和意义 20世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度,同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂容易使人忘记当前的时间。然而遇到重大事情的时候,一旦忘记时间,就会给自己或他人造成很大麻烦。平时我们要求上班准时,约会或召开会议必然要提及时间;火车要准点到达,航班要准点起飞;工业生产中,很多环节都需要用时间来确定工序替换时刻。所以说能随时准确的知道时间并利用时间,是我们生活和工作中必不可少的[1]。 电子钟是采用电子电路实现对时、分、秒进行数字显示的计时装臵,广泛应用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、0按时自动打铃、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

最新ds1302时钟程序详解 含电路图 源程序 注释资料

以下资料摘自电子发烧友网感谢作者,版权归网站所有,资料仅供参考 ds1302时钟程序详解 DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 2.3 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 ds1302程序流程图

3.2 DS1302实时时间流程 图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基本操作进行编程:

基于c51功能最全的电子钟程序lcd1602

功能最全的电子钟 【单片机】c51数字时钟(带年月日显 示) 摘要:本设计以单片机为核心,lcd1602显示。采用独立键盘输入能任意修改当前时间日期和设定闹钟时间。具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能 主程序: /**************************************************************************************** ********** ***************************************************************************************** ********** ********************** lcd1602电子钟*************************************************** ***************************************************************************************** ********** ***************************************************************************************** **********/

# include # include "lcd16024.h" sbit key1 = P2^0; //调整 sbit key2 = P2^1; //加1 sbit key3 = P2^2; //减1 sbit speaker = P2^3; //蜂鸣器 sbit key4 = P2^4; //闹钟设计 bit cal_year = 1; //进入判断闰年标志位bit leap_year; //闰年标志位 bit calculate = 0; //日加一标记 bit run = 0; //闹钟标志 bit beep = 0; //整点报时标志//uint8 num = 0; //调整是给的脉冲uint8 code str1[] = "D: "; uint8 code str2[] = "T: "; uint8 code str3[] = "Wek"; uint8 daystr[]="2013-07-29 "; //年月日格式uint8 timestr[]="21:30:59 N"; //时分秒格式 uint8 daystr1[]="2013-07-29 "; //闹钟年月日格式uint8 timestr1[]="21:30:59 N"; //闹钟时分秒格式uint8 numweek = 0; //星期加1标记char week = 1; //星期 char sec = 53; //秒 char min = 50; //分 char hour = 23; //时 uint8 day = 30; // 日 uint8 month = 9; //月 uint16 year = 2013; //年 char week1 = 1; //闹钟星期 char sec1 = 58; //闹钟秒 char min1 = 50; //闹钟分 char hour1 = 23; //闹钟时uint8 day1 = 30; //闹钟日 uint8 month1 = 9; //闹钟月 uint16 year1 = 2013; //闹钟年 uint8 WeekData1; //闹钟星期标记uint8 number = 0; //定时 uint8 WeekData; //星期标记uint8 speaker_num; //整点报时次数

DS1302时钟芯片资料全

DS1302 DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。 下面是标准的接线电路图:

DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch)是存放秒、分,小时、日、月、年、周数据的,存放的数据格式为BCD码形式 它的部时间寄存器如下: 将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和日期。这几个寄存器的说明如下: 1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当初始上电时该位置为1,时钟振荡器停止,DS1302处于低功耗状态;只有将秒寄存器的该位置改写为0时,时钟才能开始运行。 2、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作。 3、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作。 下面来说说如果对DS1302进行读写: 上面的电路图可以看出,除了电源和接地,DS1302只有三根线和单片机连接,SCLK、I/O 和RST(有的也写成CE),先看时序图:

基于DS1302与数码管设计的可调数字钟

学习情境2-可调式数字钟 之基于DS1302与数码管设计的可调数字钟 ☆点名,复习 1、定时器的工作方式有哪些?如何对定时器进行初始化。 2、数码管动态显示技术的原理? ☆新课讲授 2.2 基于DS1302与数码管设计的可调数字钟 前面我们用定时器产生1秒的时间,从而也设计出了可以调节数字钟,但用这种方法设计出来的电子钟不够准确。这节课我们用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路DS1302 ,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能。同时,我们还是用数码管作为显示时间的硬件。 2.2.1 DS1302芯片技术资料 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM 数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。 图 1 DS1302引脚 图2 DS1302内部结构 1、引脚功能及结构

DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),SCLK 始终是输入端。 2 、DS1302的寄存器和控制命令 对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。 小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM,当为0时,表示AM。在24小时模式时,位5是第二个10小时位。 秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。 控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。 日历、时间寄存器及控制字如表1所示: 此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

基于51单片机LCD1602数字钟

基于51单片机的数字时钟 实训单位: 南耕科技 系别: 工程技术系 专业: 姓名:

摘要 本文介绍了基于AT89C51单片机的数字式时钟的设计,详细叙述了系统硬件、软件的具体实现过程。本文在硬件、软件设计上均采用模块化的方法,使得在设计和调试方面取得很大的方便。软件同样采用模块化的设计,包括中断模块、时间调整模块等设计,并采用简单流通性强的C语言编写实现。本设计实现了时、分、秒的显示和时间修改的功能。通过对比实际的时钟,查找出误差的来源,确定调整误差的方法,尽可能的减少误差,使得系统可以达到实际数字钟的允许误差范围内。 关键字:AT89C51单片机;数字钟;模块化;

目录 1 绪论 (1) 1.1 课题背景 (1) 1.2 课题意义 (2) 1.3 数字式时钟的应用 (2) 1.4 本章小结 (3) 2 单片机简介 (3) 2.1 单片机的选择 (3) 2.1.1 单片机的特点 (5) 2.1.2 单片机的应用领域 (5) 2.2 AT89C51单片机的基本结构 (6) 2.3 本章小结 (11) 3 数字式时钟的硬件设计 (12) 3.1 最小系统设计 (13) 3.2 数字式时钟的外围电路设计 (14) 3.3 本章小结 (19) 4 数字式时钟的软件设计 (19) 4.1 系统软件设计内容 (19) 4.2主程序 (20) 4.3时钟设置子程序 (22) 4.4中断子程序 (24) 4.5 LCD显示子程序 (24) 4.6 本章小结 (26) 5 数字式时钟的Protues软件仿真 (26) 5.1 Protues软件的概述 (26) 5.2 Protues软件的功能特点 (27) 5.3 Protues软件具有4大功能模块 (27) 5.4 数字式时钟的Proteus软件仿真 (29) 5.5 本章小结 (35) 结论 (36) 致谢 (37) 单片机介绍 (37) 附录 (41)

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