多功能电脑时钟设计报告含正确C语言程序96分.doc

上传人:wj 文档编号:8779699 上传时间:2023-05-14 格式:DOC 页数:36 大小:325.97KB
下载 相关 举报
多功能电脑时钟设计报告含正确C语言程序96分.doc_第1页
第1页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第2页
第2页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第3页
第3页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第4页
第4页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第5页
第5页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第6页
第6页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第7页
第7页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第8页
第8页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第9页
第9页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第10页
第10页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第11页
第11页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第12页
第12页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第13页
第13页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第14页
第14页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第15页
第15页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第16页
第16页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第17页
第17页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第18页
第18页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第19页
第19页 / 共36页
多功能电脑时钟设计报告含正确C语言程序96分.doc_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

多功能电脑时钟设计报告含正确C语言程序96分.doc

《多功能电脑时钟设计报告含正确C语言程序96分.doc》由会员分享,可在线阅读,更多相关《多功能电脑时钟设计报告含正确C语言程序96分.doc(36页珍藏版)》请在冰点文库上搜索。

多功能电脑时钟设计报告含正确C语言程序96分.doc

18

18XXXXX大学《单片机系统综合训练》课程设计报告

多功能电脑时钟设计报告

一、实训目的意义及任务要求

1.1目的意义

在如今,单片机的使用领域已十分广泛,它在智能仪器仪表、实时工控、通讯设备、导航系统、家用电器等均有很广泛的应用。

单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。

单片机作为一门专业学科,对学生的要求也较高,要求对C语言有较好的掌握,还要与单片机的硬件工作原理相结合,也是理论与实践相结合的一大体现。

多功能电脑时钟有效地检验了单片机中对数码管,蜂鸣器,LED灯的控制,同时提高了学生的工程系统设计能力。

通过此次单片机系统综合训练,不仅要让学生认识了解它,而且增强学生学科积极性。

2.2任务要求

通过对硬件和软件的设计要求设计的电脑时钟完成以下功能:

1.基本功能

①实时显示当前时间(4位数码管显示,2位显示小时,2位显示分钟,第2位小数点0.5秒亮,0.5秒灭)。

②能用一按键依次切换显示年及月日。

③能修改当前时钟。

④具有秒表功能,显示秒和百分秒。

2.扩展功能

①单片机与PC机的通讯(可选);②可设定初值的倒计时功能(可选)

③闹钟及报时功能(可选);④显示星期(可选)。

3.设计参数

显示时间时,4位数码管显示,2位显示小时,2位显示分钟,第2位小数点0.5秒亮,0.5秒灭;蜂鸣器报时时间以每生学号最末位确定。

二.实习任务的方案

2.1任务进度

①布置任务、分析任务、学习单片机的C51功能程序设计(3天)

②方案设计、使用Protel设计和绘制硬件原理图(1.5天)

③程序设计和调试(4.5天)

④设计验收、撰写报告(1天)

2.2系统分析

根据系统功能要求,可将系统组成结构分成四大部分:

①DS1302时钟芯片读数据写数据模块;

②数码管显示模块;

③按键设置调节时间模块;

④秒表功能模块。

硬件电路接线图如附录一,本系统采用DS1302时钟芯片,四位数码管用来显示年月日,星期,时分,以及秒和百分秒。

其中年月日,时分秒和星期采用DS1302的数据显示,秒表采用单片机定时中断实现。

本系统共用到四个按键,且均为独立对地按键,分别用于显示切换,修改切换,修改加一,修改减一,秒表启动暂停和数据清零。

2.3器件选择

选用STC89C51芯片,频率为11.0592MHz,由于系统要求显示年月日小时和分钟,采用四位LED数码管显示即可。

按键是用来设置时间或闹钟时间或启动秒表等功能的,设置三个按键:

显示切换模式键(key3)、修改数据键(key0)、加一键(key1)、减一键(key2)。

常见的LED显示具有清晰明亮的特点。

是显示接口也是绝大多数单片机应用系统必备的部件之一。

发光二极管组成的显示器是单片机应用产品中最常用的廉价输出设备。

它由若干个发光二极管按一定的规律排列而成。

当某一个发光二极管导通时,相应的一个点或一笔画被点亮,控制不同组合的二极管导通,就能显出各种字符。

常用的7段显示器的结构如图所示,发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的成为共阴显示器。

1位显示器由8个发光二极管组成,其中7个发光二极管a~g控制7个笔画的亮或暗,另一个控制一个小数点的亮和暗,这种笔画的七段显示器能显示的字符较少,字符的形状有些失真,但失控简单,使用方便。

三、系统硬件设计

3.1单片机的最小系统

单片机功能系统图见附录1,。

单片机最小系统由STC89C51单片机、复位电路、晶振电路组成。

如图3.1所示

图3.1单片机最小系统图

3.2数码管、独立按键及DS1302时钟芯片电路的设计

在电子钟的输入部分,设置相应的置数功能,通过外部设备的输入,如按键,实现时间的切换。

除此之外,调整日期等时间也需要按键进行输入。

在选用输入端口时,将P0引脚与按键相连进行输入。

K1、K2、K3、K4分别表示设置切换键、数值加一键、数值减一、显示月和日键。

系统仿真电路图

系统仿真电路图

DS1302与单片机连线图

3.3其他附属电路设计

按键设计,电频转换芯片的硬件电路如下图所示:

RS232串口通信及电源电路等设计,如图3.3所示

图3.3附属电路设计图

四、软件设计

4.1主程序设计

使用定时器0来定时,定时5ms,运用定时器的中断来实现这些功能,显示是用的数码管的动态扫描,每5ms扫描一位数码管,20ms循环一次。

设置一些标志位,实时时间显示的标志位,星期显示的标志位,闹铃时间显示的标志位,秒表显示的标志位,在不同的模式下,我们要使该模式下的标志位有效,从而进行此模式的显示,通过按键进行不同的操作。

每个标志位有效时,数码管显示的内容就不一样。

闹钟的实现是用一个子函数,每5ms调用一次函数,并把北京时间与设定的闹铃时间比较,如果相等就使蜂鸣器有效。

闹铃时间的长短可以用一个变量对秒计数,当计数值小于我们设定的值时,就是蜂鸣器有效,当大于等于设定的值时就关闭蜂鸣器。

整点报时或半点报时很好实现,在中断函数里,当分钟等于60时,蜂鸣器对应鸣叫相应点数,并且小时要自增1,当分钟等于30时,蜂鸣器鸣一次,分钟自增1,要使蜂鸣器有效,可用一个变量对秒计数,当秒等于我们设定的值时,就关闭蜂鸣器。

4.2系统操作功能设计

根据系统功能描述,可以分为:

北京时间功能、整点报时、闹铃功能、日期显示及秒表功能功能。

我们通过对K_Mode键按下的次数计数,用Mode计数,Mode的次数就代表了不同的模式,每个模式都有与之相对应的指示灯,每个模式的功能如下:

Mode0:

按键每按下时显示北京时间模式,此时,四个指示灯全灭,显示格式为:

小时.分钟(如:

07.35,为7点35分),按K_UP或者K_DN键对系统没影响,每到整点或半点时时,要进行相应点数的间隔蜂鸣报时(半点短鸣一次)。

Mode1:

按键按下一次时,进入修改北京时间的小时模式,四个指示灯依次为“亮灭灭灭”,按K_UP或者K_DN键对小时进行修改。

Mode2:

按键按下两次时,进入修改北京时间的分钟模式,四个指示灯依次为“灭亮灭灭”,按K_UP或者K_DN键对分钟进行修改。

Mode3:

按键按下三次时,进入修改闹铃时间的小时模式,四个指示灯依次为“灭灭亮灭”,按K_UP或者K_DN键对闹铃小时进行修改。

Mode4:

按键按下四次时,进入修改闹铃时间的分钟模式,四个指示灯依次为灭灭灭亮,按K_UP或者K_DN键对闹铃分钟进行修改。

Mode5:

按键按下五次时,进入年显示模式,四个指示灯依次为“亮亮灭灭”,显示格式为:

四位年(如20.12为当前年份为公元2012年),在此种模式下,按K_UP或者K_DN键对系统没影响。

Mode6:

按键按下六次时,进入月日显示模式,四个指示灯依次为“亮灭亮灭”,显示格式为:

月日(如07.05为当前日期为7月5日),在此种模式下,按K_UP或者K_DN键对系统没影响。

Mode7:

按键按下七次时,进入秒表模式,四个指示灯依次为“亮灭灭亮”,显示格式为:

秒百分秒(如05.90为当前秒表计时到5秒900毫秒),在此种模式下,K_UP键设为用来启动/暂停秒表、K_DN键设为用来对秒表进行清零。

Mode8:

按键按下八次时,进入闹钟选择模式,四个指示灯依次为“亮亮亮灭”,显示格式为:

CL01/00,"CL.00"表示贪睡闹铃功能关闭,"CL.01"表示贪睡闹铃功能开启,按UP或DN键可在00或01间循环选择;在贪睡闹铃功能关闭时,可按任意键停止当前闹钟,或不按键,则闹钟1分钟,以后再不响。

在贪睡闹铃功能开启时,如按下除UP键外的任意键,停止当前闹钟,如不按键,则闹钟1分钟;当过5分钟后,闹钟又会重新响起,如此循环,只有按下UP键时,才能停止闹钟以后再不响。

在此种模式下,K_UP键设为用来启动/暂停秒表、K_DN键设为用来对秒表进行清零。

Mode9:

按键按下九次时,进入整点报时选择模式,四个指示灯依次为“亮亮亮亮”,显示格式为:

BS01/00,"BS.00"表示整点报时功能关闭,01表示报时功能开启,按UP或DN键可在00或01间循环选择。

4.3主程序voidmain()

图4.1主程序功能流程图

4.4主程序设计

主程序采用定时器0对程序进行扫描执行。

分别执行DS1302芯片初始化子程序,写数据子程序,将最初的值写入芯片中,采用while循环循环执行键盘扫描子程序。

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.5DS1302子程序设计

此子程序分为初始化程序,读数据程序,写数据程序,一些数据程序为例;

voidDs1302_Write_Byte(unsignedcharaddr,unsignedchard)

{

CE=0;_nop_();

SCLK=0;_nop_();

CE=1;_nop_();

Write1302(addr);

Write1302(d);

CE=0;_nop_();

IO=1;

SCLK=1;

}

4.6时间调整子程序

时间调整子程序采用的是对key1按的次数不同来进行对年月日时分及星期的设置。

voidzongshi(void)

{

if(!

key)

{

if(btx==0)

{

if(!

key)

{

btx=1;k++;}}}else{btx=0;}}k=1时,调整年份,key1为加,key2为减

voidkeyscan()k=2时,调整月份,key1为加,key2为减

{k=3时,调整日份,key1为加,key2为减

display();k=4时,调整星期,key1为加,key2为减

if(!

key)

{

if(btx==0)

{

if(!

key)

{

btx=1;

k++;

}

}

4.7按键切换子程序

voidtiaoshidisplay()

{

if(z==15)

{

z=0;

switch(k)

{

case1:

bt1=~bt1;break;//年

case2:

bt2=~bt2;bt1=0;break;//月

case3:

bt3=~bt3;bt1=0;break;//日

case4:

bt1=~bt1;bt3=0;break;//周

case5:

bt2=~bt2;bt1=0;break;//时

case6:

bt3=~bt3;bt2=0;break;//分

default:

bt3=0;break;

}

}

}

五、调试及性能分析

5.1软件测试

电子成年历是多功能的数字型,可以看当前日期(阴、阳历),时间,还有温度的仪器。

电子成年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。

最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。

在软件的调试过程中主要遇到的问题如下:

1.时钟不准,走一段时间后误差较大

原因:

该问题主要是晶振芯片的频率不真确引起的。

晶振的频率理论值为12MHZ,由于存在误差,导致了单片机时间走一段时间后便出现了误差。

2.烧入程序后,LED数码管显示闪动,而且亮度不均匀。

解决:

首先对调用的延时进行逐渐修改,可以解决显示闪动问题。

其次,由于本作品使作动态扫描方式显示的数字,动态扫描很快,人的肉眼是无法看出,但是调用的显示程序时,如果不在反回时屏蔽掉最后的附值,则会出现很亮的现象,所以在显示的后面加了屏蔽子令,最后解决了此问题。

3.修改时间、日期时没有农历没有自动对应上。

解决:

把不相关的程序暂时屏蔽,地农历的子程序独立调试,发现在调用农历自动更新时,对十进制和十六进制处理不好,所以会造成错乱。

最后把相应的十进制进行修改,使得可以与十六进制对应,最后解决了此问题.

5.2测试结果分析与结论

(1).在测试中遇到发光二极管、LED数码管为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.

(2).LED数码管显示不正常,还有亮度不够,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。

查看烧写的程序是否正确无误,对程序进行认真修改。

(3).DS1302与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入),D0=1,指定读操作(输出)。

在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。

若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。

DS1302与RAM相关的寄存器分为两类:

一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。

要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。

虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。

可以用老式电脑主板上的3.6V充电电池。

如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。

100μF就可以保证1小时的正常走时。

DS1302在第一次加电后,必须进行初始化操作。

初始化后就可以按正常方法调整时间。

5.3测试结论

经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.同时在软件的编程方面得到更到的提高,对编程能力得到加强.同时对所学的知识得到很大的提高与巩固

六、心得体会

在该部分实习中,我有几点收获:

 

1、 整合程序时,并非把各个模块链接起来就行,往往需要把某些模块拆开,重新嵌入整合程序中,方能实现它的功能,说明程序的调用和嵌套要灵活,不能生搬硬套。

 

2、 中断的应用。

在程序中,T0和T1两个定时器我均用到了,而源程序模块都用T0,没用T1,中断优先级一样,所以在整合后,需要修改中断优先级,而我简单的把两个中断优先级定为1和2,程序当然无法运行了,后来经学长指导才明白,优先级是有顺序的,单片机共五个中断源,都有自然的优先级,不能随便设置,后来将T1的优先级改为3,程序可以执行。

 

3、该部分实习,使我对软件的设计有了进一步的认识,编写程序也有迹可循,对单片机有了更深的理解,而且将C语言用到了单片机上,有了一次新的尝试,以前学到的单片机的知识在实习中均得到了实践,对我以后的从事相应的工作奠定了一个基础。

参考文献

[1]李广弟等单片机基础北京航空航天出版社,2007

[2]楼然苗等51系列单片机设计实例北京航空航天出版社,2008

[3]张毅刚.单片机原理及应用.北京:

高等教育出版社,200

附录一

附录二

程序如下:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineWrite_Protect0x8e//写保护

#defineOutPutP0//显示输出

//sbitDU=P2^6;//数码管段选

//sbitWE=P2^7;//数码管位选

sbitCE=P3^3;//复位端口定义在P0.2引脚

sbitIO=P2^4;//数据输出端定义在P0.4引脚

sbitSCLK=P3^2;//时钟输出端口定义在P0.3引脚

sbitkey=P3^4;//时间调节控制键

sbitkey1=P3^5;//每按一次位加一

sbitkey2=P3^6;//每按一次位减一

sbitkey3=P3^7;//显示切换

ucharcodeWei[]={0xfe,0xfd,0xfb,0xf7,0xfd};//位选数据0xef,0xdf,0xbf,0x7f

ucharcodeDuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0--9共阴代码

codeucharWaddr[]={0x8c,0x88,0x86,0x84,0x82,0x80,0x8a};//寄存器写地址

codeucharRaddr[]={0x8d,0x89,0x87,0x85,0x83,0x81,0x8b};//寄存器读地址

uchartimeset[]={0x01,0x02,0x03,0x04,0x05,0x00,0x01};/*设置初始时间*/

uchartime_buf[7];/*存读到的时间*/

uchartime_disp[7];

uchardispdat[5];/*存储显示值的*/

ucharBtdis=0,k=0,z;bitbtx,btx1,btx2,btx3,bt1,bt2,bt3;bitBtread;

uintflag1;

/*==================================================

函数功能:

延时n毫秒

入口参数:

n

====================================================*/

voidWrite1302(uchardat);

voiddelaynms(ucharn)

{

uchari,j;

for(i=n;i>0;i--)

for(j=125;j>0;j--);

}

/*=============================================

函数功能:

根据命令字,向1302写一个字节数据

入口参数:

Cmd,存储命令字;dat,存储待写的数据

==============================================*/

voidDs1302_Write_Byte(unsignedcharaddr,unsignedchard)

{

CE=0;_nop_();

SCLK=0;_nop_();

CE=1;_nop_();

Write1302(addr);

Write1302(d);

CE=0;_nop_();

IO=1;

SCLK=1;

}

//从DS1302读出一字节数据

ucharDs1302_Read_Byte(unsignedcharaddr)

{

unsignedchari;

unsignedchartemp;

CE=1;

addr=addr|0x01;

for(i=0;i<8;i++)

{if(addr&0x01)

{IO=1;}

else

{IO=0;}

SCLK=1;

SCLK=0;

addr=addr>>1;

}

//输出数据:

temp

for(i=0;i<8;i++)

{temp=temp>>1;

if(IO)

{temp|=0x80;}

else

{temp&=0x7F;}

SCLK=1;

SCLK=0;

}

CE=0;//停止DS1302总线

returntemp;

}

/*===================================================

函数功能:

向1302日历时钟芯片写入一个字节的数据

入口参数:

dat

====================================================*/

voidWrite1302(uchardat)

{

uchari;

//SCLK=0;

CE=1;

for(i=0;i<8;i++)

{

IO=dat&0x01;

SCLK=0;

SCLK=1;

dat=dat>>1;

}

}

/*=====================================================

函数功能:

根据命令字,从1302读取一个字节的数据

入口参数:

Cmd

返回参数:

dat

======================================================*/

ucharReadset1302(ucharCmd)

{

uchardat;

CE=0;

SCLK=0;

CE=1;

Write1302(Cmd);

SCLK=1;

CE=0;

returndat;

}

voidbcdpro(void)

{

unsignedchari,tmp;

for(i=0;i<7;i++)//BCD处理

{

tmp=timeset[i]/10;//timeset[]={0x01,0x02,0x03

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 外语学习 > 韩语学习

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

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