实时时钟RTC模块和串口设计电子钟实验

合集下载

实时时钟设计试验报告

实时时钟设计试验报告

实验报告5.按下Key4 Key3执行时,该按键执行加一操作,Led灯按照5秒顺时针一个一个亮。

6.按下Key5 Key3执行时,该按键执行减一操作,Led灯按照5秒顺时针一个一个亮。

7.按下Key6 Key3执行时,该按键执行确定操作,Led灯按照5秒顺时针一个一个亮。

8.按下INT 闹钟关闭。

5、实验总结本次实验是对课本上“电子日历钟设计”的加深。

通过本次试验我对led和led显示有了更加熟悉的认识,能熟练应用它们的功能。

同时我对时钟计数器也有了一定的认识,可以使用定时中断实现实时时钟,更重要的是我的实践能力有很大的提高。

程序设计中遇到的问题(1)、问题:初始完成程序后秒针走的时间很快,不是精确的一秒走一次。

原因:单片机只能用主系统时间,修改fprs后可以真确显示。

(2)、问题:时间切换函数与显示函数和设计的不一样,如只需要显示时,却多显示分。

原因:在仔细看代码后发现每次按键中断都在调用time1()函数,而seeond++在里面,所以每次都会加快秒的运行。

把seeond++移到外面放入time()函数后这个问题就解决了。

(3)、问题:运行时发现按键中断总会加快秒的运行,不是很精确。

原因:最后设置了一个虚拟的key7,当执行完时间指向ease7,然后调用Freshddisplaybuffer函数,这样就很好的解决了这个问题。

在程序调试过程中,设置断点并且在断点处增加一个LED灯,通过判断灯是否亮可以判断程序是否执行到该位置,对程序调试有很大的帮助。

开始WhileKey? 6 1 3 2 4 结束主程序流程图附件程序流程图:Yd_c_inter() Freshddisp laybuffer(); Set_D_T(); noise(); key=7; , 5 NDownNum() ; Freshddispl aybuffer(); Set_D_T(); noise(); key=7; FreshddisplaybufferTime1();Show_Time();Show_Time(); Time1() Freshddis playbuffer ();; Display_D ate(); noise(); 初始化蜂鸣器并关闭蜂鸣器BZOE = 0;初始化 INT 按键 Init_Inter();初始化 Lcd 和 Led; Init_Lcd(),Init_Led();UpNum(); Freshddis playbuffer (); Set_D_T(); noise(); key=7; key = 0; noise(); Time1(); Freshddis playbuffer (); Set_D_T(); noise();初始化按键中断InitKey_INTKR();Time1(); noise();关中断DI ()关中断EI()开中断EI();源代码:#pragma sfr#pragma EI#pragma DI#pragma access#pragma interrupt INTTM000 Time#pragma interrupt INTKR OnKeyPress#pragma interrupt INTP5 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);〃定义变量i,是切换时间的标志//定义 key=0 〃用于存放当前月的天数 〃默认的秒second=0 〃默认的分minute=0 〃默认的时hour=12 〃默认的天day=1 〃默认的月month=5 〃默认的年year=2014 〃默认的闹钟时=1 〃默认的闹钟分=1 〃秒的数码显示缓存区 〃分的数码显示缓存区 〃时的数码显示缓存区 〃天的数码显示缓存区 〃月的数码显示缓存区 〃年的数码显示缓存区 〃月,天的数码显示缓存区 〃时,分的数码显示缓存区 〃分,秒的数码显示缓存区 〃闹钟时的数码显示缓存区 〃闹钟分的数码显示缓存区 //INT 中断中间变量LCD_num[10]={0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070b);//数字0〜〜9的显示码unsigned char Scond;// ......................................................... 延时函数1 .............................................. //void Delay(int k){int i,j;for(i=0;i<k;i++){for(j=0;j<k;j++){〃使用特殊功能寄存器 〃开中断 〃关中断 〃使用绝对地址指令 〃定义时间中断函数为Time 〃定义按键中断为OnKeyPress //定义INT 中断为OnKeyOverchar i=0;int key=0;int temp=1;int temp1 = 1;int second=0;int minute=0;int hour=12;int day=1;int month=5;int year=2014;int c_hour=1;int c_minute=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// .................................................. 初始化Led函数................ //void Init_Led(){PM13=0XF0; 〃端口13的第四位为输出模式PM14=0XF0; 〃端口14的第四位为输出模式PM15=0XF0; 〃端口15的第四位为输出模式)// ............................................................. 按键中断函数............... •//void InitKey_INTKR(){PM4 = 0x3F; //P4的六个端口设置为输入模式PU4 = 0x3F; 〃接通上拉电阻KRM = 0x3F; 〃允许六个按键中断KRMK = 0;PM3.0 = 1;PU3.0 = 1;EGP.5 = 1;PMK5 = 0;PPR5 = 0;KRPR = 1;)// ............................... 初始化lcd函数............... //void Init_Lcd(){ PFALL=0x0F; 〃所有接lcd引脚指定为lcd引脚LCDC0=0x34; 〃设置原时钟和时钟频率LCDMD=0x30; //设置lcd电压为3/5电压LCDM=0xC0; //4分时1/3偏压模式)// ............................... 初始化定时器Inter函数.............. 〃void Init_Inter(){ CRC00)=0; //CR000为比较寄存器PRM00=0X04; 〃计数时钟为fprs/2A8 CR000=0X7FFF;//时间间隔为1s TMMK010=1;//TMMK010 中断屏蔽TMMK000=0; //TMMK000 中断允许TMC00=0X0C; //TM00和CR000相等时进入清零&启动模式)void Time(){ second++;)// ............................................................. 按键中断函数............... •//void OnKeyPress(){DI();switch(P4&0x3F) 〃判断哪个按键按下{case 0x3e:key=1; //按键keyl按下break;case 0x3d:key=2; //按键key2按下break;case 0x3b:key=3; //按键key3按下break;case 0x37:key=4; //按键key4按下break;case 0x2f:key=5; //按键key5按下break;case 0x1f:key=7; //按键key6按下break;default:break;)EI();)// ............................................................... I NT按键中断函数............... //void OnKeyOver(){DI();Que = 0; //判断Que是否为0BZOE = 0; 〃蜂鸣器关闭EI();)// ................................................... Led小灯函数............... //void LightOneLed(unsigned char ucNum){switch(ucNum){ 〃检测变量ucNumcase 0:case 1:case 2:case 3:P13 |= (unsigned char) 1 << (ucNum);〃如果为0到3中的一个值则让LED1到LED4中的一个亮break;case 4:case 5:case 6:case 7:P14 |= (unsigned char) 1 << (ucNum - 4);〃如果为4到7中的一个值则让LED5到LED8中的一个亮break;case 8:case 9:case 10:case 11:P15 |= (unsigned char) 1 << (ucNum - 8);〃如果为8至U 11中的一个值则让LED9至U LED12中的一个亮break;default:break;))// ................................................... Led小灯熄灭函数............... 〃void LightOff(){P13 = 0;P14 = 0;P15 = 0;)// ............................................. 时间函数.............. 〃void Time1(){if((second % 5) == 0){ 〃秒大于 5 变为0Scond = second / 5 + 1;LightOff(); 〃调用小灯亮函数LightOneLed(Scond % 12);)if(second>=60){minute++; //秒大于60时分加1second=0;if(minute>=60){minute=0;hour++; //分大于60时时加1if(hour>=24){hour=0;day++; 〃时大于24时天加1temp=Count_Day(month);if(day>=temp){day=1;month++; 〃天大于当前月份的天数时月加1if(month>=13){month=1;year++; //月大于12时年加1))))))// ...................................... 计算当前月的天数.............. •//int Count_Day(int month){int day;if((month==4)||(month==6)||(month==9)||(month==11))//4,6,9,11 月为30 天day=30;else if(month==2){if((year%4==0&&year%100==0)||(year%400==0))day=29; 〃闰年2月29天elseday=28; //平年2月28天)elseday=31; //1,3,5,7,8,10,12 月为31 天return (day);)// ................................ 倒计时函数 ...... //void Show_Time(){ pokew(0xFA40,0x00); pokew(0xFA42,0x00); pokew(0XFA48,buffs[1]); pokew(0XFA4A,buffs[0]); pokew(0XFA44,buffm[1]); pokew(0XFA46,buffm[0]); pokew(0xFA4C,0x00); pokew(0xFA4E,0x00); Delay(100);) // ..................................................................... 日期显示函数 ................. •// void Display_Date(){buffm[0]|=0x0800;pokew(0xFA40,buffyear[3]);〃显示年 pokew(0xFA42,buffyear[2]);pokew(0xFA44,buffyear[1]);pokew(0xFA46,buffyear[0]);pokew(0xFA48,buffmonth[1]);〃显示月 pokew(0xFA4A,buffmonth[0]);pokew(0xFA4C,buffday[1]);〃显示日pokew(0xFA4E,buffday[0]);temp1=0;) // .................................................................... 时间显示函数 .............. •//void Display_Time(){ pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0xFA44,buffh[1]);〃显示时 pokew(0xFA46,buffh[0]);pokew(0xFA48,buffm[1]);〃显示分 pokew(0xFA4A,buffm[0]);pokew(0xFA4C,buffs[1]);〃显示秒 pokew(0xFA4E,buffs[0]);)// ..................................................................... 设定时间函数 .............. •//void Set_D_T(){int lcd_addr;lcd_addr = 0xFA40;switch(i){case 1:pokew(lcd_addr,buffyear[3]);〃时间年 pokew(lcd_addr+2,buffyear[2]);pokew(lcd_addr+4,buffyear[1]);pokew(lcd_addr+6,buffyear[0]);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 2:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00);pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,buffmonth[1]);〃时间月 pokew(lcd_addr+10,buffmonth[0]);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 3:pokew(lcd_addr,0x00); //在lcd 右边显示1〃在lcd 右边显示0 〃在lcd 右边显示1 〃在lcd 右边显示0pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00);pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,buffday[1]); 〃时间日pokew(lcd_addr+14,buffday[0]);break;case 4:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,buffh[1]); 〃时间时pokew(lcd_addr+6,buffh[0]);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 5:pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0xFA44,0x00);pokew(0xFA46,0x00);pokew(0xFA48,buffm[1]); 〃时间分pokew(0xFA4A,buffm[0]);pokew(0xFA4C,0x00);pokew(0xFA4E,0x00);break;case 6:pokew(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x56);pokew(0xFA4C,buffch[1]); 〃闹钟时pokew(0xFA4E,buffch[0]);break;case 7:pokew(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x00);pokew(0xFA4C,buffcm[1]); 〃闹钟分pokew(0xFA4E,buffcm[0]);break;default:break;))// ........................................................ 切换时间函数 .............. …// void d_c_inter(){DI(); 〃关中断i++;if(i>7) 〃切换标志>7, i=1,否则i++i=1;EI(); 〃开中断)// ........................................................ 调整时间加函数 .............. •// void UpNum(){ switch(i){ case 1:year++;case 2:month++;if(month > 12){month = 1;)break;case 3:temp = Count_Day(month);day++;if(temp < day)day = 1;break;case 4:hour++;if(hour > 23)hour = 1;break;case 5:minute++;if(minute > 59)minute = 0;break;case 6:c_hour++;if(c_hour > 23)c_hour = 1;break;case 7:c_minute++;if(c_minute > 59)c_minute = 0;break;default:break;))// ........................................................ 调整时间减函数.............. …// void DownNum(){switch(i){case 1:year--;case 2:month--;if(month < 1){month = 12;)break;case 3:temp = Count_Day(month);day--;if(day < 1)day = temp;break;case 4:hour--;if(hour < 1)hour = 23;break;case 5:minute--;if(minute < 0)minute = 59;break;case 6:c_hour--;if(c_hour < 1)c_hour = 23;break;case 7:c_minute--;if(c_minute < 0)c_minute = 59;break;default: break;))// .................................................. 闹铃以及小灯函数.............. •//void noise(){if(c_hour == hour && c_minute == minute && Que == 1){ 〃闹铃的时,分与系统时,分相等,并且闹钟标志开启CKS=0XE0; 〃开启蜂鸣器输出,输出频率为0.98khz的音频Time1(); 〃调用时间函数))// ........................................................ 显示缓存区刷新时间函数.............. •//void Freshddisplaybuffer(){buffs[1]=LCD_num[second/10];/期的显示码放入秒的数码显示缓存区buffs[0]=LCD_num[second%10];buffm[1]=LCD_num[minute/10];//分的显示码放入分的数码显示缓存区buffm[0]=LCD_num[minute%10];buffm[0]|=0x0800; 〃分的后面显示一个"."buffh[1]=LCD_num[hour/10]; 〃时的显示码放入时的数码显示缓存区buffh[0]=LCD_num[hour%10];buffh[0]|=0x0800; 〃时的后面显示一个"."buffday[1]=LCD_num[day/10];//天的显示码放入天的数码显示缓存区buffday[0]=LCD_num[day%10];buffmonth[1]=LCD_num[month/10];//月的显示码放入月的数码显示缓存区buffmonth[0]=LCD_num[month%10];buffmonth[0]|=0x0800; 〃月的后面显示一个"."buffyear[3]=LCD_num[year/100/10];/^的显示码放入年的数码显示缓存区buffyear[2]=LCD_num[(year/100)%10];buffyear[1]=LCD_num[(year%100)/10];buffyear[0]=LCD_num[(year%100)%10];buffyear[0]|=0x0800; 〃年的后面显示一个"."buffmd[3]=LCD_num[month/10];//月,天的显示码放入月,天的数码显示缓存区buffmd[2]=LCD_num[month%10];buffmd[2]|=0x0800; 〃月,天后显示一个"."buffmd[1]=LCD_num[day/10];buffmd[0]=LCD_num[day%10];buffhm[3]=LCD_num[hour/10];//时,分的显示码放入时,分的数码显示缓存区buffhm[2]=LCD_num[hour%10];buffhm[2]|=0x0800; 〃时,分的后显示一个"."buffhm[1]=LCD_num[minute/10];buffhm[0]=LCD_num[minute%10];buffms[3]=LCD_num[minute/10];/^,秒的显示码放入分,秒的数码显示缓存区buffms[2]=LCD_num[minute%10];buffms[2]|=0x0800; 〃分,秒的后显示一个"."buffms[1]=LCD_num[second/10];buffms[0]=LCD_num[second%10];buffch[1]=LCD_num[c_hour/10];//闹钟时的显示码放入闹钟时的数码显示缓存区buffch[0]=LCD_num[c_hour%10];buffcm[1]=LCD_num[c_minute/10];//闹钟分的显示码放入闹钟分的数码显示缓存区buffcm[0]=LCD_num[c_minute%10];)// ................................. 主函数............... 〃void main(){DI(); 〃关中断PM3.4 = 0; //P3.3,P3.4端口设置为输出模式P3.4 = 1; //led灯初始化为点亮状态PM3.3 = 0;P3.3 = 0;BZOE = 0; 〃蜂鸣器初始化为熄灭Init_Lcd(); 〃初始化lcdInit_Led(); 〃初始化ledInitKey_INTKR(); 〃初始化按键EI(); 〃开中断Init_Inter(); //初始化中断while(1){ Time1(); noise(); switch(key){ case 0: Freshddisplaybuffer(); Time1(); Show_Time();Show_Time(); break; case 1:Time1();Freshddisplaybuffer(); Display_Date(); noise();break;case 2:Time1();Freshddisplaybuffer(); Display_Time(); noise();break;case 3:d_c_inter();Freshddisplaybuffer(); Set_D_T();noise();key=7; break;case 4:UpNum();Freshddisplaybuffer(); Set_D_T();noise();key=7; break;case 5:DownNum();Freshddisplaybuffer(); Set_D_T();noise();key=7; break;case 6:key = 0;if(i > 5)Que = 1;1 = 0;noise();case 7:Time1();Freshddisplaybuffer(); Set_D_T(); 〃调用计算时间函数 〃调用闹钟函数 〃没有按键执行 〃调用刷新函数 〃计算时间 〃调用显示时间函数 //按键1执行 〃计算时间 〃调用刷新函数 〃调用显示日期函数 〃调用闹钟函数 //按键2执行 //计算时间 //调用刷新函数 //调用时间显示函数 //调用闹钟函数 //按键3执行 〃调用时间切换函数 //调用刷新函数 〃调用时间设置函数 //调用闹钟函数 //按键4执行 〃调用时间加函数 //调用刷新函数 //调用时间设置函数 //调用闹钟函数 //按键5执行〃调用时间减函数 //调用刷新函数 //调用时间设置函数//调用闹钟函数//按键6执行〃判断是否确认 //调用闹钟函数〃虚拟按键7 //调用刷新函数//调用时间设置函数〃调用闹钟函数noise();break;。

串行口实时时钟实验

串行口实时时钟实验

微机原理与接口技术实验报告实验名称:串行口实时时钟实验班级:姓名:学号:实验日期:成绩:串行口实时时钟实验实验目的1、了解实时时钟电路工作原理2、了解串行时钟芯片的控制方法3、掌握DS1302串行时钟芯片的使用方法实验仪器单片机开发板、万利仿真机、稳压电源、计算机实验原理1、DS1302串行时钟芯片工作原理DS1302是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

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

芯片内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

引脚图如图4-77所示。

图4-77 DS1302引脚图DS1302的控制字最高位必须为1;D6位:1:读写内部通用存储器,0:读写时钟存储器;随后是地址位。

最低位是读写控制:1代表读,0:代表写。

DS1302内部日历数据存储器位定义如图4-78所示。

图4-78 DS1302内部日历数据存储器结构图CH :时钟停止位(CH=0振荡器工作允许,CH=1振荡器停止)寄存器2的第7位:12/24小时标志(bit7=1,12小时模式,bit7=0,24小时模式) 寄存器2的第5位:AM/PM 定义(AP=1下午模式,AP=0上午模式)WP :写保护位(WP=0 寄存器数据能够写入,WP=1寄存器数据不能写入) TCS :涓流充电选择(TCS=1010使能涓流充电,TCS=其它禁止涓流充电)DS :二极管选择位(DS=01一个二极管,DS=10两个,DS=00或11,充电功能也被禁止)从图中可以看出,第1脚电源经过开关、二极管、电阻对接在第8脚的备用电源进行充电。

调整涓流充电控制寄存器的值可以控制涓流充电方式。

2、 DS1302芯片读写时序DS1302采用三线串行口通迅,占用IO 口少。

嵌入式实验:实时时钟实验

嵌入式实验:实时时钟实验
{
Irq_Request(IRQ_RTC, rtc_int_isr);
rRTCCON = 0x01;
rALMYEAR = p_date->year;
rALMMON = p_date->mon;
rALMDATE = p_date->day;
rALMHOUR = p_date->hour;
rALMMIN = p_date->min;
// Argument : p_date,待设置的日期
*****************************************************************************/
void rtc_set_date(st_date* p_date)
{
rRTCCON = 0x01;
Irq_Enable(IRQ_TICK);
}
/*****************************************************************************
// Function name: rtc_alarm_set
// Description:设置S3C2410的告警时间以及方式
rRTCCON = 0x00;
}
/*****************************************************************************
// Function name: rtc_get_date
// Description:获取实时时钟当前时间、日期
/*表示日期、时间的数据结构*/
typedef struct ST_DATE

rtc闹钟实验报告

rtc闹钟实验报告

rtc闹钟实验报告
《RTC闹钟实验报告》
近年来,随着科技的不断发展,人们对于日常生活中的便利性和智能化需求也
越来越高。

其中,闹钟作为人们日常生活中不可或缺的一部分,也在不断进行
着创新和改进。

而RTC(Real Time Clock)闹钟作为一种新型的智能闹钟,其
精准的时间显示和多种功能备受人们的关注。

为了更好地了解RTC闹钟的性能和功能,我们进行了一系列的实验研究。

首先,我们对RTC闹钟进行了时间精准度测试,结果显示RTC闹钟的时间显示非常准确,误差在毫秒级别。

这对于人们在日常生活中对时间的准确把握提供了非常
大的便利。

其次,我们对RTC闹钟的多种功能进行了测试。

除了基本的闹钟功能外,RTC
闹钟还具有温度显示、湿度显示、闪灯提醒等多种实用功能。

我们对这些功能
进行了逐一测试,结果显示RTC闹钟的功能齐全且稳定可靠,能够满足人们在
日常生活中的多种需求。

最后,我们还对RTC闹钟的节能性能进行了测试。

结果显示,RTC闹钟采用低
功耗设计,能够有效延长电池的使用寿命,节省能源的同时也减少了用户的使
用成本。

综合以上实验结果,我们可以得出结论:RTC闹钟作为一种新型的智能闹钟,
具有精准的时间显示、多种实用功能和优良的节能性能,能够为人们的日常生
活提供更加便利和舒适的体验。

相信随着科技的不断发展,RTC闹钟将会在未
来得到更广泛的应用和推广,成为人们生活中的重要助手。

35. RTC实时时钟实验[11页]

35. RTC实时时钟实验[11页]

普中STM32开发板带您进入ARM世界
4.编写RTC控制程序
本章所要实现的功能是:设置RTC时间日期初值,在RTC秒中断内使用 串口打印出RTC日期和时间,D1指示灯闪烁提示系统运行。程序框架如下 : (1)初始化RTC,设置RTC时间日期初值 (2)开启RTC的秒中断,编写RTC中断函数, (3)在RTC中断内更新时间并打印输出 (4)编写主函数
STM32F1的RTC,就需要了解它内部的结构。如图32.1.1所示:(大家也 可以查看《STM32F10x中文参考手册》-16实时时钟(M世界
系统复位后, 默认禁止访问后备寄存器和 RTC,防止对后备区域 (BKP)的意外写操作。执行以下操作使能对后备寄存器和 RTC 的访问: (1) 设置 RCC_APB1ENR 寄存器的 PWREN 和 BKPEN 位来使能电源和后备
3.硬件电路
本实验使用到硬件资源如下: (1)D1指示灯 (2)串口1 (3)RTC
D1指示灯、串口1电路在前面章节都介绍过,这里就不多说,至于RTC 它属于STM32F1芯片内部的资源,只要通过软件配置好即可使用。D1指示 灯用来提示系统运行状态。串口1将读取的RTC时间日期信息打印出来。
这里需要注意RTC 不能断电,否则时间数据将会丢失,如果想让时间 在断电后还可以继续走,那么必须确保开发板上的纽扣电池有电。
接口时钟。 (2) 设置电源控制寄存器(PWR_CR)的 DBP 位使能对后备寄存器和 RTC
的访问。 设置后备寄存器为可访问后,在第一次通过 APB1 接口访问 RTC 时 , 因为时钟频率的差异,所以必须等待 APB1 与 RTC 外设同步,确保 被读取出来的 RTC 寄存器值是正确的。若在同步之后,一直没有关闭 APB1 的 RTC 外设接口,就不需要再次同步了。 如果内核要对 RTC寄存器进行任何的写操作,在内核发出写指令后, RTC模块在 3个RTCCLK 时钟之后,才开始正式的写 RTC 寄存器操作。 由于 RTCCLK 的频率比内核主频低得多,所以每次操作后必须要检查 RTC关闭操作标志位 RTOFF,当这个标志被置 1 时,写操作才正式完成 。

利用开发板编程完成显示实时时钟功能

利用开发板编程完成显示实时时钟功能
rtc具有计时准确耗电低和体积小等特点特别是在各种嵌入式系统中用于记录事件发生的时间和相关信息如通信工程电力自动化工业控制等自动化程度高的领域的无人值守环境
实验三显示实时时钟
一.实验目的
1.了解实时时钟的硬件控制原理及设计方法;
2.掌握OK210开发板处理器中RTC模块程序的设计方法。
二.实验设备
硬件:OK210开发板(配有RTC模块),串口线,PC机
rBCDHOUR= rBCDHOUR &~(0x3f)丨g_nhour;
rBCDMIN= rBCDMIN &~(0x7f)丨g_nmin;
rBCDSEC= rBCDSEC &~(0x7f)丨g_nsec;
rRTCCON=0x0;
RTC Control disable;
}
定时程序代码:
#include "config.h"
#define LED (1<<17)
void __irq Timer0ISR (void)
{
if((IO0PIN & LED)==0)
{
IO0SET=LED;
}
else IO0CLR=LED;
T0IR=0x01;
VICVectAddr=0x00;
}
void Timer0Init(void)
{
T0TCR=0x02;
软件:Android开发环境,超级终端
三.实验内容
学习和掌握OK210开发板中处理器中RTC模块的使用,编写应用程序,修改时钟日期及时间的设置,以及使用开发板的串口,在超级终端显示当前系统时间。
四.实验原理
实时时钟(RTC)
实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC具有计时准确、耗电低和体积小等特点,特别是在各种嵌入式系统中用于记录事件发生的时间和相关信息,如通信工程,电力自动化、工业控制等自动化程度高的领域的无人值守环境。RTC器件与微控制器之间的接口大都采用连线简单的串行接口,有同步串口和异步串口。

实时时钟设计试验报告

实时时钟设计试验报告

实时时钟设计试验报告一、实验目的本实验的目的是设计一个实时时钟系统,具有实时显示时间、日期和闹钟功能。

通过该实验,我们可以了解实时时钟的设计原理、硬件电路连接及软件程序编写方法。

二、实验原理实时时钟系统由时钟芯片、显示模块、按键模块和控制模块组成。

时钟芯片负责计时和日期的记录,显示模块用于显示时间和日期,按键模块用于设置时间和日期,控制模块用于控制各模块之间的协作。

三、实验器材1.STM32开发板2.DS3231时钟模块3.数码管显示模块4.按键模块5.连接线四、实验步骤1.连接硬件电路。

将STM32开发板与DS3231时钟模块、数码管显示模块和按键模块进行连接,确保电路连接正确无误。

2.编写程序。

使用C语言编写程序,通过读取DS3231时钟模块的寄存器获取时间和日期数据,并将其显示在数码管模块上。

同时,设置按键模块的功能,使其可以进行时间和日期的设置。

3.烧录程序。

使用烧录器将编写好的程序烧录到STM32开发板上,并进行调试。

4.运行实验。

接通电源,启动实时时钟系统,观察数码管是否正确显示时间和日期,按下按键模块进行时间和日期的设置,并观察设置是否生效。

五、实验结果经过实验,我们成功设计出了一个实时时钟系统。

系统能够实时地显示当前的时间和日期,并且可以通过按键进行时间和日期的设置。

在设置新的时间和日期后,系统能够正确地更新并显示。

六、实验总结通过本次实验,我们深入地了解了实时时钟系统的设计原理和实现方法。

我们熟悉了DS3231时钟模块的使用方法,并学会了通过C语言编写程序来实现实时时钟系统的功能。

同时,我们也发现了实时时钟系统的一些问题,并加以解决。

我们对实时时钟系统的稳定性和精确性进行了测试,发现系统的计时精度较高,能够达到亚秒级的准确度。

然而,在用户进行时间和日期的设置时,可能由于误操作导致时间和日期出错。

需要在后续的工作中进一步优化系统的操作界面,提高用户设置的便捷性和准确性。

总而言之,实时时钟系统是一种非常有实用价值的设计,可以广泛应用于各种计时需求的场合,如办公室、实验室、车载设备等。

电子钟实验报告

电子钟实验报告

电子钟实验报告电子钟实验报告引言:电子钟是一种利用电子技术来实现时间显示的装置,它不仅能够准确地显示时间,还具备了一些其他功能,如闹钟、温度显示等。

在本次实验中,我们将通过搭建一个简单的电子钟来了解其基本原理和工作方式。

一、材料与方法本次实验所需材料包括:Arduino开发板、LCD液晶显示屏、实时时钟模块、电阻、电容等。

我们首先将这些材料按照电路图连接起来,然后通过编写Arduino代码来实现时间的显示和功能的控制。

二、电子钟的原理电子钟的核心部分是实时时钟模块,它通过与Arduino开发板的连接,提供准确的时间信号。

实时时钟模块内部有一个独立的时钟电路,可以独立运行,并通过I2C总线与Arduino进行通信。

当我们将时间信息发送给实时时钟模块后,它会自动更新时间,并通过Arduino控制LCD显示屏来显示时间。

三、电路连接与编程我们首先将Arduino开发板与实时时钟模块通过I2C总线连接,然后将LCD显示屏与Arduino开发板连接。

接下来,我们需要编写Arduino代码来实现时间的显示和功能的控制。

在代码中,我们需要使用实时时钟模块的库函数来获取当前时间,并将其发送给LCD显示屏进行显示。

同时,我们还可以通过编写代码来实现一些其他功能,如闹钟、温度显示等。

四、实验结果与分析经过搭建电路和编写代码后,我们成功地实现了一个简单的电子钟。

通过观察LCD显示屏,我们可以清晰地看到当前的时间,并且可以通过按键来控制闹钟的开关和设置温度显示。

这个电子钟不仅具备了时间显示的功能,还具备了一些其他实用的功能,为我们的生活带来了便利。

五、实验总结通过本次实验,我们深入了解了电子钟的原理和工作方式,并通过实际操作来搭建了一个简单的电子钟。

在实验过程中,我们不仅学会了如何连接电路和编写代码,还锻炼了自己的动手能力和解决问题的能力。

电子钟作为一种常见的电子设备,广泛应用于我们的日常生活中,通过本次实验,我们对其有了更深入的了解。

15.9、 RTC实时时钟实验

15.9、 RTC实时时钟实验

RTC实时时钟实验本章节我们讲解STM32的RTC原理并通过每秒显示当前实时时间的例程来将掌握RTC 实时时钟功能及用法。

z意义与作用RTC(Real-time clock)是实时时钟的意思。

神舟IV号开发板的处理器STM32F107集成了RTC(Real-time clock)实时时钟,在处理器复位或系统掉电但有实时时钟电池的情况下,能维持系统当前的时间和日期的准确性。

实时时钟是一个独立的定时器。

RTC实时时钟模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。

修改计数器的值可以重新设置系统当前的时间和日期。

STM32的RTC主要特性为:●可编程的预分频系数:分频系数最高为220。

● 32位的可编程计数器,可用于较长时间段的测量。

●2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟频率的四分之一以上)。

●可以选择以下三种RTC的时钟源:─ HSE时钟除以128;─ LSE振荡器时钟;─ LSI振荡器时钟。

●2个独立的复位类型:─ APB1接口由系统复位;─ RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位。

●3个专门的可屏蔽中断:─闹钟中断,用来产生一个软件可编程的闹钟中断。

─秒中断,用来产生一个可编程的周期性中断信号(最长可达1秒)。

─溢出中断,指示内部可编程计数器溢出并回转为0的状态z实验原理RTC由两个主要部分组成(参见下图)。

第一部分(APB1接口)用来和APB1总线相连。

此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作(参见16.4节)。

APB1接口由APB1总线时钟驱动,用来与APB1总线接口。

另一部分(RTC核心)由一组可编程计数器组成,分成两个主要模块。

第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC 时间基准TR_CLK。

RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。

rtc闹钟实验报告

rtc闹钟实验报告

rtc闹钟实验报告
RTC闹钟实验报告
实验目的:通过对RTC(Real Time Clock)闹钟的实验,了解RTC的原理和功能,并掌握RTC的使用方法。

实验设备:Arduino开发板、RTC模块、蜂鸣器、LED灯、面包板、杜邦线等。

实验原理:RTC是一种用于计算机系统中的实时时钟,它能够提供准确的时间和日期信息。

RTC闹钟是RTC模块的一个应用,通过设置闹钟时间,当时间到达时触发蜂鸣器或LED灯等设备,起到提醒的作用。

实验步骤:
1. 连接RTC模块:将RTC模块与Arduino开发板通过杜邦线连接,确保连接正确无误。

2. 编写程序:使用Arduino IDE编写程序,通过RTC库函数设置闹钟时间,同时设置蜂鸣器或LED灯的触发条件。

3. 上传程序:将编写好的程序上传至Arduino开发板,确保上传成功。

4. 实验验证:设置闹钟时间,观察蜂鸣器或LED灯是否在设定时间触发。

实验结果:经过实验验证,RTC闹钟能够准确地在设定的时间触发蜂鸣器或LED灯,实现了闹钟的功能。

实验结论:通过本次实验,我们对RTC的原理和功能有了更深入的了解,掌握了RTC闹钟的使用方法。

RTC模块可以广泛应用于各种计算机系统中,为系统提供准确的时间和日期信息,同时也可以作为闹钟等应用的基础模块。

总结:本次实验对于理解RTC的原理和功能,掌握RTC闹钟的使用方法具有重要意义。

通过实际操作,我们更加深入地了解了RTC模块的工作原理,为今后
的实际应用打下了坚实的基础。

实时时钟与串口通信模块整合案例原理与测试说明

实时时钟与串口通信模块整合案例原理与测试说明

“实时时钟与串口通信模块整合”案例原理与测试说明1 程序设计目标及程序运行效果说明程序设计目标:本实验实现的是从DS1302芯片中读取实时时钟模块的年、月、日、时、分、秒,对获取实时时钟模块的数据信息通过串口发送给上位机进行显示,同时上位机可以发送指令给单片机,包含地址、校准值信息,来修改单片机寄存器值,实现单片机校时功能。

程序运行效果说明:在上位机上显示出从DS1302中读取的时间,并显示阴历的年月日,在上位机上通过修改寄存器的值,能实现单片机的校正功能。

2 程序相关电路及工作原理说明2.1.1串口通信模块电路图2.1.2 实时时钟模块电路图2.1.3 按键模块电路图(右边部分key1引脚)2.2 电路工作原理从实时时钟模块读取到年、月、日、时、分、秒信息,通过年、月、日计算阴历年、月、日、星期,将年、月、日、星期、时、分、秒、阴历年、阴历月、阴历日10个字节通过定时器定时地、连续地通过串口发送给上位机,上位机对获取到的10个字节进行解析并进行显示到对应的控件上面。

上位机通过选定地址、校准值,点击发送按钮,连续发送0xf0、寄存器地址、校准值3个字节给下位机,下位机通过缓存保存串口收到的数据,判断接收到的第一个字节是0xf0,第二个字节对应地址、第三个字节对应校准值,对实时时钟进行写操作,在写之前注意禁止写保护,晶振停止工作,寄存器写入数据,启动晶振,重写写保护。

同时按键1控制年月日、时分秒的显示。

2.3程序总框图设计流程如下初始化按键、串口、实时时钟等硬件资源默认显示时、分、秒显示时、分、秒否显示年、月、日是检测key1按下检测key1按下串口中断处理:接收上位机发过来的0xf0、寄存器地址、寄存器值3个字节数据保存,并完成寄存器写操作否定时器中断处理:控制数码管扫描、显示;将年、月、日、星期、时、分、秒、阴历年、阴历月、阴历日10个字节写入缓存进行发送;按键消抖上位机处理:点击发送按钮发送0xf0、寄存器地址、寄存器值3个字节数据;通过定时器定时访问串口是否有数据,若有,接收单片机发过来的的10个字节数据进行显示3 测试方法(1)按照“工程建立及下载到开发板整个流程指导.doc ”文件将当前目录的Hex 文件下载到开发版;(2)默认最右边数码管显示当前的时间;(3)打开实时时钟工程文件中的“SerialRTC(PC 上位机无需安装QT)”,即是上位机的程序,会出现如下图所示的,当然图中的时间会不同。

单片机实时时钟实训报告

单片机实时时钟实训报告

一、引言随着单片机技术的不断发展,其在各个领域的应用越来越广泛。

实时时钟(Real-Time Clock,RTC)作为一种重要的功能模块,被广泛应用于嵌入式系统中,用于实现时间的记录、显示和控制等功能。

本实训报告以单片机为平台,设计并实现了一个实时时钟系统,旨在巩固和深化单片机相关知识,提高动手实践能力。

二、实训目的1. 理解实时时钟的工作原理和基本概念;2. 掌握单片机与实时时钟芯片的接口连接方法;3. 学会使用实时时钟芯片实现时间记录、显示和控制功能;4. 提高单片机编程能力和嵌入式系统设计能力。

三、实训内容1. 实时时钟芯片介绍本实训采用DS1302实时时钟芯片,该芯片具有以下特点:(1)低功耗设计,适用于电池供电的应用场景;(2)支持闰年、星期和夏令时等功能;(3)具有32.768kHz晶振振荡器,提供精确的时间基准;(4)具有64字节RAM,可用于存储数据。

2. 单片机与DS1302的接口连接本实训选用AT89C51单片机作为控制核心,与DS1302的接口连接如下:(1)VCC:连接单片机的5V电源;(2)GND:连接单片机的地;(3)RST:DS1302复位引脚,连接单片机的P1.0引脚;(4)CE:DS1302片选引脚,连接单片机的P1.1引脚;(5)IO:DS1302数据引脚,连接单片机的P1.2引脚;(6)SQW/OUT:DS1302闹钟输出引脚,连接单片机的P1.3引脚。

3. 实时时钟系统设计(1)时间记录通过DS1302芯片的RAM存储功能,实现时间的记录。

具体操作如下:① 初始化DS1302芯片,设置时间基准;② 设置闰年、星期和夏令时等信息;③ 读取当前时间,并存入单片机的内部RAM。

(2)时间显示使用单片机的并行I/O口,将时间数据输出到LED数码管或LCD液晶显示屏,实现时间显示。

具体操作如下:① 设计显示模块的硬件电路;② 编写显示模块的驱动程序,实现时间数据的读取和显示;③ 通过按键操作,实现时间的切换和调整。

数字电子钟课程设计实验报告

数字电子钟课程设计实验报告

数字电子钟课程设计实验报告1. 引言本实验旨在设计一个数字电子钟,通过对电子元件的运用和数字电路的设计,实现显示当前时间和日期的功能。

在实验过程中,我们将学习数字电子钟的工作原理,熟悉数字电子元件的连接与使用,并运用已学知识进行设计和实现。

2. 设计思路为了设计一个完整的数字电子钟,我们需要考虑以下几个方面的内容:2.1 时钟模块时钟模块是数字电子钟的核心部分,用于记录和显示当前时间。

我们可以使用实时时钟(RTC)模块来实现这一功能。

RTC模块可以精确地计时,并提供与微处理器的接口。

2.2 显示模块数字电子钟的显示模块需要能够显示当前时间和日期。

常见的显示模块包括LED数码管和液晶显示屏。

我们可以根据实际需求选择合适的显示模块。

2.3 控制模块为了方便用户对数字电子钟进行设置和操作,我们需要设计一个控制模块。

用户可以通过控制模块来调整时间、日期等参数,并进行其他操作。

3. 设计步骤3.1 连接电子元件首先,我们需要连接时钟模块、显示模块和控制模块。

按照时钟模块和显示模块的规格说明,将它们与微处理器连接起来。

同时,根据控制模块的需求,连接控制模块与微处理器。

3.2 编写代码编写代码是实现数字电子钟功能的关键步骤。

在代码中,我们需要实现时钟模块的读取和计时功能,显示模块的显示功能,以及控制模块的参数调整和操作功能。

3.3 调试和测试完成代码编写后,我们需要对数字电子钟进行调试和测试。

首先,确保时钟模块的读取和计时功能正常。

然后,验证显示模块的显示功能是否正确。

最后,通过控制模块进行参数调整和操作,确保所有功能都能够正常运行。

4. 实验结果经过设计、编写代码、调试和测试,我们成功地实现了数字电子钟的功能。

我们的数字电子钟可以准确地显示当前时间和日期,并且具备参数调整和操作功能。

5. 总结与讨论本次实验通过设计数字电子钟,我们对数字电路的基本原理和设计方法有了更深入的理解。

通过实践,我们掌握了连接电子元件、编写代码、调试和测试的基本技能,并成功地实现了数字电子钟的功能。

实时时钟实验总结

实时时钟实验总结

实时时钟实验总结一、引言实时时钟(Real Time Clock,RTC)是一种能够提供准确时间和日期信息的设备。

在各种应用中,实时时钟都扮演着重要的角色,例如计算机系统中的时间同步、电子设备中的时间戳记录等。

本文将对实时时钟实验进行总结,包括实验目的、实验原理、实验步骤以及实验结果分析等内容。

二、实验目的本实验旨在通过搭建实时时钟电路,并使用相应的程序进行控制,实现对时间和日期的准确显示。

具体目的如下: 1. 理解实时时钟的基本原理和工作方式; 2. 掌握实时时钟电路的搭建方法; 3. 学会使用程序控制实时时钟的功能。

三、实验原理实时时钟电路由晶振、RTC芯片、电池及其他辅助电路组成。

其工作原理如下: 1. 晶振产生基准时钟信号,供RTC芯片使用; 2. RTC芯片通过与晶振的配合,实时计时,并将时间和日期信息存储在相关寄存器中; 3. 电池供电保证RTC芯片在断电情况下仍能持续工作,避免时间和日期信息的丢失。

四、实验步骤1. 准备实验材料和工具•Arduino开发板•DS1302实时时钟模块•面包板•连接线•电池2. 搭建电路按照以下步骤搭建实时时钟电路: 1. 将DS1302模块插入面包板中,确保引脚与面包板上的连接良好; 2. 将Arduino开发板与DS1302模块通过连接线连接起来,注意连接的引脚要与程序中定义的引脚对应; 3. 连接电池到DS1302模块的电池接口上,确保电池正负极正确连接。

3. 编写程序使用Arduino开发环境,编写相应的程序代码,实现对DS1302模块的控制和时间显示功能。

程序主要包括如下功能: - 初始化DS1302模块; - 读取DS1302模块中的时间和日期信息; - 在串口监视器上显示时间和日期信息; - 实现时间和日期的设置功能。

4. 上传程序并测试将编写好的程序上传到Arduino开发板上,并打开串口监视器,观察时间和日期信息的显示情况。

同时,通过修改程序中的设置功能,验证实时时钟的准确性和可靠性。

实时时钟实验课程设计

实时时钟实验课程设计

实时时钟实验课程设计一、课程目标知识目标:1. 学生能够理解实时时钟的基本原理,掌握时钟的组成部分及其功能。

2. 学生能够掌握日期和时间的表示方法,理解时、分、秒的概念及其相互关系。

3. 学生能够了解实时时钟在日常生活和科技领域中的应用。

技能目标:1. 学生能够运用所学知识,独立完成实时时钟电路的搭建和调试。

2. 学生能够通过实际操作,学会读取和设置实时时钟,提高动手实践能力。

3. 学生能够运用编程思维,编写简单的程序实现对实时时钟的控制。

情感态度价值观目标:1. 学生能够培养对时间管理和珍惜时间的意识,养成良好的作息习惯。

2. 学生能够培养团队协作意识,学会在小组合作中共同解决问题。

3. 学生能够体验科技的魅力,激发对科学技术的兴趣和求知欲。

课程性质:本课程为实践性较强的课程,结合理论知识与实际操作,培养学生的动手能力和创新能力。

学生特点:六年级学生具有一定的电子知识基础,好奇心强,善于观察和思考,具备一定的合作能力。

教学要求:教师需注重理论与实践相结合,引导学生主动探究,关注学生的个体差异,提高学生的综合素养。

在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 实时时钟基础知识:- 时钟的组成部分及其功能- 时、分、秒的概念及其相互关系- 日期和时间的表示方法2. 实时时钟电路原理:- 时钟电路的基本原理- 常见时钟芯片的介绍与应用- 电路元件的识别与使用3. 实践操作:- 实时时钟电路的搭建与调试- 读取和设置实时时钟- 编写程序实现对实时时钟的控制4. 教学内容安排与进度:- 第一课时:实时时钟基础知识学习- 第二课时:实时时钟电路原理学习- 第三课时:实践操作,实时时钟电路搭建与调试- 第四课时:实践操作,读取和设置实时时钟- 第五课时:实践操作,编写程序实现对实时时钟的控制5. 教材章节及内容:- 教材第四章第二节:时钟电路的原理与应用- 教材第五章第三节:实时时钟芯片的介绍与编程教学内容注重科学性和系统性,结合课程目标,确保学生在掌握理论知识的基础上,提高实践操作能力。

实验三 RTC例程

实验三  RTC例程

实验三 RTC例程一、实验目的RTC实时时钟的应用和串口通信的应用二、实验内容板子加电后,通过串口1可以设置初始时间及显示实时时间,该实验学习了RTC资源软件的编制及流程。

三、实验仪器、设备计算机、开发板、keil软件四、硬件设计五、软件程序设计根据任务要求,程序内容主要包括:1. 初始化串口1,用于输入和输出。

2. RTC初始化。

3. 间隔时间将RTC时间通过串口1发送出去。

整个工程包含4类源文件:FWLIB--stm32f10x_gpio.c ST公司的标准库,包含了关于对通用IO口设置的函数。

stm32f10x_rcc.c ST公司的标准库,包含了关于对系统时钟设置的函数。

stm32f10x_RTC.c ST公司的标准库,包含了关于对于RTC设置的函数。

stm32f10x_bkp.c ST公司的标准库,包含了备份寄存器有关的函数。

stm32f10x_pwr.c ST公司的标准库,包含了电源控制有关的函数。

stm32f10x_USART.c ST公司的标准库,包含了关于对USART设置的函数。

Misc.c ST公司的标准库,包含了关于中断设置的函数。

下面介绍主函数main.cRCC_Configuration(void)用于配置系统时钟设置,及外设时钟使能。

NVIC_Configuration函数用于配置中断源,本实验中用到了RTC秒中断。

GPIO_Configuration函数用于配置PB5口线,作为每秒控制LED亮灭的控制线。

Usart1_Init函数用于配置串口1,设置了通信速率等。

Clock_ini函数用于对上电后RTC的状态进行判别。

并作出相应的处理。

Time_Show函数用于间隔一秒通过串口显示实时时钟。

0x00015180时,说明经过23:59:59到了00:00:00,重新复位计数值,串口显示为00:00:00如下:下载完成并打开串口调试工具后重启开发板,串口调试工具中会显示如下信息:RTC not yet configured....RTC configured....==============Time Settings=====================================Please Set Hours输入初始时间(时分秒):RTC not yet configured....RTC configured....==============Time Settings=====================================Please Set Hours: 11Please Set Minutes: 12Please Set Seconds: 32然后就显示如下:若直接出现RTC不需要配置的情况,是因为RTC之前已经被设置过,开发板带有纽扣电池,会将之前设置的数据进行保留,就会出现直接进入时间显示,而不需要设置的情况。

DS1302串口更新时间实时时钟设计实训报告

DS1302串口更新时间实时时钟设计实训报告

2012 —2013 学年实训报告名称:单片机应用综合实训地点:实A407时间: 6.3~~~6.7系部:电子系班级:1101电信姓名学号:指导老师:王平DS1302串口更新时间实时时钟设计一、实训任务与计划任务主要内容:采用AT89S51单片机的I/O口,选用串行实时时钟DS1302和LED数码显示管,采用C语言编程,设计串口自动更新实时时钟,显示年月日时分钞及学号。

工作学习过程要求:显示两个屏时分秒,学号。

PC的时间通过串口传送到时钟二、方案与电路设计利用单片机开发板!ds1302以及两个锁存器和五个个按键,来设计时钟电路。

并自动更新时间显示。

电路如图电路原理图仿真电路图三、程序设计#include<reg52.h>#include "ds1302.h"#define KeyPort P3#define DataPort P0sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存bit ReadTimeFlag;//定义读时间标志bit SetFlag; //更新时间标志位unsigned char time_buf2[16];unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量void DelayUs2x(unsigned char t);//us级延时函数声明void DelayMs(unsigned char t); //ms级延时void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数unsigned char KeyScan(void);//键盘扫描void Init_Timer0(void);//定时器初始化void UART_Init(void);void main (void){unsigned char i,num,displaynum;Init_Timer0();Ds1302_Init();UART_Init();while (1) //主循环{if(SetFlag) //如果接收到串口信息则更新时钟{for(i=0;i<8;i++){time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];}//数据整合,如2个数 1和5整合成15Ds1302_Write_Time();SetFlag=0; //时钟信息更新后标志位清零}num=KeyScan();if(num==1){displaynum++;if(displaynum==2)displaynum=0;}if(ReadTimeFlag==1){ReadTimeFlag=0;Ds1302_Read_Time();if(displaynum==0) //显示时间{TempData[0]=dofly_DuanMa[time_buf1[4]/10];//时TempData[1]=dofly_DuanMa[time_buf1[4]%10];TempData[2]=0x40;TempData[3]=dofly_DuanMa[time_buf1[5]/10];//分TempData[4]=dofly_DuanMa[time_buf1[5]%10];TempData[5]=0x40;TempData[6]=dofly_DuanMa[time_buf1[6]/10];//秒TempData[7]=dofly_DuanMa[time_buf1[6]%10];}else if(displaynum==1)//显示日期{TempData[0]=dofly_DuanMa[time_buf1[2]/10];TempData[1]=dofly_DuanMa[time_buf1[2]%10];TempData[2]=0x40; //加入"-"TempData[3]=dofly_DuanMa[time_buf1[3]/10];TempData[4]=dofly_DuanMa[time_buf1[3]%10];TempData[5]=0x40;TempData[6]=dofly_DuanMa[1];TempData[7]=dofly_DuanMa[9];}}}}void UART_Init(void){SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装 TH1 = 0xFD; // TH1: 重装值 9600 波特率晶振11.0592MHzTR1 = 1; // TR1: timer 1 打开EA = 1; //打开总中断ES = 1; //打开串口中断}void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}void Display(unsigned char FirstBit,unsigned char Num)static unsigned char i=0;DataPort=0; //清空数据,防止有交替重影LATCH1=1; //段锁存LATCH1=0;DataPort=dofly_WeiMa[i+FirstBit]; //取位码 LATCH2=1; //位锁存LATCH2=0;DataPort=TempData[i]; //取显示数据,段码 LATCH1=1; //段锁存LATCH1=0;i++;if(i==Num)i=0;}void Init_Timer0(void){TMOD |= 0x01;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}void Timer0_isr(void) interrupt 1{static unsigned int num;TH0=(65536-2000)/256; //重新赋值 2msTL0=(65536-2000)%256;Display(0,8); // 调用数码管扫描num++;if(num==50) //大致100ms{num=0;ReadTimeFlag=1; //读标志位置1}}unsigned char KeyScan(void){unsigned char keyvalue;if(KeyPort!=0xff){DelayMs(10);if(KeyPort!=0xff){keyvalue=KeyPort;while(KeyPort!=0xff);switch(keyvalue){case 0xfe:return 1;break;case 0xfd:return 2;break;case 0xfb:return 3;break;case 0xf7:return 4;break;case 0xef:return 5;break;case 0xdf:return 6;break;case 0xbf:return 7;break;case 0x7f:return 8;break;default:return 0;break;}}}return 0;}void UART_SER (void) interrupt 4 //串行中断服务程序{unsigned char Temp; //定义临时变量unsigned char i;if(RI) //判断是接收中断产生 {RI=0; //标志位清零Temp=SBUF; //读入缓冲区的值time_buf2[i]=Temp&0x0F;i++;if(i==16) //连续接收16个字符信息 {i=0;SetFlag=1; //接收完成标志位置1}SBUF=Temp; //把接收到的值再发回电脑端}if(TI) //如果是发送标志位,清零TI=0;}四、安装与调试更新之前的时间更新之后的时间显示的月、日、学号五、小结通过这一周的实训我的收获很多,知道了单片机开发板的很多用途,时钟芯片的各种功能,锁存器的的基本使用,以及发现问题解决问题!提高了解决问题的能力。

rtc闹钟实验报告

rtc闹钟实验报告

rtc闹钟实验报告RTC闹钟实验报告引言:在现代社会中,时间对于人们的生活和工作至关重要。

而闹钟作为一种时间管理工具,早已成为人们日常生活中不可或缺的一部分。

然而,传统的闹钟存在着精确度不高、易损坏等问题。

为了解决这些问题,我们进行了一次RTC闹钟实验。

实验目的:本次实验的主要目的是通过使用RTC(Real Time Clock)模块,设计并制作一款精确度高、稳定性强的闹钟。

通过实验,我们希望能够验证RTC闹钟的性能,并进一步了解其工作原理。

实验材料:1. Arduino开发板2. RTC模块3. LCD显示屏4. 蜂鸣器5. 连接线等实验步骤:1. 连接电路:将RTC模块与Arduino开发板通过连接线连接起来,并将LCD显示屏和蜂鸣器分别连接到Arduino开发板上。

2. 编写代码:使用Arduino开发环境,编写代码来实现RTC闹钟的功能。

代码主要包括读取RTC模块的时间、设置闹钟时间、显示时间和触发蜂鸣器等功能。

3. 上传代码:将编写好的代码上传到Arduino开发板上。

4. 测试功能:通过调整RTC模块的时间和设置闹钟时间,测试RTC闹钟的各项功能是否正常。

5. 性能评估:对RTC闹钟进行性能评估,包括准确度、稳定性和可靠性等方面的测试。

实验结果:通过实验,我们成功地制作出了一款基于RTC模块的闹钟。

该闹钟具有以下特点:1. 高精确度:RTC模块采用了精密的时钟芯片,能够提供精确到秒级的时间显示和闹钟触发。

2. 稳定性强:RTC模块内部自带电池供电,即使在断电的情况下,也能保持时间的准确性。

3. 显示清晰:LCD显示屏可以清晰地显示当前时间和闹钟时间,方便用户使用。

4. 蜂鸣器提醒:当闹钟时间到达时,蜂鸣器会发出响声,提醒用户。

实验总结:通过本次实验,我们深入了解了RTC闹钟的工作原理,并验证了其在精确度、稳定性和可靠性方面的优势。

RTC闹钟不仅可以用于日常生活中的时间管理,还可以应用于工业自动化、智能家居等领域。

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

实时时钟RTC模块和串口设计电子钟实验一、实验要求
对开发板上STM32处理器的RTC模块进行操作。

RTC模块的当前时间通过串口
传送给PC机的超级终端显示,若RTC模块还未设置时间则通过超级终端进行设置。

RTC的秒中断每发生一次,发光二极管LED1闪烁一次。

二、硬件电路设计
在开发板上STM32F103VET6处理器的VBAT引脚接+3V钮扣电池,PB6引脚接
LED1,晶振、USART等均已连接好。

该应用实例不需要额外电路设计,只需将用一根RS232串行通讯线将开发板
的COM1口与PC机的串口相连即可。

三、软件设计思路
根据设计要求,软件需实现以下任务:
(1) 系统启动后检查RTC是否已设置。

由于RTC在BKP区域,当Vdd掉电之后可由后备电源提供电源,当后备电源连接到针脚VBAT上时,RTC的设置不会由于外部电源的断开而丢失。

在本例中先写一个值到BKP_DR1中以标示RTC是否已配置,在启动之后程序检查BKP_DR1的值,如果保持不变,则表示有后备电池;若BKP_DR1的值不是已经写入的值,则可能是BKP_DR1的值有误或者由于是第一次运行值还未写进去,则需要配置RTC,并且询问用户当前的时间作为RTC的起始值。

(2) 若BKP_DR1的值正确,则意味着RTC已配置,此时将在超级终端上按照每秒一次的频率更新时间。

(3) 在RTC秒中断发生时,连接到PB.05 的LED1灯改变一次状态,这样闪烁频率为2秒。

四、程序分析
整个工程包含3个源文件:startup_stm32f10x_hd.s、stm32f10x_it.c和main.c,其中startup_stm32f10x_hd.s为启动代码,所有中断服务子程序均在stm32f10x_it.c中,其它函数则在main.c中。

下面分别介绍相关的函数,函数RTC_IRQHandler用于处理秒中断事件,每次秒中断令LED1闪烁一次,在每次遇到23:59:59时将时钟回零。

函数RTC_Configuration用于配置RTC模块。

函数USART_Scanf用于从PC超级终端中获取输入的数字值。

函数Time_Regulate则利用函数USART_Scanf从超级终端获取新的RTC时间值,并回显到终端中。

函数Time_Adjust使用函数Time_Regulate的结果设置新的RTC时间。

函数Time_Show和Time_Display用于每秒一次的时间处理和将RTC时间转换
了时分秒字符串送往USART1。

源文件其他函数,例如GPIO、RCC、NVIC、USART的配置,不再作冗述。

编译与链接:
五、程序调试
1.仿真:
仿真可以通过设置Option for Target中的Debug选项“Use simulator”来进行。

点击调试按钮,进入仿真状态后,打开UART1面板,利用USART窗口来模拟实现COM1的输入和输出。

然后运行程序,可以直接在串口1中得到以下输出,设置好正确格式的时间初值后即可进入时间更新,但是因为非硬件,所以不是精确的秒计时。

2.下载:
在PC机上运行Windows自带的超级终端串口通信程序(波特率115200、1位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序;
(1) 选择硬件调试模式,点击MDK的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,连接目标板并下载调试代码到目标系统中;也可以使用串口下载方式。

(2) 程序正常运行之后会在超级终端显示以下信息:
RTC not yet configured....
RTC configured....
============TimeSettings===================
Please Set Hours:
在PC机上依次输入时钟、分钟、秒钟之后每隔1秒在超级终端上显示一次时间:
Please Set Hours: 12
Please Set Minutes: 0
Please Set Seconds: 0
Time: 12:00:00
同时开发板的LED1灯也会每隔2S闪烁一次。

(3) 调试环境中,按下Reset按钮,PC超级终端上将继续显示正常时间:
External Reset occurred....
No need to configure RTC....
Time: 12:03:09
(4) 程序正常运行时断开开发板外部电源,然后重新接上外部电源,PC超级终端上也将会继续显示正常时间:
Power On Reset occurred....
No need to configure RTC....
Time: 12:05:57。

相关文档
最新文档