基础实验-实验八 实时时钟实验
实时时钟设计实验报告
实验报告源代码:#pragma sfr //使用特殊功能寄存器#pragma EI //开中断#pragma DI //关中断#pragma access //使用绝对地址指令#pragma interrupt INTTM000 Time //定义时间中断函数为Time#pragma interrupt INTKR OnKeyPress //定义按键中断为OnKeyPress#pragma interrupt INTP5 OnKeyOver //定义INT中断为OnKeyOvervoid 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=0int temp=1; //用于存放当前月的天数int temp1=1;int second=0; //默认的秒second=0int minute=0; //默认的分minute=0int hour=12; //默认的时hour=12int day=1; //默认的天day=1int month=5; //默认的月month=5int year=2014; //默认的年year=2014int c_hour=1; //默认的闹钟时=1int c_minute=1; //默认的闹钟分=1int 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中断中间变量intLCD_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<k;i++){for(j=0;j<k;j++){}}}//………………………初始化Led函数……………………// void Init_Led(){P M13=0XF0; //端口13的第四位为输出模式P M14=0XF0; //端口14的第四位为输出模式P M15=0XF0; //端口15的第四位为输出模式}//……………………………按键中断函数……………………// void InitKey_INTKR(){PM4 = 0x3F; //P4的六个端口设置为输入模式P U4 = 0x3F; //接通上拉电阻K RM = 0x3F; //允许六个按键中断K RMK = 0;P M3.0 = 1;P U3.0 = 1;E GP.5 = 1;P MK5 = 0;P PR5 = 0;K RPR = 1;}//……………初始化lcd函数……………………//void Init_Lcd(){P FALL=0x0F; //所有接lcd引脚指定为lcd引脚L CDC0=0x34; //设置原时钟和时钟频率L CDMD=0x30; //设置lcd电压为3/5电压L CDM=0xC0; //4分时1/3偏压模式}//………………初始化定时器Inter函数……………………// void Init_Inter(){C RC00.0=0; //CR000为比较寄存器P RM00=0X04; //计数时钟为fprs/2^8C R000=0X7FFF;//时间间隔为1sT MMK010=1; //TMMK010中断屏蔽T MMK000=0; //TMMK000中断允许T MC00=0X0C; //TM00和CR000相等时进入清零&启动模式}void Time(){s econd++;}//……………………………按键中断函数……………………// void OnKeyPress(){D I();s witch(P4&0x3F) //判断哪个按键按下{case 0x3e:key=1; //按键key1按下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;}E I();}//……………………………INT按键中断函数……………………//void OnKeyOver(){D I();Q ue = 0; //判断Que是否为0B ZOE = 0; //蜂鸣器关闭E I();}//………………………Led小灯函数……………………//void LightOneLed(unsigned char ucNum){s witch(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到11中的一个值则让LED9到LED12中的一个亮break;default:break;}}//………………………Led小灯熄灭函数……………………//void LightOff(){P13 = 0;P14 = 0;P15 = 0;}//……………………时间函数……………………//void Time1(){i f((second % 5) == 0){ //秒大于5变为0Scond = second / 5 + 1;LightOff(); //调用小灯亮函数LightOneLed(Scond % 12);}i f(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){i nt day;i f((month==4)||(month==6)||(month==9)||(month==11))//4,6,9,11月为30天day=30;e lse if(month==2){if((year%4==0&&year%100==0)||(year%400==0))day=29; //闰年2月29天elseday=28; //平年2月28天}e lseday=31; //1,3,5,7,8,10,12月为31天r eturn (day);}//………………倒计时函数.............//void Show_Time(){p okew(0xFA40,0x00);p okew(0xFA42,0x00);p okew(0XFA48,buffs[1]); //在lcd右边显示1p okew(0XFA4A,buffs[0]); //在lcd右边显示0p okew(0XFA44,buffm[1]); //在lcd右边显示1p okew(0XFA46,buffm[0]); //在lcd右边显示0p okew(0xFA4C,0x00);p okew(0xFA4E,0x00);D elay(100);}//………………………………日期显示函数……………………// void Display_Date(){b uffm[0]|=0x0800;p okew(0xFA40,buffyear[3]); //显示年p okew(0xFA42,buffyear[2]);p okew(0xFA44,buffyear[1]);p okew(0xFA46,buffyear[0]);p okew(0xFA48,buffmonth[1]); //显示月p okew(0xFA4A,buffmonth[0]);p okew(0xFA4C,buffday[1]); //显示日p okew(0xFA4E,buffday[0]);t emp1=0;}//………………………………时间显示函数……………………// void Display_Time(){p okew(0xFA40,0x00);p okew(0xFA42,0x00);p okew(0xFA44,buffh[1]); //显示时p okew(0xFA46,buffh[0]);p okew(0xFA48,buffm[1]); //显示分p okew(0xFA4A,buffm[0]);p okew(0xFA4C,buffs[1]); //显示秒p okew(0xFA4E,buffs[0]);}//………………………………设定时间函数……………………// void Set_D_T(){i nt lcd_addr;l cd_addr = 0xFA40;s witch(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);pokew(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(){D I(); //关中断i++;i f(i>7) //切换标志>7,i=1,否则i++i=1;E I(); //开中断}//…………………………调整时间加函数……………………// void UpNum(){s witch(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(){s witch(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(){i f(c_hour == hour && c_minute == minute && Que == 1){ //闹铃的时,分与系统时,分相等,并且闹钟标志开启CKS=0XE0; //开启蜂鸣器输出,输出频率为0.98khz的音频Time1(); //调用时间函数}}//…………………………显示缓存区刷新时间函数……………………//void Freshddisplaybuffer(){b uffs[1]=LCD_num[second/10];//秒的显示码放入秒的数码显示缓存区b uffs[0]=LCD_num[second%10];b uffm[1]=LCD_num[minute/10];//分的显示码放入分的数码显示缓存区b uffm[0]=LCD_num[minute%10];b uffm[0]|=0x0800; //分的后面显示一个"."b uffh[1]=LCD_num[hour/10]; //时的显示码放入时的数码显示缓存区b uffh[0]=LCD_num[hour%10];b uffh[0]|=0x0800; //时的后面显示一个"."b uffday[1]=LCD_num[day/10]; //天的显示码放入天的数码显示缓存区b uffday[0]=LCD_num[day%10];b uffmonth[1]=LCD_num[month/10];//月的显示码放入月的数码显示缓存区b uffmonth[0]=LCD_num[month%10];b uffmonth[0]|=0x0800; //月的后面显示一个"."b uffyear[3]=LCD_num[year/100/10];//年的显示码放入年的数码显示缓存区b uffyear[2]=LCD_num[(year/100)%10];b uffyear[1]=LCD_num[(year%100)/10];b uffyear[0]=LCD_num[(year%100)%10];b uffyear[0]|=0x0800; //年的后面显示一个"."b uffmd[3]=LCD_num[month/10];//月,天的显示码放入月,天的数码显示缓存区b uffmd[2]=LCD_num[month%10];b uffmd[2]|=0x0800; //月,天后显示一个"."b uffmd[1]=LCD_num[day/10];b uffmd[0]=LCD_num[day%10];b uffhm[3]=LCD_num[hour/10];//时,分的显示码放入时,分的数码显示缓存区b uffhm[2]=LCD_num[hour%10];b uffhm[2]|=0x0800; //时,分的后显示一个"."b uffhm[1]=LCD_num[minute/10];b uffhm[0]=LCD_num[minute%10];b uffms[3]=LCD_num[minute/10];//分,秒的显示码放入分,秒的数码显示缓存区b uffms[2]=LCD_num[minute%10];b uffms[2]|=0x0800; //分,秒的后显示一个"."b uffms[1]=LCD_num[second/10];b uffms[0]=LCD_num[second%10];b uffch[1]=LCD_num[c_hour/10];//闹钟时的显示码放入闹钟时的数码显示缓存区b uffch[0]=LCD_num[c_hour%10];b uffcm[1]=LCD_num[c_minute/10];//闹钟分的显示码放入闹钟分的数码显示缓存区b uffcm[0]=LCD_num[c_minute%10];}//………………主函数……………………//void main(){D I(); //关中断P M3.4 = 0; //P3.3,P3.4端口设置为输出模式P3.4 = 1; //led灯初始化为点亮状态P M3.3 = 0;P3.3 = 0;B ZOE = 0; //蜂鸣器初始化为熄灭I nit_Lcd(); //初始化lcdI nit_Led(); //初始化ledI nitKey_INTKR(); //初始化按键E I(); //开中断I nit_Inter(); //初始化中断w hile(1){T ime1(); //调用计算时间函数n oise(); //调用闹钟函数s witch(key){case 0: //没有按键执行Freshddisplaybuffer(); //调用刷新函数Time1(); //计算时间Show_Time(); //调用显示时间函数Show_Time();break;case 1: //按键1执行Time1(); //计算时间Freshddisplaybuffer(); //调用刷新函数Display_Date(); //调用显示日期函数noise(); //调用闹钟函数break;case 2: //按键2执行Time1(); //计算时间Freshddisplaybuffer(); //调用刷新函数Display_Time(); //调用时间显示函数noise(); //调用闹钟函数break;case 3: //按键3执行d_c_inter(); //调用时间切换函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数key=7;break;case 4: //按键4执行UpNum(); //调用时间加函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数key=7;break;case 5: //按键5执行DownNum(); //调用时间减函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数key=7;break;case 6: //按键6执行key = 0;if(i > 5) //判断是否确认Que = 1;i = 0;noise(); //调用闹钟函数case 7: //虚拟按键7 Time1();Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数break;}}}。
实时时钟实验总结
实时时钟实验总结一、实验目的本实验的主要目的是了解实时时钟的原理及其应用,掌握实时时钟的使用方法,以及通过实验学习如何编写驱动程序。
二、实验原理1. 实时时钟是一种能够提供时间和日期信息的芯片,它通常由一个晶体振荡器和一组计数器组成。
2. 实时时钟可以通过I2C总线与处理器进行通信,读取或设置时间和日期信息。
3. 实现实时时钟需要编写相应的驱动程序,并将其与操作系统进行集成。
三、实验设备与材料1. 实验板:STM32F407ZET6开发板;2. 模块:DS1307实时时钟模块;3. 软件:Keil uVision5开发环境。
四、实验内容1. 硬件连接:将DS1307模块与STM32F407ZET6开发板连接,包括SDA、SCL、VCC和GND等引脚。
2. 编写驱动程序:根据DS1307模块手册编写相应的驱动程序,并将其集成到操作系统中。
3. 测试程序:编写测试程序,通过读取DS1307模块返回的时间和日期信息来验证驱动程序是否正常工作。
五、实验步骤1. 连接硬件:将DS1307模块与STM32F407ZET6开发板连接。
2. 编写驱动程序:根据DS1307模块手册编写相应的驱动程序,并将其集成到操作系统中。
3. 编写测试程序:编写测试程序,通过读取DS1307模块返回的时间和日期信息来验证驱动程序是否正常工作。
4. 下载程序:使用Keil uVision5开发环境将编写好的程序下载到STM32F407ZET6开发板上。
5. 运行测试:启动STM32F407ZET6开发板,通过串口助手等工具查看DS1307模块返回的时间和日期信息,验证驱动程序是否正常工作。
六、实验结果经过测试,实时时钟模块能够正确返回当前时间和日期信息,并且能够根据需要进行设置和调整。
七、实验总结本次实验通过对实时时钟原理的学习以及编写驱动程序和测试程序的练习,加深了对嵌入式系统中硬件与软件协同工作的理解。
同时也掌握了一些基本的嵌入式系统开发技能,如硬件连接、驱动编写、调试等。
单片机—实时时钟实验(汇编版)
实验二实时时钟实验一、实验目的1)数码管动态显示技术2)定时器的应用3)按键功能定义二、实验实现的功能实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。
三、系统硬件设计四、系统软件设计说明:1键进入和退出设置模式,4键选择调分或秒,2键加,3键减。
P1M1 EQU 91HP1M0 EQU 92HSEC0 DA TA 30H ;秒显示SEC1 DA TA 31HMIN0 DA TA 32H ;分显示MIN1 DA TA 33HDELAY_1 DA TA 34H ;延时参数DELAY_2 DA TA 35H ;延时参数ORG 0000HLJMP 0030HORG 001BHLJMP INTR0ORG 0030HMAIN: MOV P1M1,#00000000BMOV P1M0,#11111111BMOV R7,#000 ;记中断次数,R7=100为1秒MOV R6,#000 ;记秒MOV R5,#000 ;记分MOV R4,#0FFH ;按键位置MOV R1,#000 ;确定是否有按键按下的参数MOV TMOD,#10H ;定时器初始化MOV TH1,#0D8H ;定时时间10msMOV TL1,#0F0HSETB EASETB ET1SETB TR1LOOP0: CJNE R4,#000H,LOOP01 ;实时时钟显示MOV R4,#0FFHLJMP LOOP1LOOP01: LCALL TIMELCALL KEY0LJMP LOOP0LOOP1: CJNE R4,#000H,LOOP11 ;调秒MOV R4,#0FFHLJMP LOOP0LOOP11: CJNE R4,#003H,LOOP12MOV R4,#0FFHLJMP LOOP2LOOP12: CJNE R4,#001H,LOOP13MOV R4,#0FFHINC R6LOOP13: CJNE R6,#060,LOOP14MOV R6,#000HLOOP14: CJNE R4,#002H,LOOP16MOV R4,#0FFHCJNE R6,#000,LOOP15MOV R6,#060LOOP15: DEC R6LOOP16: LCALL TIMELCALL KEY1LJMP LOOP1LOOP2: CJNE R4,#000H,LOOP21 ;调分MOV R4,#0FFHLJMP LOOP0LOOP21: CJNE R4,#003H,LOOP22MOV R4,#0FFHLJMP LOOP1LOOP22: CJNE R4,#001H,LOOP24MOV R4,#0FFHINC R5LOOP23: CJNE R5,#060,LOOP24MOV R5,#000HLOOP24: CJNE R4,#002H,LOOP26MOV R4,#0FFHCJNE R5,#000,LOOP25MOV R5,#060LOOP25: DEC R5LOOP26: LCALL TIMELCALL KEY2LJMP LOOP2/*********中断服务程序(原始时间分秒的确定)**********/INTR0: PUSH PSWMOV TH1,#0D8HMOV TL1,#0F0HINC R7MOV TH1,#0D8HMOV TL1,#0F0HCJNE R7,#100,INTR01MOV R7,#000HINC R6CJNE R6,#60,INTR01MOV R6,#000HINC R5CJNE R5,#60,INTR01MOV R5,#000HINTR01: POP PSWRETI/*****************时间分秒显示计算***************/TIME: MOV A,R6 ;计算秒MOV B,#10DIV ABMOV SEC1,AMOV SEC0,BMOV A,R5 ;计算分MOV B,#10DIV ABMOV MIN1,AMOV MIN0,BRET/*****************按键扫描消抖及确定***************/KEY0: LCALL KS ;扫描有无按键按下KEY01: LCALL DISPLAY0 ;CJNE R1,#000H,KEY02 ; 通过(控制数码管的扫描频率,LJMP KEY05 ; 延时进而控制其扫描周期,以KEY02: MOV R1,#000H ; 消抖达到所需摸延时时间)LCALL KS ;CJNE R1,#000H,KEY03 ;确定有按键按下?LJMP KEY05 ;KEY03: LCALL KS0 ;调用计算物理位置子函数KEY04: LCALL TIME ;LCALL DISPLAY0 ;LCALL KS ;检查按键是否松开CJNE R1,#000H,KEY04 ;KEY05: RET ;KEY1: LCALL KS ;同上KEY11: LCALL DISPLAY1 ;CJNE R1,#000H,KEY12 ;LJMP KEY15 ;KEY12: MOV R1,#000HLCALL KSCJNE R1,#000H,KEY13LJMP KEY15KEY13: LCALL KS0KEY14: LCALL TIMELCALL DISPLAY1LCALL KSCJNE R1,#000H,KEY14KEY15: RETKEY2: LCALL KS ;同上KEY21: LCALL DISPLAY2 ;CJNE R1,#000H,KEY22 ;LJMP KEY25 ;KEY22: MOV R1,#000HLCALL KSCJNE R1,#000H,KEY23LJMP KEY25KEY23: LCALL KS0KEY24: LCALL TIMELCALL DISPLAY2LCALL KSCJNE R1,#000H,KEY24KEY25: RET/*****检查有无按健闭合*****/KS: CLR P3.6CLR P3.7SETB P0.5SETB P0.6SETB P0.7MOV A,P0ORL A,#01FHCPL AMOV R1,ARET/****确定按键的物理位置****/KS0: MOV R4,#000H ;行号扫描初值SETB P3.7CLR P3.6 ;行扫描初值KS1: MOV A,P0ORL A,#01FHMOV R3,A ;保存列1CJNE A,#0FFH,KS2MOV R4,#003H ;行首值SETB P3.6CLR P3.7MOV A,P0ORL A,#01FHMOV R3,A ;保存列2CJNE A,#0FFH,KS2LJMP KS4KS2: MOV A,R3 ;计算按键的物理位置RRC ASWAP AKS3: RRC AJNC KS4INC R4SJMP KS3KS4: RET/******************数码管显示*****************/DP1: MOV A,MIN1 ;前两位数码管显示MOV DPTR,#TAB0MOVC A,@A+DPTRCLR P0.0MOV P1,ALCALL DL0MOV P1,#000HSETB P0.0MOV A,MIN0MOV DPTR,#TAB1MOVC A,@A+DPTRCLR P0.1MOV P1,ALCALL DL0MOV P1,#000HSETB P0.1RETDP2: MOV A,SEC1 ;后两位数码管显示MOV DPTR,#TAB0MOVC A,@A+DPTRCLR P0.2MOV P1,ALCALL DL0MOV P1,#000HSETB P0.2MOV A,SEC0MOV DPTR,#TAB0MOVC A,@A+DPTRCLR P0.3MOV P1,ALCALL DL0MOV P1,#000HSETB P0.3RET/******************显示方式函数*****************/DISPLAY0: LCALL DP1 ;实时时钟模式的显示函数LCALL DP2RETDISPLAY1: LCALL DP1 ;调秒模式的显示函数CJNE R7,#001H,DISPLAY11MOV R2,#000HDISPLAY11:CJNE R7,#032H,DISPLAY12MOV R2,#001HDISPLAY12:CJNE R2,#000H,DISPLAY13LCALL DP2LJMP DISPLAY14DISPLAY13:LCALL DL0LCALL DL0DISPLAY14:RETDISPLAY2: LCALL DP2 ;调分模式的显示函数CJNE R7,#001H,DISPLAY21MOV R2,#000HDISPLAY21:CJNE R7,#032H,DISPLAY22MOV R2,#001HDISPLAY22:CJNE R2,#000H,DISPLAY23LCALL DP1LJMP DISPLAY24DISPLAY23:LCALL DL0LCALL DL0DISPLAY24:RET/********************延时********************//*说明:延时所用的三条令,stc10f08xe中与常用的51单片机中的指令执行时间不同*/ DL0: MOV DELAY_1,#16 ;延时时间:[2+(2+250*4+4)×16+4] /11.0592DL01: MOV DELAY_2,#250 ; =16102/11.0592DJNZ DELAY_2,$ ; =1.456msDJNZ DELAY_1,DL01 ;RET ; ;TAB0: DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,067H ;无小数点的LED字模表TAB1: DB 0BFH,086H,0DBH,0CFH,0E6H,0EDH,0FDH,087H,0FFH,0E7H ;有小数点的LED字模表END五、实验过程中遇到的问题及解决方法1、怎么让选中的数码管闪烁?通过记秒的参数,设置前半秒扫描相关数码管,后半秒不扫描。
嵌入式实验:实时时钟实验
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
微机实验 实时时钟
实验三串行口实时时钟实验实验目的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,充电功能也被禁止)图4-79 DS1302内部充电电路结构图从图中可以看出,第1脚电源经过开关、二极管、电阻对接在第8脚的备用电源进行充电。
调整涓流充电控制寄存器的值可以控制涓流充电方式。
2、DS1302芯片读写时序DS1302采用三线串行口通迅,占用IO口少。
嵌入式软件开发基础实验报告实时时钟
上海电力学院嵌入式软件开发基础实验报告题目:【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。
传送的数据包括秒、分、小时、星期、日期、月份和年份。
实时时钟实验报告
四川大学网络教育学院专业课课程设计题目办学学院四川大学电气信息学院学习中心黔江奥鹏专业层次专升本年级0903学生姓名石胜良学号aDH1091g10322010年7 月15 日四川大学网络教育学院实验报告实验名称: 实时时钟实验学习中心姓名学号实验内容:根1、实验题目分析1.1 问题描述结合实时时钟,IIC(控制小键盘和数码管等)来做具备定期功能的实时时钟。
1.2功能分析至少完成以下功能:(1)能显示每秒的时刻(2)按下功能键能切换显示日期(3)能设置定时闹钟,定时到产生某种输出(4)可以扩展考虑加入外部中断,如停止闹钟功能等。
1.3 开发平台及工具介绍实验器材有:CITK2410开发板,JTAG连接线,RS-232直通连接线RVDS集成开发环境,超级终端工具,2、实验概要设计2.1 实验基本原理IIC总线:IIC总线的器件分为主器件和从器件。
主器件的功能是启动在总线上传送数据,并产生时钟脉冲,以允许与被寻址的器件进行数据传送。
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
超始和停止信号图数据传送时序图IIC总线(IICSDA、IICSCL)经过VDD33的上拉后,进入ZLG7290数码管:实验使用的数码管是广州周立公司单片机发展有限公司自行设计的一款数码管显示驱动及键盘扫描管理芯片。
下面是介绍该数码管的特点还有电路图:1 I2C 串行接口提供键盘中断信号方便与处理器接口2 可驱动8 位共阴数码管或64 只独立LED 和64 个按键3 可控扫描位数可控任一数码管闪烁4 提供数据译码和循环移位段寻址等控制5 8 个功能键可检测任一键的连击次数6 无需外接元件即直接驱LED 可扩展驱动电流和驱动电压7 提供工业级器件多种封装形式PDIP24 SO24采用24 引脚封装引脚图如图所示其引脚功能分述如下:实时时钟(Real Time Clock):2410提供了一个实时时钟,该时钟使用独立的一路1.8V 供电,保证主电源切断时能正常维持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. 掌握时钟的编程技巧;3. 分析时钟在实际应用中的优势;4. 提高学生的实践能力和创新意识。
三、实验内容1. 时钟设计原理时钟的设计主要分为硬件设计和软件设计两部分。
(1)硬件设计:时钟硬件主要包括晶振、计数器、译码器、显示器等。
晶振产生稳定的时钟信号,计数器用于计数,译码器将计数结果转换为对应的显示信号,显示器用于显示时间。
(2)软件设计:时钟软件主要实现以下功能:① 初始化:设置时钟的初始时间,包括年、月、日、时、分、秒等;② 计时:根据晶振信号,对时钟进行计时;③ 显示:将计时结果通过译码器转换为对应的显示信号,显示在显示器上;④ 调整:允许用户通过按键调整时钟时间。
2. 时钟实现方法(1)基于单片机的时钟实现:利用单片机的定时器/计数器功能,实现时钟的计时和显示。
通过编写程序,控制单片机的定时器/计数器,达到计时目的。
(2)基于PC机的时钟实现:利用PC机的操作系统和编程语言,实现时钟的计时和显示。
通过编写程序,控制PC机的计时器,实现时钟的计时和显示。
3. 时钟实验步骤(1)搭建实验平台:根据实验要求,搭建实验电路,包括晶振、计数器、译码器、显示器等。
(2)编写程序:根据实验要求,编写时钟程序,实现时钟的计时、显示和调整功能。
(3)调试程序:通过实验仪器和软件,对程序进行调试,确保时钟的正常运行。
(4)实验结果分析:对实验结果进行分析,验证时钟功能的实现。
四、实验结果与分析1. 实验结果(1)时钟能够实现计时、显示和调整功能;(2)时钟计时准确,显示效果良好;(3)时钟调整方便,用户可随时调整时间。
2. 实验分析(1)时钟设计原理合理,实现方法可行;(2)编程技巧熟练,程序结构清晰;(3)实验过程严谨,实验结果可靠。
实时时钟设计实验报告
实验报告/ 115/ 215/ 3154 / 15源代码:#pragma sfr //使用特殊功能寄存器#pragma EI //开中断#pragma DI //关中断#pragma access //使用绝对地址指令#pragma interrupt INTTM000 Time //定义时间中断函数为Time#pragma interrupt INTKR OnKeyPress //定义按键中断为OnKeyPress #pragma interrupt INTP5 OnKeyOver //定义INT中断为OnKeyOvervoid 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=0int temp=1; //用于存放当前月的天数int temp1=1;int second=0; //默认的秒second=0int minute=0; //默认的分minute=0int hour=12; //默认的时hour=12int day=1; //默认的天day=1int month=5; //默认的月month=5int year=2014; //默认的年year=2014int c_hour=1; //默认的闹钟时=1int c_minute=1; //默认的闹钟分=1int 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中断中间变量intLCD_num[10]={0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070 b};//数字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++){5 / 15}} }//………………………初始化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=0; //CR000为比较寄存器PRM00=0X04; //计数时钟为fprs/2^8CR000=0X7FFF;//时间间隔为1sTMMK010=1; //TMMK010中断屏蔽TMMK000=0; //TMMK000中断允许TMC00=0X0C; //TM00和CR000相等时进入清零&启动模式}void Time(){second++;}//……………………………按键中断函数……………………// void OnKeyPress(){DI();switch(P4&0x3F) //判断哪个按键按下{case 0x3e:6 / 15key=1; //按键key1按下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();}//……………………………INT按键中断函数……………………//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到11中的一个值则让LED9到LED12中的一个亮break;default:break;7 / 15}}//………………………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_x0010_0==0)||(year@0==0))day=29; //闰年2月29天elseday=28; //平年2月28天}elseday=31; //1,3,5,7,8,10,12月为31天return (day);}8 / 15//………………倒计时函数.............//void Show_Time(){pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0XFA48,buffs[1]); //在lcd右边显示1pokew(0XFA4A,buffs[0]); //在lcd右边显示0pokew(0XFA44,buffm[1]); //在lcd右边显示1 pokew(0XFA46,buffm[0]); //在lcd右边显示0pokew(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){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);9 / 15pokew(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);pokew(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;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;10 / 15default: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; }}11 / 15//…………………………调整时间减函数……………………// 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];//秒的显示码放入秒的数码显示缓存区12 / 15buffs[0]=LCD_num[second_x0010_];buffm[1]=LCD_num[minute/10];//分的显示码放入分的数码显示缓存区buffm[0]=LCD_num[minute_x0010_];buffm[0]|=0x0800; //分的后面显示一个.buffh[1]=LCD_num[hour/10]; //时的显示码放入时的数码显示缓存区buffh[0]=LCD_num[hour_x0010_];buffh[0]|=0x0800; //时的后面显示一个.buffday[1]=LCD_num[day/10]; //天的显示码放入天的数码显示缓存区buffday[0]=LCD_num[day_x0010_];buffmonth[1]=LCD_num[month/10];//月的显示码放入月的数码显示缓存区buffmonth[0]=LCD_num[month_x0010_];buffmonth[0]|=0x0800; //月的后面显示一个.buffyear[3]=LCD_num[year/100/10];//年的显示码放入年的数码显示缓存区buffyear[2]=LCD_num[(year/100)_x0010_];buffyear[1]=LCD_num[(year_x0010_0)/10];buffyear[0]=LCD_num[(year_x0010_0)_x0010_];buffyear[0]|=0x0800; //年的后面显示一个.buffmd[3]=LCD_num[month/10];//月,天的显示码放入月,天的数码显示缓存区buffmd[2]=LCD_num[month_x0010_];buffmd[2]|=0x0800; //月,天后显示一个.buffmd[1]=LCD_num[day/10];buffmd[0]=LCD_num[day_x0010_];buffhm[3]=LCD_num[hour/10];//时,分的显示码放入时,分的数码显示缓存区buffhm[2]=LCD_num[hour_x0010_];buffhm[2]|=0x0800; //时,分的后显示一个.buffhm[1]=LCD_num[minute/10];buffhm[0]=LCD_num[minute_x0010_];buffms[3]=LCD_num[minute/10];//分,秒的显示码放入分,秒的数码显示缓存区buffms[2]=LCD_num[minute_x0010_];buffms[2]|=0x0800; //分,秒的后显示一个.buffms[1]=LCD_num[second/10];buffms[0]=LCD_num[second_x0010_];buffch[1]=LCD_num[c_hour/10];//闹钟时的显示码放入闹钟时的数码显示缓存区buffch[0]=LCD_num[c_hour_x0010_];buffcm[1]=LCD_num[c_minute/10];//闹钟分的显示码放入闹钟分的数码显示缓存区buffcm[0]=LCD_num[c_minute_x0010_];}//………………主函数……………………//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(); //初始化中断13 / 15while(1){Time1(); //调用计算时间函数noise(); //调用闹钟函数switch(key){case 0: //没有按键执行Freshddisplaybuffer(); //调用刷新函数Time1(); //计算时间Show_Time(); //调用显示时间函数Show_Time();break;case 1: //按键1执行Time1(); //计算时间调用刷新函数// Freshddisplaybuffer();//调用显示日期函数Display_Date();noise(); //调用闹钟函数break;//按键2执行case 2://计算时间Time1();//调用刷新函数Freshddisplaybuffer();Display_Time(); //调用时间显示函数//调用闹钟函数noise();break;case 3: //按键3执行d_c_inter(); //调用时间切换函数调用刷新函数Freshddisplaybuffer(); //Set_D_T(); //调用时间设置函数调用闹钟函数noise();//key=7;break;4执行按键case 4: // UpNum(); //调用时间加函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); 调用时间设置函数//// 调用闹钟函数noise();key=7; break;case 5: 5按键执行//DownNum(); 调用时间减函数// Freshddisplaybuffer(); //调用刷新函数// Set_D_T(); 调用时间设置函数// 调用闹钟函数noise();key=7;break;执行按键case 6: //6key = 0;判断是否确认if(i > 5) //Que = 1;i = 0;noise(); // 调用闹钟函数case 7: 7 虚拟按键// Time1();调用刷新函数Freshddisplaybuffer(); //Set_D_T(); // 调用时间设置函数/ 1415noise(); //调用闹钟函数break;}}}15 / 15。
实时钟实验报告小结
实时钟实验报告小结实验目标和要求实时钟实验的目标是设计并实现一个能够显示当前时间的实时钟系统。
要求能够使用外部振荡器作为时钟源,实现时钟的计时和显示功能,同时能够通过按键进行时间的设置和调整。
实验过程和方法实验中,我们使用了数码管、按键、外部振荡器和微控制器等硬件组件。
其中,数码管用于显示时间信息,按键用于设置和调整时间,外部振荡器提供时钟信号,微控制器作为控制中心。
在实验过程中,首先进行了硬件的连接。
将数码管的七段显示引脚与微控制器的IO口连接,按键引脚与IO口连接,外部振荡器的时钟引脚连接到微控制器的定时器输入引脚。
根据实验要求,我们使用了定时器/计数器来控制时间的计时和显示。
其次,进行了软件的编写。
使用C语言编写了控制程序,实现了时钟的计时和显示功能。
通过定时器中断的方式,每秒钟触发一次中断,计时器加一,重新更新数码管显示的时间。
通过按键的中断,可以设置和调整时间的小时和分钟。
最后,进行了调试和测试。
将程序烧录到微控制器中,将外部振荡器连接并提供时钟源,随后按下按键进行时间的设置和调整。
观察数码管显示的时间是否正确,确保实时钟系统能够正常运行。
实验结果评价经过实验测试,实时钟系统能够实现预期的功能,能够准确地计时并显示时间。
通过按键的设置和调整功能,时间也能够根据需要进行修改。
在不接通外部振荡器的情况下,实时钟系统会使用内部振荡器提供的时钟信号,确保时钟系统可以继续运行。
然而,在实验过程中也发现了一些问题。
首先是按键的抖动问题,由于按键的机械结构,按键在按下和释放的瞬间会有抖动现象,导致程序可能多次响应按键中断。
为了解决这个问题,需要在程序中增加合适的延时机制。
其次是外部振荡器的稳定性问题。
如果外部振荡器的频率不稳定,会导致计时显示的时间不准确。
因此,在选择外部振荡器时,需要注意其稳定性和精度。
另外,实时钟系统的显示模式也可以进一步优化。
目前,我们使用了数码管来显示时间,但是显示的信息有限。
实时时钟设计试验报告
实时时钟设计试验报告一、实验目的本实验的目的是设计一个实时时钟系统,具有实时显示时间、日期和闹钟功能。
通过该实验,我们可以了解实时时钟的设计原理、硬件电路连接及软件程序编写方法。
二、实验原理实时时钟系统由时钟芯片、显示模块、按键模块和控制模块组成。
时钟芯片负责计时和日期的记录,显示模块用于显示时间和日期,按键模块用于设置时间和日期,控制模块用于控制各模块之间的协作。
三、实验器材1.STM32开发板2.DS3231时钟模块3.数码管显示模块4.按键模块5.连接线四、实验步骤1.连接硬件电路。
将STM32开发板与DS3231时钟模块、数码管显示模块和按键模块进行连接,确保电路连接正确无误。
2.编写程序。
使用C语言编写程序,通过读取DS3231时钟模块的寄存器获取时间和日期数据,并将其显示在数码管模块上。
同时,设置按键模块的功能,使其可以进行时间和日期的设置。
3.烧录程序。
使用烧录器将编写好的程序烧录到STM32开发板上,并进行调试。
4.运行实验。
接通电源,启动实时时钟系统,观察数码管是否正确显示时间和日期,按下按键模块进行时间和日期的设置,并观察设置是否生效。
五、实验结果经过实验,我们成功设计出了一个实时时钟系统。
系统能够实时地显示当前的时间和日期,并且可以通过按键进行时间和日期的设置。
在设置新的时间和日期后,系统能够正确地更新并显示。
六、实验总结通过本次实验,我们深入地了解了实时时钟系统的设计原理和实现方法。
我们熟悉了DS3231时钟模块的使用方法,并学会了通过C语言编写程序来实现实时时钟系统的功能。
同时,我们也发现了实时时钟系统的一些问题,并加以解决。
我们对实时时钟系统的稳定性和精确性进行了测试,发现系统的计时精度较高,能够达到亚秒级的准确度。
然而,在用户进行时间和日期的设置时,可能由于误操作导致时间和日期出错。
需要在后续的工作中进一步优化系统的操作界面,提高用户设置的便捷性和准确性。
总而言之,实时时钟系统是一种非常有实用价值的设计,可以广泛应用于各种计时需求的场合,如办公室、实验室、车载设备等。
实时时钟实验课程设计
实时时钟实验课程设计一、课程目标知识目标:1. 学生能够理解实时时钟的基本原理,掌握时钟的组成部分及其功能。
2. 学生能够掌握日期和时间的表示方法,理解时、分、秒的概念及其相互关系。
3. 学生能够了解实时时钟在日常生活和科技领域中的应用。
技能目标:1. 学生能够运用所学知识,独立完成实时时钟电路的搭建和调试。
2. 学生能够通过实际操作,学会读取和设置实时时钟,提高动手实践能力。
3. 学生能够运用编程思维,编写简单的程序实现对实时时钟的控制。
情感态度价值观目标:1. 学生能够培养对时间管理和珍惜时间的意识,养成良好的作息习惯。
2. 学生能够培养团队协作意识,学会在小组合作中共同解决问题。
3. 学生能够体验科技的魅力,激发对科学技术的兴趣和求知欲。
课程性质:本课程为实践性较强的课程,结合理论知识与实际操作,培养学生的动手能力和创新能力。
学生特点:六年级学生具有一定的电子知识基础,好奇心强,善于观察和思考,具备一定的合作能力。
教学要求:教师需注重理论与实践相结合,引导学生主动探究,关注学生的个体差异,提高学生的综合素养。
在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 实时时钟基础知识:- 时钟的组成部分及其功能- 时、分、秒的概念及其相互关系- 日期和时间的表示方法2. 实时时钟电路原理:- 时钟电路的基本原理- 常见时钟芯片的介绍与应用- 电路元件的识别与使用3. 实践操作:- 实时时钟电路的搭建与调试- 读取和设置实时时钟- 编写程序实现对实时时钟的控制4. 教学内容安排与进度:- 第一课时:实时时钟基础知识学习- 第二课时:实时时钟电路原理学习- 第三课时:实践操作,实时时钟电路搭建与调试- 第四课时:实践操作,读取和设置实时时钟- 第五课时:实践操作,编写程序实现对实时时钟的控制5. 教材章节及内容:- 教材第四章第二节:时钟电路的原理与应用- 教材第五章第三节:实时时钟芯片的介绍与编程教学内容注重科学性和系统性,结合课程目标,确保学生在掌握理论知识的基础上,提高实践操作能力。
实时时钟设计实验报告
实验报告源代码:#pragma sfr //使用特殊功能寄存器#pragma EI //开中断#pragma DI //关中断#pragma access //使用绝对地址指令#pragma interrupt INTTM000 Time //定义时间中断函数为Time#pragma interrupt INTKR OnKeyPress //定义按键中断为OnKeyPress#pragma interrupt INTP5 OnKeyOver //定义INT中断为OnKeyOvervoid 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=0int temp=1; //用于存放当前月的天数int temp1=1;int second=0; //默认的秒second=0int minute=0; //默认的分minute=0int hour=12; //默认的时hour=12int day=1; //默认的天day=1int month=5; //默认的月month=5int year=2014; //默认的年year=2014int c_hour=1; //默认的闹钟时=1int c_minute=1; //默认的闹钟分=1int 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中断中间变量intLCD_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<k;i++){for(j=0;j<k;j++){}}}//………………………初始化Led函数……………………// void Init_Led(){P M13=0XF0; //端口13的第四位为输出模式P M14=0XF0; //端口14的第四位为输出模式P M15=0XF0; //端口15的第四位为输出模式}//……………………………按键中断函数……………………// void InitKey_INTKR(){PM4 = 0x3F; //P4的六个端口设置为输入模式P U4 = 0x3F; //接通上拉电阻K RM = 0x3F; //允许六个按键中断K RMK = 0;P M3.0 = 1;P U3.0 = 1;E GP.5 = 1;P MK5 = 0;P PR5 = 0;K RPR = 1;}//……………初始化lcd函数……………………//void Init_Lcd(){P FALL=0x0F; //所有接lcd引脚指定为lcd引脚L CDC0=0x34; //设置原时钟和时钟频率L CDMD=0x30; //设置lcd电压为3/5电压L CDM=0xC0; //4分时1/3偏压模式}//………………初始化定时器Inter函数……………………// void Init_Inter(){C RC00.0=0; //CR000为比较寄存器P RM00=0X04; //计数时钟为fprs/2^8C R000=0X7FFF;//时间间隔为1sT MMK010=1; //TMMK010中断屏蔽T MMK000=0; //TMMK000中断允许T MC00=0X0C; //TM00和CR000相等时进入清零&启动模式}void Time(){s econd++;}//……………………………按键中断函数……………………// void OnKeyPress(){D I();s witch(P4&0x3F) //判断哪个按键按下{case 0x3e:key=1; //按键key1按下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;}E I();}//……………………………INT按键中断函数……………………//void OnKeyOver(){D I();Q ue = 0; //判断Que是否为0B ZOE = 0; //蜂鸣器关闭E I();}//………………………Led小灯函数……………………//void LightOneLed(unsigned char ucNum){s witch(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到11中的一个值则让LED9到LED12中的一个亮break;default:break;}}//………………………Led小灯熄灭函数……………………//void LightOff(){P13 = 0;P14 = 0;P15 = 0;}//……………………时间函数……………………//void Time1(){i f((second % 5) == 0){ //秒大于5变为0Scond = second / 5 + 1;LightOff(); //调用小灯亮函数LightOneLed(Scond % 12);}i f(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){i nt day;i f((month==4)||(month==6)||(month==9)||(month==11))//4,6,9,11月为30天day=30;e lse if(month==2){if((year%4==0&&year%100==0)||(year%400==0))day=29; //闰年2月29天elseday=28; //平年2月28天}e lseday=31; //1,3,5,7,8,10,12月为31天r eturn (day);}//………………倒计时函数.............//void Show_Time(){p okew(0xFA40,0x00);p okew(0xFA42,0x00);p okew(0XFA48,buffs[1]); //在lcd右边显示1p okew(0XFA4A,buffs[0]); //在lcd右边显示0p okew(0XFA44,buffm[1]); //在lcd右边显示1p okew(0XFA46,buffm[0]); //在lcd右边显示0p okew(0xFA4C,0x00);p okew(0xFA4E,0x00);D elay(100);}//………………………………日期显示函数……………………// void Display_Date(){b uffm[0]|=0x0800;p okew(0xFA40,buffyear[3]); //显示年p okew(0xFA42,buffyear[2]);p okew(0xFA44,buffyear[1]);p okew(0xFA46,buffyear[0]);p okew(0xFA48,buffmonth[1]); //显示月p okew(0xFA4A,buffmonth[0]);p okew(0xFA4C,buffday[1]); //显示日p okew(0xFA4E,buffday[0]);t emp1=0;}//………………………………时间显示函数……………………// void Display_Time(){p okew(0xFA40,0x00);p okew(0xFA42,0x00);p okew(0xFA44,buffh[1]); //显示时p okew(0xFA46,buffh[0]);p okew(0xFA48,buffm[1]); //显示分p okew(0xFA4A,buffm[0]);p okew(0xFA4C,buffs[1]); //显示秒p okew(0xFA4E,buffs[0]);}//………………………………设定时间函数……………………// void Set_D_T(){i nt lcd_addr;l cd_addr = 0xFA40;s witch(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);pokew(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(){D I(); //关中断i++;i f(i>7) //切换标志>7,i=1,否则i++i=1;E I(); //开中断}//…………………………调整时间加函数……………………// void UpNum(){s witch(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(){s witch(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(){i f(c_hour == hour && c_minute == minute && Que == 1){ //闹铃的时,分与系统时,分相等,并且闹钟标志开启CKS=0XE0; //开启蜂鸣器输出,输出频率为0.98khz的音频Time1(); //调用时间函数}}//…………………………显示缓存区刷新时间函数……………………//void Freshddisplaybuffer(){b uffs[1]=LCD_num[second/10];//秒的显示码放入秒的数码显示缓存区b uffs[0]=LCD_num[second%10];b uffm[1]=LCD_num[minute/10];//分的显示码放入分的数码显示缓存区b uffm[0]=LCD_num[minute%10];b uffm[0]|=0x0800; //分的后面显示一个"."b uffh[1]=LCD_num[hour/10]; //时的显示码放入时的数码显示缓存区b uffh[0]=LCD_num[hour%10];b uffh[0]|=0x0800; //时的后面显示一个"."b uffday[1]=LCD_num[day/10]; //天的显示码放入天的数码显示缓存区b uffday[0]=LCD_num[day%10];b uffmonth[1]=LCD_num[month/10];//月的显示码放入月的数码显示缓存区b uffmonth[0]=LCD_num[month%10];b uffmonth[0]|=0x0800; //月的后面显示一个"."b uffyear[3]=LCD_num[year/100/10];//年的显示码放入年的数码显示缓存区b uffyear[2]=LCD_num[(year/100)%10];b uffyear[1]=LCD_num[(year%100)/10];b uffyear[0]=LCD_num[(year%100)%10];b uffyear[0]|=0x0800; //年的后面显示一个"."b uffmd[3]=LCD_num[month/10];//月,天的显示码放入月,天的数码显示缓存区b uffmd[2]=LCD_num[month%10];b uffmd[2]|=0x0800; //月,天后显示一个"."b uffmd[1]=LCD_num[day/10];b uffmd[0]=LCD_num[day%10];b uffhm[3]=LCD_num[hour/10];//时,分的显示码放入时,分的数码显示缓存区b uffhm[2]=LCD_num[hour%10];b uffhm[2]|=0x0800; //时,分的后显示一个"."b uffhm[1]=LCD_num[minute/10];b uffhm[0]=LCD_num[minute%10];b uffms[3]=LCD_num[minute/10];//分,秒的显示码放入分,秒的数码显示缓存区b uffms[2]=LCD_num[minute%10];b uffms[2]|=0x0800; //分,秒的后显示一个"."b uffms[1]=LCD_num[second/10];b uffms[0]=LCD_num[second%10];b uffch[1]=LCD_num[c_hour/10];//闹钟时的显示码放入闹钟时的数码显示缓存区b uffch[0]=LCD_num[c_hour%10];b uffcm[1]=LCD_num[c_minute/10];//闹钟分的显示码放入闹钟分的数码显示缓存区b uffcm[0]=LCD_num[c_minute%10];}//………………主函数……………………//void main(){D I(); //关中断P M3.4 = 0; //P3.3,P3.4端口设置为输出模式P3.4 = 1; //led灯初始化为点亮状态P M3.3 = 0;P3.3 = 0;B ZOE = 0; //蜂鸣器初始化为熄灭I nit_Lcd(); //初始化lcdI nit_Led(); //初始化ledI nitKey_INTKR(); //初始化按键E I(); //开中断I nit_Inter(); //初始化中断w hile(1){T ime1(); //调用计算时间函数n oise(); //调用闹钟函数s witch(key){case 0: //没有按键执行Freshddisplaybuffer(); //调用刷新函数Time1(); //计算时间Show_Time(); //调用显示时间函数Show_Time();break;case 1: //按键1执行Time1(); //计算时间Freshddisplaybuffer(); //调用刷新函数Display_Date(); //调用显示日期函数noise(); //调用闹钟函数break;case 2: //按键2执行Time1(); //计算时间Freshddisplaybuffer(); //调用刷新函数Display_Time(); //调用时间显示函数noise(); //调用闹钟函数break;case 3: //按键3执行d_c_inter(); //调用时间切换函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数key=7;break;case 4: //按键4执行UpNum(); //调用时间加函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数key=7;break;case 5: //按键5执行DownNum(); //调用时间减函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数key=7;break;case 6: //按键6执行key = 0;if(i > 5) //判断是否确认Que = 1;i = 0;noise(); //调用闹钟函数case 7: //虚拟按键7 Time1();Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数break;}}}。
单片机实验报告 实时时钟
单片机实验报告姓名:姓名:学号:学号:一、实验要求:1. 设计一个实时时钟,四个八段数码管显示格式为:XX.XX(小时/分钟,24小时计时法);使用一个LED用来显示秒的状态,显示规则为:以1Hz频率闪烁,既亮灭一次为一秒钟,500毫秒亮、500毫秒灭。
2. 实时时钟可以通过3x4键盘设置初始值。
数字键用于输入数值,sfb0键为设置键,sfb1键为开关键。
3. 设置初始值的流程:先按下sfb0键,四个数码管显示内容变为全“0”,并以1HZ频率开始闪烁并等待键盘输入小时、分钟数值(其中小时2位数,分钟2位数),输入完毕后,实时时钟开始以新输入的时间值开始计时。
4. 开关键的使用方法:在计时模式下按sfb1键一次,时钟停止计时,时间数值停留在按键那刻;在停止计时模式下,按sfb1键一次时钟开始继续计时。
5. 定时闹铃功能(加分功能,可选做):按sgp0_key键,进入闹铃值设置模式,四个数码管显示内容变为全“0”,并以1HZ频率开始闪烁并等待键盘输入小时、分钟数值(其中小时2位数,分钟2位数),此时计时仍然运行,输入完毕后,显示内容恢复为计时值。
当时钟计时到达闹铃值,驱动蜂鸣器鸣响8次。
6. 增加通过RS232接口,更改时钟当前时间的功能。
二、实验程序说明:对实验按键和存储位置的说明语句:1.创建一个新工程,在该工程的器件编辑器(Device Editor)中选择定时器模块,然后将其按要求放置,如图所示。
图定时器模块放置图2.配置全局资源。
单击参数内容方框里的下拉箭头,选择合适的参数值,便可以更改工程中默认的全局资源。
此实验配置的全局资源如图所示。
图全局资源配置3.按图配置Timer8定时器模块的参数。
4.按图配置管脚驱动模式。
图管脚驱动模式的参数配置5.程实现3×4矩阵键盘扫描功能,将按下键的键值显示在数码管上。
相应的按键管脚配置如图如示。
按键管脚配置实验程序://----------------------------------------------------------------------------//文件名:main.c//----------------------------------------------------------------------------#include <m8c.h> // part specific constants and macros#include "PSoCAPI.h" // PSoC API definitions for all User Modules #pragma interrupt_handler KeyScan#pragma interrupt_handler timer1_ISR//void KeyScan();void delay10ms(unsigned char time);void Dispaly(unsigned char k);unsigned char key=1,temp, stopCount;BYTE byte_Period,byte_Duty;#define DATA PRT3DR#define SEL PRT4DR#define LED1 0b11111110#define LED2 0b11111101#define LED3 0b11111011#define LED4 0b11110111#define dp 0b11111110#define sfb0 10#define sfb1 11#define STOP 12#define RESET 13#define CLOCK 14#define sgp0_key 0/*common anode LED,therefore the LED will light when the pin is low*/ unsigned char num[17] ={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85 ,0x61,0x71,0xff};unsigned charreg[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0 x63,0x85,0x61,0x71,0xff};unsigned char led1_dig=0,led2_dig=0,led3_dig=0,led4_dig=0;//分别是1,2,3,4数码管现在的数unsigned char led1=0,led2=0,led3=0,led4=0;//当做缓存的数,设置的时候用到。
单片机实时时钟实训报告
一、引言随着单片机技术的不断发展,其在各个领域的应用越来越广泛。
实时时钟(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液晶显示屏,实现时间显示。
具体操作如下:① 设计显示模块的硬件电路;② 编写显示模块的驱动程序,实现时间数据的读取和显示;③ 通过按键操作,实现时间的切换和调整。
实时时钟实验总结
实时时钟实验总结一、引言实时时钟(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开发板上,并打开串口监视器,观察时间和日期信息的显示情况。
同时,通过修改程序中的设置功能,验证实时时钟的准确性和可靠性。
定时器或实时时钟实验
void delay(uchar k)
{
uchar j;
for(j=0;j<10;j++)
while(k--);
}
void put(uchar hh,uchar ll)
//数码管动态输出
{
uchar a1,a2,a3,a4;
a1=hh/10;
a2=hh%10;
a3=ll/10;
a4=ll%10;
w1=w2=w3=w4=1;
{ if(di) put(xsh,xsl);
else put(dsxsh,dsxsl);
}
a=~a;TR0=a;
2
}else if(H2==0) {
while(!H2) { if(di) put(xsh,xsl); else put(dsxsh,dsxsl); }
di=~di; } H1=1;H2=1;L2=0;L1=1;L3=1; if(H1==0) {
sbit L2=P0^6;
sbit L3=P0^7;
bit a=1; //a=0 标识设置时间,
bit di=1;
//di=0 标识正在调整定时
uchar ledtable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar m=0,xsh=0,xsl=0,dsxsh=88,dsxsl=88;
4
if(xsl>=60)
{
xsl=0;
xsh++;
if(xsh>=60)
xsh=0;
}
}
}
五、实验过程中遇到的问题及解决方法
1. 遇到的第一个问题: 系统有定时模式、调时模式和正常模式三个模式,在不同模式中需要数码管
实时时钟课程设计
实时时钟课程设计一、课程目标知识目标:1. 学生能理解实时时钟的基本概念,掌握时钟的组成部分及运行原理。
2. 学生能够运用所学知识,分析并描述实时时钟的显示格式和功能。
3. 学生了解实时时钟在日常生活和科技领域中的应用。
技能目标:1. 学生能够运用所学知识,设计并制作一个简单的实时时钟电路。
2. 学生通过实际操作,提高动手实践能力和问题解决能力。
3. 学生能够运用实时时钟知识,解决实际问题,培养创新思维。
情感态度价值观目标:1. 学生对实时时钟产生兴趣,培养主动学习和探究的精神。
2. 学生在团队协作中,学会相互尊重、沟通和协作,培养集体荣誉感。
3. 学生认识到实时时钟在科技发展中的重要性,增强对科技进步的热爱和责任感。
本课程针对五年级学生,结合学生好奇心强、动手能力逐渐提高的特点,以实用性为导向,旨在帮助学生掌握实时时钟相关知识,提高实践操作能力,培养科学素养和团队协作精神。
课程目标具体、可衡量,便于教学设计和评估。
二、教学内容本章节教学内容主要包括以下三个方面:1. 实时时钟基础知识:- 时钟的组成部分:时钟芯片、晶体振荡器、计数器、显示装置等。
- 时钟运行原理:振荡器产生稳定的时钟信号,计数器对时钟信号进行计数,显示装置显示时间。
2. 实时时钟的应用与设计:- 显示格式:12小时制和24小时制,了解其转换方法。
- 功能介绍:闹钟、定时器、日期显示等。
- 设计实时时钟电路:使用时钟芯片,结合晶体振荡器、计数器等组件,设计并制作一个简单的实时时钟。
3. 实时时钟在实际应用中的案例:- 日常生活:电子时钟、手机、电脑等设备中的应用。
- 科技领域:物联网、智能设备、嵌入式系统等领域的应用。
教学大纲安排如下:1. 第一周:实时时钟基础知识学习,了解时钟的组成部分和运行原理。
2. 第二周:学习实时时钟的显示格式和应用功能,进行实际操作。
3. 第三周:设计实时时钟电路,分组进行实践操作,培养团队协作能力。
实验08简易数字钟
秒个位计数器的状态
鸣低音
停
“0”时,500Hz 输入音响 0 1 1 1 鸣低音 Q3S1= 以最后一声高音结束的时刻为正点时刻。 “1”时,1kHz 输入音响
1 1 0 0 0 0 0 1 停
11 12 13 14 Q3 Q2 Q1 Q0 CT P LD CTT CC40161 D3 D2 D1 D0 6 5 4 3 CR CP 2
CP
六十进制计数器
串行进位(异步)
优点:简单;缺点:速度较慢
4
构成多位计数器的级联方法
进 位 信 号
0 & 9 1 &
1
0
1 & &
1
0
0
1 +VDD CTP CTT CP 2 CP 7 10
CD40161 MC14161芯片管脚图9 NhomakorabeaB 8 3A
16 VDD A1 1 15 Yf A2 2 14 Yg LT 3 13 Ya BI 4 12 Yb LE 5 11 Yc A3 6 10 Yd A0 7 9 Ye VSS 8 CC4511 4-7 段锁存译码器/驱动器
14 VDD
13 4B
实验原理
1、同步计数器40161的逻辑功能
• 40161是一个4位二进制同步加计数器 进位
16 VDD CR 1 15 CO CP 2 14 Q0 D0 3 13 Q1 D1 4 12 Q2 D2 5 11 Q3 D3 6 10
置数
9
CC40161功能表
CR LD CP ET 操作状态
0 1 1 1 清 零 数据输入 置数 使 能
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5 实验原理
串口在嵌入式系统中是一个重要的资源,常用来做输 入输出设备,在后续的实验中也将使用串口的功能。串 口的基本操作有三个:串口初始化、发送数据和接收数 据,这些操作都是通过访问上节中描述的串口控制寄存 器进行
5 实验原理
(1)串口初始化程序 MMU_Init(); //设置系统时钟 ChangeClockDivider(1,1);// 1:2:4 ChangeMPllValue(0xa1,0x3,0x1);//FCLK=202.8MHz Port_Init(); Uart_Init(0,115200); Uart_Select(0); //初始化I/O口 //初始化串口 //选择串口0 //初始化内存管理单元
5 实验原理
(2)发送数据 while(!(rUTRSTAT0&0x2)); //等待发送缓冲空 rUTXH0=data; (3)接收数据 while(rUTRSTAT0&0x1==0x0); //等待数据 data=rURXH0; //读取数据 //将数据写到数据端口
6 实验步骤
1.参照模板工程,新建一个工程UART,添加相 应的文件,并修改UART的工程设置; 2.创建Main.C和mmu.c并加入到工程UART中; 3.编写串口操作函数实现如下功能:循环接收 串口送来的数据,并将接收到的数据发送回去; 4.编译UART; 5.将计算机的串口接到开发板的UART0上; 6.运行超级终端,选择正确的串口号,并将串 口设置位:波特率(115200)、奇偶校验 (None)、数据位数(8)和停止位数(1), 无流控,打开串口;
5 实验原理
2410时钟框图
5 实验原理
S3C2410的实时时钟寄存器
Register Address R/W Description Reset Value
RTCCON
0x57000040(L) 0x5rol register
0x0
GX-ARM9-2410EP教学实验系统 教学实验系统
实验七 实时时钟实验
1 实验目的 1.了解实时时钟在嵌入式系统中的作用; 2.掌握实时时钟的使用。
2 实验内容 1.编程实现实时时钟功能,每秒显示实 时时钟; 2.编程实现实时时钟告警功能。
3 预备知识 1.熟悉ADS集成开发环境的基本功能; 2.了解S3C2410的实时时钟模块的使用。
5 实验原理
CPU 中的串口寄存器: 8)发送寄存器UTXH和接收寄存器URXH 这两个寄存器存放这发送和接收的数据,当然只有一 个字节8位数据。需要注意的是,在发生溢出错误时,接 收的数据必须被读出来,否则会引发下次溢出错误。 9)波特率分频寄存器UBRDIV 该寄存器为十六位,用于设置串口传输的波特率,算法 参见试验指导书上公式部分。
6 实验步骤
7.运行程序,在超级终端中输入的数据将回显 到超级终端上,如下图所示:
7 实验报告要求 1.简述串行接口的工作原理以及串行接口 的优缺点; 2.RS-232C的最基本数据传送引脚是哪几 根? 3.简述串行接口通讯程序设计的基本步 骤。
4 实验设备 1.ARM2410嵌入式开发板,JTAG仿真器。 2.软件:PC机操作系统Win98、Win2000 或WinXP,ADS1.2集成开发环境,仿真 WinXP ADS1.2 器驱动程序,超级终端通讯程序。
5 实验原理 在一个嵌入式系统中,实时时钟单元 可以提供可靠的时钟,包括时分秒和年 月日;即使在系统处于关机状态下,它 也能正常工作(通常采用后备电池供 电),它的外围也不需要太多的辅助电 路,典型的就是只需要一个高精度的晶 振。