基于51单片机设计的多功能数字时钟word格式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

天津职业技术师范大学Tianjin University of Technology and Education
课程设计
专业班级:应电0811
学生姓名:
指导教师:
系别:电子工程学院
目录
题目 (1)
多功能数字钟 (1)
1系统设计 (1)
1.1设计要求 (1)
1.1.1主要性能指标 (1)
1.1.2创意部分 (1)
1.2总体设计方案 (1)
1.2.1概述及设计思路 (1)
1.2.2方案论证 (2)
2系统组成与工作原理 (3)
2.1系统框图及工作原理 (3)
2.2单元电路设计 (4)
2.2.1MC-51单片机 (4)
2.2.2复位电路 (5)
2.2.3时钟电路 (6)
2.2.4显示电路 (6)
2.2.5按键电路 (8)
2.2.6温度采集部分 (9)
3软件设计 (10)
3.1程序流程图 (10)
3.2系统程序 (10)
4实验与调试 (16)
4.1硬件测试 (16)
4.2软件测试 (17)
4.3实物调试 (18)
5附录A 元件清单 (20)
6附录B 参考文献 (20)
7附录C 电路原理图 (21)
题目
多功能数字钟
1系统设计
1.1设计要求
设计制作一个24小时制多功能数字钟。

1.1.1主要性能指标
1、数字显示年、月、周、日、时、分、秒。

2、温度显示,精确到小数点后1位。

3、时钟误差<5S/24H。

温度误差不超5。

1.1.2创意部分
要求准确的进行年、月、周、日、时、分、秒的转换,切换两种显示模式。

1.2总体设计方案
1.2.1概述及设计思路
该设计方案是以MC51单片机为核心,采用LCD液晶屏幕显示系统,温度采集模块、日期提醒、键盘时间调整预设置等模块,所构建的数字时钟系统,能动态显示实时时钟的时、分、秒,数据显示(误差限制在30每天),温度调节模块进行了重点设计实现SB0、SB1、SB2、SB3、SB4五个键实现时钟正常显示,调时。

本系统设计大部分功能有软件来实现,使电路简单明了,系统稳定性也得大大提高。

1.2.2方案论证
(1)时钟模块
【方案一】采用单片机内置定时/计数器。

它的处理过程主要是先设定单片机内部定时/计数器的工作方式,对机器周期计数确定基准时间,然后用另外一个定时器软件计数的方法对基准时间形成秒,秒计60次形成分,分计60次形成小时。

依此类推,获取日期也是采用相同的方法。

该方案在具体实现过程中,计时存在较大的误差。

如果晶振受到其他外界信号干扰,或者基准时间计算不准确,都会导致时间显示错误。

【方案二】采用555多谐振荡器。

由555定时器组成一个多谐振荡器,产生周期为100HZ的脉冲,然后经过两个74LS160组成的分频器得到1HZ的秒脉冲。

多谐振荡器的稳定度及频率的准确度决定了数字钟计时的准确程度,通常选用成品晶振构成振荡器电路。

计时精度取决于振荡器的频率,振荡器频率越高计时精度越高。

【方案三】采用DS1302时钟芯片。

DS1302是一种高性能、超低功耗的实时时钟芯片,附加31字节静态RAM,可以通过串行接口与单片机进行通信。

实时时钟提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。

芯片内部集成备用电源,当外围电路电路有电源供应的时候,备用电源充电储能。

当外围电路掉电时,DS1302芯片工作在休眠状态,以备用电源供电。

当外围电路再次供电,即可唤醒休眠进入正常工作状态,显示时间无任何异常。

该系统设计中,采用方案三。

(2)温度传感器
【方案一】选用CMOS数字式温度传感器。

DS1612是美国达拉斯半导体公司生产的CMOS 数字式温度传感器。

内含两个不挥发性存储器,可以在存储器中任意的设定上限和下限温度值进行恒温器的温度控制,由于这些存储器具有不挥发性,因此一次定入后,即使不用CPU也仍然可以独立使用。

DS1612可测量的温度范围为-55℃~+125℃,在0℃~+70℃范围内,测量精度为±0.5℃。

DS1621同外部电路的控制信号和数据的通信是通过双向总线来实现的。

通过设定寄存器来设置工作方式,并对工作状态进行监控。

【方案二】选用DS18B20温度传感器。

DS1820 是一种三脚塑封芯片,1 脚接地,3 脚为VCC(当用外部电源供电时接+5V;当用总线供电时接地),2 脚为数据总线。

DS18B20采用单总线数据通信,当检测温度范围为-65℃~+125℃,精度可达±0.5℃。

内置EEPROM,可存放长期需要保存的数据。

全数字温度转换及输出,多样封装形式,适用多种不同的硬件系统。

该系统设计中,采用方案二。

(3)数据显示
【方案一】采用LED数码管显示数据。

LED数码管是由若干个发光二极管组成的显示字段的显示器件,当数码管中的某个发光二极管导通的时候,相应的一个字段便发光,不导通则不发光。

一般来说,LED数码管的控制可分为段选控制和位选控制。

段选是LED所显示的字段,如:a,b,c,d,e,f,g,dp,当a,b,c同时点亮时显示数字7;当a,b,d,e,g同时点亮时显示数字2。

位选则是显示该数字的位。

根据以上控制原理,可实现对时间和温度的显示。

【方案二】采用LCD1602液晶屏显示数据。

液晶屏的应用非常广泛,比如日常生活中的手表、时钟、计算器、仪器仪表、家电、医疗器械、车船仪表、声象设备文体用品、通讯设备视频图像显示和大画面显示等等。

LCD1602 液晶模块的读写操作,屏幕和光标的操作都是通过指令编程来实现的。

如清除显示指令 01H,光标复位到地址00H 位置;光标复位指令00H,光标返回到地址。

LCD1602液晶屏具有字符发生器,可以直观的显示汉字、图形、字符,并且显示容量大,进行数据的实时显示简单方便。

该系统设计中,需要显示的数据比较多。

如果使用LED数码管,那么就要用分屏切换来显示数据,那样既不直观又不方便,并且对单片机的I/O口开销比较大。

若使用LCD液晶屏显示数据,则不需要分屏切换,而且还节省了I/O资源。

因此,采用方案二。

2系统组成与工作原理
2.1系统框图及工作原理
图2-1 系统框架图
工作原理:本设计采用STC89C51单片机作为本次课程设计的控制模块。

单片机可把由DS18B20、DS1302中的数据利用软件来进行处理,从而把数据传输到显示模块,实现温度、日历的显示。

以LCD液晶显示器为显示模块,把单片机传来的的数据显示出来,并且显示多样化,在显示电路中,主要靠按键来实现各种显示要求的选择与切换。

2.2单元电路设计
2.2.1M C-51单片机
89S51各引脚功能介绍:
VCC:
89S51 电源正端输入,接+5V。

VSS:
电源地端。

XTAL1:
单芯片系统时钟的反相放大器输入端。

XTAL2:
系统时钟的反相放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF 的小电
容,可以使系统更稳定,避免噪声干扰而死Array机。

EA
/Vpp:
"EA"为英文"External Access"的缩写,
表示存取外部程序代码之意,低电平动作,
也就是说当此引脚接低电平后,系统会取用
外部的程序代码(存于外部EPROM中)来执
行程序。

因此在8031及8032中,EA引脚必
须接低电平,因为其内部无程序存储器空间。

如果是使用 8752 内部程序空间时,此引脚
要接成高电平。

此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。

ALE/PROG:
端口3的管脚设置:
P3.0:RXD,串行通信输入。

P3.1:TXD,串行通信输出。

P3.2:INT0,外部中断0输入。

P3.3:INT1,外部中断1输入。

P3.4:T0,计时计数器0输入。

P3.5:T1,计时计数器1输入。

P3.6:WR:外部数据存储器的写入信号。

P3.7:RD,外部数据存储器的读取信号。

2.2.2复位电路
MCS-51单片机的复位是由外部的复位电路来实现的。

复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。

上电复位:上电复位电路是—种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。

上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。

为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。

上电自动复位是通过外部复位电路的电容充电来实现的。

只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。

图2-2-2 复位电路
2.2.3时钟电路
时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有
条不紊的一拍一拍地工作。

因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。

常用的时钟电路有两种方式:一种是
内部时钟方式,另一种为外部时钟方式。

本文用的是内部时钟方式(如图3-3所示)。

MCS-51单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。

这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。

图2-2-3 时钟电路
2.2.4显示电路
采用LCD显示,LCD显示具有丰富多样性,灵活性,电路简单、易于控制而且功
耗小,对于信息量多的系统,是比较适合的,LCD液晶显示模块采用LCD1602型号,具有很低的功耗,正常工作室电流仅 2.0mA/5.0V。

通过编程实现总动关闭屏幕能够更有效地降低功耗。

LCD1602分两行显示,每行可现实多达16个字符,其内部的字符发生器已经存储了160个不同的点阵字符图形,通过内部指令可实现对其显示多样的控制。

LCD1602的特性:
•+5V电压,对比度可调
•内含复位电路
•提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能•有80字节显示数据存储器DDRAM
•内建有160个5X7点阵的字型的字符发生器CGROM
•8个可由用户自定义的5X7的字符发生器CGRAM
图2-2-4 显示电路图
2.2.5按键电路
按键的开关状态通过一定的电路转换为高、低电平状态。

按键闭合过程在相应的I/O 端口形成一个负脉冲。

闭合和释放过程都要经过一定的过程才能达到稳定,这一过程是处于高、低电平之间的一种不稳定状态,称为抖动。

抖动持续时间的常长短与开关的机械特性有关,一般在5-10ms之间。

为了避免CPU多次处理按键的一次闭合,应采用措施消除抖动。

本文采用的是独立式按键,直接用I/O口线构成单个按键电路,每个按键占用一条I/O口线,每个按键的工作状态不会产生互相影响。

P2.2口表示功能移位键,按键选择要调整的时十位、时个位、分十位或分个位。

P2.1口表示数字“+“键,按一下则对应的数字加1。

P2.0口表示数字“-”键,按一下则对应的数字减1。

图 2-2-5 按键控制模块
P2.3口表示时间表的切换,程序默认为日常时间表,当按下该开关,使输入为低电平时,表示当前执行的是温度显示。

再按键,使键抬起,输入维高电平时,表示当前执行的是日常作息时间表。

2.2.6温度采集部分
该系统设计采用DS18B20温度传感器采集温度,可以用程序设定9~12位的分辨率,精度为±0.5°C。

分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。

DS18B20的性能是新一代产品中最好的。

继"一线总线"的早期产品后,DS1820开辟了温度传感器技术的新概念。

测量温度范围为-55°C~+125°C,现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。

适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。

支持3V~5.5V的电压范围,使系统设计更灵活、方便。

3软件设计
3.1程序流程图
3.2系统程序
#include <AT89X51.h>
#include <string.h>
#include<intrins.h>
#define LCM_RS P1_3 //定义引脚
#define LCM_RW P1_4
#define LCM_E P1_5
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
#define uchar unsigned char
uchar id,timecount,dipsmodid;
bit lmcinit_or_not; //是否需要清屏标志位“1”为需要“0”为不需要bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志void Disp_line1(void); //显示屏幕第一行
void Disp_line2(void); //显示屏幕第二行
void id_case1_key();
void Disp_mod0(void);//显示模式0
void Disp_mod1(void);//显示模式1
//*********** DS1302 时间显示定义部分
sbit T_CLK=P1^0;
sbit T_IO =P1^1;
sbit T_RST=P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void Set(uchar,uchar); //根据选择调整相应项目
void RTInputByte(uchar); /* 输入1Byte */
uchar RTOutputByte(void); /* 输出1Byte */
void W1302(uchar, uchar); // 向DS1302写入一个字节
uchar R1302(uchar); // 从DS1302读出一个字节
void Set1302(unsigned char * ); // 设置时间
bit sec,min,hour,year,mon,day,weekk; //闪烁标志位
//初始化后设置为:04年12月2日星期4 0点0分0秒
unsigned char inittime[7]={0x00,0x00,0x00,0x02,0x12,0x04,0x04};
// 秒分钟小时日月年星期
//***** 18B20温度显示定义部分
sbit DQ=P1^6; //18B20 接P16口
typedef unsigned char byte;
typedef unsigned int word;
Read_Temperature(char,char);
void mychar(void);
byte ow_reset(void);
byte read_byte(void);
void write_byte(char val);
void adjust_res(char res); //res 分别等于0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
// 0.5, 0.25, 0.125
//*******温度控制部分*********
bit tl_flash_flag; //下限闪烁标志
bit th_flash_flag; //上限闪烁标志
bit tl_flag; //下限越限标志
bit th_flag; //上限越限标志
bit tl_sign,th_sign; //温度零下标志0:零上,1:零下
char tempid;
void Disp_Temp(void); //显示上下限温度
void Set_TH_Temp(void); //设置温度上限
void Set_TL_Temp(void); //设置温度下限
signed char tl=20,th=45;
void Compare_Temp(signed char l,signed char h); //比较温度
void Tl_Al(void); //下限越限报警
void Th_Al(void); //上限越限报警
//******* 1602LCD驱动**********************************************************
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void);
void Delay400Ms(void);
unsigned char code week[]={"Week."};
void main(void)
{
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
mychar();
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
TR0=1;
ET0=1;
W1302(0x90,0xa5);//打开充电二级管一个二级管串联一个2K电阻
W1302(0x8e,0x80);//写保护,禁止写操作
adjust_res(0x1f); //调整18B20的分辨率0x1f:0.5; 0x3f:0.25; 0x5f:0.125
while(1)
{
if (P2_3==0)
{dipsmodid++;
lmcinit_or_not=1;
if(dipsmodid>2) dipsmodid=0;
while(P2_3==0);
}
switch(dipsmodid)
{
case 0:
Disp_mod0();
break;
case 1:
Disp_mod1();
break;
}
}
}
//选择显示模?
void Dispmod_id_case_key()
{
if (P0_3==0)
{dipsmodid++;
if(dipsmodid>1) dipsmodid=0;
}
}
//显示模式0
void Disp_mod0(void)
{
if(lmcinit_or_not==1)
{LCMInit();
lmcinit_or_not=0;
}
if ((P2_0|P2_1)==0) //初始化
{
Delay5Ms();
if ((P2_0|P2_1)==0) Set1302(inittime); }
//mychar(); //显示自定义字符
if (P2_2==0) // 设置和选择项目键
{
Delay5Ms();
if(P0_6==0){id++;if(id>7) id=0;}
while(P2_2==0);
}
switch(id)
{
case 0:
sec=0;
Disp_line1(); Disp_line2();
break;
case 1://年
year=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 2://月
year=0;mon=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 3://日
mon=0;day=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 4://星期
day=0;weekk=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 5://小时
weekk=0;hour=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 6://分钟
hour=0;min=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 7://秒
min=0;sec=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
}
}
//显示模式1
void Disp_mod1(void)
{
if(lmcinit_or_not==1)
{LCMInit();
lmcinit_or_not=0;
}
Read_Temperature(1,0); DisplayOneChar(0,1,'T'); DisplayOneChar(1,1,'L'); DisplayOneChar(2,1,':'); DisplayOneChar(7,1,'T'); DisplayOneChar(8,1,'H'); DisplayOneChar(9,1,':');
if(P2_2==0)
{
if(P2_2==0)
{
tempid++;
if(tempid>2) tempid=0;
while(P2_2==0);
}
}
switch(tempid)
{
case 0:
4实验与调试
4.1硬件测试
本设计的硬件验证电路完全由按照上述理论进行焊接。

其电路焊接如图4-1所示。

由于电路比较简单在焊接中遇到的问题不是很多。

主要遇到的问题有电路焊接时地线和电源线的排布,由于电路中的电源线和地线的连接点比较多,在实际的印刷电路板中,地线一般是环绕板子而且比较粗的铜线,鉴于这个思路,我将电源线和地线分别布置在电路板的两个边上,如图4-2,4-3所示。

另外,由于我们这是实验板,是验证理论用的板子,板子上的芯片经常需要拆卸,因此我选择了用双列直插底座来安装芯片,这样可以保证在拆卸芯片时不需要再重新焊接芯片,省去了很多不必要的麻烦。

硬件焊接好后需要测试是否都连接好了,本设计采用的测试方法是用万用表来测量,用万用表的两个表笔分别接连线的两端,测试是否电阻为零,如果电阻为零说明连接正确,如果有电阻说明没有连接好。

由于实验板上的有些焊点离的比较近,在焊接时可能由于不小心将焊锡滴落在两个焊点之间造成短路,短路是对电路板最大的危害之一,因此要细心的检查每两个相邻的焊点之间是否有短路发生。

图4-1 整体电路实物图
4.2软件测试
图4-2编译程序
本设计采用伟福编译软件来编译程序,是目前使用广泛的单片机开发软件,它集
成了源程序编辑和程序调试于一体,支持汇编语言编译,另外它还支持第三方编译器,可以编译C语言和PL/M语言。

源程序的编写:首先从菜单的“文件”中“新建文件”,建立文件;然后为文件选择好单片机型号,语言设置项选择伟福汇编器;确定后新的文件就算建立了。

接下来进行编辑、修改等操作。

如图4-2所示。

编译:加载好要编译的文件,在工具栏的右上方找到编译按钮,按下编译按钮,开始编译,编译后会提示编译是否通过,如果编译通过就可以进行程序下载,实验;如果编译没有通过说明程序存在错误需要修改这时会在软件下方提示哪里有错误,是什么错误类型,如图4-3所示。

双击下边的错误提示,软件会将光标自动移到错误处以便于修改。

编译通过后会显示编译成功提示,如图4-4所示。

编译:加载好要编译的文件,在工具栏的右上方找到编译按钮,按下编译按钮,开始编译,编译后会提示编译是否通过,如果编译通过就可以进行程序下载,实验;如果编译没有通过说明程序存在错误需要修改这时会在软件下方提示哪里有错误,是什么错误类型。

双击下边的错误提示,软件会将光标自动移到错误处以便于修改。

编译通过后会显示编译成功提示。

4.3实物调试
由于实物调试中遇到的问题可能是软件的问题也可能是硬件的问题,因此需要采取好的调试过程,制定一个好的调试原则。

本设计在调试时采用了遇到问题先排查是否是硬件故障,然后再排查软件故障的顺序。

在排查硬件故障时可以利用已有的设计成功的软件来测试。

例如在调试过程中,最先遇到的问题是液晶显示器不能显示。

我在排查故障时采用了一个原有的能够正常运行的程序来测试电路是否能够显示,结果是能够显示。

这说明电路的硬件连接没有问题,然后再排查软件问题,结果发现是程序中查询日历芯片时的地址赋错值了,在排除这个错误之后再烧写程序测试就能够正常显示了。

程序能够正常显示时间之后是调试按键子程序,要测试是否能扫描到按键及按键功能是否正确。

由于按键程序设计时跳转比较麻烦因此出了些小错误,在按键调整之后总是不能返回时间显示界面。

经过细心检查发现是在返回显示程序的跳转标号写错了,经过改进,终于成功了。

程序能够正常显示时间之后是调试按键子程序,要测试是否能扫描到按键及按键功能是否正确。

由于按键程序设计时跳转比较麻烦因此出了些小错误,在按键调整之后总是不能返回时间显示界面。

经过细心检查发现是在返回显示程序的跳转标号写错了,经过改进,终于成功了。

程序能够正常显示时间之后是调试按键子程序,要测试是否能扫描到按键及按键功能是否正确。

由于按键程序设计时跳转比较麻烦因此出了些小错误,在按键调整之后总是不能返回时间显示界面。

经过细心检查发现是在返回显示程序的跳转标号写错了,经过改进,终于成功了。

图4-3-1 模式0的显示
图4-3-2 模式1的显示
5附录A 元件清单
表7-1 元件清单
6附录B 参考文献
1、郭天祥《51单片机C语言教程》北京:电子工业出版社,2009,12
2、谢自美,《电子线路设计、实验、测试》武汉:华中理工大学出版社,2000
3、何书森、何华斌《实用数字电路原理与设计速成》福州:福建科学技术出版社,2000.6
4、王洪君《单片机原理及应用》济南:山东大学出版社2009.2
5、阎石《数字电子技术基础》第五版,北京:高等教育出版社,2008.12
7附录C 电路原理图
电路原理图
文档来源网络,版权归原作者。

如有侵权,请告知,我看到会立刻处理。

相关文档
最新文档