欢迎来到得力文库 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
得力文库 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    单片机课设--定时闹钟.doc

    • 资源ID:11355513       资源大小:572KB        全文页数:34页
    • 资源格式: DOC        下载积分:9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    单片机课设--定时闹钟.doc

    - -专业 XX 学号 指导教师 完成时间 单片机课程设计报告定时闹钟目 录摘要1关键字 1正文一、系统设计21.1设计目标21.2硬件设计21.3软件设计41.4三个模式间状态图51.5键盘控制程序走向流程图61.6 串口通信图 8二、实验结果与讨论9三、结论9参考文献附录111、程序源代码112、实物图20- word.zl- -摘要本设计采用ATMEL AT89C52MCU作为处理器核心,用数码管作为数据显示工具,蜂鸣器实现响铃功能,独立式键盘K20-K27控制时钟,串口用于设置时钟和闹钟时间来制作一个定时闹钟。秒数走位由MCU部11.0592MHz的晶振提供准确定时实现,并循环扫描,在数码管上显示。本设计的关键是键盘的动态扫描和按键消抖,难点是串口数据的传送和处理。本设计运用C51编程,由于C语言具有语法简单、代码简洁且执行效率高等优点,使得C语言广泛运用于各种程序设计的代码编辑工具中。运用C语言编程,增强了程序可读性;使得开发人员能够将精力用在如何设计程序上来,提高了开发效率。关键字: 单片机 动态扫描 按键消抖 C51编程正文一、 系统设计1.1设计目标利用动态数码管作为显示器,K20-K27作为输入按键,蜂鸣器作为声音输出制作一个定时闹钟。要求:1、正确显示时分。2、可以利用按钮调整时间和设定闹钟时间。3、当时间到达设定的闹钟时间时,蜂鸣器发出嘀、嘀、嘀的报警声。提示:利用定时器作为时间的基准。提高:通过串口在PC上设定时间和闹钟1.2硬件设计本设计中涉及到的硬件模块有C52、独立键盘、数码管、PC含keil软件、烧写工具、串口调试工具等1.2.1 C52核心处理器。对传送的各个指令和数据进展处理。供其他模块用到的主要引脚有:P0:送码值;P2:送位选信号,连接键盘;TXD、RXD:串口通信;P3.7:蜂鸣器1.2.2 独立键盘K20-K27键盘分为独立键盘和矩阵式键盘。扫描方法有逐行扫描法和行列翻转法。在本设计中用到的键盘是独立式键盘K20-K27,分别连接到MCU C52的P2口,采用逐行扫描法,又由于只有一行,故只需扫描一次即可。在键盘按键时,需要考虑到键盘消抖问题。键盘消抖分为硬件消抖和软件消抖。在本设计中,直接采用软件延时delay2(),到达消抖功能,代码不长,又节省硬件资源。独立键盘K20-K27连接到C52管脚P2和数码管。各键功能:K20:编辑时间,以递增方式控制时针数值,包括时钟和闹钟K21:编辑时间,以递增方式控制分针数值,包括时钟和闹钟K22:时钟模式切换到闹钟模式K23:退出闹钟模式,并保存闹钟时间,开启闹钟K24:时钟模式和秒数显示模式切换K25:未用到,供功能扩大使用K26:开闹钟K27:关闹钟1.2.3 数码管数码管用于显示当前时间,闹钟时间和秒数。数码管显示分为静态显示和动态显示。静态显示时,各数码管在显示过程中持续得到送显信号,与各数码管接口的I/O口线是专用的。静态显示需借助C52串口完成。动态显示时,各数码管在显示过程中轮流得到送显信号,与各数码管接口的I/O口线是共用的。在动态显示过程中,数码管常亮是通过循环扫描送显信号实现。本设计中用到的数码管为共阴极接法,阴极接位选信号,即C52 P2口,阳极接P0口,承受码值。时钟和闹钟模式下,显示时针数值和分针数值。秒数显示模式下,只有两个数码管亮,显示当前时间秒值。1.2.4 PC在PC端除了编辑软件Keil和烧写工具外,另一个很重要的工具就是串口调试工具。串口工具通过串口线与C52通信。PC端到C52传送数据,控制写当前时间和设置闹钟。C52到PC端传送数据,提示PC送到C52的数据有误,并在串口界面上显示字符串“error! ,供以提示。在PC端的串口工具选项设置与代码中串口设计参数匹配。波特率为9600,数据位8位,停顿位1位。采用十六进制Hex发送。根据上述硬件设计,有如下硬件间系统框图1。P2RXDTXDP3.7P0 C52串口工具数码管键盘蜂鸣器图1 系统框图1.3软件设计1.3.1时钟时钟设计有两个方案,一:利用程序计数延时定时;二:利用定时器定时。考虑到,程序定时不准确,误差大,而定时器c52部晶振提供的时钟,能够准确定时,所以,本设计采用定时器给各模块提供准确时钟。对于时钟,主要用在走秒,即定时器定时时间为1s,考虑到,设计中需要用到串口进展数据传送,而且对用C52,1s属于长定时,所以定时器采用定时器timer0。timer0工作在方式1,定时设置为50ms,即初始值为TH0=0x4c,TL0=0x01,再通过一个标志位flag来控制次数,初始值为20,那么定时时间刚好为1s。1.3.2 时间显示模式从设计要求看,本设计至少要涉及到两个模式:1时钟模式;2闹钟模式。时钟模式下,数码管实时显示当前时间,闹钟模式下,显示设置的闹钟时间,并且闹钟模式下,数码管显示的值闪烁,以区别于时钟模式,这样更易于区分这两种模式。这两个模式通过K22和K23来切换,K22从时钟模式进入闹钟模式,K23退出闹钟模式,并保存当前设置的闹钟时间,并置位闹钟状态位flag1=0flag1=0,开闹钟;flag1=1,关闹钟,此外,时钟、闹钟模式下均为可编辑状态,K20、K21分别控制时针数值和分针数值。为了更接近现实的时钟,本设计提供第三种模式-秒数显示模式。这个模式下,4个数码管只有两个亮,用来显示秒数值,通过键K24切换到此模式,和退出此模式,对于秒数,其控制权在定时器timer0,不提供编辑功能。1.3.3振铃此功能的实现主要依靠实验箱上的蜂鸣器,当当前时间到达闹钟时间时,RD=0,开场振铃,蜂鸣器响。本设计中,在振铃状态,提供关闹铃功能,通过K27关闹钟,置闹钟状态位flag1=1,关闹钟;假设是需要翻开闹钟,那么可按键K26,置flag1=0。1.3.4 串口此功能用于,在PC上通过串口工具,传送数据到C52,进而控制数码管值,即设置时间和闹钟。在实现串口功能,搭配用了定时器timer2,timer2工作于方式2,即8位自动重装。timer2作为波特率发生器,给串口提供数据传送速率。本设计中,波特率为9600,故timer2初始值为TH1=0xfd,TL1=0xfd。 在本设计中,在时钟模式和闹钟模式下,串口数据逐位传送,分别传给时针数值和分针数值。更具人性化的是,本设计提供错误提。当传送时针数值时,数据大于23,或传送分针数值时,数据大于59时,C52通过串口向PC传送错误提示“error! ,提示数据传送错误。1.3.5键盘扫描本设计中键盘采用独立键盘K20-K27。读取键盘值通过:P2=0xff;key_pressed=P2;key_pressed那么为读取到的键盘值,再匹配从而知道按了哪个键。在键盘扫描设计中,一个关键技术是键盘消抖。这里通过延时程序delay2()延时一段时间,再读取键盘值,判断是键盘抖动还是正常按下的值。1.4 三个模式间状态图K24K22秒显示状态闹钟模式时钟模式程序烧入RST复位K22K24图2 三个模式间转换状态图1.5 键盘控制程序走向流程图K23?K20?K21?otherValue?count_h=count_h+1count_m=count_m+1main()init()1clockModelvalue1=getKeyPressed()value2=getKeyPressed()Delay()value1=value2K26?Flag1=0K22?Delay()alarmClockModelvalue1=getKeyPressed()value2=getKeyPressed()value1=value2K24?Delay()secondModelvalue1=getKeyPressed()value2=getKeyPressed()value1=value2K24?YNK25?K21?count_m=count_m+1K20?K23?count_h=count_h+1K27?Flag1=1图3 键盘控制程序走向流程图图3中为表达的功能及操作有以下几点:1.5.1计数模块count()计数功能依靠定时器timer0的中断,定时1s,当前时间走1秒。1.5.2振铃模块music()该功能由蜂鸣器完成。置RD=0时,蜂鸣器响。此外蜂鸣器响有一个前提条件:振铃处于开状态,即标志flag1=0。1.5.3显示模块display()该功能显示当前时间或闹钟时间或秒数。控制条件有:标志CS:CS=0:显示当前时间时、分;CS=1:显示当前时间秒;CS=2:闹钟状态;标志flag2:控制闹钟状态下闪烁显示。1.6串口通信图送错误提示信息送时针、分针数值串口工具MCU显示数码管图4 串口通信图1.5.1串口向MCU送数据送时针值时,数值大小小于24,送分针数值,数值小于60。1.5.2MCU向串口送错误提示信息串口向MCU送数据不满足上述条件时,送“error! 提示信息。1.5.3数据显示假设串口传送的数据满足上述条件,那么在数码管上显示,否那么保持不变。2 实验结果与讨论2.1程序烧写通过烧写程序将源码烧到单片机中。数码管初始显示为00.00,与程序设置count_m,count_h吻合。2.2程序调试2.2.1按键K20和K21,时、分值分别增加,一直按着,那么时间持续变化。但不是很稳定,有待改良。2.2.2 按键K22,数码管进入闹钟编辑状态,并且显示数值交替闪烁。与程序设置if(flag2<=10 && CS=2)P2=0xff; elseif(flag2>=20)flag2=0;一致flag2在定时器中断中改变。2.2.3按键K23,退出闹钟编辑状态。保存当前闹钟设置值count_m_alarm=count_x; count_h_alarm=count_y,开启闹钟flag1=0。2.2.4按键K24,切换到秒显示状态。再按一次切回时钟模式。2.2.5按键K26,关闭闹钟;按键K27,开启闹钟。在当前时间时、分值与闹钟设置值匹配时,这两个键的功能吻合。2.3串口发送。翻开串口调试工具,选择端口,设置其它选项,分两次传送,如两次均发送十六进制数09,数码管显示值如附图6。假设设置时针值大于23,设置分针值大于59,那么提示错误,显示结果如附图7。3 结论3.1 综合上述所有描述,本设计完成了闹钟根本的功能。此外,添加了其他功能。如,本闹钟不仅可以显示时间时、分值,闹钟值,还可以显示秒数。具有闹钟开、关功能。对提高局部做了扩大,可以提示是否有数据设置错误。3.2 本设计很好地完成了闹钟设计,具有自己的特色。美中缺乏的是,通过键盘设置时钟时,数值不易把握;闹钟响时,声音比拟怪。3.3自我体会本次课程设计,加深了对理论知识的实践,学到了很多课堂上没有学到的知识。对单片机的了解和应用更深一层。课程设计往往具有一定的趣味性,更能激起大家的兴趣,对知识的深入理解只会是有百利而无一害。与课堂上讲的理论知识不同的是,课堂上都是采用汇编语言,而到了真正设计时,更多的是采用C语言编程,这样更加的简单,提高了开发的效率。参考文献1田希晖 薛亮儒.C51单片机技术教程M.,人民邮电.20072友德 志英 涂时亮.单片微型机原理、应用与实验(第五版)M,复旦大学.2006附录1、程序源代码#include<reg52.h>unsigned char count_s,count_m,count_h;/秒、分、时时间unsigned char count_x,count_y,count_m_alarm=0,count_h_alarm=23;/count_x,count_y记录当前时间; count_m_alarm=0,count_h_alarm=23:预置闹钟时间,同时用于保存闹钟设置unsigned char flag=0,flag1=0,flag2=0;/flag0: 中断时间=timer0初始值*flag;flag2: 控制闹钟状态下闪烁,区别于正常时钟模式unsigned char dis_duanma11=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/共阴码表unsigned char CS;/当前显示的计数段;CS=0:显示时、分,时钟状态; CS=1:显示秒数; CS=2:闹钟编辑状态;unsigned char tag=0;/串口输入数据,区别时、分unsigned char ERROR = "error! "/串口输入出错,提示字符串void display();void delay()/动态扫描延时unsigned int count_delay;for(count_delay=0;count_delay<=1000;count_delay+);void delay2()/按键消抖延迟unsigned int count_delay;for(count_delay=0;count_delay<=10000;count_delay+);void music() /蜂鸣器发声 if(flag1=0)RD=0;void count() /计数模块if(count_s>=59)count_s=0;if(count_m>=59)/>=:由于进位的原因count_m=0;if(count_h>=23)count_h=0;elsecount_h+;elsecount_m+;elsecount_s+;void IntT0()interrupt 1/定时器T0中断,计数TH0=0x4c;/重置初始值TL0=0x01;flag+;flag2+;if(flag=20)/timer0中断时间被乘数/中断次数,即中断时间到达,重置中断次数flag=0;count();else if(count_m!=count_m_alarm | count_h!=count_h_alarm)/当前时间与闹钟时间不匹配,表示不在闹钟状态,关闭蜂鸣器RD=1;else if(count_m=count_m_alarm && count_h=count_h_alarm)/当前时间与闹钟时间匹配,表示在闹钟状态,开启蜂鸣器music();void sendError()unsigned char i = 0; ES=0;for(i=0;i<7;i+)SBUF=ERRORi;while(!TI);TI=0; ES=1;void IntS() interrupt 4unsigned char serialData;if(RI=1)serialData = SBUF;if(tag=0)/时 if(serialData > 23)sendError();goto loop2; else if(tag=1)/分if(serialData > 59) sendError();goto loop2;if(CS=2)/闹钟状态 if(tag=0)/时 count_y = SBUF;tag+; else if(tag=1)/分 count_x = SBUF;tag = 0; else if(CS=0)/时钟状态if(tag=0)/时 count_h = SBUF;tag+; else if(tag=1)/分 count_m = SBUF;tag = 0; loop2:display();RI=0;void display() /显示译码;P0送码值;P2送位选信号(高四位P24-P27)if(flag2<=10 && CS=2) P2=0xff;elseif(flag2>=20)flag2=0;else if(CS=1)/显示秒状态,送秒数/下1P0=dis_duanmacount_x%10;P2=0x7f;delay();/下2P0=dis_duanmacount_x/10;P2=0xbf;delay();else/显示时分状态,送时、分/送分/下1P0=dis_duanmacount_x%10;P2=0x7f;delay();/下2P0=dis_duanmacount_x/10;P2=0xbf;delay();/送时/上2P0=dis_duanmacount_y%10+0x80;P2=0xdf;delay();/上1P0=dis_duanmacount_y/10;P2=0xef;delay(); void main() /主函数unsigned char key_pressed; /检测按键是否按下TMOD=0x21;/定时器方式存放器,timer1:工作方式2,配合串口;timer0工作方式1,16定时PS=0;/中断优先级存放器IP,PT0=1;/timer0中断优先级高于串口中断TH0=0x4c;/初始化方式1初始值,T=(12/fosc)*(216-a)us, TL0=0x01;/a=0x4501=19457d, T=0.05sTH1=0xfd;/初始化方式2,8位自动重装,初始值X=2n-(2SMOD*fosc/(32*波特率*12);TL1=0xfd;/波特率=9600SCON=0x50;/串口控制存放器,方式1,1+8+1位PCON=0x00;/电源控制存放器,SMOD=0,波特率不加倍EA=1;/中断允许存放器,允许中断ES=1;/串口中断允许ET0=1;/timer0中断允许TR0=1;/定时器控制存放器(TCON),启动timer0TR1=1;/启动timer1while(1)RD=1;/关闭蜂鸣器loop1:if(CS=1) /CS当前状态是显示秒还是时、分count_x=count_s;/将秒送给显示存放器count_y=0;else count_x=count_m; /送分给显示存放器(时钟状态模式)count_y=count_h; /送时给显示存放器display(); /调用显示子函数P2=0xff; /先写一再读取key_pressed=P2;/读取键盘值if(key_pressed & 0x01 )=0x00&& CS=0)/判断按下的按键是否为编辑时,如果正在显示秒,那么不予以回应delay2();/消抖P2=0xff;key_pressed=P2;/再判断if(key_pressed & 0x01)=0x00)if(count_h>=23)count_h=0;elsecount_h+;else if(key_pressed & 0x02 )=0x00 && CS=0)/判断是否按下时编辑按键,如果正在显示秒,那么不予以回应delay2(); /延时消抖P2=0xff;key_pressed=P2;if(key_pressed & 0x02)=0x00)if(count_m>=59)count_m=0;elsecount_m+;else if(key_pressed & 0x04)=0x00)/按下闹钟调节按键delay2();/延时消抖P2=0xff;if(key_pressed & 0x04)=0x00)CS=2;count_x=count_m_alarm;/读取闹钟设置count_y=count_h_alarm;/读取闹钟设置loop:display();/显示闹钟设置时间P2=0xff;key_pressed=P2;if(key_pressed & 0x01)=0)/按下编辑时按键delay2();P2=0xff;key_pressed=P2;if(key_pressed & 0x01)=0)if(count_y>=23)count_y=0;elsecount_y+;else if(key_pressed & 0x02)=0)/编辑分按键delay2();P2=0xff;key_pressed=P2;if(key_pressed & 0x02)=0)if(count_x>=59)count_x=0;elsecount_x+;else if(key_pressed & 0x08)=0x00)/退出设置按键delay2();P2=0xff;key_pressed=P2;if(key_pressed & 0x08)=0x00) count_m_alarm=count_x; /保存闹钟设置count_h_alarm=count_y; /保存闹钟设置CS=0; /撤销编辑状态if(flag1=1)flag1=0;goto loop1;/跳出闹钟编辑设置goto loop;/处于闹钟编辑状态,刷新设置的闹钟时间 else if(key_pressed & 0x10)=0)/按下显示状态按键显示时分或者显示秒delay2();P2=0xff;key_pressed=P2;if(key_pressed & 0x10)=0)if(CS>=1)CS=0;elseCS+;else if(key_pressed & 0x40)=0)delay2();P2=0xff;key_pressed=P2;if(key_pressed & 0x40)=0)flag1=0;/开闹钟else if(key_pressed & 0x80)=0)delay2();P2=0xff;key_pressed=P2;if(key_pressed & 0x80)=0)flag1=1;/停顿闹钟2、实物图图5 秒显示状态下数码管显示值图6 串口设置时间值图7 串口传送界面及错误信息- word.zl

    注意事项

    本文(单片机课设--定时闹钟.doc)为本站会员(知****量)主动上传,得力文库 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知得力文库 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于得利文库 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

    © 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

    黑龙江省互联网违法和不良信息举报
    举报电话:0468-3380021 邮箱:hgswwxb@163.com  

    收起
    展开