数字电子钟的设计.docx

上传人:b****5 文档编号:6663490 上传时间:2023-01-08 格式:DOCX 页数:40 大小:66.77KB
下载 相关 举报
数字电子钟的设计.docx_第1页
第1页 / 共40页
数字电子钟的设计.docx_第2页
第2页 / 共40页
数字电子钟的设计.docx_第3页
第3页 / 共40页
数字电子钟的设计.docx_第4页
第4页 / 共40页
数字电子钟的设计.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

数字电子钟的设计.docx

《数字电子钟的设计.docx》由会员分享,可在线阅读,更多相关《数字电子钟的设计.docx(40页珍藏版)》请在冰豆网上搜索。

数字电子钟的设计.docx

数字电子钟的设计

引言:

本设计通过对一个能实现按键开关可调整时、分、秒,定时报警的24小时制的时间系统的设计学习。

详细叙述了51单片机应用中的定时中断原理、数码管显示原理、动态扫描显示原理等,进一步学习、应用单片机C语言系统的实现了各种功能。

从而使自身明白使用单片机汇编语言和C语言之间的效率、整体性问题。

该系统由AT89C51、独立式按键、二极管、LED数码管、蜂鸣器等部分构成,能实现24小时制时、分、秒的时钟显示,18B20温度、能实现时钟简单的功能。

同时也可进行时、分、秒的校准、定时报警和LED二极管流水灯显示。

本系统主要是和实际生活的数字钟结合起来,可用1功能键进入时间校准等。

可用3个带有不同按键分别对时钟的时、分、秒进行校准。

每个按键伴有不同的声响以示区别。

1设计方案

1.1软件实现数字时钟

原理为:

利用定时器0与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。

该方案具有硬件电路简单的特点,但当单片机不上电,程序将不执行。

且由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。

1.2采用美国DALLAS公司的专用时钟芯片DS1302

该芯片主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。

其内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。

为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。

当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。

而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。

1.3最终方案选择

鉴于以上两种方案,时钟芯片DS1302具有更多的优点,本设计采用方案二完成数字时钟的功能。

2硬件详细设计

2.1主板电路

系统整体硬件电路包括温度显示电路,上下限报警调整电路,单片机主板电路等,如图1所示。

图1中有三个独立式按键可以分别调整温度计的上下限报警设置,图中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值。

图1单片机数字钟硬件系统的总体设计框图

2.2显示电路

显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用p3口的RXD,和TXD,串口的发送和接收,四只数码管采用74LS164右移寄存器驱动,显示比较清晰。

显示电路如图2所示。

图2温度显示电路

3软件设计

3.1程序主要模块

数字钟的模块主要包括:

时钟模块,温度模块,显示模块,键盘模块,报警模块六大模块组成。

图3列出了主要模块的关系。

 

数字时钟

温度模块

时钟模块

温度显示

时间计算

温度报警

显示日期

 

图3模块关系图

3.2主程序流程

主程序的主要工作是:

初始化DS1302时钟芯片和DS18B20温度芯片,以及单片机的初始工作状态,然后进入读取时间和温度的流程,用户课根据按键的功能进行选择其工作状态。

主程序流程如图4所示。

 

开始

初始化

Y

有按键

N

需要响应

N

Y

松开键

Y

扫描计数加1

按键处理

松开键处理

N

图4主程序流程图

3.3DS1302时钟芯片程序分析

DS1302数据读取函数分析,程序源码如下所示:

unsignedchari;

unsignedchartemp=0;

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

{

temp=temp>>1;

}

在控制指令字输入后的下一个SCLK时钟的上升沿时,紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

DS1302数据写入函数分析,程序源码如下所示:

unsignedchari;

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

{

ds1302_io=(bit)(byte1&0x01);//先进最低位

ds1302_clk=1;

}if(ds1302_io)

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。

3.4数据显示与刷新

更新显示涉及到两个操作:

发数据和改片选信号。

但实践发现,代码中无论是先改片选信号还是先发数据信号,都会出现重影(即相邻两位显示差不多)这也是动态扫描引起的。

实践先该片选,则前一位的数据会在下一位显示一段时间;先发数据,则后一位的数据会在前一位显示一段时间。

因而出现重影。

解决这个问题的办法是先进行一个消影操作,然后再发片选,最后发数据。

这样就很好地解决了重影问题。

这样做的关键在于,在极短的一段时间内让显示器都不亮,等一切准备工作都做好了以后再发数据,只要显示频率足够快,是看不出显示器有闪烁的,这段显示程序代码如下:

P1=0x00;//消影

P2=选择[选择];//发片选信号

codetmp=acode[echoarray[选择]];

如果(选择==2&&mod==0&&dotflag)//判断是否显示"."

codetmp|=0x80;

P1=codetmp;//发数据

选择=++选择%4;//片选计数器下移

3.5键盘响应

键盘处理程序流程相对简单,只是简单的判键与处理。

所谓键盘消抖就是一次按建的多次响应问题。

当然,一般一次按建只须响应一次,但有的时候需要多次响应,如系统进入修改模式,数字的增减。

当出现这种问题时,用户的一次击键是作为一次还是多次处理,必须有一个标准。

程序中我用到了一个标志位,相当于中断系统的中断标志。

当用户按下键时,标志清零,松开键时,标志恢复;键按下超过一定时间(靠一扫描计数器判定)后,恢复标志,则经过一定的时间延迟(也靠一扫描计数器判定)可以响应一次按键(即一次按键的多次响应)。

而事实上,键盘响应程序就是一个事件触发器,键盘的每一个状态(按下,松开,点击)都可能引发一段响应程序(如:

重新设定键按下=>准备复位;松开=>系统复位)。

这里的时间延迟靠的是指令计数,由于受硬件中断等不确定因素影响,这个延迟一般不准确,但通过实践测试,可以找到一些合适的值。

4结论

本文通过对一个能实现按键开关可调整时、分、秒,定时报警的24小时制的时间系统的设计学习。

详细介绍了51单片机应用中的定时中断原理、数码管显示原理、动态扫描显示原理等,进一步学习、应用单片机C语言系统的实现了各种功能。

从而使自身明白使用单片机汇编语言和C语言之间的效率、整体性问题。

该系统由AT89C51、独立式按键、二极管、LED数码管、蜂鸣器等部分构成,能实现24小时制时、分、秒的时钟显示,18B20温度、能实现时钟简单的功能。

同时也可进行时、分、秒的校准、定时报警和LED二极管流水灯显示。

5课程设计体会

通过此次单片机课程设计,我掌握单片机应用系统的有关知识,加深了解单片机的工作原理。

初步掌握简单单片机应用系统的设计、制作、调试的方法。

提高动手实践能力。

以下是我的心得体会。

首先,我们组员首先根据自己所掌握的知识集合老师推荐的参考资料,逐次设计没个部分的电路。

计时功能主要用DS1302芯片的实现,至于报时则要要把符合要求的时刻信号输入给相关器件,让它在老师所要求的时刻让灯泡亮灯,校时系统就是要在随意时刻让电路产生进位信号,对分、时进行调节,使数字钟显示系统与标准时间相同。

在这样的思路下,我们设计出数字电子钟的电路。

随后我们根据自己正确的仿真图来连接实物图并且连接成功。

我的主要任务是进行系统的调试功能。

在调试时遇到了一些问题,比如,刚开始进行按键输入检测时,我们直接用万用表测量按键两端的电平,刚测时,万用表显示高电平,当有按键按下时,则万用表显示低电平,这说明了按键是正常的,但当直接用按键时,系统板则不能正常使用按键。

后面重新焊接了按键,系统板则才能正常使用按键。

原先焊接时发现了电阻的管脚比之前看到的同阻值电阻管脚细。

后面经过万用表调试后,重新焊接了电阻,问题就解决了。

通过整个电路设计与制作的整个过程,掌握了对电子钟的一些简单的基本的设计,组装与调试方法。

熟悉了COMS系列中、小规模集成电路的使用;更教会了我在以后的学习和工作中要养成严谨、耐心的工作态度,遇到困难要主动出击,而不是坐着等人指导。

通过理论与实际的相结合,进一步深入的体会到一种学习的方法,特别是对电子设计方面。

首先,要明确总体的设计方案与方法;其次,对各个部分进行设计与改进;最后,将各个部分整合到一起进行比较、观察。

最后,要进行严格的调试过程才能最终完成。

这次课程设计锻炼了我们的动手能力,激发了我们的创新思维,培养了我们勇于面对困难克服困难的坚强意志和不懈的精神,使我们又一次体味到团队的力量和合作的重要性;更重要的是使我们深深的体会到理论结合实际的重要性,体会到知识的海洋是无穷无尽,激发我们去追求。

temp=temp|0x80;//先出最低位

参考文献

1 李朝青.单片机原理及接口技术(简明修订版).杭州:

北京航空航天大学出版社,1998

2 李广弟.单片机基础[M].北京:

北京航空航天大学出版社,1994

3 阎石.数字电子技术基础(第三版).北京:

高等教育出版社,1989

4 廖常初.现场总线概述[J].电工技术,1999.

ds1302_clk=1;

_nop_();

ds1302_clk=0;

_nop_();

ds1302_clk=0;

byte1>>=1;

 

附录1程序清单

C51COMPILERV7.09ZG_1302_18B2011/24/200917:

05:

18PAGE1

 

C51COMPILERV7.09,COMPILATIONOFMODULEZG_1302_18B20

OBJECTMODULEPLACEDINZG-1302-18B20.OBJ

COMPILERINVOKEDBY:

C:

\Keil\C51\BIN\C51.EXEZG-1302-18B20.cBROWSEDEBUGOBJECTEXTEND

linelevelsource

1#include

2#include

3

4#defineucharunsignedchar

5#defineuintunsignedint

6

7sbitQUEDING=P1^7;

8sbitFANHUI=P1^3;

9sbitSHANG=P1^5;

10sbitXIA=P1^4;

11sbitQIEHUAN=P1^6;//按键

12

13sbitds1302_rst=P1^2;

14sbitds1302_clk=P1^0;

15sbitds1302_io=P1^1;//1302

16

17

18sbitwei1=P3^0;

19sbitwei2=P3^1;

20sbitwei3=P3^2;

21sbitwei4=P3^4;

22sbitwei5=P3^5;

23sbitwei6=P3^3;//数码管位选位

24

25sbitDQ=P3^7;//定义DS18B20端口DQ

26

27sbitBEEP=P2^7;//蜂鸣器

28

29//////////////////////18b20/////////////////////////////////////

30

31unsignedcharpresence;

32

33unsignedcharcodeLEDData[]={0x81,0xED,0xA2,0xA8,0xCC,0x98,0x90,0xAD,0x80,0x88,0xff};

34unsignedcharcodedispbitcode[]={0x01,0x02,0x04,0x10,0x20,0x08};

35unsignedchardatatemp_data[2]={0x00,0x00};

36unsignedchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};

37unsignedcharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,

380x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

39

40

41//bitwendu;

42

43

44//ucharinit2[]={0x11,0x26,0x18,0x21,0x11,0x07,0x09};//初始时间数组

45//秒,分,时,日,月,星期,年

46

47显示缓存区

48unsignedchardispbuf[6]={0,0,0,0,0,0};

49定义全局变量

50unsignedcharhour=0,minute=0,second=0,year=0,mounth=0,date=0,week=0;

51unsignedcharhor=0,min=0,sec=0,yer,mnth,dat,wk;

52//unsignedchartime[]={0x06,0x03,0x14,0x03,0x00,0x00,0x00};//初始时间数组

53//unsignedcharid,temp,num;

54unsignedcharmscnt,flag_shan=0;//闪动标志;

55//unsignedcharflag_qiehuan=0;//时分秒~年月日~星期的显示切换

C51COMPILERV7.09ZG_1302_18B2011/24/200917:

05:

18PAGE2

56unsignedchartemp,i;

57//unsignedcharshan_qiehuan=0;//闪烁切换;停止时分秒~年月日~星期的显示切换

58unsignedcharflag_tiaoshi_sfm,flag_tiaoshi_nyr,flag_tiaoshi_bj;//调时间标志

59

60ucharbj_time[2]={0x00,0x00};

61unsignedchardispbuf_bj[4]={0,0,0,0};

62//分,时报警时间

63bitalarm_flag=0;

64ucharqiehuan;

65

66bitflag=0;

67bitflag_jinzhi=0;//时钟跑时禁止其他键盘调时间

68bitflag_qd_zt=0;//启动跟暂停标志;

69

70

71///////////////////BEEP数码管显示////////////////////

72voidDelay(unsignedintnum)//延时函数

73{

741while(--num);

751}

76

77voiddelayms(unsignedintms)

78{

791unsignedchary;

801while(ms--)

811{

822for(y=0;y<250;y++)

832{

843_nop_();

853_nop_();

863_nop_();

873_nop_();

883}

892}

901}

91

92//voiddisplay(uchara,ucharb,ucharc,uchard,uchare,ucharf)

93voidxianshi()

94{

951P2=LEDData[dispbuf[0]];

961wei1=1;wei6=0;

971Delay(300);

981P2=LEDData[dispbuf[1]];

991wei1=0;wei2=1;

1001Delay(300);

1011P2=LEDData[dispbuf[2]];

1021wei2=0;wei3=1;

1031Delay(300);

1041P2=LEDData[dispbuf[3]];

1051wei3=0;wei4=1;

1061Delay(300);

1071P2=LEDData[dispbuf[4]];

1081wei4=0;wei5=1;

1091Delay(300);

1101P2=LEDData[dispbuf[5]];

1111wei5=0;wei6=1;

1121Delay(300);

1131}

114

115voidbeep(uchara)

116{

1171BEEP=0;

C51COMPILERV7.09ZG_1302_18B2011/24/200917:

05:

18PAGE3

1181delayms(a);

1191BEEP=1;//关闭蜂鸣器

1201}

121

122

123////////////////////////////////18b20数据处理函数///////////

124

125

126Init_DS18B20(void)//初始化ds1820

127{

1281

1291DQ=1;//DQ复位

1301Delay(8);//稍做延时

1311

1321DQ=0;//单片机将DQ拉低

1331Delay(90);//精确延时大于480us

1341

1351DQ=1;//拉高总线

1361Delay(8);

1371

1381presence=DQ;//如果=0则初始化成功=1则初始化失败

1391Delay(100);

1401DQ=1;

1411

1421return(presence);//返回信号,0=presence,1=nopresence

1431}

144

145ReadOneChar(void)//读一个字节

146{

1471unsignedchari=0;

1481unsignedchardat=0;

1491

1501for(i=8;i>0;i--)

1511{

1522DQ=0;//给脉冲信号

1532dat>>=1;

1542DQ=1;//给脉冲信号

1552

1562if(DQ)

1572dat|=0x80;

1582Delay(4);

1592}

1601

1611return(dat);

1621}

163

164

165WriteOneChar(unsignedchardat)//写一个字节

166{

1671unsignedchari=0;

1681for(i=8;i>0;i--)

1691{

1702DQ=0;

1712DQ=dat&0x01;

1722Delay(5);

1732

1742DQ=1;

1752dat>>=1;

1762}

1771}

178

179

C51COMPILERV7.09ZG_1302_18B2011/24/200917:

05:

18PAGE4

180

181Read_Temperature(void)//读取温度

182{

1831Init_DS18B20();

1841if(presence==1)

1851{beep(20);}//DS18B20不正常,蜂鸣器报警

1861else

1871{

1882//flash=0;

1892WriteOneChar(0xCC);//跳过读序号列号的操作

1902WriteOneChar(0x44);//启动温度转换

1912

1922Init_DS18B20();

1932WriteOneChar(0xCC);//跳过读序号列号的操作

1942WriteOneChar(0xBE);//读取温度寄存器

1952

1962temp_data[0]=ReadOneChar();//温度低8位

1972temp_data[1]=ReadOneChar();//温度高8位

1982}

1991}

200

201Disp_Temperature()//显示温度

202{

2031unsignedcharn=0;

2041

2051display[4]=temp_data[0]&0x0f;

2061display[0]=ditab[display[4]];//查表得小数位的值

2071

2081display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);

2091display[3]=display[4]/100;

2101display[1]=display[4]%100;

2111display[2]=display[1]/10;

2121display[1]=display[1]%10;

2131

2141if(!

display[3])//高位为0,不显示

2151{

2162display[3]=0x0a;

2172if(!

display[2])//次高位为0,不显示

2182display[2]=0x0a;

2192}

2201

2211/*P0=0xc6;//显示C

2221P2=0x7f;

2231Delay(300);

2241

2251P0=0x9c;//显示°

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1