




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机课程设计报告基于单片机的数字时钟姓名: 班级: 学号:利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。功能要求:a)计时并显示(LED)。由于实验板上只有 4位数码管,可设计成显示“时分” 和显示“分秒”并可切换。b) 时间调整功能。利用 4个独立按钮,实现时钟调整功能。这4个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移 位(SHITF)。c) 定闹功能。利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动 作作为闹铃。d) 秒表功能。最小时间单位 0.01秒。硬件原理分析1 .电源部分电源通路0电源部份采用两种输入接口(如上
2、图)。a)外电源供电,采用2.1电源座,可接入电源 DC5V,经单向保护D1接入开关 S1。b) USB供电,USB供电口输入电源也经 D1单向保护,送到开关 S1。注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。S1为板子工作电源开关,按下后接通电源,提供VCC给板子各功能电路。电路采用两个滤波电容,给板子一个更加稳定的工作电源。LED为电源的指示灯,通电后 LED灯亮。2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要 一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。 有源也可以当无源使用,而无源则不能当有源使用
3、,当然用有源蜂鸣器作音乐发声会失真 厉害。如上图:单片机P15输出高低电平经 R21连接三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止, 蜂鸣器失电关闭蜂鸣。3.数码管电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。数码管的阴级由P0 口经过电阻限流连接。例如,要十位的数码管工作,P12输出0,使三极管 Q12导通,8脚得电,当P0 口相应位有输出。时,点亮相应的LED灯组合各种字符数字。4. 独立键盘如上图,由六个按键组成,每个按键的一端连接IO 口,另一端直接连接 GND
4、(0电位)。六个按键分别接入 P37-P32,只要按下按键,相应位的 IO 口位将被拉为低电平(0), 程序可以判断相应位是否为 0来确认按键己按下。5. 动态显示动态显示驱动电路是单片机应用中最常用的显示方式。动态显示接口电路是把所有显示器的 8 个笔划段的同名段连在一起,而每一个显示器的公共极 COM 是各自独立地受I/O 线控制。 CPU 向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是哪个显示器亮,则取决于 COM 端。在轮流点亮扫描过程中, 每位显示器的点亮时间是极为短暂的 (约 1ms) , 但由于人眼的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同
5、时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。动态扫描显示必须由 CPU 不断地调用显示程序, 才能保证持续不断的显示。 在实际工作中,当然不可能只显示,这样在两次调用显示程序之间的时间间隔就不一定了,如果时间间隔比较长,就会使显示不连续。三、软件设计主程序将按键1设定为功能选择键,每按一次按键1,进入相应的功能模式。分秒显示1按下后,进入下一模式。分秒显示模式下,数码管显示时钟时间的分和秒。当按键时分显示1按下后,进入下一模式。时分显示模式下,数码管显示时钟时间的时和分。当按键时间调整时间调整按键34时十位减一按键4按键4时间调整模式下,仅调整时钟的时、分。
6、数码管闪烁的为当前调整的位子,按键2为加,按键3为减,按键4为移位键。闹钟闹钟按键4闹钟模式下,可设置闹钟的时、分。数码管闪烁的为当前调整的位子,按键2为加,按键3为减,按键4为移位键。当闹钟时间调整完毕之后,按下按键5,确认闹钟时间。随后等待时钟时间到达闹钟时间。时钟时间到达闹钟时间后,蜂鸣器工作。秒表秒表模式下,按下按键 4,秒表开始计时;再次按下按键4,秒表暂停。按下按键2或按键3,秒表清零。四、软件调试在软件调试过程中碰到了很多问题。其中比较重要的几个问题如下:1、时钟调整子程序中,时、分的十位数、个位数加减不符合常识。比如在加减时,小时可以达到 27 、 28 等数值,而这是不符合常
7、识的。在查看代码后发现, 可以在加、 减过程中设置if 函数判断当前所处位置, 调整当前数值所能达到的最大值或最小值。修改后代码如下:按键 2 加else if(keyval=0xbf) /if(pos=0)dispbufpos+;if(dispbufpos=3)dispbufpos=0;else if(pos=1)if(dispbuf0=0|dispbuf0=1) dispbufpos+;dispbufpos=dispbufpos%10;if(dispbuf0=2)dispbufpos+;if(dispbufpos>=4)dispbufpos=0;else if(pos=2)dispb
8、ufpos+;if(dispbufpos=6) dispbufpos=0;else if(pos=3)dispbufpos+;dispbufpos=dispbufpos%10;else if(keyval=0xdf) /按键 3 减if(pos=0)if(dispbufpos=0)dispbufpos=2;else dispbufpos-;else if(pos=1)if(dispbuf0=0|dispbuf0=1)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;if(dispbuf0=2)if(dispbufpos>=4&&d
9、ispbufpos<=9)dispbufpos=3;else if(dispbufpos=0)dispbufpos=3;elsedispbufpos-;else if(pos=2)if(dispbufpos=0)dispbufpos=5;else dispbufpos-;else if(pos=3)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;2、 秒表模式下, 无法很好地区分当前计时所达到的具体数值。 在秒的个位数位子设置一个小数点,使秒表的显示更加直观。修改后代码如下:在程序开始处,添加如下代码:unsigned char code se
10、gtab_dot=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;/ 带小数点的数码管代码在 void t0int(void) interrupt 1 using 1之中添加如下代码:if(mode=4&&P1=0xfd)/ 秒表处显示小数点的 if 语句P0=segtab_dotdispbufdispindex;elseP0=segtabdispbufdispindex;3、 在秒表运行一遍后, 进入其他模式操作完毕, 再次进入秒表模式下发现秒表无法清 零。检查代码后发现,在闹钟模式下,进入秒表模式时,未对秒表清零。修改后代
11、码如下:if(keyval=0x7f)/1 号按键 模式 进入秒表模式 mode=4;old_ss=0;old_ms=0;miaobiao_ss=old_ss;miaobiao_ms=old_ms;dispbuf0=miaobiao_ss/10;dispbuf1=miaobiao_ss%10;dispbuf2=miaobiao_ms/10;dispbuf3=miaobiao_ms%10;clocksing=0;附完整实验代码:,*基于单片机的数字时钟功能:时钟、闹钟、秒表模式 0 :时钟显示模式-分、秒模式 0 下,数码管显示时钟时间 - 分、秒。按键说明:按键 1:选择下一模式。模式 1 :
12、时钟显示模式- 时、分模式 1 下,数码管显示时钟时间 - 时、分。按键说明:按键 1:选择下一模式。模式 2 :时钟调整模式模式 2 下,调整时钟时间,仅调整时、分时间。按键说明:按键1:选择下一模式。按键2:增加选中数码管的数值。按键3:减少选中数码管的数值。按键4:移位键,按键选择下一数码管。模式 3 :闹钟模式模式 3 下,设置闹铃时间之后,等时钟到达相应时间,发出铃声。按键说明:按键1:选择下一模式。按键2:增加选中数码管的数值。按键3:减少选中数码管的数值。按键4:移位键,按键选择下一数码管。按键5:设置闹铃时间后,按键确认,数码管显示当前时钟时间。模式 4 :秒表模式模式 4 为
13、秒表模式,可记录0-59 秒。最小时间单位为 0.01 秒。按键说明:按键1:选择下一模式。按键2:清除秒表当前数值。按键3:清除秒表当前数值。按键4:开始、暂停秒表。*/*#include <reg52.h>unsigned char dispbuf4=0,0,0,0;unsigned char code segtab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/ 不带小数点的数码管代码unsigned char code segtab_dot=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78
14、,0x00,0x10;/ 带小数点的数码管代码unsigned char code bittab=0xfe,0xfd,0xfb,0xf7;unsigned char dispindex;unsigned char mode;unsigned char pos;unsigned char keyval;unsigned char hh,mm,ss;unsigned char miaobiao_ms=0,miaobiao_ss=0; / 秒表unsigned char old_ms,old_ss;/ 保存秒表时间unsigned char clock_hh,clock_mm;unsigned in
15、t clock_shanshuo;闪烁sbit clocksing=P1A5;/ 用于存放所设闹钟时间/ 用于控制闹钟调整时间时是否闪烁0 : 闪烁 1 : 不闹钟所用蜂鸣器unsigned int cnt;unsigned char cnt1;unsigned char cnt2;/用于10ms转1s计数用于10ms转0.5s处计数(用于闪烁)用于秒表处计时unsigned char keyscan(void);void delay(unsigned int t);void keypro(void);bit flash;/*主函数 */void main(void)TMOD=0x11;TH0
16、=(0-2000)/256;TL0=(0-2000)%256;ET0=1;TR0=1;TH1=(0-2000)/256;TL1=(0-2000)%256;ET1=1;TR1=0;/ 秒表 先不开EA=1;mode=0;hh=02;mm=03;ss=15;while(1)if(mode=3)if(hh=clock_hh)if(mm=clock_mm)clocksing=0;elseclocksing=1; else clocksing=1;if(keyscan()=0xff) continue; keypro();/*键扫描程序*/unsigned char keyscan(void) P3=0
17、xff;keyval=P3;if(keyval=0xff) return 0xff;delay(10000);if(keyval!=P3)return 0xff;elsewhile(P3!=0xff);return keyval;/*时钟中断及显示程序*/void t0int(void) interrupt 1 using 1 TH0=(0-2000)/256;TL0=(0-2000)%256;/2msP0=0xff;P1=0xff;P1=bittabdispindex;if(mode=4&&P1=0xfd)/秒表处显示小数点的if 语句(P0=segtab_dotdispbu
18、fdispindex; else (P0=segtabdispbufdispindex;if(dispindex=pos)&&(flash=1)&&(mode=2|(mode=3&&clock_shanshuo=0) /闪烁控制程序(P0=0xff;P1=0xf0;dispindex+;dispindex=dispindex&0x03;cnt+;cnt1+;if(cnt1>=250)/0.5ms 闪烁( cnt1=0; flash=flash;if(cnt>=500)/2ms*500=1s( cnt=0; ss+; if(ss
19、>=60) ( ss=0; mm+; if(mm>=60) ( mm=0; hh+; if(hh>=24) (hh=0;if(mode=0)dispbuf0=mm/10;dispbuf1=mm%10;dispbuf2=ss/10;dispbuf3=ss%10;else if(mode=1|(mode=3&&clock_shanshuo=1)dispbuf0=hh/10;dispbuf1=hh%10;dispbuf2=mm/10;dispbuf3=mm%10;/*按键选择,进入不同模式*/void keypro(void)switch(mode)case 0:/
20、 显示分秒if(keyval=0x7f)mode=1;dispbuf0=hh/10;dispbuf1=hh%10;dispbuf2=mm/10; dispbuf3=mm%10; break;case 1:/ 显示时分if(keyval=0x7f)mode=2;dispbuf0=hh/10;dispbuf1=hh%10;dispbuf2=mm/10;dispbuf3=mm%10;break;case 2:/ 时间调整 ( 只调整时分)if(keyval=0x7f) /按键 1 调整模式进入闹钟模式mode=3;clock_hh=0;clock_mm=0;clock_shanshuo=0;hh=d
21、ispbuf0*10+dispbuf1; / mm=dispbuf2*10+dispbuf3;dispbuf0=clock_hh/10;dispbuf1=clock_hh%10;dispbuf2=clock_mm/10;dispbuf3=clock_mm%10;TR0=1;保存调整后的时间/ 显示闹钟的初始时间else if(keyval=0xbf) /if(pos=0)按键 2dispbufpos+;if(dispbufpos=3)dispbufpos=0;else if(pos=1)if(dispbuf0=0|dispbuf0=1) dispbufpos+;dispbufpos=dispb
22、ufpos%10;if(dispbuf0=2)dispbufpos+;if(dispbufpos>=4)dispbufpos=0;else if(pos=2)dispbufpos+;if(dispbufpos=6)dispbufpos=0;else if(pos=3)dispbufpos+;dispbufpos=dispbufpos%10;else if(keyval=0xdf) /按键 3 减if(pos=0)if(dispbufpos=0)dispbufpos=2;else dispbufpos-;else if(pos=1)if(dispbuf0=0|dispbuf0=1)if(d
23、ispbufpos=0)dispbufpos=9;else dispbufpos-;if(dispbuf0=2)if(dispbufpos>=4&&dispbufpos<=9)dispbufpos=3;else if(dispbufpos=0)dispbufpos=3; else dispbufpos-;else if(pos=2)if(dispbufpos=0)dispbufpos=5;else dispbufpos-;else if(pos=3)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;else if(keyva
24、l=0xef) /按键 4 移位pos+;pos=pos&03; break;case 3: / 闹钟模式if(keyval=0x7f)/ 按键 1 调整模式进入秒表模式mode=4;old_ss=0;old_ms=0;miaobiao_ss=old_ss;miaobiao_ms=old_ms;dispbuf0=miaobiao_ss/10;dispbuf1=miaobiao_ss%10;dispbuf2=miaobiao_ms/10;dispbuf3=miaobiao_ms%10;else if(keyval=0xbf)/ 按键 2 加clock_shanshuo=0;if(pos=
25、0)dispbufpos+;if(dispbufpos=3)dispbufpos=0;else if(pos=1)if(dispbuf0=0|dispbuf0=1)dispbufpos+;dispbufpos=dispbufpos%10;if(dispbuf0=2)dispbufpos+;if(dispbufpos>=4)dispbufpos=0;else if(pos=2)dispbufpos+;if(dispbufpos=6)dispbufpos=0;else if(pos=3)dispbufpos+;dispbufpos=dispbufpos%10;else if(keyval=0
26、xdf)/ 按键 3 减clock_shanshuo=0;if(pos=0)if(dispbufpos=0)dispbufpos=2; else dispbufpos-;else if(pos=1)if(dispbuf0=0|dispbuf0=1)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;if(dispbuf0=2)if(dispbufpos>=4&&dispbufpos<=9)dispbufpos=3;else if(dispbufpos=0)dispbufpos=3;elsedispbufpos-;else if
27、(pos=2)if(dispbufpos=0)dispbufpos=5;else dispbufpos-;else if(pos=3)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;else if(keyval=0xef)/ 按键 4 移位clock_shanshuo=0;pos+;pos=pos&03;else if(keyval=0xf7) / 按键 5 设置闹钟时间clock_shanshuo=1;clock_hh=dispbuf0*10+dispbuf1; /保存所设闹钟时间clock_mm=dispbuf2*10+dispbuf3;dispbuf0=hh/10;dispbuf1=hh%10;dispbuf2=mm/10;dispbuf3=mm%10;break;case 4: / 秒表模式if(keyval=0x7f)/ 按键 1 调整模式进入时钟显示模式mode=0;TR1=0;/ 关闭秒表dispbuf0=mm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025辽宁鞍山市海城市人力资源和社会保障服务中心、海城市响堂街道办事处公益性岗位招聘5人考前自测高频考点模拟试题及答案详解(易错题)
- 2025江西交设工程咨询有限公司招聘劳务派遣岗位人员1人考前自测高频考点模拟试题及答案详解(全优)
- 2025年福建农信春季招聘149人考前自测高频考点模拟试题及答案详解(网校专用)
- 祖国的美好明天课件
- 2025内蒙合成化工研究所工艺技能岗位招聘5人考前自测高频考点模拟试题及答案详解(必刷)
- 祖国我们爱你课件
- 2025年中国钠离子电池负极材料行业发展策略、市场环境及前景研究分析报告
- 2025湖北武汉市汉口学院人力资源部职员招聘1人模拟试卷及答案详解(易错题)
- 滑膜炎课件教学课件
- 2025内蒙古赤峰市红山区崇文实验学校教师招聘14人模拟试卷参考答案详解
- 2025中国临床肿瘤学会CSCO非小细胞肺癌诊疗指南要点解读课件
- 客运管理工作
- 人教版小学三年级数学上册各单元测试卷含答案全套
- 初中地理跨学科主题学习设计与实施
- 人教版一年级上册数学期中试卷(共5套-可直接打印)
- CVD 碳化硅涂层产品技术要求
- 2024版以房抵债协议范本
- 马克思主义制度经济理论知到智慧树章节测试课后答案2024年秋上海财经大学
- 【部编】人教版六年级上册道德与法治全册知识点总结梳理
- 社区居家养老服务设计方案范文
- JT-T-1180.2-2018交通运输企业安全生产标准化建设基本规范第2部分:道路旅客运输企业
评论
0/150
提交评论