嵌入式电子闹钟()时钟课程设计
嵌入式课程设计-- 基于LCD的电子时钟实验

课程设计报告题目嵌入式系统项目设计课程设计(报告)任务书(理工科类)Ⅰ、课程设计(报告)题目:基于LCD的电子时钟实验Ⅱ、课程设计(论文)工作内容学习LCD与ARM的LCD的控制器的接口原理,掌握内置LCD控制器驱动编写方法和RTC控制方法,在可行性分析的基础上实现以下功能:1、编写程序实现电子时钟功能,通过实验系统的LCD将时间显示出来;2、仿照给定图形在LCD上显示类似的时钟界面;3、动态显示当前的时间,包括:年、月、日、时、分、秒,时针,分针、秒针必须为动态实时指示当前的时间。
一、课程设计目标1、培养综合运用知识和独立开展实践创新的能力;2、培养学生的编程能力、用计算机解决实际问题的能力。
3、培养学生遇到问题,解决问题的能力。
二、研究方法及手段应用1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;2、实验设备有L-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆;3、PC操作系统WIN98或WIN2000或WINXP,ARM SDT2.5或ADS1.2集成开发环境,仿真器驱动程序;4、本实验使用实验教学系统的CPU板,在进行本实验时,LCD电源开关、音频的左右声道开关、AD通道选择开关、触摸屏中断选择开关等均应处在关闭状态。
三、课程设计预期效果1、完成实验环境搭建;2、分模块调试和编译;3、组合并完善程序;4、联合仿真软件运行程序;5、液晶显示器显示时钟图样,时,分,秒能指向正确的时间。
学生姓名:严维锋专业年级:自动化2008级目录前言 (3)第一章系统设计 (4)第一节课题目标及总体方案 (4)第二节原理框图 (5)第三节程序和芯片的初始化 (5)第四节构建功能模块 (7)第五节 MAIN函数的局部原理分析 (8)第二章实验(测试)结果及讨论 (13)第一节 ADS1.2软件的编译,连接和运行 (13)第二节程序调试 (14)第三章结论 (14)心得体会 (15)参考文献 (16)附录 (17)源程序 (17)前言近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,其强大的控制能力和专业性在通讯、网络、工控、电子等领域发挥着越来越重要的作用。
嵌入式电子闹钟课程设计方案

嵌入式系统综合实验题目基于嵌入式的数字闹钟系统设计学生姓名秦乙学号20071309087学院电子与信息工程学院专业信息工程二O一O年十二月二十七日目录论文标题.................................................... 错误!未定义书签。
摘要和关键词................................................ 错误!未定义书签。
1 绪论 (2)1.1 在信息产业中EDA产生的影响 (2)1.2 中国国内EDA发展情况 (2)2 FPGA简介 (2)2.1 FPGA概述 (2)2.2 FPGA基本结构 (3)2.3 FPGA编程原理 (3)3 设计的总体方案 (4)3.1流程图 (4)3.2模块组成 (4)3.3数字闹钟工作原理 (4)4设计的详细原理 (5)4.1主要模块 (5)4.2功能概述 (5)5设计的步骤和过程 (6)5.1计时模块 (6)5.2校时模块 (7)5.3设定闹钟模块 (8)5.4显示模块设计 (9)5.5蜂鸣器模块设计..................................... 错误!未定义书签。
2 6设计的仿真和结果......................................... 错误!未定义书签。
2 7总结..................................................... 错误!未定义书签。
5 参考文献................................................... 错误!未定义书签。
5基于嵌入式的数字闹钟系统设计秦乙南京信息工程大学电子与信息工程学院信息工程系,南京210044 摘要:随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。
为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子数字钟诞生了,它集时间、日期、星期和温度功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
嵌入式课程设计-- 基于LCD的电子时钟实验

课程设计报告题目嵌入式系统项目设计课程设计(报告)任务书(理工科类)Ⅰ、课程设计(报告)题目:基于LCD的电子时钟实验Ⅱ、课程设计(论文)工作内容学习LCD与ARM的LCD的控制器的接口原理,掌握内置LCD控制器驱动编写方法和RTC控制方法,在可行性分析的基础上实现以下功能:1、编写程序实现电子时钟功能,通过实验系统的LCD将时间显示出来;2、仿照给定图形在LCD上显示类似的时钟界面;3、动态显示当前的时间,包括:年、月、日、时、分、秒,时针,分针、秒针必须为动态实时指示当前的时间。
一、课程设计目标1、培养综合运用知识和独立开展实践创新的能力;2、培养学生的编程能力、用计算机解决实际问题的能力。
3、培养学生遇到问题,解决问题的能力。
二、研究方法及手段应用1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;2、实验设备有L-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆;3、PC操作系统WIN98或WIN2000或WINXP,ARM SDT2.5或ADS1.2集成开发环境,仿真器驱动程序;4、本实验使用实验教学系统的CPU板,在进行本实验时,LCD电源开关、音频的左右声道开关、AD通道选择开关、触摸屏中断选择开关等均应处在关闭状态。
三、课程设计预期效果1、完成实验环境搭建;2、分模块调试和编译;3、组合并完善程序;4、联合仿真软件运行程序;5、液晶显示器显示时钟图样,时,分,秒能指向正确的时间。
学生姓名:严维锋专业年级:自动化2008级目录前言 (3)第一章系统设计 (4)第一节课题目标及总体方案 (4)第二节原理框图 (5)第三节程序和芯片的初始化 (5)第四节构建功能模块 (7)第五节 MAIN函数的局部原理分析 (8)第二章实验(测试)结果及讨论 (13)第一节 ADS1.2软件的编译,连接和运行 (13)第二节程序调试 (14)第三章结论 (14)心得体会 (15)参考文献 (16)附录 (17)源程序 (17)前言近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,其强大的控制能力和专业性在通讯、网络、工控、电子等领域发挥着越来越重要的作用。
嵌入式包括时分秒的数字时钟课程设计

嵌入式包括时分秒的数字时钟课程设计答案:嵌入式包括时分秒的数字时钟的课程设计可以通过使用微控制器和相关的编程语言来实现。
以下是一个基本的课程设计方案,用于设计一个嵌入式数字时钟。
1. 硬件设计:- 使用一个微控制器,如Arduino或Raspberry Pi,作为主控制器。
- 连接一个实时时钟(RTC)模块,以获取准确的时间信息。
- 连接一个数码管显示器,用于显示时、分、秒的数字。
- 连接适当的按钮或开关,用于设置时间和控制其他功能。
2. 软件设计:- 使用适当的编程语言,如C或Python,编写嵌入式软件。
- 初始化RTC模块,并设置初始时间。
- 通过读取RTC模块的时间信息,更新时、分、秒的变量。
- 将时、分、秒的变量转换为适当的格式,并在数码管显示器上显示。
- 实现按钮或开关的功能,例如设置时间、切换显示模式等。
- 使用循环结构,不断更新时间和响应用户输入。
扩展和深入分析:在设计嵌入式数字时钟时,可以进一步扩展和改进功能,以满足特定需求和提供更好的用户体验。
以下是一些可能的扩展和深入分析方向:1. 闹钟功能:- 添加闹钟功能,允许用户设置特定时间的闹钟。
- 当闹钟时间到达时,触发声音或震动提示。
2. 温度和湿度显示:- 连接温度和湿度传感器,显示当前环境的温度和湿度信息。
3. 亮度控制:- 添加光敏电阻或其他传感器,根据环境光线调整数码管显示器的亮度。
4. 日期和星期显示:- 使用RTC模块提供的日期信息,显示当前日期和星期。
5. 时钟同步:- 使用无线通信模块,如Wi-Fi或蓝牙,与互联网时间服务器同步时钟。
6. 电池备份:- 添加电池备份电路,以保持时钟运行,即使主电源中断。
通过以上扩展和改进,嵌入式数字时钟可以成为一个更加功能强大和实用的设备。
这些功能可以根据具体需求进行选择和实现,以满足不同用户的需求。
总结:嵌入式包括时分秒的数字时钟的课程设计可以通过硬件和软件的结合来实现。
硬件设计包括选择适当的微控制器、实时时钟模块、数码管显示器和按钮开关。
嵌入式课程设计——基于DS1302数字钟

嵌入式课程设计报告题目:基于DS1302数字钟姓名:学号:班级:电子101专业:电子信息工程指导老师:提交时间: 2013-12-13组员:目录摘要................................................. - 1 -1.引言............................................... - 3 -2.硬件电路设计:..................................... - 4 - 2.1 DS1302 ........................................ - 4 - 2. 2 AT89C52 ...................................... - 6 - 2. 3 LCD1602 ...................................... - 7 -2. 4 设计方案 ..................................... - 8 -3.软件程序设计....................................... - 9 - 3.1主程序.......................................... - 9 - 3.2 LCD1602程序:................................. - 10 -3.3 DS1302应用程序:.............................. - 13 -4.课设的心得体会.................................... - 17 - 参考文献............................................ - 20 -摘要本设计选取串行接口时钟芯片 DS1302 与单片机同步通信构成数字时钟电路并用LCD1602显示。
嵌入式电子闹钟()时钟课程设计

}#include<reg52。
h 〉 // #include<intrins 。
h 〉uchar num ,count,shi,fen,miao ,s1num ,s2num,year,month,day ,week,flag,flag1,year1,month1, day1,week1,shi1,fen1,miao1,year2,month2,day2,week2,shi2,fen2,miao2,year5,month5, day5,week5,shi5,fen5,miao5,wk ,ashi,afen; // 参数定义 uchar code table []="20 — — "; // uchar code table1[]=" : : 00:00”; /*uchar time_dat[7]={12,1,6,6,12,59,59}; // uchar write_add [7]={0x8c ,0x8a,0x88,0x86,0x84,0x82,0x80}; uchar read_add [7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};*/ void write_com (uchar com); // void write_data(uchar date ); //void write_ds1302(uchar add,uchar dat ); //ds1302void set_rtc (); //ds1302 void time_pros(); //ds1302 void read_rtc (); //ds1302 void alarm (); // void delay(uint z)//{uint x,y ;for (x=z;x>0;x-—) for(y=110;y 〉0;y--);#define uchar unsigned char// #define uint unsigned int // 位定义 sbit rs=P2^5; sbit lcden=P2^7; sbit s1=P2^0; sbit s2=P2^1; sbit s3=P2^3; sbit s4=P2^4; sbit rst=P1^5; sbit io=P1^6; sbit sclk=P1^7; sbit beep=P3^0; // // // // // //ds1302 //宏定义液晶位定义 时间功能切换按键 按键加 按键减 闹钟功能切换键 引脚定义 蜂鸣器 头文件 液晶固定显示年周月日时分秒 液晶写指令函数 液晶写数据函数芯片写指令函数 时间设置函数 进制转换函数 读时间函数 闹钟函数 延时函数}void write_com(uchar com)//1602 液晶写指令 {rs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0;}void write_data(uchar date)//1602 液晶写写数据 {rs=1; P0=date; delay (5); lcden=1; delay(5); lcden=0;//void init() {lcden=0; flag=0; flag1=0;write_com(0x38); write_com (0x0c ); write_com(0x06); write_com (0x01); write_com (0x80); // for(num=0;num<14;num++) {write_data(table[num ]); delay(5); }write_com (0x80+0x40); // for(num=0;num 〈20;num++) {write_data(table1[num]); delay (5);}初始化液晶固定显示,第一行液晶显示第二行void write_sfm(uchar add,uchar date)// 时分秒{uchar shi3,ge; shi3=date/10; ge=date%10;write_com(0x80+0x40+add); write_data(0x30+shi3);write_data(0x30+ge);}void write_nyr(uchar ad,uchar date)// 年月日{uchar shi4,ge2;shi4=date/10;ge2=date%10; write_com(0x80+ad); write_data(0x30+shi4); write_data(0x30+ge2);}void write_week(uchar wk) // 星期按西方星期设置{星期天为第一天write_com(0x80+11);switch(wk){case 1:write_data('S’); delay(5);write_data('U’); delay(5);write_data(’N’); break;case 2: write_data('M’); delay(5);write_data('O’); delay(5);write_data('N’); break;case 3: write_data('T');delay(5); write_data('U'); delay(5); write_data('E'); break;case 4:write_data('W’); delay(5);write_data(’E’); delay(5);write_da ta('D’); break;case 5: write_data('T'); delay(5);write_data(’H’); delay(5);write_data('U’); break;case 6: write_data('F’); delay(5);write_data('R’); delay(5);write_data('T’); break;case 7: write_data('S'); delay(5);write_data(’A'); delay(5);write_data(’T'); break;}}// 按键函数void keyscan(){if(s1==0){delay(5);if(s1==0)write_com(0x0f); s1num++; //flag=1;flag1=1;while(!s1);记录按键次数switch(s1num)// 光标闪烁点定位{case 1:write_com(0x80+0x40+6); // 秒break;case 2:write_com(0x80+0x40+3); // 分break;case 3:write_com(0x80+0x40+0); // 时break;case 4:write_com(0x80+11); // break;case 5:write_com(0x80+8); // break;星期日case 6:write_com(0x80+5);// break;case 7:write_com(0x80+2); //break;case 8:s1num=0;write_com(0x0c);// 间设置set_rtc();flag=0;break;}设置开显示光标不显示关闭时if(s1num!=0) // {按键加减if/加按键函数delay(10); if(s2==0) {while(!s2); switch(s1num) //根据功能键相应次数做出调节{case 1: miao++; // 秒加 if (miao==60) miao=0;write_sfm(6,miao); write_com(0x80+0x40+6); break;case 2: fen++; // 分加 if(fen==60)fen=0; write_sfm (3,fen); write_com (0x80+0x40+3); break ;case 3: shi++; // 时加 if (shi==24)shi=0; write_sfm (0,shi); write_com (0x80+0x40+0); break ;case 4: week++; // if(week==8) week=1; write_week(week ); write_com(0x80+11); break; case 5: day++; // if(day==32) day=1; write_nyr(8,day ); write_com(0x80+8); break;if (month==13)month=1; write_nyr (5,month); write_com (0x80+5);break;case 7: year++; //年加if (year==100) year=0;write_nyr(2,year );write_com(0x80+2);break;}}}if (s3==0) // 减按键函数同上 {星期加日加 case 6: month++;//月加delay(10);if(s3==0){while(!s3);switch(s1num) // 根据功能键相应次数做出调节{case 1: miao—-;if(miao==—1)miao=59;write_sfm(6,miao); write_com(0x80+0x40+6);break;case 2: fen——;if(fen==-1)fen=59;write_sfm(3,fen); write_com(0x80+0x40+3); break;case 3: shi—-;if(shi==—1)shi=23;write_sfm(0,shi); write_com(0x80+0x40+0); break;case 4: week--;if(week==—1) week=7;write_week(week); write_com(0x80+11); break;case 5: day--; if(day==-1) day=31; write_nyr(8,day);write_com(0x80+8); break;case 6: month—-;if(month==—1)month=12;write_nyr(5,month); write_com(0x80+5); break;case 7: year-—;if(year==—1) year=99;write_nyr(2,year); write_com(0x80+2); break;}}}}if(s4==0) // {闹钟按键delay(5);if(s4==0){write_com(0x0f); // s2num++;// flag=1;while(!s4);switch(s2num)//光标闪烁记录按键次数光标闪烁点定位{case 1:write_com(0x80+0x40+13);// break;case 2:write_com(0x80+0x40+10); // 时break;case 3:write_com(0x0c);flag=0; s2num=0;break;}}}//关闭闹钟设置if(s2num!=0) //{if(s2==0) //{delay(10); if(s2==0){ while(!s2);switch(s2num)//闹钟设置闹钟加根据功能键相应次数做出调节{case 1: afen++;if(afen==60)afen=0;write_sfm(13,afen);write_com(0x80+0x40+13);break;case 2: ashi++;if(ashi==24)ashi=0;write_sfm(10,ashi); write_com(0x80+0x40+10); break;}}}if(s3==0) // 闹钟减{delay(10);if(s3==0){while(!s3);switch(s2num) // 根据功能键相应次数做出调节{case 1: afen--;if(afen==—1)afen=59;write_sfm(13,afen);write_com(0x80+0x40+13);break;case 2: ashi--;if(ashi==-1)ashi=23;write_sfm(10,ashi);write_com(0x80+0x40+10); break;}}}}}void wirte_ds1302_byte(uchar dat) //ds1302 字节写{ uchar i;for(i=0;i〈8;i++){sclk=0;io=dat&0x01;dat=dat>>1; sclk=1; }}void write_ds1302(uchar add ,uchar dat) //ds1302 {rst=0;_nop_();// 空操作 sclk=0; _nop_(); rst=1;_nop_(); wirte_ds1302_byte (add ); wirte_ds1302_byte (dat ); rst=0; io=1; sclk=1;}uchar read_ds1302(uchar add) //ds1302{uchar i,value; rst=0;_nop_();// 空操作 sclk=0; _nop_(); rst=1;_nop_(); wirte_ds1302_byte(add ); for (i=0;i<8;i++) { value=value 〉>1; sclk=0; if (io) { value=value |0x80; } sclk=1; } rst=0;_nop_();// 空操作 sclk=0; _nop_();写函数读函数sclk=1;io=1;return value; }void set_rtc(){write_ds1302(0x8e,0x00);year1=year/10; //year=year%10;year=year+year1*16;write_ds1302(0x8c,year);//ds1302// 关写保护转换为十六进制week1=week/10;week=week%10;week=week+week1*16; write_ds1302(0x8a,week);month1=month/10;month=month%10;month=month+month1*16; write_ds1302(0x88,month);day1=day/10;day=day%10;day=day+day1*16; write_ds1302(0x86,day);shi1=shi/10;shi=shi%10;shi=shi+shi1*16; write_ds1302(0x84,shi);fen1=fen/10;fen=fen%10;fen=fen+fen1*16; write_ds1302(0x82,fen);miao1=miao/10;miao=miao%10;miao=miao+miao1*16;write_ds1302(0x80,miao);时间设置write_ds1302(0x8e,0x80); // 开写保护flag1=0;void read_rtc () //{year2=read_ds1302(0x8d); week2=read_ds1302(0x8b );month2=read_ds1302(0x89); day2=read_ds1302(0x87);shi2=read_ds1302(0x85);fen2=read_ds1302(0x83);miao2=read_ds1302(0x81);}void time_pros() // 进制{从 ds1302 中读出的时间转换为十year5=year2/16; year2=year2%16;year2=year2+year5*10; month5=month2/16; month2=month2%16;month2=month2+month5*10; day5=day2/16; day2=day2%16; day2=day2+day5*10; shi5=shi2/16; shi2=shi2%16; shi2=shi2+shi5*10; fen5=fen2/16; fen2=fen2%16; fen2=fen2+fen5*10; miao5=miao2/16;miao2=miao2%16; miao2=miao2+miao5*10;void display(){从 ds1302 中读时间// 显示函数write_sfm(6,miao2); write_com(0x80+0x40+6);write_sfm(3,fen2); write_com(0x80+0x40+3);write_sfm(0,shi2); write_com(0x80+0x40+0);write_week(week2);write_com(0x80+11);write_nyr(8,day2);write_com(0x80+8);write_nyr(5,month2);write_com(0x80+5);write_nyr(2,year2);write_com(0x80+2);if((ashi==shi2)&&(afen==fen2)) {alarm();}}void alarm() // 闹钟{beep=0; delay(1000);beep=1;void mai n()//{in it();//while(1){keysca n();//if(flag==O){keysca n(); read_rtc(); time_PrOS(); display();}■■■・』』u ■〈n “ Ia ・.■,□ ∣22912-07-64 I-C12: 18=03 C0=0^■ W■'h Ui■t∣?K。
基于51单片机的电子时钟_嵌入式课程设计报告_西安科技大学_网络工程

课程设计:嵌入式系统应用题目名称:电子时钟姓名:学号:班级:网络工程完成时间:2013年12月31日1设计的任务1.1设计内容基于已经焊好的STC89C52RC单片机,以单片机控制技术设计电子时钟。
1.2 设计目标用LCD上显示相应的时间,实现显示年、月、日、星期、时、分、秒的功能,通过键盘来控制实现年、月、日、星期、时、分、秒校准功能。
2 设计的过程2.1 基本结构2.1.1 STC89C52介绍采用STC89C52单片机作为主控制系统;采用DS1302作为时钟芯片;采用1602 LCD液晶作为显示器件。
STC89C52原理图主要功能:STC89C52是由深圳宏晶科技公司生产的与工业标准MCS-51指令集和输出管脚相兼容的单片机。
STC89C52主要功能如表所示。
引脚介绍:①主电源引脚(2根)VCC(Pin40):电源输入,接+5V电源GND(Pin20):接地线②外接晶振引脚(2根)XTAL1(Pin19):片内振荡电路的输入端XTAL2(Pin20):片内振荡电路的输出端③控制引脚(4根)RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG(Pin30):地址锁存允许信号PSEN(Pin29):外部存储器读选通信号EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
④可编程输入/输出引脚(32根)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
P0口(Pin39~Pin32):8位双向I/O口线,名称为P0.0~P0.7P1口(Pin1~Pin8):8位准双向I/O口线,名称为P1.0~P1.7P2口(Pin21~Pin28):8位准双向I/O口线,名称为P2.0~P2.7P3口(Pin10~Pin17):8位准双向I/O口线,名称为P3.0~P3.7STC89C52最小系统:最小系统是指能进行正常工作的最简单电路。
嵌入式闹钟课程设计报告

嵌入式闹钟课程设计报告一、课程目标知识目标:1. 理解嵌入式闹钟的基本原理,掌握其核心组件的功能与作用。
2. 学会使用编程语言(如C语言)编写嵌入式闹钟程序,实现对时间的显示、设置和闹钟提醒功能。
3. 了解嵌入式系统的基本概念,掌握常见的输入输出接口及其应用。
技能目标:1. 能够运用所学知识设计和制作一个具有实际功能的嵌入式闹钟。
2. 培养学生的动手操作能力,学会使用相关工具和仪器进行硬件焊接、调试和程序下载。
3. 提高学生的团队协作能力,学会在项目过程中进行有效沟通和分工合作。
情感态度价值观目标:1. 培养学生对嵌入式系统的兴趣,激发学生学习编程和电子技术的热情。
2. 培养学生的创新精神和实践能力,鼓励学生勇于尝试、不断探索。
3. 增强学生的自信心和责任感,使学生在面对挑战时保持积极的态度。
课程性质:本课程为实践性较强的课程,结合理论知识与实际操作,培养学生的动手能力和创新能力。
学生特点:初中生,具备一定的电子和编程基础,对新鲜事物充满好奇心,喜欢动手实践。
教学要求:注重理论与实践相结合,强调学生的主动参与和动手实践,关注个体差异,提高学生的综合素质。
通过本课程的学习,使学生能够掌握嵌入式闹钟的制作方法,培养其创新意识和团队协作能力。
教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 嵌入式系统基本概念:介绍嵌入式系统的定义、组成及应用领域,使学生了解嵌入式系统的基本知识。
- 教材章节:第1章 嵌入式系统概述2. 嵌入式闹钟硬件设计:讲解闹钟所需的主要硬件组件,如微控制器、时钟芯片、显示屏、按键等,并介绍硬件电路的搭建方法。
- 教材章节:第2章 嵌入式系统硬件设计3. 嵌入式编程基础:教授C语言编程基础,包括变量、数据类型、运算符、控制语句等,为编写嵌入式闹钟程序打下基础。
- 教材章节:第3章 嵌入式编程基础4. 时间显示与设置:讲解时间的表示方法、时间设置与显示的实现,使学生掌握闹钟时间调整与显示功能的设计。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h> //头文件#include<intrins.h>#define uchar unsigned char //宏定义#define uint unsigned int//位定义sbit rs=P2^5; //液晶位定义sbit lcden=P2^7;sbit s1=P2^0; //时间功能切换按键sbit s2=P2^1; //按键加sbit s3=P2^3; //按键减sbit s4=P2^4; //闹钟功能切换键sbit rst=P1^5; //ds1302引脚定义sbit io=P1^6;sbit sclk=P1^7;sbit beep=P3^0; //蜂鸣器uchar num,count,shi,fen,miao,s1num,s2num,year,month,day,week,flag,flag1,year1,month1,day1,week1,shi1,fen1,miao1,year2,month2,day2,week2,shi2,fen2,miao2,year5,month5,day5,week5,shi5,fen5,miao5,wk,ashi,afen; //参数定义uchar code table[]="20 - - "; //液晶固定显示uchar code table1[]=" : : 00:00";/*uchar time_dat[7]={12,1,6,6,12,59,59}; //年周月日时分秒uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};*/void write_com(uchar com); //液晶写指令函数void write_data(uchar date); //液晶写数据函数void write_ds1302(uchar add,uchar dat); //ds1302芯片写指令函数void set_rtc(); //ds1302时间设置函数void time_pros(); //ds1302进制转换函数void read_rtc(); //ds1302读时间函数void alarm(); //闹钟函数void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void init() //初始化{lcden=0;flag=0;flag1=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80); //液晶固定显示,第一行 for(num=0;num<14;num++){write_data(table[num]);delay(5);}write_com(0x80+0x40); //液晶显示第二行for(num=0;num<20;num++){write_data(table1[num]);delay(5);}}void write_com(uchar com)//1602液晶写指令{rs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date)//1602液晶写写数据{rs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void write_sfm(uchar add,uchar date)//时分秒{uchar shi3,ge;shi3=date/10;ge=date%10;write_com(0x80+0x40+add);write_data(0x30+shi3);write_data(0x30+ge);}void write_nyr(uchar ad,uchar date)//年月日{uchar shi4,ge2;shi4=date/10;ge2=date%10;write_com(0x80+ad);write_data(0x30+shi4);write_data(0x30+ge2);}void write_week(uchar wk) //星期按西方星期设置星期天为第一天{write_com(0x80+11);switch(wk){case 1: write_data('S');delay(5);write_data('U');delay(5);write_data('N');break;case 2: write_data('M');delay(5);write_data('O');delay(5);write_data('N');break;case 3: write_data('T');delay(5);write_data('U'); delay(5);write_data('E'); break;case 4: write_data('W'); delay(5);write_data('E'); delay(5);write_data('D'); break;case 5: write_data('T'); delay(5);write_data('H'); delay(5);write_data('U'); break;case 6: write_data('F'); delay(5);write_data('R'); delay(5);write_data('T'); break;case 7: write_data('S'); delay(5);write_data('A'); delay(5);write_data('T'); break;}}void keyscan() //按键函数{if(s1==0){delay(5);if(s1==0){write_com(0x0f);s1num++; //记录按键次数flag=1;flag1=1;while(!s1);switch(s1num)//光标闪烁点定位{case 1:write_com(0x80+0x40+6); //秒break;case 2:write_com(0x80+0x40+3); //分break;case 3:write_com(0x80+0x40+0); //时break;case 4:write_com(0x80+11); //星期break;case 5:write_com(0x80+8); //日break;case 6:write_com(0x80+5); //月break;case 7:write_com(0x80+2); //年break;case 8:s1num=0;write_com(0x0c);//设置开显示光标不显示关闭时间设置set_rtc();flag=0;break;}}}if(s1num!=0) //按键加减{if(s2==0) //加按键函数{delay(10);if(s2==0){while(!s2);switch(s1num) //根据功能键相应次数做出调节{case 1: miao++; //秒加if(miao==60)miao=0;write_sfm(6,miao);write_com(0x80+0x40+6);break;case 2: fen++; //分加if(fen==60)fen=0;write_sfm(3,fen);write_com(0x80+0x40+3);break;case 3: shi++; //时加if(shi==24)shi=0;write_sfm(0,shi);write_com(0x80+0x40+0);break;case 4: week++; //星期加 if(week==8)week=1;write_week(week);write_com(0x80+11);break;case 5: day++; //日加if(day==32)day=1;write_nyr(8,day);write_com(0x80+8);break;case 6: month++; //月加if(month==13)month=1;write_nyr(5,month);write_com(0x80+5);break;case 7: year++; //年加 if(year==100)year=0;write_nyr(2,year);write_com(0x80+2);break;}}}if(s3==0) //减按键函数同上 {delay(10);if(s3==0){while(!s3);switch(s1num) //根据功能键相应次数做出调节{case 1: miao--;if(miao==-1)miao=59;write_sfm(6,miao);write_com(0x80+0x40+6);break;case 2: fen--;if(fen==-1)fen=59;write_sfm(3,fen);write_com(0x80+0x40+3);break;case 3: shi--;if(shi==-1)shi=23;write_sfm(0,shi);write_com(0x80+0x40+0); break;case 4: week--;if(week==-1)week=7;write_week(week);write_com(0x80+11);break;case 5: day--;if(day==-1)day=31;write_nyr(8,day);write_com(0x80+8);break;case 6: month--;if(month==-1)month=12;write_nyr(5,month);write_com(0x80+5);break;case 7: year--;if(year==-1)year=99;write_nyr(2,year);write_com(0x80+2);break;}}}}if(s4==0) //闹钟按键{delay(5);if(s4==0){write_com(0x0f); //光标闪烁s2num++; //记录按键次数flag=1;while(!s4);switch(s2num)//光标闪烁点定位{case 1:write_com(0x80+0x40+13); //分break;case 2:write_com(0x80+0x40+10); //时break;case 3:write_com(0x0c); //关闭闹钟设置 flag=0;s2num=0;break;}}}if(s2num!=0) //闹钟设置{if(s2==0) //闹钟加{delay(10);if(s2==0){while(!s2);switch(s2num) //根据功能键相应次数做出调节{case 1: afen++;if(afen==60)afen=0;write_sfm(13,afen);write_com(0x80+0x40+13);break;case 2: ashi++;if(ashi==24)ashi=0;write_sfm(10,ashi);write_com(0x80+0x40+10); break;}}}if(s3==0) //闹钟减{delay(10);if(s3==0){while(!s3);switch(s2num) //根据功能键相应次数做出调节 {case 1: afen--;if(afen==-1)afen=59;write_sfm(13,afen);write_com(0x80+0x40+13); break;case 2: ashi--;if(ashi==-1)ashi=23;write_sfm(10,ashi);write_com(0x80+0x40+10); break;}}}}}void wirte_ds1302_byte(uchar dat) //ds1302字节写{uchar i;for(i=0;i<8;i++){sclk=0;io=dat&0x01;dat=dat>>1;sclk=1;}}void write_ds1302(uchar add,uchar dat) //ds1302写函数{rst=0;_nop_();// 空操作sclk=0;_nop_();rst=1;_nop_();wirte_ds1302_byte(add);wirte_ds1302_byte(dat);rst=0;io=1;sclk=1;}uchar read_ds1302(uchar add) //ds1302读函数{uchar i,value;rst=0;_nop_();// 空操作sclk=0;_nop_();rst=1;_nop_();wirte_ds1302_byte(add);for(i=0;i<8;i++){value=value>>1;sclk=0;if(io){value=value|0x80;}sclk=1;}rst=0;_nop_();// 空操作sclk=0;_nop_();io=1;return value;}void set_rtc() //ds1302时间设置{write_ds1302(0x8e,0x00); //关写保护year1=year/10; //转换为十六进制year=year%10;year=year+year1*16;write_ds1302(0x8c,year);week1=week/10;week=week%10;week=week+week1*16;write_ds1302(0x8a,week);month1=month/10;month=month%10;month=month+month1*16;write_ds1302(0x88,month);day1=day/10;day=day%10;day=day+day1*16;write_ds1302(0x86,day);shi1=shi/10;shi=shi%10;shi=shi+shi1*16;write_ds1302(0x84,shi);fen1=fen/10;fen=fen%10;fen=fen+fen1*16;write_ds1302(0x82,fen);miao1=miao/10;miao=miao%10;miao=miao+miao1*16;write_ds1302(0x80,miao);write_ds1302(0x8e,0x80); //开写保护}void read_rtc() //从ds1302中读时间{year2=read_ds1302(0x8d);week2=read_ds1302(0x8b);month2=read_ds1302(0x89);day2=read_ds1302(0x87);shi2=read_ds1302(0x85);fen2=read_ds1302(0x83);miao2=read_ds1302(0x81);}void time_pros() //从ds1302中读出的时间转换为十进制{year5=year2/16;year2=year2%16;year2=year2+year5*10;month5=month2/16;month2=month2%16;month2=month2+month5*10;day5=day2/16;day2=day2%16;day2=day2+day5*10;shi5=shi2/16;shi2=shi2%16;shi2=shi2+shi5*10;fen5=fen2/16;fen2=fen2%16;fen2=fen2+fen5*10;miao5=miao2/16;miao2=miao2%16;miao2=miao2+miao5*10;}void display() //显示函数{write_sfm(6,miao2);write_com(0x80+0x40+6);write_sfm(3,fen2);write_com(0x80+0x40+3);write_sfm(0,shi2);write_com(0x80+0x40+0);write_week(week2);write_com(0x80+11);write_nyr(8,day2);write_com(0x80+8);write_nyr(5,month2);write_com(0x80+5);write_nyr(2,year2);write_com(0x80+2);if((ashi==shi2)&&(afen==fen2)){alarm();}}void alarm() // 闹钟{beep=0;delay(1000);beep=1;}void main() //主函数{init(); //初始化 while(1){keyscan(); //按键函数if(flag==0){keyscan();read_rtc();time_pros();display();}}}。