当前位置:文档之家› 基于AVR单片机的RTC实时时钟

基于AVR单片机的RTC实时时钟

基于AVR单片机的RTC实时时钟
基于AVR单片机的RTC实时时钟

基于A VR单片机的RTC实时时钟

引言:

本次我们小组设计的是基于A VR单片机的RTC实时时钟,它能提供日历/时钟/秒表的功能,它走时准确,耗电低

设计原理:

该实时时钟使用了A VR单片机,主要利用其中的DS1302时钟芯片,1602液晶屏和CTC分频模式。

一.日历时钟设计:

1.芯片选择

对于时钟设计我们直接使用了DS1302时钟芯片,该芯片利用了外加的12M的晶振进行计时,自带了万年历的功能,使用十分方便。本身有后备电

源引脚,可以外接后备电源保持实时工作。内有年月日时分秒的寄存器,可

直接写入读取,缺点是较难起振,感觉会受温度影响

2.液晶屏使用

为了方便的显示时间,我们还采用了1602液晶屏.1602液晶屏功耗小,体积小,显示内容丰富,操作灵活,具有双行16字显示。

3.时钟程序设计

1)DS1302程序

主要函数:

DS1302Init()//初始化时钟芯片,DS1302_WriteB()//写入单字节数据

DS1302_readB()//读取单字节数据,DS1302_setT()//时间设置

DS1302_getT()// 获取时间

2)1602程序

主要函数

Init1602()//初始化1602,Gotoxy()//显示位置设置

Write1602()//在1602中显示数据

3)其他常用程序

Keycheck()//小键盘检查,Delay_ms()//延时函数

BCD2ACSII()//编码转换, display()//显示1602

4.程序设计原理

DS1302:通过拉高拉低RST电平进行片选,当时钟信号来临时,先向DS1302

写入操作的地址信息,在第二个时钟信号进行数据操作,读取或写入,每次操

作完注意进行写保护防止误写入数据导致时钟停止

1602:通过RS,R/W,EN进行控制操作,通过D0~D7进行数据写入二.秒表设计

1.芯片选择

直接使用ATMEga16本身的分频功能。

2.定时器程序设计

timer()//定时器驱动及1602显示,time()//中断执行的函数

3.程序设计原理:

利用定时器timer1中的256分频,先对TCCR1寄存器预存数据,存入的数

据为(65525-12000000/256),当TCCR1累加到65535时,产生中断,

然后进行中断操作,全局变量SECONG加1等。

调试过程:

单片机的调试是枯燥而又艰辛的,其中既有硬件上又软件上的调试。对于硬件调试,

我们一开始就打定主意用液晶屏来显示,但是买来的液晶屏屡试都还无反应,只用背光

灯亮了,我们想了无数个办法都没有成功,在其中浪费了巨大的时间,后来发现竟然是

因为电位器没有调好,调好后在改了一下代码的显示,总算是把1602调通了,实在是

因为一开始没有经验完全不知道电位器要调整。

我们遇上的第二个大麻烦就是1302竟然不能走钟,一开始还是从软件入手,测试了

DS1302寄存器里的数据,改了很多小问题,最后变的可以读取和写入数据了,但是还

是不能走,我用万用表测了管脚,感觉是因为晶振没有起振,换了同学的晶振,还是不

能走动,愈发悲剧,百度谷歌了很长时间,有说电容问题,甚至有说DS1302很多假冒

的,后来某次突然二了,竟然有吹风筒去吹(看代码太久,神经错乱),更无语的是吹

了一下后。。。。竟然时钟竟然动了,十分囧,遂感觉是因为天气潮湿导致晶振管脚短

接,至今未能验证是否。后来这两天天气凉下来都能正常起振了

最后是小键盘的调试,因为之前弄过,所以硬件上是没有问题的,只是软件上问题多多,比如会显示乱码之类的,大多是时序和键盘抖动的问题,慢慢调还是调好了。

经验教训:

最大的感慨是调试时一开始完全不知道是软件还是硬件的问题,只能慢慢猜测,不断

尝试才能调好一块板子,而且同是AVR单片机不同的焊接电路使用方法是完全不同的,

写代码时一定要多用宏定义才方便改,遇到问题慢慢看DATASHEET。

附带源码

【主程序】

#include"test.h"

#include"time.h"

#include"keycheck.h"

#include"delay.h"

#define TIMER_KEY 15

#define RTC_KEY 14

#define SETTIME_KEY 11

uchar settime[7]={0x20,0x04,0x12,0x26,0x09,0x06,0x10};

void Writeweek(uchar day){

switch (day){

case 1:

Write1602(1,'M');

Write1602(1,'o');

Write1602(1,'n');

break;

case 2:

Write1602(1,'T');

Write1602(1,'u');

Write1602(1,'e');

break;

case 3:

Write1602(1,'W');

Write1602(1,'e');

Write1602(1,'d');

break;

case 4:

Write1602(1,'T');

Write1602(1,'h');

Write1602(1,'r');

break;

case 5:

Write1602(1,'F');

Write1602(1,'r');

Write1602(1,'i');

break;

case 6:

Write1602(1,'S');

Write1602(1,'a');

Write1602(1,'t');

break;

case 7:

Write1602(1,'S');

Write1602(1,'u');

Write1602(1,'n');

break;

}

}

void display(uchar time[]){ uchar *p;

Gotoxy(1,0);

Write1602(1,'2');

Write1602(1,'0');

p=BCD2ACSII(time[6]);

Write1602(1,p[0]);

Write1602(1,p[1]);

Write1602(1,'-');

p=BCD2ACSII(time[4]);

Write1602(1,p[0]);

Write1602(1,p[1]);

Write1602(1,'-');

p=BCD2ACSII(time[3]);

Write1602(1,p[0]);

Write1602(1,p[1]);

Gotoxy(12,0);

Writeweek(time[5]);

Gotoxy(2,1);

p=BCD2ACSII(time[2]);

Write1602(1,p[0]);

Write1602(1,p[1]);

Write1602(1,':');

p=BCD2ACSII(time[1]);

Write1602(1,p[0]);

Write1602(1,p[1]);

Write1602(1,':');

p=BCD2ACSII(time[0]);

Write1602(1,p[0]);

Write1602(1,p[1]);

Gotoxy(0,0);

}

void Write_time_input(){

uchar i;

uchar table[]="input new time:";

for(i=0;i<15;i++){

Write1602(1,table[i]);

}

}

void input_time(uchar i){

uchar num1,num2;

while(1){

if((num1=keycheck())!=16){

Delay_ms(20);

if((num1=keycheck())!=16)

break;

}

}

num1+='0';

Write1602(1,num1);

Delay_ms(500);

while(1){

if((num2=keycheck())!=16)

break;

}

num2+='0';

Write1602(1,num2);

settime[i]=((num1-3)*16+num2);

}

void time_set(){

Init1602();

Gotoxy(0,0);

input_time(6);

Write1602(1,'-');

Delay_ms(500);

input_time(4);

Write1602(1,'-');

Delay_ms(500);

input_time(3);

Delay_ms(500);

Write1602(1,' ');

input_time(5);

Gotoxy(0,1);

Delay_ms(500);

input_time(2);

Write1602(1,':');

Delay_ms(500);

input_time(1);

Write1602(1,':');

Delay_ms(500);

input_time(0);

DS1302_setT(settime);

}

void main(){

uchar key;

uchar RTC=0;

uchar TIMER=0;

uchar SETTIME=0;

uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};

DS1302_portinit();

DS1302_init();

DS1302_setT(settime);

while(1){

RTC=1;

key=keycheck();

if(key==TIMER_KEY){

RTC=0;

TIMER=1;

SETTIME=0;

}

else if(key==SETTIME_KEY){

RTC=0;

TIMER=0;

SETTIME=1;

}

else{

RTC=1;

TIMER=0;

SETTIME=0;

}

if(RTC==1){

Init1602();

DS1302_getT(gettime);

display(gettime);

}

if(TIMER==1)

timer();

if(SETTIME==1){

Init1602();

Write_time_input();

Delay_ms(1000);

time_set();

}

}

}

【1602程序头文件代码】

#ifndef __TIME_H

#define __TIME_H

#include"delay.h"

#include"keycheck.h"

#define time_Port PORTD

#define time_DDR DDRD

#define time_PIN PIND

#define RST 4

#define SCLK 2

#define time_DATA 3

#define DATA_H PORTD|=(BIT(3))

#define DATA_L PORTD&=~(BIT(3))

#define SCLK_H PORTD|=(BIT(SCLK))

#define SCLK_L PORTD&=~(BIT(SCLK))

#define RST_H PORTD|=(BIT(RST))

#define RST_L PORTD&=~(BIT(RST))

#define RD 0x01

#define WR 0x00

#define C_SEC 0x80

#define C_MIN 0x82

#define C_HR 0x84

#define C_DAY 0x86

#define C_MTH 0x88

#define C_WK 0x8A

#define C_YR 0x8C

#define C_WP 0x8E

#define C_CHARGE 0x90

#define C_BURST 0xBE

#define CLK_HALT 0x80

#define CLK_START 0x00

#define M12_24 0x80

#define PROTECT 0x80

#define UPROTECT 0x00

#define TC_D1R2 0xA5

#define TC_D2R8 0xAB

#define TC_DISABLED 0x00

#define C_RAMBASE 0xC0

#define CLK_HALT 0x80

#define CLK_START 0x00

#define SREG_INIT SREG|=(1<<7)

#define TCCR1_INIT TCCR1B=0X04

#define TCNT1H_INIT TCNT1H=0X48

#define TCNT1L_INIT TCNT1L=0XE4

#define TIMSK_INIT TIMSK|=(1<<2)

#define TIMSK_STOP TIMSK&=~(1<<2)

#pragma interrupt_handler time:iv_TIM1_OVF

uchar minut;

uchar second;

void DS1302_portinit(void){

time_DDR=0XFF;

}

void DS1302_writeB(uchar byte)

{

uchar i;

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

{

SCLK_L;

if(byte&0x01){

DATA_H;

}

else

{

DATA_L;

}

asm("nop");

SCLK_H; byte>>=1;

}

}

uchar DS1302_readB(void)

{

uchar i,byte=0X00;

time_DDR&=~BIT(time_DATA);

time_Port&=~BIT(time_DATA);

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

{

SCLK_H;

asm("nop");

asm("nop");

SCLK_L; asm("nop");

asm("nop");

if(time_PIN&BIT(time_DATA))

{

byte|=BIT(i);

}

else

{

byte&=~BIT(i);

}

}

time_DDR|=BIT(time_DATA);

return byte;

}

void DS1302_writeD(uchar addr,uchar data) {

RST_L;

SCLK_L;

asm("nop");

asm("nop");

RST_H;

asm("nop");

asm("nop");

DS1302_writeB(addr); asm("nop");

asm("nop");

SCLK_L;

asm("nop");

asm("nop");

DS1302_writeB(data);

SCLK_L; asm("nop");

asm("nop");

RST_L;

}

uchar DS1302_readD(uchar addr)

{

uchar data;

RST_L;

SCLK_L;

asm("nop");

asm("nop");

RST_H;

asm("nop");

asm("nop");

DS1302_writeB(addr);

asm("nop");

asm("nop");

data=DS1302_readB();

asm("nop");

asm("nop");

SCLK_L;

RST_L;

return data;

}

void DS1302_setT(uchar ptTimeD[])

{

uchar i;

uchar addr = 0x80;

DS1302_writeD(C_WP|WR,UPROTECT);

Delay_ms(5);

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

{

DS1302_writeD(addr|WR,ptTimeD[i]); addr+=2;

Delay_ms(1);

}

DS1302_writeD(C_WP|WR,PROTECT);

}

void DS1302_getT(uchar time[])

{

uchar i;

uchar addr = 0x80;

RST_H;

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

{

time[i]=DS1302_readD(addr|RD);

asm("nop");

addr+=2;

}

SCLK_L;

RST_L;

}

void DS1302_init(void)

{

DS1302_writeD(C_WP|WR,UPROTECT);

DS1302_writeD(C_SEC|WR,CLK_START);

DS1302_writeD(C_WP|WR,PROTECT);

}

uchar* BCD2ACSII(uchar i){

uchar *p;

p[0]=i/16;

p[1]=i%16;

p[0]+='0';

p[1]+='0';

return p;

}

uchar* BCD2ACSII2(uchar i){ uchar *p;

p[0]=i/10;

p[1]=i%10;

p[0]+='0';

p[1]+='0';

return p;

}

void time(){

second++;

if(second==60){

second=0;

minut++;

if(minut==60)

minut=0;

}

TCNT1L_INIT;

TCNT1H_INIT;

}

void display_timer(){

uchar *p;

Init1602();

Gotoxy(5,0);

p=BCD2ACSII2(minut);

Write1602(1,p[0]);

p=BCD2ACSII2(minut);

Write1602(1,p[1]);

Write1602(1,':');

p=BCD2ACSII2(second);

Write1602(1,p[0]);

p=BCD2ACSII2(second);

Write1602(1,p[1]);

}

void timer(){

minut=0;

second=0;

display_timer();

while(1){

if(keycheck()==12)

break;

}

TCCR1_INIT;

SREG_INIT;

TCNT1H_INIT;

TCNT1L_INIT;

TIMSK_INIT;

while(1){

display_timer();

if(keycheck()==13){

TIMSK_STOP;

break;

}

}

}

#endif

【1602驱动代码】

#ifndef __TEST_H

#define __TEST_H

#include

#include

#include"delay.h"

#define RS_CLR PORTA&=~BIT(6)

#define RS_SET PORTA|=BIT(6)

#define RW_CLR PORTA&=~BIT(5)

#define RW_SET PORTA|=BIT(5)

#define EN_CLR PORTA&=~BIT(4)

#define EN_SET PORTA|=BIT(4)

#define DATA PORTC

#define DATA_IN PINC //êy?Yê?è??ú

#define DATA_DIR DDRC //êy?Y?ú′?ê?·??ò

#define uchar unsigned char

#define uint unsigned int

#define ControlPort PORTA

#define ControlPortDIR DDRA

#define Command 0

#define Data 1

#define Flag_Reg 0

#define Dat_Reg 1

#define Screen_mode 0x08

#define Cursor_flashoff ~(1<<0)

#define Cursor_on (1<<1)

#define Display_on (1<<2)

#define Cursor_off ~(1<<1)

#define Display_off 0x00

#define Clear 0X01

#define P_mode 0X06

void Write1602(uchar Kind,uchar Dat) //D′??á??òêy?Y{

if(Kind==Command) RS_CLR;

else if(Kind==Data)RS_SET;

RW_CLR;

DATA_DIR=0xff;

DATA=Dat;

EN_SET;

asm("nop");

asm("nop");

EN_CLR;

}

void ClearScreen()

{

Write1602(Command,Clear);

}

void Init1602()

{

ControlPortDIR=0xff;

ControlPort=0x00;

DDRA=0xff;

PORTA=0x00;

EN_CLR;

Delay_ms(15);

Write1602(Command,0x38);

Delay_ms(5);

Write1602(Command,0x38);

Delay_ms(5);

Write1602(Command,0x38);

Write1602(Command,Screen_mode|Display_off); Write1602(Command,Clear);

Write1602(Command,P_mode);

Write1602(Command,Screen_mode|Display_on&Cursor_off&Cursor_fla shoff);

}

void Gotoxy(uchar x,uchar y) {

if(y==0) Write1602(Command,(0x80+x));

else Write1602(Command,(0x80+0x40+x));

}

#endif

【延迟函数】

#ifndef __DELAY_H

#define __DELAY_H

#include

#include

#define uchar unsigned char

#define uint unsigned int

void Delay_ms(uint t)

{

uint i,j;

for(i=0;i

{

for(j=0;j<1411;j++);

}

}

#endif

【KEYBOARD扫描代码】

#ifndef __KEYCHECK_H

#define __KEYCHECK_H

#include"delay.h"

#define KEY_DDR DDRB

#define KEY_PORT PORTB

#define KEY_PIN PINB

#define uchar unsigned char

#define uint unsigned int

uint keycheck(){

uint key_row,key_column;

KEY_DDR=0X0F;

KEY_PORT=0XF0;

if(KEY_PIN!=0XF0){

Delay_ms(2);

if(KEY_PIN!=0XF0){

switch(KEY_PIN){

case 0XE0:

key_row=1;

break;

case 0XD0:

key_row=2;

break;

case 0XB0:

key_row=3;

break;

case 0X70:

key_row=4;

break;

default:

key_row=0;

break;

}

KEY_DDR=0XF0;

KEY_PORT=0X0F;

Delay_ms(1);

if(KEY_PIN!=0X0F){

switch(KEY_PIN){

case 0X0E:

key_column=1;

break;

case 0X0D:

key_column=2;

break;

case 0X0B:

key_column=3;

break;

case 0X07:

key_column=4;

break;

default:

key_column=0;

break;

}

return (key_row-1)*4+key_column-1;

}

}

}

return 16; }

#endif

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

目录 0 前言 (1) 1 总体方案设计 (2) 2 硬件电路设计 (2) 3 软件设计 (5) 4 调试分析及说明 (7) 5 结论 (9) 参考文献 (9) 课设体会 (10) 附录1 电路原理 (12) 附录2 程序清单 (13)

电子时钟的设计 许山沈阳航空航天大学自动化学院 摘要:传统的数字电子时钟采用了较多的分立元器件,不仅占用了很大的空间而且利用率也比很低,随着系统设计复杂度的不断提高,用传统时钟系统设计方法很难满足设计需求。 单片机是集CPU、RAM、ROM、定时器/计数器和多种接口于一体的微控制器。它体积小、成本低、功能强,广泛应用于智能产品和工业自动化上。而51系列的单片机是各单片机中最为典型和最有代表性的一种。,本次设计提出了系统总体设计方案,并设计了各部分硬件模块和软件流程,在用C语言设计了具体软件程序后,将各个模块完全编译通过过后,结果证明了该设计系统的可行性。该设计给出了以AT89C2051为核心,利用单片机的运算和控制功能,并采用系统化LED显示模块实时显示数字的设计方案,适当地解决了实际生产和日常生活中对计时高精确度的要求,因此该设计在现代社会中具有广泛的应用性。 关键字:AT89C2051,C语言程序,电子钟。 0前言 利用51单片机开发电子时钟,实现时间显示、调整和闹铃功能。具体要求如下: (1)按以上要求制定设计方案,并绘制出系统工作框图; (2)按要求设计部分外围电路,并与单片机仿真器、单片机实验箱、电源等正确可靠的连接,给出电路原理图; (3)用仿真器及单片机实验箱进行程序设计与调试;

(4)利用键盘输入调整秒、分和小时时刻,数码管显示时间; (5)实现闹钟功能,在设定的时间给出声音提示。 1总体方案设计 该电子时钟由89C51,BUTTON,1602 LCD液晶屏等构成,采用晶振电路作为驱动电路,利用单片机内部定时计数器0通过软件扩展产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。闹钟和时钟的时分秒的调节是由一个按键控制,而另外一个按键控制时钟和闹钟的时间的调节。 图1 系统结构框图 该电子时钟由STC89C51,BUTTON,1602 LCD液晶屏等构成,采用晶振电路作为驱动电路,晶振电路的晶振频率为12MHZ,使用的定时器/计数器工作方式0,通过软件扩展产生的一秒定时,达到时分秒的计时,60秒为一分钟,60分钟为一小时,24小时为一天,又重00:00:00开始计时。没有按键按键按下时,时钟正常运行,当按下调节时钟按键K1,就会关闭时钟,当按下闹钟按键K3时时钟就会进入设置时间界面,但是时钟不会停止工作,按K2键,,就可以对时钟和闹钟要设置的时间进行调整。 2硬件电路设计

实时时钟设计实验报告

实验报告

源代码: #pragma sfr //使用特殊功能寄存器 #pragma EI //开中断 #pragma DI //关中断 #pragma access //使用绝对地址指令 #pragma interrupt INTTM000 Time //定义时间中断函数为Time #pragma interrupt INTKR OnKeyPress //定义按键中断为OnKeyPress #pragma interrupt INTP5 OnKeyOver //定义INT中断为OnKeyOver void Init_Led(); void InitKey_INTKR(); void Init_Lcd(); void Init_Inter(); void LightOneLed(unsigned char ucNum); void LightOff(); int Count_Day(int month); char i=0; //定义变量i,是切换时间的标志 int key=0; //定义key=0 int temp=1; //用于存放当前月的天数 int temp1=1; int second=0; //默认的秒second=0 int minute=0; //默认的分minute=0 int hour=12; //默认的时hour=12 int day=1; //默认的天day=1 int month=5; //默认的月month=5 int year=2014; //默认的年year=2014 int c_hour=1; //默认的闹钟时=1 int c_minute=1; //默认的闹钟分=1 int buffs[2]; //秒的数码显示缓存区 int buffm[2]; //分的数码显示缓存区 int buffh[2]; //时的数码显示缓存区 int buffday[2]; //天的数码显示缓存区 int buffmonth[2]; //月的数码显示缓存区 int buffyear[4]; //年的数码显示缓存区 int buffmd[4]; //月,天的数码显示缓存区 int buffhm[4]; //时,分的数码显示缓存区 int buffms[4]; //分,秒的数码显示缓存区 int buffch[2]; //闹钟时的数码显示缓存区 int buffcm[2]; //闹钟分的数码显示缓存区 unsigned char Que = 0; //INT中断中间变量 int LCD_num[10]={0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070b};// 数字0~~9的显示码 unsigned char Scond; //…………………………延时函数1……………………// void Delay(int k){ i nt i,j; f or(i=0;i

基于51单片机的实时时钟设计报告

课程设计(论文)任务书 信息工程学院信息工程专业(2)班 一、课程设计(论文)题目嵌入式课程设计 二、课程设计(论文)工作自 2014 年 6 月 9 日起至2014年 6月15日止。 三、课程设计(论文) 地点: 5-402 单片机实验室 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)使学生掌握单片机各功能模块的基本工作原理; (2)培养学生单片机应用系统的设计能力; (3)使学生能够较熟练地使用proteus工具完成单片机系统仿真。 (4)培养学生分析、解决问题的能力; (5)提高学生的科技论文写作能力。 2.课程设计的任务及要求 1)基本要求: (1)分析所设计系统中各功能模块的工作原理; (2)选用合适的器件(芯片); (3)提出系统的设计方案(要有系统电路原理图); (4)对所设计系统进行调试。 2)创新要求: 在基本要求达到后,可进行创新设计,如改善单片机应用系统的性能。 3)课程设计论文编写要求 (1)要按照书稿的规格打印撰写论文。 (2)论文包括目录(自动生成)、摘要、正文、小结、参考文献、附录等。 (3)论文装订按学校的统一要求完成。 4)答辩与评分标准: (1)完成原理分析:20分; (2)完成设计过程:30分; (3)完成调试:20分; (4)回答问题:20分; (5)格式规范性(10分)。

5)参考文献: (1)张齐.《单片机原理与嵌入式系统设计》电子工业出版社 (2)周润景.《PROTUES入门实用教程》机械工业出版社 (3)任向民.《微机接口技术实用教程》清华大学出版社 (4)https://www.doczj.com/doc/325173840.html,/view/a5a9ceebf8c75fbfc77db2be.html 6)课程设计进度安排 内容天数地点 构思及收集资料1图书馆 系统设计与调试 4 实验室 撰写论文2图书馆、实验室 学生签名: 2014 年6 月9日 课程设计(论文)评审意见 (1)完成原理分析(20分):优()、良()、中()、一般()、差(); (2)设计分析(30分):优()、良()、中()、一般()、差(); (3)完成调试(20分):优()、良()、中()、一般()、差(); (4)回答问题(20分):优()、良()、中()、一般()、差(); (5)格式规范性(10分):优()、良()、中()、一般()、差(); 评阅人:职称: 2014 年6 月15 日

基于单片机的数字时钟

郑州科技学院 《单片机原理及应用》课程设计

目 录 0 引言3 1 设计方案4 2 系统设计7 2.1 硬件原理12 2.2 软件原理16 3 实验与仿真19 4 结论21 参考文献22 附录1 程序23 附录2 仿真电路图26 0 引言 近年来,随着电子产品的发展,随着社会竞争的激烈,人们对数字时钟的要求越来越高。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间,忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。 因此从人们的日常生活到工厂的自动控制,从民用时钟到科学发展所需的时钟,现代人对时间的精度和观察时间的方便有了越来越多的需求。人们要求随时随地都能快速准确的知道时间,并且要求时钟能够更直观、更可靠、价格更便宜。这种要求催生了新型时钟的产生。 除此之外,由于对社会责任的更多承担,人们要求所设计的产品能够产生尽量少的垃圾、能够消耗尽量少的能量。因此人们对时钟的又有

了体积小、功耗低的要求。 传统的机械表由于做工的高精细要求,造价的昂贵,材料的限制,时间指示精度的限制,使用寿命方面,以及其它方面的限制,已不能满足人们的需求。另外,近些年随着科技的发展和社会的进步,人们对时钟的要求也越来越高,而使得新型电子钟表成了大势所趋。 另外单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。 单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。 1 设计方案 1.1 任务及要求 ①通过单片机内定时器控制走时,准确持续走时,调时不影响走时。 ②在八个数码管上显示时、分、秒及两个小数点。 ③含有闹钟功能,可以选择闹钟开关,可以设定闹铃时间。 ④到达闹钟时刻蜂鸣器警报,可以关掉警报。 1.2 系统功能说明 电子钟的格式为:XX.XX.XX ,由左向右分别为:时、分、秒。完成显示由秒01一直加1至59,再恢复为00;分加1,由00至01,一直加1至59,再恢复00;时加1,时由00加至23之后秒、分、时全部清清零。该钟使用T0作250us的定时中断。 走时调整:走时过程中直接调整且不影响走时准确性,按下时间选择键对“时、分、秒”显示进行调整,每按一下时间加,即加1,时间减,即减1。

51定时器和lcd12864做的实时时钟显示(附图)

#include #include"intrins.h" #define uchar unsigned char #define uint unsigned int sbit rs=P1^0; sbit rw=P1^1; sbit e=P2^5; sbit psb=P1^2; sbit rst=P1^4; uchar hour,fen,miao,num; uchar code table[]="时间:"; uchar sbuf[]={0,0,0,0,0,0}; void delay(uint x) { uchar i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void Timer0Init(void) //50??@11.0592MHz { TMOD |= 0x01; //??????? TL0 = 0x00; //??????

TH0 = 0x4C; //?????? EA=1; ET0=1; TR0=1; //???0???? } void Delay2ms() //@11.0592MHz { unsigned char i, j; _nop_(); i = 4; j = 146; do { while (--j); } while (--i); } void Delay100us() //@11.0592MHz { unsigned char i, j; i = 2; j = 109; do { while (--j); } while (--i);

void Delay50ms() //@11.0592MHz { unsigned char i, j, k; i = 3; j = 207; k = 28; do { do { while (--k); } while (--j); } while (--i); } void write_12864com(uchar com) { rs=0; rw=0; Delay100us(); P0=com; e=1; Delay100us(); e=0; Delay100us(); }

单片机实时时钟电路的原理及应用

单片机实时时钟电路的原理及应用 1 引言现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485 等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的 实时时钟电路DS1302 是DALLAS 公司的一种具有涓细电流充电能力的电路, 主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并 且可以关闭充电功能。采用普通32.768kHz 晶振。 2 DS1302 的结构及工作原理DS1302 是美国DALLAS 公司推出的一种高性能、低功耗、带RAM 的实 时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补 偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU 进行同步通信,并可 采用突发方式一次传送多个字节的时钟信号或RAM 数据。DS1302 内部有一个31×8的用于临时性存放数据的RAM 寄存器。DS1302 是DS1202 的升级产品,与DS1202 兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电 源进行涓细电流充电的能力。 2.1 引脚功能及结构图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 置为高电平。

(完整word版)基于单片机电子时钟的制作

毕业综合实训概述 实训目的: 对单片机电子时钟的制作及设计原理的掌握,利用本次实训对所学的理论课程进行实际论证,更好的掌握理论知识。能够更好的运用在实践当中。 实训时间: 2015年9月21日-2015年11月8日 实训要求: 1.独立完成实物的制作及理解设计原理; 2.分析及制作程序流程图; 3. 绘制电路图; 4.了解个元器件在电路中的作用。

目录 1 引言 (1) 1.1选题背景 (1) 1.2设计原理 (1) 1.3单片机简介 (2) 1.4单片机的发展历史 (2) 1.5单片机的应用领域及发展趋势 (2) 2 方案议论 (5) 2.1 设计要求 (5) 2.2 系统描述 (5) 2.3 设计方案 (5) 2.3.1 集成电路 (5) 2.3.2 单片机的最小系统 (6) 2.3.3结论 (7) 3 硬件设计 (8) 3.1硬件结构 (8) 3.2中心控制模块 (8) 3.3电源模块 (11) 3.4控制电路 (12) 3.5复位电路 (12) 4软件设计 (15) 4.1电子时钟的设计原理 (15) 4.2 软件设计流程 (15) 5 总结 (17) 致谢 (18) 参考文献 (18) 附录电子时钟程序 (19)

1 引言 1.1选题背景 单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。单片机由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。 INTEL的8080是最早按照这种思想设计出的处理器,当时的单片机都是8位或4位的。其中最成功的是INTEL的8051,此后在8051上发展出了MCS51系列单片机系统。因为简单可靠而性能不错获得了很大的好评。尽管2000年以后ARM 已经发展出了32位的主频超过300M的高端单片机,直到现在基于8051的单片机还在广泛的使用。现代人类生活中所用的几乎每件有电子器件的产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电子产品中都含有单片机。汽车上一般配备40多片单片机,复杂的工业控制系统上甚至可能有数百片单片机在同时工作! 利用单片机实现电子时钟有很多优点,例如外部电路简单,控制方便等,因而备受广大单片机爱好者的喜爱。通过电子时钟的制作方案,掌握C语言的编程方法。并熟练的运用89S52单片机定时器准确的实现时间的递进,按下按键可以设置时间,最重要的是自己还可以通过程序设计输入自己需要的定点时间。 1.2设计原理 通过单片机对时间准确的控制,实现时间的递进。 定时器:时钟周期T是时序中最小的时间单位,具体计算的方法是1/时钟源频率,我们KST-52单片机开发板上用的晶振是11.0592M,那么我们对于这个单

实时时钟实验报告

嵌入式系统开发实验报告 实验四:实时时钟实验 班级:应电112 姓名:张志可 学号: 110415151 指导教师:李静 实验日期: 2013年9月25日

实验四:实时时钟实验 一、实验目的 1. 了解实时时钟的硬件控制原理及设计方法。 2. 掌握 S3C2410X 处理器的 RTC 模块程序设计方法。 二、实验设备 硬件:Embest ARM 教学实验系统,ULINK USB-JTAG 仿真器套件,PC 机。 软件:MDK 集成开发环境,Windows 98/2000/NT/XP。 三、实验原理 1. 实时时钟(RTC) 实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC 具有计时准确、耗电低和体积小等特点,特别是在各种嵌入式系统中用于记录事件发生的时间和相关信息,如通信工程、电力自动化、工业控制等自动化程度高的领域的无人值守环境。随着集成电路技术的不断发展,RTC 器件的新品也不断推出,这些新品不仅具有准确的 RTC,还有大容量的存储器、温度传感器和 A/D 数据采集通道等,已成为集 RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。 RTC 器件与微控制器之间的接口大都采用连线简单的串行接口,诸如 I2C、SPI、MICROWIRE 和CAN 等串行总线接口。这些串口由2~3 根线连接,分为同步和异步。 2. S3C2410X 实时时钟(RTC)单元 S3C2410X 实时时钟(RTC)单元是处理器集成的片内外设。由开发板上的后备电池供电,可以在系统电源关闭的情况下运行。RTC 发送8 位BCD 码数据到CPU。传送的数据包括秒、分、小时、星期、日期、月份和年份。RTC 单元时钟源由外部32.768KHz 晶振提供,可以实现闹钟(报警)功能。 四、实验内容 学习和掌握 Embest ARM 教学实验平台中 RTC 模块的使用,编写应用程序,修改时钟日期及时间的设置,以及使用 EMBEST ARM 教学系统的串口,在超级终端显示当前系统时间。

PC机实时时钟的设计剖析

1 PC机实时时钟的设计 利用PC机现有的硬件和软件资源设计程序,以实现在显示器上显示XX(时):XX(分):XX(秒)。 (1)设计思路 PC机系统板上使用一片8253,其地址为40H—43H,其通道0以方式3工作,每55ms 向中断控制器8259A IRQ0端发一次中断请求。本设计题要求借用原有电路,重新设置8253的计数器0每10ms产生一次中断,100次中断后加1秒,然后调整时、分、秒并显示在屏幕上。 (2)实时时钟的功能 按下任意键开始显示数据区中存放的时间值,并且每秒更新一次,运行中按下空格键则停止运行并返回DOS。程序中应保护原系统的08H中断矢量以便退出时恢复原系统的设置。 (3)题目的要求 ① PC机实时时钟的基本程序如附录一,请根据中断服务程序设计时钟时、分、秒调整的中断服务程序,然后调试实现时钟的基本功能 ②在原有程序基础上,增加键盘输入字符功能,可通过修改时、分、秒的数据,实现实时时钟可调整功能。 ③在原有程序基础上,设计美观的时钟显示方式及友好的操作方式。 附录一 STACK segment para stack 'stack' db 256 dup (0) stack ends data segment para public 'data' count db 100 tenh db '1' hour db '3',20h tenm db '1' minute db '0' db ':' tens db '5' second db '0',0dh,'$' data ends code segment para public 'code' start proc far

基于单片机的简易时钟设计(毕业设计)

广西理工职业技术学院 毕业设计(论文)说明书题目:简易电子时钟设计 系别:电气工程系 专业班级:11机电2 姓名:黄武锦 学号:20112323 指导教师:黎有好 二〇一三年七月二十四日

目录 1.概论 (2) 2.整体设计思路 (3) 2.1硬件各部分所能完成的功能 (4) 2.2系统工作原理 (5) 2.3时钟各功能分析及图解 (5) 2.4.1电路各功能图解分析 (5) 2.4.2电路功能使用说明 (8) 3. 软件设计思路 (9) 3.1 主程序模块 (9) 3.2 数码管动态扫描模块 (10) 3.3 当前时间计时模块 (10) 3.4 闹钟输入输出模块 (11) 3.5 当前时间调整模块 (13) 3.6复位模块 (14) 4.系统的调试和性能分析 (15) 4.1系统的调试方法 (15) 4.1.1输入按键的调试 (15) 4.1.2复位电路的调试 (15) 4.1.3显示电路的调试 (15) 4.1.4整个系统的联调 (15) 4.2心得体会 (16) 参考文献 (16) 附录 (17) 附录A 系统原理图 (17) 附录B 程序源代码 (18) 电气信息学院课程设计评分表 (29)

1.概论 单片机系统作为一种典型的嵌入式系统,其系统设计包括硬件电路设计和软件编程设计两个方面,其调试过程一般分为软件调试、硬件测试、系统调试3个过程。如果采用单片机系统的虚拟仿真软件——Proteus,则不用制作具体的电路板也能够完成以上工作。数字钟是采用数字电路实现对时,分,秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。数字钟已成为人们日常生活中的必需品,广泛应用于家庭、车站、码头、剧院、办公室等场所,给人们的生活、学习、工作带来极大的方便[4]。不仅如此,在现代化的进程中,也离不开电子钟的相关功能和原理,比如机械手的控制、家务的自动化、定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。而且是控制的核心部分。因此,研究数字钟及扩大其应用,有着非常现实的意义。 电子钟在工业控制和日常生活中是很重要的,它不仅可以用于计时、提醒又可用于对机器的控制,在自动化的过程中必然有电子钟的参与,因此电子钟的应用会越来越广泛。而且向着精确、低功耗、多功能发展。基于单片机设计的数字钟精确度较高,因为在程序的执行过程中,任何指令都不影响定时器的正常计数,即便程序很长也不会影响中断的时间。从而,使数字钟的精度仅仅取决于单片机的产生机器周期电路和定时器硬件电路的精确度。另外,程序较为简洁,具有可靠性和较好的可读性。如果我们想将它应用于实时控制之中,只要对上述程序和硬件电路稍加修改,便可以得到实时控制的实用系统,从而应用到实际工作与生产中去。 数字电子钟的设计方法有多种,例如,可用中小规模集成电路组成电子钟,也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟还可以利用单片机来实现电子钟等等。这些方法都各有特点,其中,利用单片机实现的电子钟具有编程灵活,便于功能扩充,精确度高等特点。

RTC

RTC实时时钟 什么是RTC实时时钟 在一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等;而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768KHz 晶体和电阻电容等。 S3C2410实时时钟的基本特性 实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC 可以通过STRB/LDRB 指令将8 位BCD 码数据送至CPU。这些BCD 数据包括秒,分,时,日期,星期,月和年。RTC 单元通过一个外部的32.768KHz晶振提供时钟。RTC具有定时报警的功能。RTC 控制器功能说明: ●时钟数据采用BCD 编码 ●能够对闰年的年月日进行自动处理 ●具有告警功能,当系统处于关机状态时,能产生告警中断; ●具有独立的电源输入 ●提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟

RTC实时时钟的结构框图 RTC模块构成 ●闰年产生器 这个模块可以根据BCDDATA,BCDMON,以及BCDYEAR的数据决定每个月的最后日期是28,29,30 还是31。一个8位的计数器只能显示两个BCD码,因此它不能判断00 年究竟是不是闰年。例如它不能够判断1900 年和2000 的差别。。为了解决这个问题,S3C2410内的RTC 模块中有一个固定的逻辑,用来支持2000 年为闰年。请注意虽然2000 年是闰年,但1900 年不是闰年。因此,S3C2410 中00 代表2000 年,而不是1900 年。 ●读/写寄存器 要求置高RTCON 寄存器的0 位来表示读和写RTC 模块中的寄存器。。为了显示秒,分,小时,日期,月和年,CPU 会从BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON,和BCDYEAR 寄存器读取数据。但是由于多个寄存器的读取,可能产生1 秒钟的偏离。例如,如果用户读取寄存器BCDYEAR 到BCDMIN,假设结果为1959 年,12 月,31 日,23 点,59 分。在用户读取BCDSEC 寄存器时,但如果结果是0,那么很有可能年,月,日,时,分已经变成了1960 年1 月1 日0 时0 分了。解决的方法是,当读取到的BCDSEC 等于0 时,用户应该在读取一次BCDYEAR到BCDSEC 的值。 ●备用电池 RTC可被备用电池驱动,备用电池通过RTCVDD引脚向RTC提供电压。当系统掉电时,RTC与CPU 之间的接口被阻塞,备用电池仅仅驱动振荡电路以及BCD计数器,这样可减少能量损耗。

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

。 ==================主程序================= #include

。#include "ds1302.h" #include "LCD1602.h" void change(); uchar times[9]; uchar date[9]; main() {LCD_init();//LCD初始化 init_1302(time_1302); gotoxy(1,1); LCD_display("Time:"); gotoxy(1,2); LCD_display("Date:"); times[8]='\0';// date[8]='\0'; while(1) {get_1302(time_1302); change(); gotoxy(7,1); LCD_display(times); gotoxy(7,2); LCD_display(date);

} } /*=========================== 转换子程序 ===========================*/ void change() { // 时间的转换 times[0]=time_1302[2]/10+'0'; times[1]=time_1302[2]%10+'0'; times[2]=':'; times[3]=time_1302[1]/10+'0'; times[4]=time_1302[1]%10+'0'; times[5]=':'; times[6]=time_1302[0]/10+'0'; times[7]=time_1302[0]%10+'0'; // 日期的转换 date[0]=time_1302[6]/10+'0'; date[1]=time_1302[6]%10+'0'; date[2]='-';

单片机—实时时钟实验(汇编版)

实验二实时时钟实验 一、实验目的 1)数码管动态显示技术 2)定时器的应用 3)按键功能定义 二、实验实现的功能 实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。 三、系统硬件设计

四、系统软件设计 说明:1键进入和退出设置模式,4键选择调分或秒,2键加,3键减。 P1M1 EQU 91H P1M0 EQU 92H SEC0 DA TA 30H ;秒显示 SEC1 DA TA 31H MIN0 DA TA 32H ;分显示 MIN1 DA TA 33H DELAY_1 DA TA 34H ;延时参数 DELAY_2 DA TA 35H ;延时参数 ORG 0000H LJMP 0030H ORG 001BH LJMP INTR0 ORG 0030H MAIN: MOV P1M1,#00000000B MOV P1M0,#11111111B MOV R7,#000 ;记中断次数,R7=100为1秒 MOV R6,#000 ;记秒 MOV R5,#000 ;记分 MOV R4,#0FFH ;按键位置 MOV R1,#000 ;确定是否有按键按下的参数 MOV TMOD,#10H ;定时器初始化 MOV TH1,#0D8H ;定时时间10ms MOV TL1,#0F0H SETB EA SETB ET1 SETB TR1 LOOP0: CJNE R4,#000H,LOOP01 ;实时时钟显示 MOV R4,#0FFH LJMP LOOP1 LOOP01: LCALL TIME

LCALL KEY0 LJMP LOOP0 LOOP1: CJNE R4,#000H,LOOP11 ;调秒MOV R4,#0FFH LJMP LOOP0 LOOP11: CJNE R4,#003H,LOOP12 MOV R4,#0FFH LJMP LOOP2 LOOP12: CJNE R4,#001H,LOOP13 MOV R4,#0FFH INC R6 LOOP13: CJNE R6,#060,LOOP14 MOV R6,#000H LOOP14: CJNE R4,#002H,LOOP16 MOV R4,#0FFH CJNE R6,#000,LOOP15 MOV R6,#060 LOOP15: DEC R6 LOOP16: LCALL TIME LCALL KEY1 LJMP LOOP1 LOOP2: CJNE R4,#000H,LOOP21 ;调分MOV R4,#0FFH LJMP LOOP0 LOOP21: CJNE R4,#003H,LOOP22 MOV R4,#0FFH LJMP LOOP1 LOOP22: CJNE R4,#001H,LOOP24 MOV R4,#0FFH INC R5 LOOP23: CJNE R5,#060,LOOP24 MOV R5,#000H LOOP24: CJNE R4,#002H,LOOP26 MOV R4,#0FFH CJNE R5,#000,LOOP25 MOV R5,#060

课程设计 实时时钟

单片机原理课程设计报告 题目:实时时钟 院(系) 专业 年级 姓名学号 指导教师 设计时间2013.11.25-2013.12.6

电子信息工程专业10级学生单片机原理课程设计任务书课程设计题目二、实时时钟 指导教师职称高级工程师 设计任务和要求: 1.基本要求 (1)采用DS1302作为实时时钟芯片进行计时 (2)读出DS1302中的时间数据 (3)能显示时间数据,包括年月日,时分秒 (4)显示方式不限 2. 设计步骤 (1) 使用Proteus按设计要求绘制电路图。 (2) 按要求编写相应程序。 (3) 使用Proteus仿真程序,对程序进行调试。 (4) 撰写课程设计报告 3.撰写课程设计报告 课程设计报告内容包括题目、摘要、目录、正文、结论、致谢、参考文献等。 学生在完成上述全部工作之后,应将全部内容以先后顺序写成设计报告一份,阐述整个设计内容,要求重点突出、特色鲜明、语言简练、文字通畅,字迹工整。报告书以A4纸打印,装订成册(文字不少于3000 字)。

目录 1. 设计要求与方法论证 (3) 1.1 设计要求 (3) 1.2 系统基本方案选择和论证 (3) 1.2.1 单片机芯片的选择方案和论证 (3) 1.2.2 显示模块选择方案和论证 (4) 1.3 电路设计最终方案决定 (4) 2. 系统的硬件设计与实现 (4) 2.1 电路设计框图 (4) 2.2 系统硬件概述 (5) 2.3 系统硬件模块 (5) 2.3.1 AT89C51 (5) 2.3.2 DS1302 (6) 2.3.3点阵式LCD (7) 3.系统的软件设计 (7) 4. 硬件电路调试 (7) 5. 结论 (9) 6. 致谢 (9) 参考文献 (10) 附录 (11)

单片机仿真课程设计基于单片机的实时时钟

基于51系列单片机及DS1302时钟芯片的实时时钟仿真设计 一、课程设计目的意义 通过本次课程设计可以灵活运用单片机的基础知识,依据课程设计内容,能够完成从硬件电路图设计,到软件编程及系统调试实现系统功能,完成课程设计,加深对单片机基础知识的理解并灵活运用。 二、实现目标 本设计主要为实现一款可正常显示时钟/日历的实时电子时钟。对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现电子时钟。本设计应用AT89C52芯片作为核心,LCD显示屏,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。三、硬件设计 本设计采用具有32根I/O引脚的AT89C52单片机。AT89C52单片机是一款低功耗,低电压,高性能CMOS 8位单片机,片内含4KB(可经受1000次擦写周期)的FLASH可编程可反复擦写的只读程序存储器(EPROM),器件采用CMOS工艺和ATMEI公司的高密度、非易失性存储器(NURAM)技术制造,其输出引脚和指令系统都与MCS-52兼容。片内的FLASH存储器允许在系统内可改编程序或用常规的非易失性存储器编程器来编程。因此,AT89C52是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域。 AT89C52具有以下主要性能: 1.4KB可改编程序Flash存储器; 2.全静态工作:0——24Hz; 3.128×8字节内部RAM; 4.32个外部双向输入/输出(I/O)口; 5.6个中断优先级; 2个16位可编程定时计数器; 6.可编程串行通道; 7.片内时钟振荡器。 DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字

实时日历时钟显示系统的设计

微机原理及应用课程设计任务书 20 xx -20 xx 学年第 x 学期第 xx 周- xx 周 题目实时日历时钟显示系统的设计 内容及要求 内容:实时日历时钟显示系统 要求:设计一个实时日历时钟显示系统的程序。用“年/月/日”,“时:分:秒”(都是两位)的形式连续显示系统时间 进度安排 课程设计内容时间分配 方案论证1天 分析、设计、调试、运行3天 检查、整理、写设计报告、小结1天 合计5天 学生姓名: xx 指导时间: xxxx 指导地点: xxxx 任务下达任务完成 考核方式 1.评阅√ 2.答辩√ 3.实际操作□ 4.其它□指导教师系(部)主任 注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查。 2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。

此次微机原理课程设计要求设计一个实时日历时钟显示系统。 本程序利用DOS中断2AH号功能调用取系统年月日,再逐个显示各数据,利用2CH号功能调用取系统时间,逐个显示各数据。用“时:分:秒”(都是两位)的形式连续显示系统时间,并利用计算机提供的软件调试工具对所编写程序进行调试,记录下整个调试分析的过程与运行结果。 任务安排: 主程序: xx:主体程序和流程设计 xx:日历调用显示系统 xx:时间调用显示系统 子程序: xx:显示两位数字的子程序

一、课程名称 (2) 二、课程内容及要求 (2) 三、小组组成 (2) 四、设计思路 (3) 五、程序流程图及介绍 (4) 六、调试 (5) 七、总结 (7) 八、参考资料 (9) 附录 (9)

一、课程名称:实时日历时钟显示系统的设计 二、课程内容及要求 课程内容:实时日历时钟显示系统 要求:设计一个实时日历时钟显示系统的程序。用“年/月/日”,“时:分:秒”(都是两位)的形式连续显示系统时间 三、小组组成: 成员: xx, xx, xx, xx 任务安排: 主程序: xx:主体程序和流程设计 xx:日历系统 xx:时间系统 子程序: xx:显示两位数字的子程序

嵌入式软件开发基础实验报告 实时时钟

上海电力学院 嵌入式软件开发基础实验报告 题目:【ARM】实时时钟实验 专业:电子科学与技术 年级: 姓名: 学号:

一、实验目的 1、了解实时时钟的硬件控制原理及设计方法。 2、掌握S3C44B0X 处理器的RTC 模块程序设计方法。 二、实验设备 1、硬件:Embest EduKit-III 实验平台,Embest ARM 标准/增强型仿真器套件,PC 机。 2、软件:Embest IDE Pro ARM 集成开发环境,Windows 98/2000/NT/XP。 三、实验内容 学习和掌握 Embest EduKit-III 实验平台中RTC 模块的使用,进行以下操作: 1、编写应用程序,修改时钟日期及时间的设置。 2、使用EMBEST ARM 教学系统的串口,在超级终端显示当前系统时间。 四、实验原理 1. 实时时钟(RTC) 实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC 具有计时准确、耗电低和体积小等特点,特别是在各种嵌入式系统中用于记录事件发生的时间和相关信息,如通信工程、电力自动化、工业控制等自动化程度高的领域的无人值守环境。随着集成电路技术的不断发展,RTC 器件的新品也不断推出,这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D 数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。 RTC 器件与微控制器之间的接口大都采用连线简单的串行接口,诸如I2C、SPI、MICROWIRE和CAN 等串行总线接口。这些串口由2~3 根线连接,分为同步和异步。 2. S3C44B0X 实时时钟(RTC)单元 S3C44B0X 实时时钟(RTC)单元是处理器集成的片内外设。由开发板上的后备电池供电,可以在系统电源关闭的情况下运行。RTC 发送8 位BCD 码数据到CPU。传送的数据包括秒、分、小时、星期、日期、月份和年份。RTC 单元时钟源由外部32.768KHz 晶振提供,可以实现闹钟(报警)功能。 S3C44B0X 实时时钟(RTC)单元特性: BCD 数据:秒、分、小时、星期、日期、月份和年份 1、闹钟(报警)功能:产生定时中断或激活系统 2、自动计算闰年 3、无2000 年问题 4、独立的电源输入 5、支持毫秒级时间片中断,为RTOS 提供时间基准 读/写寄存器 访问 RTC 模块的寄存器,首先要设RTCCON 的bit0 为1。CPU 通过读取RTC 模块中寄存器BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON 和 BCDYEAR 的值,得到当前的相应时间值。然而,由于多个寄存器依次读出,所以有可能产生错误。比如:用户依次读取年(1989)、月(12)、日(31)、时(23)、分(59)、秒(59)。当秒数为1 到59 时,没有任何问题,但是,当秒数为0 时,当前时间和日期就变成了1990 年1 月1 日0 时0 分。这种情况下(秒数为0),用户应该重新读取年份到分钟的值(参考程序设计)。

基于单片机的时钟设计

随着现代生活的推进,电子时钟在人们的生活中已经普及,本课题的主要内容就是结合单片机的强大功能,在一块普通的电子时钟集成多种功能,方便人们的日常生活,该功能是通过单片机、8 段数码管以及一些简单辅助电路实现的。由于之前没有独立做过单片机实现多功能电子时钟方面的内容,所以在做设计时总会遇见很多问题,本次设计是在结合老师的指导及同学的帮助下完成的,并通过在网上所查的大量资料及单片机设计中常见的电路而构思出来的。单片计算机即单片微型计算机。由RAM ,ROM,CPU 构成,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。51 系列单片机是各单片机中最为典型和最有代表性的一种。这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。本设计主要设计了一个基于A T89C51单片机的电子时钟。并在数码管上显示相应的时间。并通过一个控制键用来实现时间的调节和是否进入省电模式的转换。该方法仿真效果真实、准确,节省了硬件资源。

1.主要功能 用4位LED显示时、分、秒值,以24小时计时方式工作,可用开关调整时间值和闹铃时间。 2.硬件设计 如下图所示,本次设计时钟电路,使用AT89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一蜂鸣器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、蜂鸣器、显示屏即可满足设计要求。

单片机电路如下:

3.软件设计: (一)主要功能及原理数字式电子钟用集成电路计时时,译码代替机械式传动,用LED 显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。该电子时钟由A T89C51、四段数码管等构成,采用晶振电路作为驱动电路, 由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。而电路中唯一的一个控制键却拥有多种不同的功能,按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下,则可以通过按键实现分钟的累加,每按一次分钟加一;而另一个键按下,则可实现小时的调节,同样每按一次小时加一。 (二)通过对多种单片机性能的分析,最终认为A T89C51是最理想的电子时钟开发芯片。A T89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,单片机的外部扩展能力很强。在内部的各种功能部件不能满足应用的需求时, 均可在外部进行扩展,与许多通用的微机接口芯片兼容,给应用系统设计带来了很大的方便。

相关主题
文本预览
相关文档 最新文档