基于MCS51单片机的闹钟提醒器设计报告.docx
- 文档编号:23853372
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:38
- 大小:189.40KB
基于MCS51单片机的闹钟提醒器设计报告.docx
《基于MCS51单片机的闹钟提醒器设计报告.docx》由会员分享,可在线阅读,更多相关《基于MCS51单片机的闹钟提醒器设计报告.docx(38页珍藏版)》请在冰豆网上搜索。
基于MCS51单片机的闹钟提醒器设计报告
课程论文
题目:
基于MCS51单片机的闹钟
提醒器设计报告
学生姓名:
陈浩敏
学生学号:
1008030204
系别:
电气信息工程学院
专业:
电子信息工程
年级:
10级
任课教师:
张水锋
电气信息工程学院制
2012年12月
基于MCS51单片机的闹钟提醒器
学生:
陈浩敏
指导教师:
张水锋
电气信息工程学院电子信息工程专业
一、设计方案选定:
1.1前言:
单片计算机即单片微型计算机,(Single-ChipMicrocomputer)。
是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。
他体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。
而51单片机是各单片机中最为典型和最有代表性的一种。
这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
基于单片机的定时和控制装置在许多行业有着广泛的应用。
而数字定时闹钟是其中最基本,也是最有代表性的一个实例。
数字定时闹钟的设计方法有许多种,例如,可以用中小规模集成电路组成数字定时闹钟,也可以利用专用的时钟芯片配以显示电路及其所需要的外围电路组成数字定时闹钟,还可以利用单片机来实现数字定时闹钟。
这些方法都各有其特点,其中,利用单片机来实现数字定时闹钟具有编程灵活、精度高等特点,便于数字定时闹钟功能的扩充,同时还可以用该数字定时闹钟发出各种控制信号。
1.2实验目的:
1、熟悉集成电路的引脚安排。
2、掌握各芯片的逻辑功能及使用方法。
3、充分认识单片机设计。
4、了解数字钟的组成及工作原理。
5、提高同学们的动手能力和编程技巧。
1.3总体设计要求:
1.3.1、基本要求:
(1)显示准确的北京时间(时、分、秒),可用24小时制式;
(2)随时可以调校时间;
(3)闹铃功能。
1.3.2、自由发挥部分:
(1)秒表功能;
(2)增加公历日期显示功能(年、月、日),年号只显示最后两位;
(3)随时可以调校年、月、日;
(4)允许通过转换功能键转换显示时间或日期。
1.4方案选定:
思路:
基于单片机的数字定时闹钟在设计时需要解决三个方面的主要问题:
一是LCD显示模块的驱动和编程,二是有关单片机中定时器的使用,三是如何利用单片机的外中断实现时钟功能和运行模式的转化。
在基于单片机系统的数字定时闹钟电路中,除了基本的单片机系统和外围电路外,还需要外部的控制和显示装置。
在本设计中,输入装置是按键开关,用于控制数字定时闹钟的运行模式,显示装置是LCD液晶显示器。
该数字定时闹钟是由AT89C52单片机控制的,可以达到以下效果:
1、能够显示“时时-分分-秒秒”。
2、能够设定定时时间、修改定时时间。
3、定时时间到能够发出一分钟的报警声。
AT89C52的指令系统和引脚与8051完全兼容,片内有128B的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
显示部分采用六位一体的共阳极数码管。
二、硬件电路设计:
2.1AT89C52:
AT89C52是51系列单片机的一个型号,它是ATMEL公司生产的。
主要功能特性:
1、兼容MCS51指令系统。
2、8k可反复擦写(>1000次)FlashROM。
3、32个双向I/O口。
4、256x8bit内部RAM。
5、3个16位可编程定时/计数器中断。
6、时钟频率0-24MHz
7、2个串行中断,可编程UART串行通道,2个外部中断源,共6个中断源,2个读写中断口线,3级加密位,低功耗空闲和掉电模式,软件设置睡眠和唤醒功能。
2.2复位电路:
为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。
一般微机电路正常工作需要供电电源为5V±5%,即4.75~5.25V。
由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才被撤除,微机电路开始正常工作。
2.3晶振电路:
晶振在数字电路的基本作用是提供一个时序控制的标准时刻。
数字电路的工作是根据电路设计,在某个时刻
门完成特定的任务,如果没有一个时序控制的标准时刻,整个数字电路就会成为“聋子”,不知道什么时刻该做什么事情了。
晶振的作用是为系统提供基本的时钟信号。
通常一个系统共用一个晶振,便于各部分保持同步。
有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。
晶振的工作原理:
主板时钟芯片即分频器的原始工作振荡频率,由石英晶体多谐振荡器的谐振频率来产生,晶振其实是一个频率产生器,他主要把传进去的电压转化为频率信号。
提供给分频率一个基准的14.318MHZ的振荡频率,它是一个多谐振荡器的正回馈环电路,也就是说它把输入作为输出,把输出作为输入的回馈频率,象这样一个永无休止的循环自激过程。
2.4时钟显示
2.4.1LCD1602:
工业字符型液晶,能够同时显示16x02即32个字符。
(16列2行)
2.4.2DS1302:
引脚功能及结构
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
。
下图为DS1302的引脚功能图:
DS1302封装图
要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。
虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。
可以用老式电脑主板上的3.6V充电电池。
如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。
100μF就可以保证1小时的正常走时。
DS1302在第一次加电后,必须进行初始化操作。
初始化后就可以按正常方法调整时间。
2.5程序框图:
电子闹钟的主电路指的是图中的框部分,主要设计到单片机电路和按键按钮电路,主机的设计具体地说有:
(1)系统时钟电路设计;
(2)系统复位电路设计;(3)按键与按钮电路设计;(4)闹铃声指示电路设计。
本设计是定时闹钟的设计,由单片机AT89C52芯片和LCD液晶显示器为核心,辅以时钟芯片等必要电路,构成的一个单片机电子定时闹钟。
电子钟设计可以采用数字。
2程序流程图
2.6基本电路及工作原理:
定时闹钟的设计,由单片机AT89C52芯片和DS1302和LCD液晶显示器为核心,辅以必要的电路,构成一个单片机电子定时闹钟。
电子钟设计可以采用数字电路实现,也可以采用单片机来完成。
AT89C52的指令系统和引脚与8051完全兼容,片内有128B的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
AT89C52结合用LCD液晶显示器设计的简易定时闹钟,可以设置限制的时间及显示闹钟设置时间,若时间一到则发车一阵声响,进一步可以扩充控制电器的启停。
定时闹钟包括时间显示,按键电路,复位电路,闹铃指示电路等等几部分。
三、软件设计和仿真:
3.1软件设计:
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey_set=P1^0;
sbitkey_add=P1^1;
sbitkey_sub=P1^2;
sbitkey_break=P1^3;
sbitbell=P3^0;
sbitRS=P2^5;
sbitRW=P2^6;
sbitE=P2^7;
sbitT_CLK=P2^2;
sbitT_IO=P2^1;
sbitT_RST=P2^0;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
ucharalarm_temp[2]={0,0};//时、分
uchartime_temp[7]={0x00,0x00,0x00,0x19,0x12,0x03,0x12,};//存放初始化时间及从ds1302读取的数据
//数据格式:
秒分时日月星期年
//初始时间:
00-00-00-03-19-12-12
bitm;
voidInitTimer0(void)//50ms中断,用于产生":
"的闪烁
{
TMOD=0x01;
TH0=0x3C;
TL0=0x0B0;
EA=1;
ET0=1;
TR0=1;
}
/*定时器延时,n为延时的微秒数,整个程序可用*/
voiddelay(uintn)
{
TH1=-n/236;
TL1=-n%236;
TR1=1;
while(!
TF1)
TF1=0;
TR1=0;
}
voiddelay_4s(void)//误差0us
{
unsignedchara,b,c;
for(c=252;c>0;c--)
for(b=230;b>0;b--)
for(a=33;a>0;a--);
_nop_();//ifKeil,requireuseintrins.h
}
//*********LCD1602驱动程序***************
voidlcd_wdat(ucharm)
{
RS=1;
RW=0;
P0=m;
delay
(1);
E=1;
delay
(1);
E=0;
}
voidlcd_wcmd(ucharh)
{
RS=0;
RW=0;
P0=h;
delay
(1);
E=1;
delay
(1);
E=0;
}
voidlcd_init(void)
{
delay(15000);
lcd_wcmd(0x38);
delay(5000);
lcd_wcmd(0x38);
delay(5000);
lcd_wcmd(0x38);
delay(5000);
lcd_wcmd(0x0c);
lcd_wcmd(0x06);
lcd_wcmd(0x01);
}
/*---------------------------------------------------------------------------*/
/*ds1302读写程序*/
voidRTInputByte(uchard)//往DS1302写入1Byte数据(内部函数),d写入的数据
{
uchari;
ACC=d;
for(i=8;i>0;i--)
{
T_IO=ACC0;/*相当于汇编中的RRC*/
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
ucharRTOutputByte(void)//从DS1302读取1Byte数据(内部函数)
{//
uchari;
for(i=8;i>0;i--)
{
ACC=ACC>>1;/*相当于汇编中的RRC*/
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
voidW1302(ucharucAddr,ucharucDa)//往DS1302写入数据
{//先写地址,后写命令/数据(内部函数)
T_RST=0;//ucAddr:
DS1302地址,ucData:
要写的数据
T_CLK=0;
T_RST=1;
RTInputByte(ucAddr);/*地址,命令*/
RTInputByte(ucDa);/*写1Byte数据*/
T_CLK=1;
T_RST=0;
}
ucharR1302(ucharucAddr)//读取DS1302某地址的数据,先写地址,后读命令/数据(内部函数)
{//ucAddr:
DS1302地址
ucharucData;//ucData:
读取的数据
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(ucAddr);/*地址,命令*/
ucData=RTOutputByte();/*读1Byte数据*/
T_CLK=1;
T_RST=0;
return(ucData);
}
voidset1302(uchar*pClock)//设置初始时间,先写地址,后读命令/数据(寄存器多字节方式)
{//簆Clock:
设置时钟数据地址格式为:
秒分时日月星期年
uchari;
ucharucAddr=0x80;
W1302(0x8e,0x00);/*控制命令,WP=0,写操作*/
for(i=7;i>0;i--)
{
W1302(ucAddr,*pClock);/*秒分时日月星期年*/
pClock++;
ucAddr+=2;
}
W1302(0x8e,0x80);/*控制命令,WP=1,写保护*/
}
/*------------------------开机显示------------------------------*/
voiddisplay1(void)
{
uchari;
ucharcodedis[4]="week";
ucharcodep1[16]="Name:
Chenhaomin";
ucharcodep2[16]="No:
1008030204";
delay(1000);
for(i=0;i<16;i++)
{
lcd_wcmd(0x80|i);
lcd_wdat(p1[i]);
}
for(i=0;i<16;i++)
{
lcd_wcmd(0xc0|i);
lcd_wdat(p2[i]);
}
delay_4s();
lcd_init();
delay(1000);
delay(1000);
lcd_wcmd(0x80);//2
lcd_wdat(0x32);
lcd_wcmd(0x81);//0
lcd_wdat(0x30);
for(i=0;i<4;i++)
{
delay(10);
lcd_wcmd(0x80|i+0x0b);
lcd_wdat(dis[i]);
}
}
/*------------显示部分-----------------*/
voiddisp(void)
{
/*显示时间*/
lcd_wcmd(0x82);
lcd_wdat(R1302(0x8d)/16+0x30);//年
lcd_wcmd(0x83);
lcd_wdat(R1302(0x8d)%16+0x30);
lcd_wcmd(0x84);//-
lcd_wdat(45);
lcd_wcmd(0x85);
lcd_wdat(R1302(0x89)/16+0x30);//月
lcd_wcmd(0x86);
lcd_wdat(R1302(0x89)%16+0x30);
lcd_wcmd(0x87);//-
lcd_wdat(45);
lcd_wcmd(0x88);
lcd_wdat(R1302(0x87)/16+0x30);//日
lcd_wcmd(0x89);
lcd_wdat(R1302(0x87)%16+0x30);
lcd_wcmd(0x8a);
lcd_wdat(32);
lcd_wcmd(0x8f);
lcd_wdat(R1302(0x8b)%16+0x30);//星期
lcd_wcmd(0xc0);
lcd_wdat(R1302(0x85)/16+0x30);//时
lcd_wcmd(0xc1);
lcd_wdat(R1302(0x85)%16+0x30);
//lcd_wcmd(0xc2);//:
//lcd_wdat(58);
lcd_wcmd(0xc3);
lcd_wdat(R1302(0x83)/16+0x30);//分
lcd_wcmd(0xc4);
lcd_wdat(R1302(0x83)%16+0x30);
//lcd_wcmd(0xc5);
//lcd_wdat(58);//:
lcd_wcmd(0xc6);
lcd_wdat(R1302(0x81)/16+0x30);//秒
lcd_wcmd(0xc7);
lcd_wdat(R1302(0x81)%16+0x30);
/*显示闹钟*/
lcd_wcmd(0xcb);
lcd_wdat(alarm_temp[1]/10+0x30);//时
lcd_wcmd(0xcc);
lcd_wdat(alarm_temp[1]%10+0x30);
lcd_wcmd(0xcd);
lcd_wdat(58);
lcd_wcmd(0xce);
lcd_wdat(alarm_temp[0]/10+0x30);//分
lcd_wcmd(0xcf);
lcd_wdat(alarm_temp[0]%10+0x30);//秒
}
/*-----------------系统设置----------------------*/
voidsys_set(void)
{
uchari,j;
ucharkey_state=0;
TR0=0;//停止闪烁,显示":
"
lcd_wcmd(0xc2);
lcd_wdat(58);
lcd_wcmd(0xc5);
lcd_wdat(58);
while(key_break)
{
if(!
key_set)//adjustthekeystate
{
delay(10000);
if(!
key_set)
while(!
key_set);
key_state++;
if(key_state==9)
key_state=0;
}
switch(key_state)//调整时间时,需要的时候再读出各寄存器的值,以完成调整时间的要求
//虽然会浪费一定的空间,但能保证较快地响应请求
//在每次读出数据后应将bcd码转化为16进制数,调整完成后,再将16进制数转化为bcd码,最后给ds1302送数
{
case0:
//时钟秒调整time_temp[0]
lcd_wcmd(0xc8);
lcd_wdat(67);//c
lcd_wcmd(0xc9);
lcd_wdat(45);//-
lcd_wcmd(0xca);
lcd_wdat(83);//s
time_temp[0]=R1302(0x81);//读出秒寄存器
time_temp[0]=time_temp[0]/16*10+time_temp[0]%16;//转化为16进制数
if(!
key_add)
{
delay(10000);
if(!
key_add)
{
while(!
key_add);
time_temp[0]++;
if(time_temp[0]==60)
time_temp[0]=0;
}
}
if(!
key_sub)
{
delay(10000);
if(!
key_sub)
{
while(!
key_sub);
time_temp[0]--;
if(time_temp[0]==255)
time_temp[0]=59;
}
}
W1302(0x8e,0x00);
W1302(0x80,time_temp[0]/10*16+time_temp[0]%10);
W1302(0x8e,0x80);
break;
case1:
//时钟分调整
lcd_wcmd(0xc8);
lcd_wdat(67);//c
lcd_wcmd(0xc9);
lcd_wdat(45);//-
lcd_wcmd(0xca);
lcd_wdat(77);//m
time_temp[1]=R1302(0x83);//读出分寄存器
time_temp[1]=time_temp[1]/16*10+time_temp[1]%16;
if(!
key_add)//++
{
delay(10000);
if(!
key_add)
{
while(!
key_add);
time_temp[1]++;
{
if(time_temp[1]==60)
time_temp[1]=0;
}
}
}
if(!
key_sub)//--
{
delay(10000);
if(!
key_sub)
{
while(!
key_sub);
time_temp[1]--;
{
if(time_temp[1]==255)
time_temp[1]=59;
}
}
}
W1302(0x8e,0x00);
W1302(0x82,time_temp[1]/10*16+time_temp[1]%10);
W1302(0x8e,0x80);
break;
case2:
//时钟时调整
lcd_wcmd(0xc8);
lcd_wdat(67);//c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MCS51 单片机 闹钟 提醒 设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)