实时时钟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(Real Time Clock)闹钟作为一种新型的智能闹钟,其
精准的时间显示和多种功能备受人们的关注。
为了更好地了解RTC闹钟的性能和功能,我们进行了一系列的实验研究。
首先,我们对RTC闹钟进行了时间精准度测试,结果显示RTC闹钟的时间显示非常准确,误差在毫秒级别。
这对于人们在日常生活中对时间的准确把握提供了非常
大的便利。
其次,我们对RTC闹钟的多种功能进行了测试。
除了基本的闹钟功能外,RTC
闹钟还具有温度显示、湿度显示、闪灯提醒等多种实用功能。
我们对这些功能
进行了逐一测试,结果显示RTC闹钟的功能齐全且稳定可靠,能够满足人们在
日常生活中的多种需求。
最后,我们还对RTC闹钟的节能性能进行了测试。
结果显示,RTC闹钟采用低
功耗设计,能够有效延长电池的使用寿命,节省能源的同时也减少了用户的使
用成本。
综合以上实验结果,我们可以得出结论:RTC闹钟作为一种新型的智能闹钟,
具有精准的时间显示、多种实用功能和优良的节能性能,能够为人们的日常生
活提供更加便利和舒适的体验。
相信随着科技的不断发展,RTC闹钟将会在未
来得到更广泛的应用和推广,成为人们生活中的重要助手。
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 时,写操作才正式完成 。
利用开发板编程完成显示实时时钟功能
实验三显示实时时钟
一.实验目的
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实时时钟实验
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(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实时时钟的应用和串口通信的应用二、实验内容板子加电后,通过串口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串口更新时间实时时钟设计实训报告
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(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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。