ImageVerifierCode 换一换
格式:DOC , 页数:40 ,大小:1.75MB ,
资源ID:849987      下载积分:20 积分
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 微信支付   
验证码:   换一换

加入VIP,免费下载资源
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【http://www.wodocx.com/d-849987.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于51单片机的电子时钟.doc)为本站会员(管**)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(发送邮件至2622162128@qq.com或直接QQ联系客服),我们立即给予删除!

基于51单片机的电子时钟.doc

1、摘要时钟具有走时准确、整点报时、设置时间、设置闹钟时间、数据输入合法性判别、掉电数据不丢失、操作简便等特点。目录摘要1一、设计要求3二、硬件系统42.1器件选用42.2器件简介41.STC89C52芯片42.DS1302芯片53.1602液晶64.蜂鸣器72.3系统构架92.4电路设计91蜂鸣器与电源指示电路102. 51单片机与时钟芯片电路103 .液晶显示电路114按键控制电路115.电源引入电路12三、程序设计123.1程序框图123.2简介流程图143.3程序代码15四、实物及使用说明154.1 图片展示154.2操作键介绍174.3功能介绍18五、心得体会18六、附录19附一、源程序

2、19附二:器件清单(器件购买清单)40一、设计要求1. 走时准确(一个月内走时误差不得大于*秒)2. 具备整点报时,设置闹钟功能3. 具备修改时间功能4. 操作简单易懂二、硬件系统2.1器件选用对于要求走时准确的闹钟,应该选择专用的时钟芯片来实现。我们选常用的DS1302芯片来保证走时的准确性。显然,为了能够报时,我们需要一个发音器件,可以选用蜂鸣器。对于控制功能的实现,我们可以选用性价比较高的STC89C52单片机来实现。显然,我们还需要一个人机界面显示器和操作按键来对闹钟进行一些操作。这个可以选用1602液晶以及按键来实现。由上可知,51单片机是闹钟系统的主控芯片。2.2器件简介1.STC

3、89C52芯片STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2

4、级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz。2.DS1302芯片DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格

5、式DS1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK串行时钟时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW。下面将主要的性能指标作一综合:实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力 31个 8 位暂存数据存储RAM 串行 I/O 口方式使得管脚数量最少 宽范围工作电压2.0 5.5V 工作电流 2.0V 时,小于300nA 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式 8

6、脚DIP 封装或可选的8 脚SOIC 封装根据表面装配 简单 3 线接口 与 TTL 兼容Vcc=5V 可选工业级温度范围-40 +853.1602液晶1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。显然,对于显示时钟数据它是能够

7、胜任的。下面是液晶的示意图以及引脚说明: 4.蜂鸣器蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。蜂鸣器分为有源和无源两种,此处源值得是震荡源,而非电源。两者的区别是:有源蜂鸣器只要给一个电源,就能发声,所以程序控制方便,但由于多了一个震荡电路,价格上相对较高;无源蜂鸣器给直流信号无法使其发声,须通高低电平才能使其发声,显然高低电平的频率不能太低,但是

8、频率也不能太高,否则蜂鸣器的响应速度跟不上,由此可知无源蜂鸣器控制较为复杂。但是其价格便宜。此处我们选用无源蜂鸣器,因为对于51单片机来说,在实现闹钟功能后,还可以轻松的驱动无源蜂鸣器。下面是蜂鸣器的实物图通过以上初步的了解,可以断定我们选的器材可以满足设计要求。2.3系统构架液晶显示电源模块 STC89C52蜂鸣器DS1302模块操作键2.4电路设计通过查所选器件的数据手册,可以设计出正确的电路图。下面是我设计的电路图。1蜂鸣器与电源指示电路2. 51单片机与时钟芯片电路3 .液晶显示电路4按键控制电路5.电源引入电路三、程序设计3.1程序框图开始初始化设置键按下按键处理确认键按下 数据合法

9、 写入DS1302报时与闹钟显示数据读DS1302数据 3.2简介流程图.初始化:DS1302,1602初始化,开定时器0、1,开外部中断2.按键处理:按键有上下左右,设置键,确认键。其中左右键是控制液晶光标左右移动,是通过将液晶位置的地址写入数组A,然后左右键改变变量i,然后Ai就是光标所在的位置,由此我们可以进行一系列操作。上下键是控制相应位置数据的加减,知道了光标的位置,我们也可以知道相应位置显示的数据。设置键和确认键分别接在两个外部中断引脚上,中断程序里面是一些控制标志位的处理。3.数据合法判断:判断输入的数据是否合法。如月份为13,日期为31,小时为25等都为非法数据,如果出现了这种

10、情况,应该拒绝写入DS1302,并提示错误。总体来看,当没有键按下的时候,程序将不停地从DS1302读数据,然后显示数据,并判断是否是整点,是否到了闹钟时间;当有按键按下的时候,那么就进入设置状态,进行一些列设置,如修改时间,开闹钟等。当设置的数据非法时,数据将不会写入DS1302,保护了原来的数据,并且会提示数据非法,设置失败。由于数据时写入DS1302,且改芯片一直供电,所以数据不会因为单片机的掉电而丢失,如此我们不需要每次开机都设置时间,设置闹钟。3.3程序代码由于代码有些长,附在最后。四、实物及使用说明4.1 图片展示从上图可以看出,时钟显示了年月日时分秒周,其中6下面的0代表闹钟关闭

11、,如果为1代表闹钟打开。现在闹钟已经打开,后面是闹钟时间22:214.2操作键介绍1. 设置键为最底下那排左边的按键,当按下它,液晶会显示光标,指示当前位置,由此我们可以知道是对“年月日时分秒周闹”的哪一个操作。注意,只有当按下这个键,其它键才有效。2. 确认键最底下那排右边的按键,当按下它,液晶会关显示光标。如果闹钟为0,则不显示闹钟时间;如果闹钟为1则显示闹钟时间。如果设置时间错误,如月份为13,小时为25等,则会显示“Illegal time Set failed”,并发出声音提示。3. 上面四个按键,其中左右两个控制光标的左右移动,上下两个控制光标所在位置数据的加减。4. 如果按下了设

12、置键,并对数据进行了修改,但又不想修改怎么办?很简单,不要按确认键,然后关电源,则修改无效。5. 本闹钟只要DS1302芯片不掉电,则时间数据,闹钟数据不会丢失,即便主控芯片掉电也如此。DS1302用了纽扣电池供电,所以一般情况下不需要担心数据丢失的问题。除非纽扣电池没电。4.3功能介绍 时钟具有走时准确、整点报时、设置时间、设置闹钟时间、数据输入合法性判别、掉电数据不丢失、操作简便等特点。五、心得体会通过制作电子钟,让我更加了解了51单片机,也让我更会看数据手册,学会了怎样驱动DS1302,液晶。与同学的交流,加强了我们之间的联系。通过帮同学查错,我对于程序查错更有自信了。六、附录附一、源程

13、序#include #include#include#define uchar unsigned char#define uint unsigned int/*ds1302的位定义*/sbit SCK=P20;sbit SDA=P21;sbit RST=P22;/*液晶的位定义*/sbit RS=P25;sbit RW=P26;sbit En=P27;/*按键及蜂鸣器*/sbit Beep=P10;sbit up=P13;/上sbit down=P14;/下sbit left=P12;/左sbit right=P15;/ 右sbit P32=P32;/中断0sbit P33=P33;/中断1b

14、it set,ok;/设置,确定,0/1行有关bit choose_row;/用于选择第一行还是第二行unsigned int time_delay;/延时变量bit read_time;code uchar avalueh08=0x82,0x83,0x85,0x86,0x88,0x89,0x8b;/液晶第0行的地址code uchar avalueh111=0xc0,0xc1,0xc3,0xc4,0xc6,0xc7,0xc9,0xcb,0xcc,0xce,0xcf; /液晶的地址 address valuecode uchar error0=Illegal time;code uchar e

15、rror1=Set failed;uchar column0,column1;/列,用于地址bit row0,row1;/行0行1bit correct_time;/校时uchar alarm;/闹钟开关uchar n;/代表数字09uchar alarmh,alarmm,alarm_tmp,alarmh1,alarmm1; /闹钟时,分/闹钟音乐unsigned char music_n=0; /n为节拍常数变量 unsigned char code music_tab26 = 0x18, 0x30, 0x1C , 0x10, /格式为: 频率常数, 节拍常数, 频率常数, 节拍常数, 0x

16、20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80 ; /*复位脚*/#define RST_CLRRST=0/*电平置低*/#define RST_SETRST=1/*电平置高*/*双向数据*/#define IO_CLRSDA=0/*电平置低*/#define IO_SETSDA=1/*电平置高*/#define IO_RSDA /*电平读取*/*时钟信号*/#define S

17、CK_CLRSCK=0/*时钟信号*/#define SCK_SETSCK=1/*电平置高*/*ds1302地址宏定义*/#define ds1302_sec_add0x80/秒数据地址#define ds1302_min_add0x82/分数据地址#define ds1302_hour_add0x84/时数据地址#define ds1302_day_add0x86/日数据地址#define ds1302_month_add0x88/月数据地址#define ds1302_week_add0x8a/星期数据地址#define ds1302_year_add0x8c/年数据地址#define d

18、s1302_control_add0x8e/控制数据地址#define ds1302_charger_add0x90 #define ds1302_clkburst_add0xbe#define ds1302_alarm_add0xe0#define ds1302_alarmh_add0xe2#define ds1302_alarmm_add0xe4/*时钟显示用数组*/uchar time_buf18 = 20,13,12,30,8,52,0,2;/空年月日时分秒周uchar time_buf8 ;/空年月日时分秒周/*液晶显示用数组*/uchar time= ;uchar date = ;

19、uchar tempdata8;uchar m=0,1,2,3,4,5,6,7,8,9;/*函数声明*/void time0_init(void) ;void music_delay (unsigned char m);void delay();void ds1302_write_byte(uchar addr, uchar d);uchar ds1302_read_byte(uchar addr);void ds1302_write_time(void);void ds1302_read_time(void);void ds1302_init(void);void lcd_wdat(ucha

20、r dat);void lcd_wcom(uchar com);void lcd_init();void showchar(uchar pos,c);void showstring(uchar line,char *ptr);void disp_year(void);void disp_time(void);/*主函数*/void main() uchar i;unsigned char music_m; /m为频率常数变量 unsigned char music_i=0;Beep=0;/关蜂鸣器,不关好吵ds1302_init();lcd_init();/delay();lcd_wcom(0

21、xc9);lcd_wdat(0) ;/闹钟为0,即没闹钟lcd_wcom(0x80); TMOD|=0x01;/timer0用于音乐控制节拍 TH0=0xd8;TL0=0xef; ET0=1; TR0=0;/先关,用时再开 TMOD|=0x10;/定时器1设置 16位 TH1=0xa0;/初始化值 TL1=0x00; ET1=1; TR1=1; EX0=1;/外部中断0 IT0=1;/下降沿触发 EX1=1;/外部中断1 IT1=1; EA=1;/开总中断while(1) while(set) ET1=0;/关定时器1if(choose_row) column1=6; lcd_wcom(0xc

22、9);/显示在闹钟的位置,因为闹钟常用row1=1; elselcd_wcom(0x82);/设置显示位置为第0行的第3个字符 row0=1; lcd_wcom(0x0f); /开光标while(row0=1)if(left=0)column0-;/第0行的列,左移if(column00xf0) column0=6;/n=0;/时间初值为0,或许可以不要if(right=0)column0+;if(column06) column0=0;n=0;if(up=0)+n;/上,时间加一,以下为限制n值,如分钟的十位不可为6789switch(column0)/把设置的值收到数组中,以便写入DS13

23、02 case 0: n=(n9 ? 0:n); time_buf11=time_buf11%10+n*10;correct_time=1;break;case 1: n=(n9 ? 0:n); time_buf11=time_buf11/10*10+n;correct_time=1;break;case 2: n=(n1 ? 0:n); time_buf12=time_buf12%10+n*10;correct_time=1;break;case 3: n=(n9 ? 0:n); time_buf12=time_buf12/10*10+n;correct_time=1;break;case

24、4: n=(n3 ? 0:n); time_buf13=time_buf13%10+n*10;correct_time=1;break;case 5: n=(n9 ? 0:n); time_buf13=time_buf12/10*10+n;correct_time=1;break;case 6: n=(n7 ? 1:n); time_buf17=n;correct_time=1;break;default:break;lcd_wdat(mn);/写数据if(down=0)n-;switch(column0) case 0: n=(n9 ? 9:n); time_buf11=time_buf11

25、%10+n*10;correct_time=1;break;case 1: n=(n9 ? 9:n); time_buf11=time_buf11/10*10+n;correct_time=1;break;case 2: n=(n1 ? 1:n); time_buf12=time_buf12%10+n*10;correct_time=1;break;case 3: n=(n9 ? 9:n); time_buf12=time_buf12/10*10+n;correct_time=1;break;case 4: n=(n3 ? 3:n); time_buf13=time_buf13%10+n*10

26、;correct_time=1;break;case 5: n=(n9 ? 9:n); time_buf13=time_buf13/10*10+n;correct_time=1;break;case 6: n=(n7 ? 7:n);if(n=0) n=1; time_buf17=n;correct_time=1;break;default:break;lcd_wdat(mn); lcd_wcom(avalueh0column0); for(time_delay=0;time_delay0xf0) column1=0X0a;n=0;if(right=0)column1+;if(column10x

27、0a) column1=0;n=0;if(up=0)EA=0;n+;switch(column1)case 0: n=(n2 ?0: n); time_buf14=time_buf14%10+n*10;correct_time=1;break;case 1: n=(n9 ?0: n); time_buf14=time_buf14/10*10+n;correct_time=1;break;case 2: n=(n5 ?0: n); time_buf15=time_buf15%10+n*10;correct_time=1;break;case 3: n=(n9 ?0: n); time_buf15

28、=time_buf15/10*10+n;correct_time=1;break;case 4: n=(n5 ?0: n); time_buf16=time_buf16%10+n*10;correct_time=1;break;case 5: n=(n9 ?0: n); time_buf16=time_buf16/10*10+n;correct_time=1;break;default: break;if(column1=6) if(n1) n=0;if(n=1) alarm=1;lcd_wcom(0x38);lcd_wcom(0x80+0x4b);alarm_tmp=0+alarmh/10;

29、lcd_wdat(alarm_tmp);alarm_tmp=0+alarmh%10;lcd_wdat(alarm_tmp);lcd_wdat(:);lcd_wcom(0x38);alarm_tmp=0+alarmm/10;lcd_wdat(alarm_tmp);alarm_tmp=0+alarmm%10;lcd_wdat(alarm_tmp);lcd_wcom(0xcb);/开闹钟,开显示lcd_wcom(0xc9); elsealarm=0;lcd_wcom(0xcb);/关闹钟,关显示lcd_wdat( );lcd_wdat( );lcd_wdat( );lcd_wdat( );lcd_w

30、dat( );lcd_wcom(0xc9);if(alarm=1) /设置闹钟时间,以及记录闹钟时间switch(column1)case 7 : n=(n2 ? 0:n); alarmh=alarmh%10+n*10;break;case 8 :n=(n9 ? 0:n); alarmh=alarmh/10*10+n;break;case 9 :n=(n5 ? 0:n); alarmm=alarmm%10+n*10;break;case 10 :n=(n9 ? 0:n); alarmm=alarmm/10*10+n;break;default: break;lcd_wdat(mn);EA=1;

31、if(down=0)EA=0;n-;switch(column1) case 0: n=(n2 ? 2:n); time_buf14=time_buf14%10+n*10;correct_time=1;break;case 1: n=(n9 ? 9:n); time_buf14=time_buf14/10*10+n;correct_time=1;break;case 2: n=(n5 ? 5:n); time_buf15=time_buf15%10+n*10;correct_time=1;break;case 3: n=(n9 ? 9:n); time_buf15=time_buf15/10*

32、10+n;correct_time=1;break;case 4: n=(n5 ? 5:n); time_buf16=time_buf16%10+n*10;correct_time=1;break;case 5: n=(n9 ? 9:n); time_buf16=time_buf16/10*10+n;correct_time=1;break;default: break; if(column1=6)if(n1) n=1;if(n=1) alarm=1;lcd_wcom(0x38);lcd_wcom(0x80+0x4b);alarm_tmp=0+alarmh/10;lcd_wdat(alarm_

33、tmp);alarm_tmp=0+alarmh%10;lcd_wdat(alarm_tmp);lcd_wdat(:);lcd_wcom(0x38);alarm_tmp=0+alarmm/10;lcd_wdat(alarm_tmp);alarm_tmp=0+alarmm%10;lcd_wdat(alarm_tmp);lcd_wcom(0xcb);/开闹钟,开显示lcd_wcom(0xc9);elsealarm=0;lcd_wcom(0xcb);lcd_wdat( );lcd_wdat( );lcd_wdat( );lcd_wdat( );lcd_wdat( );lcd_wcom(0xc9);if

34、(alarm=1)switch(column1)case 7 : n=(n2 ? 2:n); alarmh=alarmh%10+n*10;break;case 8 :n=(n9 ? 9:n); alarmh=alarmh/10*10+n;break;case 9 :n=(n5 ? 5:n); alarmm=alarmm%10+n*10;break;case 10 :n=(n9 ? 9:n); alarmm=alarmm/10*10+n;break;default: break;lcd_wdat(mn);EA=1;lcd_wcom(avalueh1column1);for(time_delay=0;time_delay30000;time_delay+);while(ok) ok=0;lcd_wcom(0x0c);/关光标 if(alarm=0)lcd_wcom(0xcb);lcd_wdat( );lcd_wdat( );/关闹钟,关显示lcd_wdat( );lcd_wdat( );lcd_wdat( );lcd_wcom(0xc9); ET1=1;/处理完毕,开定时器1 /应该将闹钟时间写入DS1302,这样掉电不丢失if(read_time)read_time=0;ds1302_read_time();/读时间for(i=0;i8;i+

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922