欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    C语言编写单片机万年历系统课程设计报告98分.docx

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

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

    C语言编写单片机万年历系统课程设计报告98分.docx

    1、C语言编写单片机万年历系统课程设计报告98分多功能电脑时钟设计报告 一、实训目的意义及任务要求1.1目的意义 单片机的使用领域已十分广泛,如智能仪器仪表、实时工控、通讯设备、导航系统、家用电器等。“学好单片机,工作就不成问题了。”老师说,可见学好单片意义之重大。单片机作为一门基础学科,既是对前期学习C语言的综合运用,也是理论与实践相结合的一大体现。电脑时钟有效地检验了对DS1302时钟芯片,STC89C52单片机中断,独立键盘,数码管,蜂鸣器,LED灯的控制,同时提高了学生的工程系统设计能力。LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。 所以,电子万年

    2、历无论作为比赛题目还是练习题目都是很有价值。通过此次单片机系统综合训练,不仅要让学生认识了解它,而且增强学生学科积极性。2.2任务要求要求设计的电脑时钟完成以下功能:1.基本功能实时显示当前时间(4位数码管显示,2位显示小时,2位显示分钟,第2位小数点0.5秒亮,0.5秒灭)。能用一按键依次切换显示年及月日。能修改当前时钟。具有秒表功能,显示秒和百分秒。2. 扩展功能单片机与PC机的通讯(可选)可设定初值的倒计时功能(可选)闹钟及报时功能(可选)。显示星期(可选)。二、实训方案2.1 系统分析根据系统功能要求,可将系统组成结构分成四大部分:DS1302时钟芯片读数据写数据模块,数码管显示模块,

    3、按键设置调节时间模块,秒表功能模块,。硬件电路接线图如后图,本系统采用DS1302时钟芯片,四位数码管显示年月,日星期,时分,以及秒和百分秒。其中年月日,时分秒和星期采用DS1302的数据显示,秒表采用单片机定时中断实现。本系统共用到四个按键,且均为独立对地按键,分别用于显示切换,修改切换,修改加一,修改减一,秒表启动暂停和数据清零。2.2 器件选择选用STC89C52芯片,频率为11.0592MHz;由于系统要求显示年月日小时和分钟,采用四位LED数码管显示即可;按键是用来设置时间或闹钟时间或启动秒表等功能的,设置三个按键:显示切换模式键(key3)、修改数据键(key0)、加一键(key1

    4、)、减一键(key2)。DS1302时钟芯片。常见的LED显示具有清晰明亮的特点。是显示接口也是绝大多数单片机应用系统必备的部件之一。发光二极管组成的显示器是单片机应用产品中最常用的廉价输出设备。它由若干个发光二极管按一定的规律排列而成。当某一个发光二极管导通时,相应的一个点或一笔画被点亮,控制不同组合的二极管导通,就能显出各种字符。1. 显示器的结构常用的7段显示器的结构如图所示,发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的成为共阴显示器。1位显示器由8个发光二极管组成,其中7个发光二极管ag控制7个笔画的亮或暗,另一个控制一个小数点的亮和暗,这种笔画的七段显示器能显示的字符较

    5、少,字符的形状有些失真,但失控简单,使用方便。三、系统硬件设计3.1 单片机最小系统单片机功能系统图见附录 1,。单片机最小系统由STC89C51单片机、复位电路、晶振电路组成。如图3.1所示图3.1 单片机最小系统图 3.2 数码管、独立按键及DS1302时钟芯片电路的设计系统仿真电路图系统仿真电路图DS1302与单片机连线图3.3 其他附属电路设计按键、电频转换芯片、RS232串口通信及电源电路等设计,如图3.3所示图3.3 附属电路设计图四、软件设计4.1主程序设计主程序采用定时器0对程序进行扫描执行。分别执行DS1302芯片初始化子程序,写数据子程序,将最初的值写入芯片中,采用whil

    6、e循环循环执行键盘扫描子程序。main() TMOD=0x01; /使用模式1,16位定时器 TH0=(65536-10000)/256; /给定初值 TL0=(65536-10000)%256; EA=1; /总中断打开 ET0=1; /定时器中断打开 TR0=1; /定时器开关打开Ds1302_Init(); Ds1302_Write_Time();while(1) keyscan(); if(Btread=0) Btread=1; Ds1302_Read_Time(); display(); 4.2 DS1302子程序设计此子程序分为初始化程序,读数据程序,写数据程序,一些数据程序为例;

    7、void Ds1302_Write_Byte(unsigned char addr, unsigned char d) CE=0;_nop_(); SCLK=0; _nop_(); CE=1; _nop_(); Write1302(addr); Write1302(d); CE=0; _nop_(); IO=1; SCLK=1;分别写入地址,再写入数据。4.3时间调整子程序时间调整子程序采用的是对key1按的次数不同来进行对年月日时分及星期的设置。void zongshi(void) if(!key) if(btx=0) if(!key) btx=1;k+; elsebtx=0; k=1时,调

    8、整年份,key1为加,key2为减void keyscan() k=2时,调整月份,key1为加,key2为减 k=3时,调整日份,key1为加,key2为减 display(); k=4时,调整星期,key1为加,key2为减 if(!key) if(btx=0) if(!key) btx=1; k+; 五、调试及性能分析5.1软件测试电子成年历是多功能的数字型,可以看当前日期(阴、阳历),时间,还有温度的仪器。电子成年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中主要遇到

    9、的问题如下:1烧入程序后,LED数码管显示闪动,而且亮度不均匀。解决:首先对调用的延时进行逐渐修改,可以解决显示闪动问题。其次,由于本作品使作动态扫描方式显示的数字,动态扫描很快,人的肉眼是无法看出,但是调用的显示程序时,如果不在反回时屏蔽掉最后的附值,则会出现很亮的现象,所以在显示的后面加了屏蔽子令,最后解决了此问题。2修改时间、日期时没有农历没有自动对应上。解决:把不相关的程序暂时屏蔽,地农历的子程序独立调试,发现在调用农历自动更新时,对十进制和十六进制处理不好,所以会造成错乱。最后把相应的十进制进行修改,使得可以与十六进制对应,最后解决了此问题.5.2测试结果分析与结论(1)在测试中遇到

    10、发光二极管、LED数码管为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.(2)LED 数码管显示不正常,还有亮度不够,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。查看烧写的程序是否正确无误,对程序进行认真修改。 (3).DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM 数据;D5D1 指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。在

    11、DS1302 的时钟日历或RAM 进行数据传送时,DS1302 必须首先发送命令字节。若进行单字节传送,8 位命令字节传送结束之后,在下2 个SCLK 周期的上升沿输入数据字节,或在下8 个SCLK 周期的下降沿输出数据字节。DS1302 与RAM 相关的寄存器分为两类:一类是单个RAM 单元,共31 个,每个单元组态为一个8 位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM 寄存器,在此方式下可一次性读、写所有的RAM 的31 个字节。要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F 以上)。虽然DS1302 在主电源掉电后的耗电

    12、很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。可以用老式电脑主板上的3.6V 充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 F 就可以保证1 小时的正常走时。DS1302 在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。5.3 测试结论经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.同时在软件的编程方面得到更到的提高,对编程能力得到加强.同时对所学的知识得到很大的提高与巩固六、心得体会从大一开始接触单片机,简单运用单片机,我初步认识了单片机。再经过这两周的单片机的

    13、专门学习,我对单片机有了进一步的学习和认识,加深了我对单片机理论知识的理解,提升了我个人理论结合实际的实践能力。从简单的单片机设计开始,一步一步的增加难度。刚开始设计时,老师给我们的任务很简单,可以轻松完成任务完成。电脑时钟的设计,是在秒表的基础上慢慢的添加一个又一个的功能,然后一个一个的调试。在调试的过程中我们遇到了很多的问题,我们编出来的程序不是一下子就能实现我们想要的功能的,要经过不断的修改、调试,实现我们想要的功能。程序设计中,定时器的应用相当广泛,它与中断函数构成了基本的计数环节,中断为定时提供了条件,函数每5ms便进入中断函数一次,并执行相应的操作与计数。条件语句为数码管的功能显示

    14、提供了条件。我们还进一步优化设计,比如整点报时设计对应点数报时,闹钟用音乐播放形式与整点报时区分开来,闹钟及整点(半点)可设是否开启等。总之,通过本次单片机系统综合训练,我对单片机的基础知识及基本的应用技术有了深刻的了解,提升了个人理论到实践的运用能力。进一步为后续学习及工作有打下坚实基础。参考文献附录一附录二#include#include#define uchar unsigned char #define uint unsigned int#define Write_Protect 0x8e /写保护#define OutPut P0 /显示输出 /sbit DU=P26; /数码管段选

    15、/sbit WE=P27; /数码管位选 sbit CE=P33; /复位端口定义在P0.2引脚sbit IO=P24; /数据输出端定义在P0.4引脚sbit SCLK=P32; /时钟输出端口定义在P0.3引脚sbit key=P34; /时间调节控制键sbit key1=P35; /每按一次位加一sbit key2=P36; /每按一次位减一sbit key3=P37; /显示切换uchar code Wei=0xfe,0xfd,0xfb,0xf7,0xfd;/ 位选数据0xef,0xdf,0xbf,0x7fuchar code Duan=0x3f,0x06,0x5b,0x4f,0x66

    16、,0x6d,0x7d,0x07,0x7f,0x6f; /0-9共阴代码 code uchar Waddr=0x8c,0x88,0x86,0x84,0x82,0x80,0x8a; /寄存器写地址code uchar Raddr=0x8d,0x89,0x87,0x85,0x83,0x81,0x8b; / 寄存器读地址uchar timeset=0x01,0x02,0x03,0x04,0x05,0x00,0x01; /*设置初始时间*/uchar time_buf7; /*存读到的时间*/uchar time_disp7;uchar dispdat5; /*存储显示值的*/uchar Btdis=0

    17、,k=0,z; bit btx,btx1,btx2,btx3,bt1,bt2,bt3; bit Btread;uint flag1; /*=函数功能:延时n 毫秒入口参数:n=*/ void Write1302(uchar dat);void delaynms(uchar n) uchar i,j; for(i=n;i0;i-) for(j=125;j0;j-);/*=函数功能:根据命令字,向1302写一个字节数据入口参数:Cmd,存储命令字;dat,存储待写的数据=*/ void Ds1302_Write_Byte(unsigned char addr, unsigned char d) C

    18、E=0;_nop_(); SCLK=0; _nop_(); CE=1;_nop_(); Write1302(addr); Write1302(d); CE=0; _nop_(); IO=1; SCLK=1;/从DS1302读出一字节数据uchar Ds1302_Read_Byte(unsigned char addr) unsigned char i; unsigned char temp; CE=1; addr = addr | 0x01; for (i = 0; i 1; /输出数据:temp for (i = 0; i 1; if (IO) temp |= 0x80; else temp

    19、 &= 0x7F; SCLK=1; SCLK=0; CE=0; /停止DS1302总线 return temp;/*=函数功能:向1302日历时钟芯片写入一个字节的数据入口参数:dat=*/void Write1302(uchar dat) uchar i; /SCLK=0; CE=1; for(i=0;i1; /*=函数功能:根据命令字,从1302读取一个字节的数据入口参数:Cmd返回参数:dat=*/uchar Readset1302(uchar Cmd) uchar dat; CE=0; SCLK=0; CE=1; Write1302(Cmd); SCLK=1; CE=0; return

    20、 dat;void bcdpro(void) unsigned char i,tmp; for(i=0;i7;i+) /BCD处理 tmp=timeseti/10; /timeset=0x01,0x02,0x03,0x04,0x05,0x06,0x01 time_bufi=timeseti%10; /time_buf7 time_bufi=time_bufi+tmp*16; /*= 向DS1302写入时钟数据=*/void Ds1302_Write_Time(void) unsigned int i; uchar flag; flag=Readset1302(0x81); if(flag&0x

    21、80) /判断时钟芯片是否停止,为1时时钟停止 /掉电保存 bcdpro(); for(i=0;i7;i+) Ds1302_Write_Byte(Waddri,time_bufi); Ds1302_Write_Byte(0x8e,0x80); /打开写保护 /*= 从DS1302读出时钟数据=*/void Ds1302_Read_Time(void) unsigned char i,tmp; for(i=0;i7;i+) time_bufi=Ds1302_Read_Byte(Raddri); for(i=0;i7;i+) /BCD处理 tmp=time_bufi/16; time_bufi=t

    22、ime_bufi%16; time_dispi=time_bufi+tmp*10; /*= DS1302初始化=*/void Ds1302_Init(void) CE=0; /RST脚置低 SCLK=0; /SCK脚置低 Ds1302_Write_Byte(0x80,0x00); /*=函数名: 时分秒显示子程序=函数功能:将从DS1302读到的数据在8位共阴数码管上显示=返回参数:=*/void display() uchar i; if(Btdis=0) if(bt2=0) dispdat0=Duantime_disp3/10; /时 dispdat1=Duantime_disp3%10;

    23、 else dispdat0=0x00; dispdat1=0x00; /dispdat2=0x40; /- if(bt3=0) dispdat2=Duantime_disp4/10; /分 dispdat3=Duantime_disp4%10; else dispdat2=0x00; dispdat3=0x00; /dispdat5=0x40; if(flag125) dispdat4=0x80; else dispdat4=0x00; if(Btdis=3) dispdat0=Duantime_disp5/10; /秒 dispdat1=Duantime_disp5%10; dispdat

    24、2=0x40; dispdat3=0x40; if(Btdis=1) if(bt1=0) dispdat0=Duantime_disp0/10; /年 dispdat1=Duantime_disp0%10; else dispdat0=0x00; dispdat1=0x00; /dispdat2=0x40; /- if(bt2=0) dispdat2=Duantime_disp1/10; /月 dispdat3=Duantime_disp1%10; else dispdat2=0x00; dispdat3=0x00; dispdat4=0x00; if(Btdis=2) /dispdat0=0

    25、x40; if(bt1=0) dispdat3=Duantime_disp6%10; /周 else dispdat3=0x00; dispdat2=0x40; if(bt3=0) dispdat0=Duantime_disp2/10; /日 dispdat1=Duantime_disp2%10; else dispdat0=0x00; dispdat1=0x00; if(dispdat3=7) dispdat3=0x7f; if(Btdis=4) for(i=0;i5;i+) OutPut=dispdati; P1=Weii; delaynms(1); OutPut=0x00; /*=函数名: 按键=函数功能:显示模式,调时模式=返回参数:=*/void zongshi(void) if(!key) if(btx=0) if(!ke


    注意事项

    本文(C语言编写单片机万年历系统课程设计报告98分.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

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




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开