单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码要点

上传人:飞*** 文档编号:24946215 上传时间:2021-07-17 格式:DOCX 页数:32 大小:333.30KB
返回 下载 相关 举报
单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码要点_第1页
第1页 / 共32页
单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码要点_第2页
第2页 / 共32页
单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码要点_第3页
第3页 / 共32页
点击查看更多>>
资源描述
单片机课程设计报告基于单片机的数字时钟姓名: 班级: 学号:利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。功能要求:a)计时并显示(LED)。由于实验板上只有 4位数码管,可设计成显示“时分” 和显示“分秒”并可切换。b) 时间调整功能。利用 4个独立按钮,实现时钟调整功能。这4个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移 位(SHITF)。c) 定闹功能。利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动 作作为闹铃。d) 秒表功能。最小时间单位 0.01秒。硬件原理分析1 .电源部分电源通路0电源部份采用两种输入接口(如上图)。a)外电源供电,采用2.1电源座,可接入电源 DC5V,经单向保护D1接入开关 S1。b) USB供电,USB供电口输入电源也经 D1单向保护,送到开关 S1。注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。S1为板子工作电源开关,按下后接通电源,提供VCC给板子各功能电路。电路采用两个滤波电容,给板子一个更加稳定的工作电源。LED为电源的指示灯,通电后 LED灯亮。2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要 一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。 有源也可以当无源使用,而无源则不能当有源使用,当然用有源蜂鸣器作音乐发声会失真 厉害。如上图:单片机P15输出高低电平经 R21连接三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止, 蜂鸣器失电关闭蜂鸣。3.数码管电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。数码管的阴级由P0 口经过电阻限流连接。例如,要十位的数码管工作,P12输出0,使三极管 Q12导通,8脚得电,当P0 口相应位有输出。时,点亮相应的LED灯组合各种字符数字。4. 独立键盘如上图,由六个按键组成,每个按键的一端连接IO 口,另一端直接连接 GND (0电位)。六个按键分别接入 P37-P32,只要按下按键,相应位的 IO 口位将被拉为低电平(0), 程序可以判断相应位是否为 0来确认按键己按下。5. 动态显示动态显示驱动电路是单片机应用中最常用的显示方式。动态显示接口电路是把所有显示器的 8 个笔划段的同名段连在一起,而每一个显示器的公共极 COM 是各自独立地受I/O 线控制。 CPU 向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是哪个显示器亮,则取决于 COM 端。在轮流点亮扫描过程中, 每位显示器的点亮时间是极为短暂的 (约 1ms) , 但由于人眼的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。动态扫描显示必须由 CPU 不断地调用显示程序, 才能保证持续不断的显示。 在实际工作中,当然不可能只显示,这样在两次调用显示程序之间的时间间隔就不一定了,如果时间间隔比较长,就会使显示不连续。三、软件设计主程序将按键1设定为功能选择键,每按一次按键1,进入相应的功能模式。分秒显示1按下后,进入下一模式。分秒显示模式下,数码管显示时钟时间的分和秒。当按键时分显示1按下后,进入下一模式。时分显示模式下,数码管显示时钟时间的时和分。当按键时间调整时间调整按键34时十位减一按键4按键4时间调整模式下,仅调整时钟的时、分。数码管闪烁的为当前调整的位子,按键2为加,按键3为减,按键4为移位键。闹钟闹钟按键4闹钟模式下,可设置闹钟的时、分。数码管闪烁的为当前调整的位子,按键2为加,按键3为减,按键4为移位键。当闹钟时间调整完毕之后,按下按键5,确认闹钟时间。随后等待时钟时间到达闹钟时间。时钟时间到达闹钟时间后,蜂鸣器工作。秒表秒表模式下,按下按键 4,秒表开始计时;再次按下按键4,秒表暂停。按下按键2或按键3,秒表清零。四、软件调试在软件调试过程中碰到了很多问题。其中比较重要的几个问题如下:1、时钟调整子程序中,时、分的十位数、个位数加减不符合常识。比如在加减时,小时可以达到 27 、 28 等数值,而这是不符合常识的。在查看代码后发现, 可以在加、 减过程中设置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)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(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(pos=2)if(dispbufpos=0)dispbufpos=5;else dispbufpos-;else if(pos=3)if(dispbufpos=0)dispbufpos=9;else dispbufpos-;2、 秒表模式下, 无法很好地区分当前计时所达到的具体数值。 在秒的个位数位子设置一个小数点,使秒表的显示更加直观。修改后代码如下:在程序开始处,添加如下代码:unsigned char code segtab_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、 在秒表运行一遍后, 进入其他模式操作完毕, 再次进入秒表模式下发现秒表无法清 零。检查代码后发现,在闹钟模式下,进入秒表模式时,未对秒表清零。修改后代码如下: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 :时钟显示模式- 时、分模式 1 下,数码管显示时钟时间 - 时、分。按键说明:按键 1:选择下一模式。模式 2 :时钟调整模式模式 2 下,调整时钟时间,仅调整时、分时间。按键说明:按键1:选择下一模式。按键2:增加选中数码管的数值。按键3:减少选中数码管的数值。按键4:移位键,按键选择下一数码管。模式 3 :闹钟模式模式 3 下,设置闹铃时间之后,等时钟到达相应时间,发出铃声。按键说明:按键1:选择下一模式。按键2:增加选中数码管的数值。按键3:减少选中数码管的数值。按键4:移位键,按键选择下一数码管。按键5:设置闹铃时间后,按键确认,数码管显示当前时钟时间。模式 4 :秒表模式模式 4 为秒表模式,可记录0-59 秒。最小时间单位为 0.01 秒。按键说明:按键1:选择下一模式。按键2:清除秒表当前数值。按键3:清除秒表当前数值。按键4:开始、暂停秒表。*/*#include 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,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 int 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=(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=0xff;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_dotdispbufdispindex; 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=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:/ 显示分秒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=dispbuf0*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=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=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&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 减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=5)cnt2=0;miaobiao_ms+;if(miaobiao_ms=100)miaobiao_ms=0;miaobiao_ss+;if(miaobiao_ss=60)miaobiao_ss=0;dispbuf0=miaobiao_ss/10;dispbuf1=miaobiao_ss%10;dispbuf2=miaobiao_ms/10;dispbuf3=miaobiao_ms%10;五、 学习体会通过本次单片机课程设计,不仅加深了我对单片机理论课程知识的认识,而且通过将理论与实践相结合,使我真正地全面理解单片机的功能。在刚开始编程时,没有一点思路,通过 ftp 上所提供的例程,慢慢理清了思路、基本了解了程序大致需要那几部分,基本确定编程思想。在课程设计的整个过程中也遇到了很多问题,但本着遇到问题解决问题的原则,通过查找资料和询问老师、同学的办法,基本解决了所遇到问题。整个课程设计过程学到了不少通过理论学习没法学到的东西,真正增强了自己的能力。课程设计的三天时间,虽然辛苦但是收获巨大。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 其他分类 > 其它学术


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!