数字电子钟的设计.docx
- 文档编号:6663490
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:40
- 大小:66.77KB
数字电子钟的设计.docx
《数字电子钟的设计.docx》由会员分享,可在线阅读,更多相关《数字电子钟的设计.docx(40页珍藏版)》请在冰豆网上搜索。
数字电子钟的设计
引言:
本设计通过对一个能实现按键开关可调整时、分、秒,定时报警的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;//显示°
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 电子钟 设计