毕业设计(论文)基于单片机的数字时钟日历设计.doc

上传人:仙人指路1688 文档编号:3980567 上传时间:2023-03-30 格式:DOC 页数:45 大小:2.27MB
返回 下载 相关 举报
毕业设计(论文)基于单片机的数字时钟日历设计.doc_第1页
第1页 / 共45页
毕业设计(论文)基于单片机的数字时钟日历设计.doc_第2页
第2页 / 共45页
毕业设计(论文)基于单片机的数字时钟日历设计.doc_第3页
第3页 / 共45页
毕业设计(论文)基于单片机的数字时钟日历设计.doc_第4页
第4页 / 共45页
毕业设计(论文)基于单片机的数字时钟日历设计.doc_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《毕业设计(论文)基于单片机的数字时钟日历设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于单片机的数字时钟日历设计.doc(45页珍藏版)》请在三一办公上搜索。

1、基于单片机的多功能电子时钟设计姓名: 学号: 专业:电子信息工程目 录1 使用硬件模块介绍11.1 STC89C52单片机最小系统模块21.212864液晶显示模块31.3 DS18B20的温度传感器的测温模块51.4 DS1302时钟芯片模块71.5. 定时报警模块91.6. NE555背光模块101.7电源与按键模块.102程序控制与实现111.使用硬件模块介绍该电子时钟是基于AT89C52单片机设计的,具有定时,闹铃,显示实时温度,显示日历,节日信息,由于程序较大,所以选择了STC89C52单片机,他可以提供8KB的FlashROM,设计可以分为以下七个模块单片机的最小系统模块。1286

2、4液晶显示模块DS18B20的温度传感器的测温模块。DS1302时钟芯片模块。定时报警模块。NE555背光模块。电源与按键模块总电路及实物如下:1.1 STC89C52单片机最小系统模块单片机由时钟电路和复位电路组成1.时钟电路STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。时钟可以由内部方式产生或外部方式产生2.复位及复位电路(1)复位操作复位是单片机的初始化操作。其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,

3、也需按复位键重新启动。2)复位信号及其产生RST引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。若使用颇率为6MHz的晶振,则复位信号持续时间应超过4us才能完成复位操作。二.STC89C52单片机具体功能如下 主电源引脚(2根)VCC(Pin40):电源输入,接5V电源GND(Pin20):接地线外接晶振引脚(2根)XTAL1(Pin19):片内振荡电路的输入端XTAL2(Pin20):片内振荡电路的输出端控制引脚(4根)RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG(Pin30):地址

4、锁存允许信号PSEN(Pin29):外部存储器读选通信号EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。可编程输入/输出引脚(32根)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。PO口(Pin39Pin32):8位双向I/O口线,名称为P0.0P0.7P1口(Pin1Pin8):8位准双向I/O口线,名称为P1.0P1.7 P2口(Pin21Pin28):8位准双向I/O口线,名称为P2.0P2.7P3口(Pin10Pin17):8位准双向I/O口

5、线,名称为P3.0P3.7电路图如下1.2 12864液晶显示模块液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。在本万年历当中12864 液晶显示显示当前的实时时间和温度及重要的阴阳历节日等功能。12864 液晶显示具有如下的特性:提供8 位,4 位并行接口及串行接口可选并行接口适配M6800 时序自动电源启动复位功能内部自建振荡源6416 位字符显示RAM(DDRAM 最多16 字符4 行,LCD 显示范围162 行)(改为半角输入)2M 位中文字型ROM(CGROM),总共提供8192 个中文字型(1616 点阵

6、)16K 位半宽字型ROM(HCGROM),总共提供126 个西文字型(168 点阵)6416 位字符产生RAM(CGRAM)1516 位总共240 点的ICON RAM(ICONRAM)其与单片机的连接电路如图1.2.1 所示:图1.2.1 12864与单片机的接线图液晶显示12864的引脚功能如表1.2.2所示。表1.2.2 液晶显示12864的引脚功能引脚号引脚名称方向功能说明1VSS-模块的电池地2VDD-模块的电源正端3VO-LCD驱动电压输入端4RS(CS)H/L并行的指令数据选择信号:串行的片选信号5R/W(SID)H/L并行的读写选择信号:串行的数据口6E(CLK)H/L并行的

7、使能信号:串行的同步时钟7DB0H/L数据08DB1H/L数据19DB2H/L数据210DB3H/L数据311DB4H/L数据412DB5H/L数据513DB6H/L数据614DB7H/L数据715PSBH/L并串行接口选择:H-并行:L-串行16NC空脚17RSTH/L复位 低电平有效18NC空脚19LED_A-背光电源正极20LED_K-背光电源负极12864LCD的指令系统及时序 该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。其指令表如表2所示:指令名称控制信号控制代码R/WRSDB7DB6DB5DB4DB3DB2DB1DB0显示开关000011

8、1111/0显示起始行设置0011XXXXXX页设置0010111XXX列地址设置0001XXXXXX读状态10BUSY0ON/OFFRST0000写数据01写数据读数据11读数据1.3 DS18B20的温度传感器的测温模块图1.3 测温电路图温度传感器的种类众多,DALLAS公司生产的DS18B20温度传感器适合在应用与高精度、高可靠性的场合。DS18B20的主要特点:超小的体积,超低的硬件开销,抗干扰能力强,精度高。DS18B20的主要特征:全数字温度转换及输出 先进的单总线数据通信最高12位分辨率,精度可达土0.5摄氏度 12位分辨率时的最大工作周期为750毫秒 可选择寄生工作方式 检测

9、温度范围为55C +125C (67F +257F)内置EEPROM,限温报警功能 64位光刻ROM,内置产品序列号,方便多机挂接 多样封装形式,适应不同硬件系统 DS18B20工作原理及应用:DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。DS18B20共有三种形态的存储器资源,分别是:ROM 只读存储器:用于存放DS18B20的ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56位的CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20

10、共64位ROM。RAM 数据暂存器:用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操

11、作。 DS18B20芯片与单片机的接口:DS18B20只需要接到控制器(单片机)的一个I/O口上,由于单总线为开漏,所以需要外接一个4.7K的上拉电阻。如要采用寄生工作方式,只要将VDD电源引脚与单总线并联即可。但在程序设计中,寄生工作方式将会对总线的状态有一些特殊的要求。微控制器控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求微控制器将数据线下拉500微秒,然后释放,DS18B20收到信号后等待1660微秒左右,然后发出60240微秒的存在低脉冲,微控制

12、器收到此信号表示复位成功,如果没有收到复位成功信号,则表示DS18B20出现问题,可以用来作为系统设计时的故障提示、判断信号。DS18B20的单总线数据传输特点,决定了它严格的控制时序。微控制器写1时,数据线必须先被拉至低电平,然后就被释放,使数据线在写时间片开始之后的15微秒之内拉至高电平。微控制器写0时,数据线必须先被拉至低电平且至少保持逻辑低电平60微秒。微控制器把数据线从高电平拉至低电平时,产生读时间片,数据线必须保持在逻辑低电平至少1微秒;来自DS18B20的输出数据在读时间片下降沿之后15微秒有效。因此,为了读取从时间片开始算起15微秒的数据线状态,微控制器必须停止把数据线驱动至低

13、电平。在读时间片结束时,数据线经过外部的上拉电阻拉回至高电平。所有读时间片的最短持续期限为60微秒,各个读时间片之间必须有最短为1微秒的恢复时间。其读写时序如图所示读数据写060微秒15微秒45微秒15微秒45微秒15微秒DS18B20写时间间隙写11.4 DS1302时钟芯片模块1.4.1 DS1302电路原理图(1)DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.55.5V。时钟可工作在24小时格式或12小时(AM/PM)格式。 DS1302与单片机的接口使用同步串行通信,

14、仅用3条线与之相连接。可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源后背电源双电源引脚。如图1.4.2所示。引脚号引脚名称功能1VCC2主电源2、3X1、X2振荡源,外接32768Hz晶振4GND地线5RST复位/片选线6I/O串行数据输入/输出端(双向)7SCLK串行时钟输入端8VCC1后备电源图1.4.2 DS1302引脚功能表(2)DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历

15、、时间寄存器及其控制字见下表。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的内容。 DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H-FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。寄存器名命令字取值范围各位内容写操作读操作76543210秒寄存器80H81H00-59CH10SECSEC分寄存器82

16、H83H00-59010MINMIN时寄存器84H85H01-12或00-2312/24010HRHR日寄存器86H87H01-28,29,30,310010DATEDATE月寄存器88H89H01-1200010MMONTH周寄存器8AH8BH01-0700000DAY年寄存器8CH8DH00-9910YEARYEAR DS1302的日历、时钟寄存器及其控制字1.5. 定时报警模块 1.5 报警电路图因为单片机的I/O的驱动能力不足以让蜂鸣器发声,所以外加三极管来放大电路驱动蜂鸣器,当P2.0管脚输出高电平时,发射结导通,集电结反偏,三极管处于放大状态,所以可以提供较大的电流来驱动蜂鸣器报警

17、1.6. NE555背光模块1.6.1 NE555背光电路此电路是由555构成的单稳态电路,当按键S0按下了,电容将会放电,被单稳态电路触发整形,形成一定宽度的脉冲,从5脚输出,使得三极管导通一段时间,从而使得LED导通一段时间,从而实现,在使用时可以看到屏幕,不使用时,屏幕处于省电的状态,节约了能量1.7电源与按键模块.1.6.2 电源与按键模块按键是用来设置日期,时间,其中各部分的功能分别为P21:退出设置键,显示版本信息键P22:上调键P23:设置键P24:减,下调键P25:日程提醒电源是为各个元器件提供能量的,电路所采用的单电源供电,7805输出的是一个压值大小为5V的直流电压。2程序

18、控制与实现/头文件#include #include #include/*/灯与扬声器定义sbit beep = P20;/扬声器/*/温度传感器引脚定义sbit DQ = P1 4 ;/ds18B20*/*/键盘引脚定义sbit KEY_1 = P21; /退出设置键,显示版本信息键sbit KEY_2 = P22; /上调键sbit KEY_3 = P23; /设置键sbit KEY_4 = P24; /减,下调键sbit KEY_7 = P25; /日程提醒 /*/LED接口定义sbit RS = P12;/模式位,为0输入指令,为1输入数据sbit RW = P11;/读写位,为0读,

19、为1写sbit E = P10;/使能位#define Lcd_Bus P0 /数据总线/sbit wela = P26;/sbit dula = P27;/*/定义DS1302时钟接口sbit clock_clk = P3 2;/ds1302_clk(时钟线)sbit clock_dat = P3 3;/ds1302_dat(数据线)sbit clock_Rst = P3 4;/ds1302_Rst(复位线)/*/定义累加器A中的各位sbit a0 = ACC 0;sbit a1 = ACC 1;sbit a2 = ACC 2;sbit a3 = ACC 3;sbit a4 = ACC 4;

20、sbit a5 = ACC 5;sbit a6 = ACC 6;sbit a7 = ACC 7;/*/定义全局变量Unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2,nf,ns;/定义时间映射全局变量(专用寄存器)bit w = 0; /调时标志位,=0时为走时状态,=1时为调时状态static unsigned char menu = 0;/定义静态小时更新用数据变量static unsigned char keys = 0;/定义静态小时更新用数据变量st

21、atic unsigned char timecount = 0;/定义静态软件计数器变量signed char address,item,max,mini,calam,dalam,aalam,balam,ealam,falam,galam,halam;unsigned char flag=0,flag1=0; unsigned char richeng=0; int kk=0;/*/void DelayM(unsigned int a)/延时函数 1MS/次 unsigned char i; while( -a != 0) for(i = 0; i 125; i+); /一个 ; 表示空语句

22、,CPU空转。 /i 从0加到125,CPU大概就耗时1毫秒/*void DelayF(unsigned char b) unsigned int j,k; for(j=b;j=0;j-) for(k=3000;k0) write_data(*s); s+; /*/void lcm_w_test(bit i,unsigned char word)/写指令或数据 if(i = 0) write_com(word);/写指令或数据(0,指令) else write_data(word);/写指令或数据(1,数据) /*/void lcm_clr(void)/清屏函数 lcm_w_test(0,0x

23、01); /*/void lcm_clr2(void)/清屏上面3行(用空格填满要清显示的地方,因为液晶屏是静态显示的,所以这办法常用) lcm_w_test(0,0x80);/第一行 lcm_w_word( ); /标尺(1234567812345678应该能够显示满一行) lcm_w_test(0,0x90);/第二行 lcm_w_word( ); /标尺(1234567812345678应该能够显示满一行) lcm_w_test(0,0x88);/第一行 lcm_w_word( ); /标尺(1234567812345678应该能够显示满一行) /*/DS18B20温度传感器驱动(显示0

24、至60度,小数点后显示一位)/*/void Delay(int num)/延时函数 while(num-) ; /*/void Init_DS18B20(void)/初始化ds1820 unsigned char x=0; DQ = 1; /DQ复位 Delay(8); /稍做延时 DQ = 0; /单片机将DQ拉低 Delay(80); /精确延时 大于 480us DQ = 1; /拉高总线 Delay(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 Delay(20);/*/unsigned char ReadOneChar(void)/读一个字节 uns

25、igned char i=0; unsigned char dat = 0; for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; Delay(4); return(dat);/*/void WriteOneChar(unsigned char dat)/写一个字节 unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; Delay(5); DQ = 1; dat=1; /*/unsigned int ReadTemperature(voi

26、d)/读取温度,温度值返回到此函数中,供调用 unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); / 跳过读序号列号的操作 WriteOneChar(0x44); / 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器 a=ReadOneChar(); /读低8位 b=ReadOneChar(); /读高8位 t=b; t=8

27、; t=t|a; tt=t*0.0625; t= tt*10+0.5; /放大10倍输出并四舍五入 return(t);/t内的温度值,返回到子函数中,要将温度传输到temp变量,应用temp=ReabTemperature()/*/后面会出现的函数声明(当各函数的排列适当时可不用声明,加入函数声明就不用管各个子函数出现的位置先后了?)void lcm_w_ss(void);/向液晶LCM中写秒数据void lcm_w_mm(void);/向液晶LCM中写分数据void lcm_w_hh(void);/向液晶LCM中写小时数据void lcm_w_dd(void);/写日数据void lcm_

28、w_mo(void);/写月数据void lcm_w_yy(void);/写年数据void lcm_w_xq(void);/星期处理并送入LCM的指定区域unsigned char clock_in(void);/DS1302逐位写入字节(底层协议)void clock_out(unsigned char dd);/1302驱动程序逐位读出字节(底层协议?void Init_1302(void);/-设置1302的初始时间(2007年1月1日00时00分00秒星期一)unsigned char read_clock(unsigned char ord);/DS1302读数据(底层协议)void

29、 read_clockS(void);void Set_time(unsigned char sel);/根据选择调整的相应项目sel加1并写入DS1302void write_clock(unsigned char ord, unsigned char dd);/DS1302写数据(底层协议)void updata (void);void lcm_w_nl(void);/显示农历子函数void Conversion(bit c,unsigned char year,unsigned char month,unsigned char day); /农历年月日计算子函数void Conver_w

30、eek(bit c,unsigned char year,unsigned char month,unsigned char day);/星期计算子函数void ds_w(void); void alam_w1(void) ;/!1 void alam_w2(void);void lcm_w_ns2(); void lcm_w_nf2(); void naozhong(); void lcm_w_naozhong(); / void DelayF () ;/*/设置1302的初始时间(自动初始化)void Init_1302(void)/-设置1302的初始时间(2007年1月1日00时00分

31、00秒星期一) unsigned char f; if(read_clock(0xc1) != 0xaa) write_clock(0x8e,0x00);/允许写操作 write_clock(0x8c,0x07);/年 write_clock(0x8a,0x01);/星期 write_clock(0x88,0x01);/月 write_clock(0x86,0x01);/日 write_clock(0x84,0x00);/小时 write_clock(0x82,0x00);/分钟 write_clock(0x80,0x00);/秒 write_clock(0x90,0xa5);/充电 writ

32、e_clock(0xc0,0xaa);/写入初始化标志RAM(第00个RAM位置) for(f=0;f60;f=f+2)/清除闹钟RAM位为0 write_clock(0xc2+f,0x00); write_clock(0x8e,0x80);/禁止写操作 /*/DS1302写数据(底层协议)void write_clock(unsigned char ord, unsigned char dd) clock_clk=0; clock_Rst=0; clock_Rst=1; clock_out(ord); clock_out(dd); clock_Rst=0; clock_clk=1;/*/1302驱动程序逐位读出字节(底层协议)void clock_out(unsigned char dd) ACC=dd; clock_dat=a0; clock_clk=1; clock_clk=0; clock_dat=a1; clock_clk=1; clock_clk=0

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号