

下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、多功能电脑时钟设计报告一、实训目的意义及任务要求1.1目的意义单片机的使用领域已十分广泛,如智能仪器仪表、实时工控、通讯设备、导 航系统、家用电器等。 “学好单片机,工作就不成问题了。 ”老师说,可见学好单 片意义之重大。单片机作为一门基础学科,既是对前期学习 C 语言的综合运用,也 是理论与实践相结合的一大体现。电脑时钟有效地检验了对 DS1302 寸钟芯片, STC89C5单片机中断,独立键盘,数码管,蜂鸣器,LED 丁的控制,同时提高了学 生的工程系统设计能力。LED 数字显示的日历钟显示清晰直观、走时准确、可以进 行夜视, 并且还可以扩展出多种功能。 所以,电子万年历无论作为比赛题目还
2、是 练习题目都是很有价值。通过此次单片机系统综合训练,不仅要让学生认识了解 它,而且增强学生学科积极性。2.2任务要求要求设计的电脑时钟完成以下功能:1. 基本功能1实时显示当前时间 ( 4 位数码管显示, 2 位显示小时, 2 位显示分钟, 第 2 位小数点 0.5 秒亮, 0.5 秒灭)。2能用一按键依次切换显示年及月日。3能修改当前时钟。4具有秒表功能,显示秒和百分秒。2.扩展功能单片机与 PC 机的通讯(可选)可设定初值的倒计时功能(可选)闹钟及报时功能(可选)。显示星期(可选)。二、实训方案2.1系统分析根据系统功能要求,可将系统组成结构分成四大部分:DS1302 寸钟芯片读数据写数
3、据模块,数码管显示模块,按键设置调节时间模块,秒表功能模块,。硬件 电路接线图如后图,本系统采用 DS1302 时钟芯片,四位数码管显示年月,日星期, 时分,以及秒和百分秒。其中年月日,时分秒和星期采用 DS1302 的数据显示,秒 表采用单片机定时中断实现。本系统共用到四个按键,且均为独立对地按键,分 别用于显示切换,修改切换,修改加一,修改减一,秒表启动暂停和数据清零。22器件选择选用 STC89C5 芯片, 频率为 11.0592MHz 由于系统要求显示年月曰小时和 分钟,采用四位 LED 数码管显示即可;按键是用来设置时间或闹钟时间或启动秒 表等功能的,设置三个按键:显示切换模式键(k
4、ey3)、修改数据键(key0)、加 一键(keyl) 、减一键(key2)。DS1302 时钟芯片。常见的 LED 显示具有清晰明亮的特点。是显示接口也是绝大多数单片机应用 系统必备的部件之一。发光二极管组成的显示器是单片机应用产品中最常用的廉价输出设备。它由 若干个发光二极管按一定的规律排列而成。当某一个发光二极管导通时,相应的 一个点或一笔画被点亮,控制不同组合的二极管导通,就能显出各种字符。1.显示器的结构常用的 7 段显示器的结构如图所示,发光二极管的阳极连在一起的称为共阳 极显示器,阴极连在一起的成为共阴显示器。1 位显示器由 8 个发光二极管组成, 其中 7个发光二极管 ag 控
5、制 7 个笔画的亮或暗,另一个控制一个小数点的亮和 暗,这种笔画的七段显示器能显示的字符较少,字符的形状有些失真, 但失控简 单, 使用方便。4 u Q O O Oa b c d c f a共阴二、系统硬件设计3.1单片机最小系统单片机功能系统图见附录 1,。单片机最小系统由 STC89C5 单片机、复位电 路、晶振电路组成。如图 3.1 所示图 3.1 单片机最小系统图3.2数码管、独立按键及DS1302时钟芯片电路的设计系统仿真电路图MM1 1 j j J JM-H1IM-H1I詁d d I I n-n- 3 3 4 4 -J-J JcJc D D 3 3如K KKWKW薜KXKX*兀吒:
6、JillJillK K雀:1:川;.: ?1;.T-:;.T-=-系统仿真电路图XTMM怛gjn wnaw-TjJuMFQh-H1S1 Wri!SS加:SV6ZJL5IF0叫F*1.1F:1E 1JdFUFEi.+HJ船:ik-rrITIEPDS1302 与单片机连线图RS232 串口通信及电源电路等设计,如图 3.3 所示图 3.3 附属电路设计图四、软件设计4.1主程序设计主程序采用定时器0 对程序进行扫描执行。分别执行DS1302 芯片初始化子程序,写数据子程序,将最初的 值写入芯片中,采用 while 循环循环执行键盘扫描子程 序。main ()TMOD=0 x01; II使用模式 1
7、,16 位定时器TH0=(65536-10000)/256; II给定初值TL0=(65536-10000)%256;EA=1;II总中断打开ET0=1;II定时器中断打开.33按按其他附属电路设计键、电 频 转 换 芯 片3anCVKs3中二1C分厨日期附闾艮示值显示子程序1F日期、时币子程序衣壬口瑞更蒔丫程序V国月子程|图-A 主稈序濫稈團TR0=1;/定时器开关打开Ds1302_l nit();Ds1302_Write_Time();while(1)keysca n();if(Btread=O) Btread=1;Ds1302_Read_Time();display();4.2 DS13
8、02子程序设计此子程序分为初始化程序,读数据程序,写数据程序,一些数据程序为例;void Ds1302_Write_Byte( un sig ned char addr, un sig ned char d)CE=0;_ nop_();SCLK=0; _ nop_();CE=1; _nop_();Write1302(addr);Write1302(d);CE=0; _nop_();IO=1;SCLK=1;分别写入地址,再写入数据。时间调整子程序采用的是对key1 按的次数不同来进行对年月日时分及星期的 设置。void zon gshi(void)if(!key)if(btx=0)if(!key
9、)4.3时间调整子程btx=1;k+; elsebtx=0; k=1 voidkeyscan() k=2 k=3 display(); k=4 if(!key)if(btx=0)if(!key)btx=1;k+;时,调整年份,时,调整月份,时,调整日份,时,调整星期,key1 为加 ,key2 为减key1 为加 ,key2 为减key1 为加 ,key2 为减key1 为加 ,key2 为减五、调试及性能分析5.1软件测试电子成年历是多功能的数字型,可以看当前日期(阴、阳历) , 时间,还有温 度的仪器。电子成年历功能很多, 所以对于它的程序也较为复杂 , 所以在编写程序 和调试时出现了相对
10、较多的问题。最后经过多次的模块子程序的修改,一步一步 的完成,最终解决了软件。在软件的调试过程中主要遇到的问题如下:1 烧入程序后,LED 数码管显示闪动,而且亮度不均匀。 解决:首先对调用的延时进行逐渐修改,可以解决显示闪动问题。其次,由 于本作品使作动态扫描方式显示的数字,动态扫描很快,人的肉眼是无法看出 , 但是调用的显示程序时,如果不在反回时屏蔽掉最后的附值,则会出现很亮的现 象,所以在显示的后面加了屏蔽子令,最后解决了此问题。2修改时间、日期时没有农历没有自动对应上。 解决:把不相关的程序暂时屏蔽,地农历的子程序独立调试,发现在调用农 历自动更新时,对十进制和十六进制处理不好,所以会
11、造成错乱。最后把相应的 十进制进行修改,使得可以与十六进制对应,最后解决了此问题 .5.2测试结果分析与结论( 1)在测试中遇到发光二极管、 LED 数码管为不显示时 , 首先使用试测仪 对电路进行测试 , 观察是否存在漏焊 , 虚焊 , 或者元件损坏 .(2)LED 数码管显示不正常, 还有亮度不够, 首先使用试测仪对电路进行 测试 , 观察电路是否存在短路现象。 查看烧写的程序是否正确无误, 对程序进行认 真修改。(3).DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命 令字节,命令字节最高位 MSB(D7 必须为逻辑 1,如果 D7=0,则禁止写 DS1302 即写保护
12、;D6=0 指定时钟数据,D6=1,指定 RAM 数据;D5D1 指定输入或输 出的特定寄存器;最低位 LSB(D0)为逻辑 0,指定写操作(输入),D0=1,指定读 操作 ( 输出 ) 。在DS1302的时钟日历或RAM进行数据传送时, DS1302必须首先发送命令字 节。若进行单字节传送, 8 位命令字节传送结束之后,在下 2 个 SCLK 周期的上 升沿输入数据字节,或在下 8 个 SCLK 周期的下降沿输出数据字节。DS1302 与 RAM 相关的寄存器分为两类:一类是单个 RAM 单元, 共 31 个, 每 个单元组态为一个 8 位的字节,其命令控制字为 C0HFDH,其中奇数为读操
13、作, 偶数为写操作;再一类为突发方式下的 RAM 寄存器,在此方式下可一次性读、写 所有的RAM 的 31 个字节。要特别说明的是备用电源 B1,可以用电池或者超级电容器(0.1F 以上)。虽 然DS1302 在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最 好选用小型充电电池。可以用老式电脑主板上的 3.6V 充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。 100 卩 F 就可以保证 1 小时的正常走时。 DS1302 在第一次加电后,必须进行初始化操作。 初始化后就可以按正常方法调整时间。5.3测试结论经过多次的反复测试与分析 , 可以对电
14、路的原理及功能更加熟悉 ,同时提高了 设计能力与及对电路的分析能力 . 同时在软件的编程方面得到更到的提高 ,对编程 能力得到加强 . 同时对所学的知识得到很大的提高与巩固六、心得体会从大一开始接触单片机,简单运用单片机,我初步认识了单片机。再经过这 两周的单片机的专门学习,我对单片机有了进一步的学习和认识,加深了我对单 片机理论知识的理解,提升了我个人理论结合实际的实践能力。从简单的单片机 设计开始,一步一步的增加难度。刚开始设计时,老师给我们的任务很简单,可 以轻松完成任务完成。电脑时钟的设计, 是在秒表的基础上慢慢的添加一个又一 个的功能, 然后一个一个的调试。在调试的过程中我们遇到了很
15、多的问题,我们 编出来的程序不是一下子就能实现我们想要的功能的, 要经过不断的修改、 调试, 实现我们想要的功能。程序设计中,定时器的应用相当广泛,它与中断函数构成 了基本的计数环节,中断为定时提供了条件,函数每 5ms 便进入中断函数一次, 并执行相应的操作与计数。条件语句为数码管的功能显示提供了条件。我们还进 一步优化设计,比如整点报时设计对应点数报时,闹钟用音乐播放形式与整点报 时区分开来,闹钟及整点(半点)可设是否开启等。总之, 通过本次单片机系统综合训练, 我对单片机的基础知识及基本的应用 技术有了深刻的了解,提升了个人理论到实践的运用能力。进一步为后续学习及 工作有打下坚实基础。参
16、考文献JssB盗S SS -科菲:上ill yiMhj-Ui HF0-IJ-I1 1 !w14附录一HI一一J-nJ :r tlw壬壬-寓建 ss誉mlnrilmlnrilQs3:I:*h n |j h拧 4附录二#include#include #define uchar unsigned char #define uint unsigned int#define Write_Protect 0 x8e / 写保护#define OutPut P0 / 显示输出数码管段选数码管位选复位端口定义在 P0.2 引脚 数据输出端定义在P0.4 引脚 时钟输出端口定义在 P0.3 引脚 时间调节控制
17、键每按一次位加一每按一次位减一显示切换uchar codeWei=0 xfe,0 xfd,0 xfb,0 xf7,0 xfd;/uchar code Duan=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;/0-9 阴代码code uchar Waddr=0 x8c,0 x88,0 x86,0 x84,0 x82,0 x80,0 x8a; / code ucharRaddr=0 x8d,0 x89,0 x87,0 x85,0 x83,0 x81,0 x8b; / uchartimeset=0 x01,0 x02,0 x0
18、3,0 x04,0 x05,0 x00,0 x01; /* uchar time_buf7;/*存读到的时间 */uchar time_disp7;uchar dispdat5;/*存储显示值的 */uchar Btdis=0,k=0,z; bit btx,btx1,btx2,btx3,bt1,bt2,bt3; bit Btread; uint flag1;/*= 函数功能:延时 n 毫秒入口参数: n=*/ voidWrite1302(uchar dat);void delaynms(uchar n)uchar i,j;for(i=n;i0;i-) for(j=125;j0;j-);/*=
19、函数功能:根据命令字,向 1302 写一个字节数据 入口参数:Cmd 存储命令字;dat,存储待写的数据=*/ voidDs1302_Write_Byte(unsigned char addr, unsigned char d)CE=0;_nop_();SCLK=0; _nop_();/sbit DU=P2A6;/sbit WE=P2A7;/sbit CE=P3A3;/sbit IO=P2A4;/sbit SCLK=P3A2; / sbitkey=P3A4;/sbit key1=P3A5;/sbit key2=P3A6;/sbit key3=P3A7;/位选数据 0 xef,0 xdf,0 x
20、bf,0 x7f寄存器写地址寄存器读地址设置初始时间 */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 | 0 x01;for (i = 0; i 1;/ 输出数据: tempfor (i = 0; i 1;if (IO) temp |= 0 x80; else temp &= 0 x
21、7F; SCLK=1;SCLK=0;CE=O; / 停止 DS1302 总线return temp;/*=函数功能:向 1302 日历时钟芯片写入一个字节的数据 入口参数: dat=*/ voidWrite1302(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 dat;void bc
22、dpro(void)unsigned char i,tmp;for(i=0;i7;i+) /BCD 处理tmp=timeseti/10; /timeset=0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x01time_bufi=timeseti%10; /time_buf7 time_bufi=time_bufi+tmp*16;/*=向 DS1302 写入时钟数据=*/void Ds1302_Write_Time(void)unsigned int i;uchar flag; flag=Readset1302(0 x81);if(flag&0 x80) / 判断时
23、钟芯片是否停止,为 1 时时钟停止 / 掉电保存bcdpro();for(i=0;i7;i+) Ds1302_Write_Byte(Waddri,time_bufi); Ds1302_Write_Byte(0 x8e,0 x80); / 打开写保护/*=从 DS1302 读出时钟数据=*/ voidDs1302_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=time_bu
24、fi%16;time_dispi=time_bufi+tmp*10; /*=DS1302 初始化=*/ voidDs1302_Init(void)CE=0; /RST 脚置低SCLK=0; /SCK 脚置低 Ds1302_Write_Byte(0 x80,0 x00);/*= =函数名: 时分秒显示子程序=函数功能:将从 DS1302 读到的数据在 8 位共阴数码管上显示 =返回参数:=*/ voiddisplay()uchar i;if(Btdis=0) if(bt2=0) dispdat0=Duantime_disp3/10; / dispdat1=Duantime_disp3%10;el
25、sedispdat0=0 x00;dispdat1=0 x00;/dispdat2=0 x40; /-if(bt3=0)dispdat2=Duantime_disp4/10; /dispdat3=Duantime_disp4%10;elsedispdat2=0 x00;dispdat3=0 x00;/dispdat5=0 x40;if(flag125)dispdat4=0 x80;elsedispdat4=0 x00;if(Btdis=3)dispdat0=Duantime_disp5/10; / dispdat1=Duantime_disp5%10;dispdat2=0 x40;dispda
26、t3=0 x40;if(Btdis=1) if(bt1=0)dispdat0=Duantime_disp0/10; /dispdat1=Duantime_disp0%10;elsedispdat0=0 x00;dispdat1=0 x00;/dispdat2=0 x40; /-if(bt2=0)dispdat2=Duantime_disp1/10; / 月 dispdat3=Duantime_disp1%10;elsedispdat2=0 x00;dispdat3=0 x00; dispdat4=0 x00;if(Btdis=2)/dispdat0=0 x40;if(bt1=0)dispdat
27、3=Duantime_disp6%10; / 周elsedispdat3=0 x00; dispdat2=0 x40; if(bt3=0)dispdat0=Duantime_disp2/10; / 日dispdat1=Duantime_disp2%10;elsedispdat0=0 x00;dispdat1=0 x00; if(dispdat3=7)dispdat3=0 x7f;if(Btdis=4)for(i=0;i5;i+)OutPut=dispdati;P1=Weii;delaynms(1);OutPut=0 x00;/*= =函数名: 按键=函数功能:显示模式,调时模式=返回参数:=*
28、/ voidzongshi(void)if(!key)if(btx=0)if(!key)btx=1;k+;elsebtx=0;void keyscan()display();if(!key)if(btx=0)if(!key)btx=1;k+; /*=k=1 时,调整年份, key1 为加 ,key2 为减=*/while(k=1)Btdis=1;display();zongshi();if(!key1)if(btx1=0)if(!key1)btx1=1;if(time_disp00)time_disp0-;elsetime_disp0=99;elsebtx2=0; /*=k=2 时,调整月份,
29、 key1 为加 ,key2 为减=*/while(k=2)Btdis=1;display();zongshi();if(!key1)if(btx1=0)if(!key1)btx1=1;if(time_disp129)time_disp2=29;else if(time_disp228)time_disp2=28;else time_disp1=1;else btx1=0; if(!key2)if(btx2=0)if(!key2)btx2=1;if(time_disp11)time_disp1-;if(time_disp1=2) if(time_disp0%4=0)if(time_disp22
30、9)time_disp2=29;else if(time_disp228) time_disp2=28; else time_disp1=12; else btx2=0; /*=k=3 时,调整天, key1 为加 ,key2 为减=*/ while(k=3)Btdis=2;display(); zongshi();if(!key1)if(btx1=0)if(!key1)btx1=1;if(time_disp1=2)if(time_disp0%4=0) if(time_disp229) time_disp2+; else time_disp2=1; else if(time_disp228)t
31、ime_disp2+;elsetime_disp2=1;else if(time_disp18)if(time_disp1%2=0) / 小于 8 月的月份除以 2 的余数为 0 则为小月if(time_disp230) time_disp2+; else time_disp2=1; else if(time_disp1%2=1) / 小于 8 月的月份除以 2 的余数为 1 则为大月 if(time_disp27)if(time_disp1%2=0)if(time_disp231)time_disp2+;else time_disp2=1; else if(time_disp1%2=1)if
32、(time_disp21) time_disp2-; else time_disp2=29; else if(time_disp21) time_disp2-; else time_disp2=28; else if(time_disp11) time_disp2-; else time_disp2=30; else if(time_disp1%2=1)if(time_disp21)time_disp2-;else time_disp2=31; else if(time_disp17) if(time_disp1%2=0) if(time_disp21)time_disp2-;else tim
33、e_disp2=31; else if(time_disp1%2=1)if(time_disp21)time_disp2-;else time_disp2=30; else btx2=0; /*=k=4 时,调整星期, key1 为加 ,key2 为减=*/ while(k=4)Btdis=2;display();zongshi();if(!key1)if(btx1=0)if(!key1)btx1=1;if(time_disp61) -time_disp6; else time_disp6=7; else btx2=0; /*=k=5 时,调整小时, key1 为加 ,key2 为减=*/ while(k=5)Btdis=0;display();zongshi();if(!key1)if(btx1=0)if(!key1)btx1=1;if(time_disp30) time_disp3-; else time_disp3=23; else btx2=0; /*=k=6 时,调整分钟, key1 为加 ,key2 为减*/while(k=6)Btdis=0;display();zongshi();if(!key1)if(btx1=0)if(!key1)btx1=1;if(time_disp40)time_disp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 棉花种植农业气象服务研究考核试卷
- 纺织机械的智能生产流程考核试卷
- 电子产品销售数据分析考核试卷
- 木楼梯生产流程优化考核试卷
- 核子仪表在核材料管制中的技术发展考核试卷
- 管道工程历史文化保护与利用考核试卷
- 电机在电力行业能源科普宣传与教育活动策划的应用考核试卷
- 紧固件行业企业战略联盟与合作考核试卷
- 石油开采业的人力资源管理与培训考核试卷
- 山西大学《工程造价案例分析(实验)》2023-2024学年第二学期期末试卷
- 2025年重庆中考押题道德与法治试卷(一)(含答案)
- 长城汽车2025人才测评答案
- 肿瘤的内分泌治疗护理
- 东北三省三校2025届高三下学期第二次联合模拟考试数学试题及答案
- 污水管道封堵施工方案
- 《中华人民共和国产品质量法》知识培训
- 2025-2030彩色不锈钢项目可行性研究报告
- 2025年山西省华远国际陆港集团有限公司招聘笔试参考题库含答案解析
- 技能人才评价命题技术规程
- 装配式建筑产业发展现状、问题与对策分析
- 中职不等式的试题及答案
评论
0/150
提交评论