




已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数字电子钟课程设计1设计目的(1)熟悉单片机系统(2)熟悉单片机系统设计的方法和步骤 (3)熟悉单片机系统设计的应用软件(uVISION和proteus)2设计要求(1)用8段LED或LCD显示屏动态显示,内容包括日期(年,月,日)和时间 (时、分、秒),时间显示误差小于1秒/分。(2)可通过按键设定时间和日期。(3)显示状态稳定,清晰,设定时不应中断显示。(4)采用MCS-51单片机系统设计。 (5)设计语言:汇编或C51。3设计步骤 (1)用proteus软件画出数字时钟图(2)用uVsion软件编写软件(3)在数字时钟图上仿真,实现上述功能4完成时间时间:4月11日-5月9日5上交材料(5月13日)课程设计报告:纸质一份(见模板),电子版一份(附源程序)6纸质报告模板如下: 信息科学与工程学院课程设计报告( 20 20 学年 第 学期 )题 目 基于CVI的数字PID控制系统的工程设计与参数 院(系、部) 课 程 名 称 专 业 年 级 学 号 姓 名 年 月 日题目X电气X班 学号:XX 日期:XXX 一、引言 本系统是基于单片机制作的数字电子钟。二、设计内容及要求 (1) 显示准确的北京时间(时、分、秒),可用24小时制式;(2) 随时可以调校时间。(3) 增加公历日期显示功能(年、月、日),年号只显示最后两位;(4) 随时可以调校年、月、日;(5) 允许通过转换功能键转换显示时间或日期。(6) 所有按键需要通过串口自发自收来调校各种功能 三、硬件设计(1)、采用6位LED数码管显示日期或者时间。(2)、显示器的驱动可采用“静态显示驱动”(如7段译码/锁存/驱动芯片CD4511);也可采用“动态扫描驱动”,但后者比前者所需驱动电流要大。(3)显示部分也可采用液晶,但液晶成本较高。(4)、键盘的按键数目较多时则采用行列式矩阵结构为好。“一键多用”的构思和设计能大为减少按键的数目。 (5)、整体设计上应考虑其结构简单操作简便布局美观成本低廉。 四、软件设计(1)、“时钟”基准时间由单片机内部的定时中断提供,定时时间应是“秒”的整除数,且长短适宜。最长不能超过16位定时器的最长定时时间;最短不能少于中断服务程序的执行时间。通常来说基准时间越短,越有利于提高时钟的运行精确度。(2)、用一个计数器对定时中断的次数进行计数,可实现“秒”定时,同理可以进行“分”“时”定时,以及“日”“月”“年”定时。(3)、LED 数码管显示器采用“动态扫描驱动”时要注意的是:驱动信号的维持时间必须大于“起辉时间”(电流大起辉时间短),而驱动信号的间歇时间必须小于“余辉时间”(电流大余辉时间长),但驱动电流大小受硬件电路能力和LED数码管极限功耗的制约。(4)、动态扫描显示方式在更新显示内容时,因LED数码管余辉的存在可能会造成显示字符的模糊,新内容写入显示器之前须将所有的LED数码管熄灭。五、总结由于该大作业是用汇编语言写的,很多语句掌握都不是很牢固,但是经过这么长时间的实验,我基本掌握了部分汇编语言的用法,特别是实验中经常用到的按键查询,跳转语句,以及汇编的方法。 刚开始的时候,我什麽都不懂,根本不知怎样入门,后来查找了一些系统资料,渐渐有了些了解,才开始写自己的程序。虽然如此,中间还是遇到过不少困难,不如些按键查询的时候,仿真不出来,不知道哪里出错了,也不知道是不是程序有问题,后来在小组成员的帮助下,终于找到问题所在,通过不断的琢磨,后来终于实现了老师的要求的基本功能,七、附录 (1)电路图(2)流程图 A. 主程序流程图 b. 显示模式调整流程图 c. TO中断子程序 d. 日历子程序 f. 显示流程图 g.串口自发自收: (3)源程序/*08电气A 0815311004 蔡锋*/( main.c)#include #include #include delay.h#include display.h#include clock.h#include getkeynum.h#include week.h#include moon.h#define uchar unsigned char#define uint unsigned intsbit led1=P31;/灯1 led1=0;24小时模式开关1/0 绿sbit led2=P36;/灯2 led2=0;闹钟关/开 1/0 黄sbit led3=P37;/灯3 led3=0;shift0/11/0 红uchar key_num,key_flage,key_temp,min_wei,hour_wei,ok;uint count3,hai;uchar num,mode;/按键返回值,模式状态uchar hour2,minutes2,second2;/闹铃设置时间存储区uchar hour1,minutes1,second1,year1,mon1,day1;/修改时间时暂存区uchar time_24_flage,day_24;/24小时模式存储区uchar min3,sec3,mm3;/秒表值uchar hour4,min4,sec4;/倒计时值bit hour_set,minute_set,second_set,year_set,mon_set,day_set;/修改相应时的位标志bit add,dec;/加减位标志 bit shift,speed,beeing,begin,stop;/第二功能键参数,单/24倍速,闹钟开关,倒计时开始停止键,秒表开始停止键void inital(void)/定时器初始化函数 TMOD=0x11; /定时器0,1工作于方式1,采用12M晶振,定时0为20ms,定时1为0.5ms TH0=(65536-19998)/256; TL0=(65536-19998)%256; TH1=(65536-498)/256; TL1=(65536-498)%256; EA=1; ET1=0; ET0=1; TR1=0; TR0=1;void timer0 (void) interrupt 1 using 1 /定时0中断函数 TH0=(65536-19998)/256; TL0=(65536-19998)%256; count+;if(speed=0)hms();elsehms_24(); if(min=0)&(sec=0)fm=0; elseif(min=0)&(sec=2)fm=1; if(beeing=1) if(hour=hour2)&(min=minutes2)&(sec=second2)fm=0; if(fm=0)if(hour4)fm=1;else if(hour*60*60+min*60+sec)-(hour2*60*60+minutes2*60+second2)4)fm=1; elseif(beeing=0)fm=1;if(time_24_flage=1)if(hour=hour_24)&(min=min_24)&(sec=sec_24)&(day!=day_24) hour_241=hour;min_241=min;sec_241=sec;time_out=1;fm=0;if(fm=0)if(hour48)fm=1;else if(hour*60*60+min*60+sec)-(hour_24*60*60+min_24*60+sec_24)48)fm=1; void time1() interrupt 3 TH1=(65536-498)/256; TL1=(65536-498)%256; count3+;if(speed=0)if(stop=1) if(count3=20)count3=0;if(mm3=99)mm3=0;if(sec3=59)sec3=0;if(min3=59)min3=0;elsemin3+;elsesec3+;elsemm3+;if(begin=1) if(count3=2000)count3=0;if(sec4=0)if(min_wei=0)sec4=0;elsesec4=59;if(min4=0)if(hour_wei=0) min4=0;elsemin4=59;if(hour4=0)hour4=0;elsehour4-;if(hour4=0) hour_wei=0;elsemin4-;if(min4=0)&(hour_wei=0) min_wei=0;elsesec4-;elseif(speed=1)if(stop=1) if(count3=1)count3=0;if(mm3=99)mm3=0;if(sec3=59)sec3=0;if(min3=59)min3=0;elsemin3+;elsesec3+;elsemm3+;if(begin=1) if(count3=82)count3=0;if(sec4=0)if(min_wei=0)sec4=0;elsesec4=59;if(min4=0)if(hour_wei=0) min4=0;elsemin4=59;if(hour4=0)hour4=0;elsehour4-;if(hour4=0) hour_wei=0;elsemin4-;if(min4=0)&(hour_wei=0) min_wei=0;elsesec4-;void resettime (void) ok=0; hour1=hour; minutes1=min; second1=sec;while(mode=5) num=getkeynum(hour1,minutes1,second1); if(key_flage=1)switch(num)case 0: add=1;dec=0;/加break;case 1: dec=1;add=0;/减break;case 2: hour_set=1;minute_set=0;second_set=0;/时设置break;case 3: hour_set=0;minute_set=1;second_set=0;/分设置break;case 4: hour_set=0;minute_set=0;second_set=1;/秒设置break; case 5: hour1=0;minutes1=0;second1=0;/清零break;case 6: ok=1;/确定break;case 7: mode=0;/返回显示时分秒break;default:break; if(hour_set=1) if (add=1) hour1+;add=0; if( hour1=24) hour1=0; if (dec=1) hour1-;dec=0; if (hour1=-1) hour1=23; else if(minute_set=1) if (add=1) minutes1+;add=0; if (minutes1=60) minutes1=0; if(dec=1) minutes1-;dec=0; if (minutes1=-1) minutes1=59; else if(second_set=1) if (add=1) second1+;add=0; if(second1=60) second1=0; if (dec=1) second1-;dec=0; if(second1=-1) second1=59; if(ok=1) /当确定被按下时,表明重设时间要覆盖原来的时间 hour=hour1; min=minutes1; sec=second1;/count=0;mode=0;ok=0; display(hour1,minutes1,second1);void resetday (void) uchar yearyear1,year1_flage;ok=0;year1=year;mon1=mon;day1=day;while(mode=4) num=getkeynum(year1,mon1,day1); if(key_flage=1)switch(num)case 0: add=1;dec=0;/加break;case 1: dec=1;add=0;/减break;case 2: year_set=1;mon_set=0;day_set=0;/年设置break;case 3: year_set=0;mon_set=1;day_set=0;/月设置break;case 4: year_set=0;mon_set=0;day_set=1;/日设置break;case 5: year1=0;mon1=0;day1=0;/清零break;case 6: ok=1;/确定break;case 7: mode=1;/返回显示年月日break;default:break;yearyear1=year1%4;if (yearyear1=0) year1_flage=1;else year1_flage=0; if(year_set=1) if (add=1) year1+;add=0; if(year1=100) year1=0; if (dec=1) year1-;dec=0; if (year1=-1) hour1=99; else if(mon_set=1) if (add=1) mon1+;add=0; if (mon1=13) mon1=1; if(dec=1) mon1-;dec=0; if (mon1=0) mon1=12; else if(day_set=1) if(mon1=2)&(year1_flage=1) if (add=1) day1+;add=0;if(day1=30) day1=1;if (dec=1) day1-;dec=0;if(day1=0) day1=29;if(mon1=2)&(year1_flage=0) if (add=1) day1+;add=0;if(day1=29) day1=1;if (dec=1) day1-;dec=0;if(day1=0) day1=28;if(mon1=4)|(mon1=6)|(mon1=9)|(mon1=11) if (add=1) day1+;add=0;if(day1=31) day1=1;if (dec=1) day1-;dec=0;if(day1=0) day1=30;if(mon1=1)|(mon1=3)|(mon1=5)|(mon1=7)|(mon1=8)|(mon1=10)|(mon1=12) if (add=1) day1+;add=0;if(day1=32) day1=1;if (dec=1) day1-;dec=0;if(day1=0) day1=31; if(ok=1) /当确定被按下时,表明重设时间要覆盖原来的时间 year=year1; mon=mon1; day=day1;mode=1;ok=0; display(year1,mon1,day1);void resetbee (void) ok=0; hour1=hour2; minutes1=minutes2; second1=second2;while(mode=8) num=getkeynum(hour1,minutes1,second1); if(key_flage=1)switch(num)case 0: add=1;dec=0;/加break;case 1: dec=1;add=0;/减break;case 2: hour_set=1;minute_set=0;second_set=0;/时设置break;case 3: hour_set=0;minute_set=1;second_set=0;/分设置break;case 4: hour_set=0;minute_set=0;second_set=1;/秒设置break;case 5: hour1=0;minutes1=0;second1=0;/清零break;case 6: ok=1;/确定break;case 7: mode=0;/返回显示时分秒break;default:break; if(hour_set=1) if (add=1) hour1+;add=0; if( hour1=24) hour1=0; if (dec=1) hour1-;dec=0; if (hour1=-1) hour1=23; else if(minute_set=1) if (add=1) minutes1+;add=0; if (minutes1=60) minutes1=0; if(dec=1) minutes1-;dec=0; if (minutes1=-1) minutes1=59; else if(second_set=1) if (add=1) second1+;add=0; if(second1=60) second1=0; if (dec=1) second1-;dec=0; if(second1=-1) second1=59; if(ok=1) /当确定被按下时,表明重设时间要覆盖原来的时间 hour2=hour1; minutes2=minutes1; second2=second1;mode=0;ok=0; display(hour1,minutes1,second1);void stopwatch()ok=0;min3=0;sec3=0;mm3=0;count3=0;while(mode=7) num=getkeynum(min3,sec3,mm3); if(key_flage=1)switch(num)case 0: stop=1;/确定break;case 1: stop=0;/停止break;case 2: min3=0;sec3=0;mm3=0;/清零break;case 3: break;case 4: break;case 5: break;case 6: break;case 7: ET1=0;TR1=0;count3=0;mode=0;/返回显示时分秒break;default:break; if(stop=1) ET1=1; TR1=1; else ET1=0; TR1=0;count3=0; display(min3,sec3,mm3);void resetcountdown() ok=0; hour1=hour4; minutes1=min4; second1=sec4;while(mode=9)key_flage=0; num=getkeynum(hour1,minutes1,second1); if(key_flage=1)switch(num)case 0: add=1;dec=0;/加break;case 1: dec=1;add=0;/减break;case 2: hour_set=1;minute_set=0;second_set=0;/时设置break;case 3: hour_set=0;minute_set=1;second_set=0;/分设置break;case 4: hour_set=0;minute_set=0;second_set=1;/秒设置break;case 5: hour_set=0;minute_set=0;second_set=0;ok=1;/确认按键break;case 6: if(begin=0)ok=2;begin=1;/开始停止倒计时按键elsebegin=0;break;case 7: ET1=0;TR1=0;count3=0;ok=0;mode=0;/返回显示时分秒break;default:break; if(hour_set=1) ok=0; if (add=1) hour1+;add=0; if( hour1=24) hour1=0; if (dec=1) hour1-;dec=0; if (hour1=-1) hour1=23; else if(minute_set=1) ok=0; if (add=1) minutes1+;add=0; if (minutes1=60) minutes1=0; if(dec=1) minutes1-;dec=0; if (minutes1=-1) minutes1=59; else if(second_set=1) ok=0; if (add=1) second1+;add=0; if(second1=60) second1=0; if (dec=1) second1-;dec=0; if(second1=-1) second1=59; if(ok=1) /当确定被按下时,表明重设时间要覆盖原来的时间 hour4=hour1; min4=minutes1; sec4=second1;if(hour4=0)hour_wei=0;elsehour_wei=1;if(hour_wei=0)&(min4=0)min_wei=0;elsemin_wei=1; if(begin=1) ET1=1; TR1=1; else if(begin=0)ET1=0; TR1=0;count3=0; if(ok=0)display(hour1,minutes1,second1); elseif(ok=2)|(ok=1)display(hour4,min4,sec4); void time_24(void)if(time_24_flage=0)led1=0;time_24_flage=1;hour_24=hour;min_24=min;sec_24=sec;day_24=day;elseled1=1;time_24_flage=0;time_out=0;mode=0;void time_init(void)year=11;mon=5;day=13 ;hour=8;min=0;sec=0;hour2=8;minutes2=5;second2=0;/* 主函数 */*/void main() fm=1; led1=1; led2=1; led3=1; speed=0;/ speed=1;/for(hai=300;hai0;hai-) hello(); display(hour,min,sec); time_init(); inital(); / 初始化 while(1) hour_set=0;minute_set=0;second_set=0;year_set=0;mon_set=0;day_set=0; num=getkeynum(hour,min,sec); /调用键扫描,确定功能 if(key_flage=1)switch(num)case 0: if(shift=0)shift=1;led3=0;elseshift=0;led3=1;break;case 1: if(mode!=0)mode=0;/显示时分秒else if(mode!=1)mode=1;/显示年月日break;case 2: if(mode!=2)mode=2;/显示星期时分else if(mode!=3)mode=3;/显 示农历年月日break;case 3: if(shift=0)mode=4;/修改年月日if(shift=1)mode=5;/修改时分秒break;case 4: if(shift=0)mode=6;/24时钟if(shift=1)mode=7;/秒表break;case 5: if(shift=0)mode=8;/设置闹钟if(shift=1)mode=9;/倒计时break;case 6: if(beeing=0)beeing=1;led2=0;/开启闹钟elsebeeing=0;led2=1;/关闭闹钟break;case 7: if(speed=0)speed=1;/24倍速elsespeed=0;/1倍速break;default:break;switch(mode)case 0: display(hour,min,sec);break;case 1: display(year,mon,day);break;case 2: get_week(year,mon,day);display(week,hour,min);break;case 3: Conversion_date(year,mon,day);display(year_moon,month_moon,day_moon);break;case 4: resetday();break;case 5: resettime();break;case 6: time_24();break;case 7: stopwatch();break;case 8: resetbee();break;case 9: resetcountdown();break;default:break; /*08电气A 0815311004 蔡锋*/ (clock)#ifndef _clock_H#define _clock_H#include delay.h#define uchar unsigned char#define uint unsigned intuintcount;ucharxiuzheng;sbit fm=P23;/蜂鸣器 fm=1;uchar year,mon,day,hour,min,sec,year_flage;/* 说明:时分秒自动加减函数* 调用函数:ymd()* 输入:count* 输出:hour,min,sec*/void hms();/* 说明:时分秒自动加减函数24倍速* 调用函数:ymd()* 输入:count* 输出:hour,min,sec*/void hms_24();/* 说明:二月函数* 调用函数:无* 输入:day,year_flage* 输出:mon,day*/void feb();/* 说明:大月函数* 调用函数:无* 输入:day* 输出:mon,day*/void big_mon();/* 说明:小月函数* 调用函数:无* 输入:day* 输出:mon,day*/void min_mon();/* 说明:年月日自动加减函数* 调用函数:无* 输入:mon* 输出:year,mon,day,year_flage*/void ymd();void hms()if (count=50)count=0;sec+;if (sec=60)min+;if (min=60)hour+;if (hour=24)ymd();hour=0; min=0;sec=0;void hms_24()if(xiuzheng=23)if (count=4)xiuzheng=0;count=0;sec+;if (sec=60)min+;if (min=60)hour+;if (hour=24)ymd();hour=0; min=0;sec=0;else if (count=2)xiuzheng+;coun
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届新疆伊犁州英语九上期末质量检测试题含解析
- 2026届内蒙古伊金霍洛旗英语九上期末质量跟踪监视试题含解析
- 2025年风力发电运维值班员(技师)职业技能鉴定考试题库含答案
- 2025年教师资格考试高中面试美术试题及解答参考
- 广东省广州市华南师范大附属中学2026届九年级英语第一学期期末预测试题含解析
- 山东菏泽郓城2026届九年级英语第一学期期末复习检测模拟试题含解析
- 湖北省恩施土家族苗族自治州2026届九年级化学第一学期期中教学质量检测试题含解析
- 2025年设备购销合同格式范文5篇
- 离婚子女抚养协议修订版:费用调整及监护权调整文本
- 2026届山东省临沂市沂水县英语九年级第一学期期末达标检测模拟试题含解析
- 2025至2030中国电动汽车用电动机行业项目调研及市场前景预测评估报告
- 2025年福州房地产市场分析报告
- 诗词格律培训课件
- 《大学生心理健康教育》课程教案
- 音乐感知:从听觉到绘画
- 急诊icu管理制度
- 无人机操控技术 教案 3.2无人机模拟器基本设置
- T/CSBME 078-2024掌上超声仪临床应用规范
- T/CEMIA 012-2018光纤激光器用掺镱光纤
- T/BECA 0005-2023建筑垃圾再生回填材料
- 老年医学人才培训汇报
评论
0/150
提交评论