计算机科学与技术专业专升本论文.doc_第1页
计算机科学与技术专业专升本论文.doc_第2页
计算机科学与技术专业专升本论文.doc_第3页
计算机科学与技术专业专升本论文.doc_第4页
计算机科学与技术专业专升本论文.doc_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 毕 业 论 文 题题 目目 基于基于 AVR 的可调电子钟设计的可调电子钟设计 院系名称:院系名称:计算机科学与技术计算机科学与技术 专业班级:专业班级:1111 专升本专升本 学生姓名:学生姓名: 学学 号:号: 指导教师:指导教师: 2 目录目录 摘摘 要要4 4 第一章第一章 引言引言5 5 1.11.1 设计任务设计任务5 1.21.2 设计要求设计要求5 第二章第二章 总体方案论证与设计总体方案论证与设计总体方案论证与设计总体方案论证与设计6 6 第三章第三章 系统硬件设置系统硬件设置7 7 3.13.1 ATmega16ATmega16 单片机简介单片机简介.7 3.23.2 ATmega16ATmega16 单片机的工作原理单片机的工作原理.7 3.2.13.2.1 I/OI/O 端口的工作原理端口的工作原理 7 3.2.23.2.2 定时定时/ /计数器计数器 .8 3.2.33.2.3 中断系统中断系统8 3.2.43.2.4 振荡器振荡器9 3.33.3 时钟模块设计时钟模块设计.10 3.3.13.3.1 DS1302DS1302 特性介绍特性介绍 10 3.3.23.3.2 DS1302DS1302 引脚介绍引脚介绍 11 3.3.33.3.3 DS1302DS1302 有关日历,时间的寄存器有关日历,时间的寄存器 12 3.3.43.3.4 DS1302DS1302 与单片机接口电路与单片机接口电路 12 3.43.4 显示模块设计显示模块设计.13 3.4.13.4.1 LCD1602LCD1602 的特性介绍的特性介绍 .14 3.4.23.4.2 LCD1602LCD1602 引脚介绍引脚介绍 .15 3.4.33.4.3 16021602 内部功能器件及相关功能内部功能器件及相关功能 16 3.4.43.4.4 16021602 液晶与单片机接口电路液晶与单片机接口电路 18 3.53.5 设置模块设置模块 20 3.63.6 振荡电路振荡电路 21 3.73.7 复位电路复位电路 22 第四章第四章 系统软件设计系统软件设计2323 4.14.1 时钟函数模块时钟函数模块 25 4.1.14.1.1 实现功能实现功能 .25 3 4.1.24.1.2 函数设计函数设计.25 4.24.2 显示函数模块显示函数模块 30 4.2.14.2.1 实现功能实现功能 .30 4.2.24.2.2 函数设计函数设计.30 4.2.34.2.3 小结小结.31 4.34.3 按键函数模块按键函数模块 32 4.3.14.3.1 实现功能实现功能.32 4.3.24.3.2 函数设计函数设计.32 4.3.34.3.3 小结小结.32 4.44.4 主函数模块主函数模块 32 第五章第五章 心得体会心得体会3333 第六章第六章 致谢致谢3333 附录附录 1 1 元器件表元器件表 3434 附录附录 2 2 仿真图仿真图 3535 附录附录 3 3 源码源码 3636 附录附录 4 4 参考文献参考文献 6868 4 摘摘 要要 单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。单片机 接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。 本设计就是应用单片机强大的控制功能制作而成的指针式电子钟,该指针式电子 钟实现如下功能:液晶屏模拟表盘与时分秒指针显示当前时钟,K1 键用于选择 调节对象,K2 键用于调整时分秒,在按下 K4 键时确定调节值,时钟继续运行。 本设计采用的是 AVR 单片机,AVR 系列的单片机不仅具有良好的集成性能, 而且都具备在线编程接口,其中的 Mega 系列还具备 JTAG 仿真和下载功能;含有 片内看门狗电路、片内程序 Flash、同步串行接口 SPI;多数 AVR 单片机还内嵌 了 AD 转换器、EEPROM、模拟比较器、PWM 定时计数器等多种功能;AVR 单片机 的 IO 接口具有很强的驱动能力,灌入电流可直接驱动继电器、LCD 等元件。 芯片采用 DALLAS 公司的涓细充电时钟芯片 DS1302,该芯片通过简单的串行通 信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息, 采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。 显示器件采用 LCD1602 液晶,通过相应的按键调整相应的值。通过此次设 计能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软 件设计能力。 关键词关键词 AVR 单片机 时钟芯片 DS1302 LCD1602 液晶 5 第一章第一章 引言引言 本例采用 LCD1602 液晶作为显示元件,液晶屏显示当前时钟。该电子钟实 现如下功能:液晶屏模拟表盘与时分秒指针显示当前时钟,K1 键用于选择调节 对象,K2 键用于调整时分秒,在按下 K3 键时确定调节值,时钟继续运行。本例 程序包含控制模块、显示模块、实时时间计算模块、设置模块(时间设置模块) 。 1.11.1 设计任务设计任务 利用 AVR 单片机等实现一个简单的基于 AVR 的可调电子钟。 1.21.2 设计要求设计要求 a实现年月日时分秒指针式显示功能 b用三个按键来实现调整时分秒的功能 6 第二章第二章 总体方案论证与设计总体方案论证与设计总体方案论证与设计总体方案论证与设计 组成框图中包含显示模块,控制器,时间模块,设置模块。显示模块有 LCD1602 来控制显示,整个代码实现主要由控制器来实现,时间模块有 DS1302 来实现,可以显示系统时间,也可自行调整,设置模块为按键处理。具体模块分 析在相关的软硬件设计中详细介绍。 本设计中的可调电子钟拟采用 AVR 系列单片机 ATMEGA16 作为主控制器, 以 DS1302 时钟芯片和 16M 的外置晶振提供准确时间标准,以期实现对“时、分、 秒”的数字显示和校准时间的计时装置;可调电子钟不但可以显示当前时间,而 且可以显示年、月、日等,给人们的生活带来方便。另外可调电子钟还具备日期 时间的调节与写入功能。本设计将以 AVR 单片机为控制核心,通过与 DS1302 信获取实时时间,并将得到的数据通过 LCD1602 液晶显示出来,同时通过相应 的按键调整相应的值。因此本设计可分为以下模块:控制模块、显示模块、实时 时间计算模块、设置模块(时间设置模块) 。 7 第三章第三章 系统硬件设置系统硬件设置 3.13.1 ATmega16 单片机简介单片机简介 ATmega16 单片机是 ATmega 系列 AVR 单片机中内容接口丰富,功能齐全,性 能价格比较高的产品。它具有高性能、低功耗的 8 位 AVR 微处理器,先进的 RISC 结构,非易失性程序和数据存储器等。ATmega16 单片机的中央处理器由 32 个 8 位通用寄存器,1 个算术运算单元及状态和控制逻辑单元组成。AVR 采用了 哈弗结构,具有独立的程序总线和数据总线,程序存储器里的指令通过一级流水 线运行。它的存储器分为独立寻址的 flash 程序存储器,片内 SRAM 数据存储器 和 EEPROM 3 部分,均采用线性编址。 图 3-1 3.23.2 ATmega16ATmega16 单片机的工作原理单片机的工作原理 3.2.13.2.1 I/OI/O 端口的工作原理端口的工作原理 8 ATmeage16 单片机具有 32 个通用 I/O 口,分为 PA,PB,PC,PD,每组都是八位。 这些 I/O 都是可以通过各自的端口寄存器设置为输入或置成输出,有些 I/O 口还 具有第二功能。 所有的端口引脚都具有内部上拉电阻,可以通过寄存器独立选择是否连接, 复位时所有的引脚都为高阻态。ATmega16 单片机的每个端口都有三个 I/O 寄存 器地址:数据寄存器 PORTx(x=ABCD,下同)、方向寄存器 DDRx 和输入引脚 PINx。 3.2.23.2.2 定时定时/ /计数器计数器 ATmega16 单片机有三个定时/计数器:T/C0,T/C1,T/C2。其中 T/C0,T/C2 是两个八位的定时/计数器,而 T/C1 是 16 位的定时/计数器。 T/Cx(0,1,2)是一个通用的带有输出比较匹配和 PWM 波形发生器的单通道 8 位定时/计数器模块。T/Cx 可以选择通过预分频器由系统时钟驱动,或通过 T0 引脚的外部时钟驱动,时钟逻辑模块控制使用哪个时钟源及哪个边沿来进行加或 者减计数。 T/Cx(0,1,2)的时钟分频器对系统分频后作为 T/Cx(0,1,2)的驱动时 钟。T/Cx(0,1,2)的时钟可以是系统时钟或者系统时钟的 8 分频、64 分频、 256 分频及 1024 分频,通过控制寄存器 TCCRx(0,1,2)。 T/Cx 双缓冲结构的八位输出比较寄存器 OCRx(0,1,2)一直与 T/Cx(0,1,2)的计数值 TCNTx(0,1,2)进行比较。一旦 TCNTx(0,1,2)等于 OCRx(0,1,2),比较器就给出匹配信号。有 4 种工作模式:普通模式,CTC 模式, 快速 PWM 模式,相位修正 PWM 模式。 3.2.33.2.3 中断系统中断系统 ATmega16 单片机有 21 个中断源,每一个中断源都有一个独立的中断向量作 为中断服务程序的入口地址,而且所有的中断源都有自己的独立的使能位。如果 全局中断 I 和相应使能位都置位,则在中断标志位置位时将执行中断服务程序。 9 一个中断产生后,全局中断使能位 I 将被清零,后续中断被屏蔽。 中断相关的寄存器:MCU 控制寄存器 MCUCR,MCU 控制和状态寄存器 MCUCSR,通用中断控制寄存器 GICR,通用中断状态寄存器 GIFR. 3.2.43.2.4 振荡器振荡器 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 振荡器特性:XTAL1 和 XTAL2 分别为反向放大器的输入和输出。该反向放大 器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱 动器件,XTAL2 应不接。有余输入至内部时钟信号要通过一个二分频触发器,因 此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 10 3.33.3 时钟模块设计时钟模块设计 实时时间计算模块 方案(1):AVR 单片机内部带有定时/计数功能,此定时功能是通过对外部 晶振的脉冲进行计数,从而达到计时功能,只要使用 11.0592 的晶振就能实现零 误差的计时,因此可以利用此功能实现计时,但因为只有单一的计时功能要实现 “万年历”的功能需要较复杂的程序,而且如果单片机掉电无法继续进行计时, 所以使用不便。 方案(2):DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗的实 时时钟芯片,附加 31 字节静态 RAM,采用 SPI 三线接口与 CPU 进行通信,并 可采用突发方式一次传送多个字节的时钟信号和 RAM 数据。实时时钟可提供秒、 分、时、日、星期、月和年,一个月小与 31 天时可以自动调整,且具有闰年补 偿功能。工作电压宽达 2.55.5V。采用双电源供电(主电源和备用电源) ,可设 置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。利用单片机 强大的控制功能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。 综合上述两种方案,宜采用方案(2)实现实时计时功能。 3.3.13.3.1 DS1302DS1302 特性介绍特性介绍 DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗的实时时钟芯片, 附加 31 字节静态 RAM,采用 SPI 三线接口与 CPU 进行通信,并可采用突发方 式一次传送多个字节的时钟信号和 RAM 数据。实时时钟可提供秒、分、时、日、 星期、月和年,一个月小与 31 天时可以自动调整,且具有闰年补偿功能。工作 电压宽达 2.55.5V。采用双电源供电(主电源和备用电源) ,可设置备用电源充 电方式,提供了对后备电源进行涓细电流充电的能力。利用单片机强大的控制功 能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。 11 DS1302 可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿 等多种功能 DS1302 有 12 个寄存器,其中有 7 个寄存器与日历、时钟相关,存 放的数据位为 BCD 码形式;采用单片机计时,一方面需要采用计数器,占用硬 件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而采用时钟 芯片 DS1302。 3.3.23.3.2 DS1302DS1302 引脚介绍引脚介绍 图 3-2 8 、Vcc1:备用电池端; 1、Vcc2:5V 电源。当 Vcc2Vcc1+0.2V 时,由 Vcc2 向 DS1302 供电, 当 Vcc2/单片机寄存器的头文件 #include #include #include /a 为要操作的寄存器,b 为要操作的位数 #define SET_1(a,b) a|=(10; i-) if(_data else DIO_CLE_0; SCLK_SET_1;/时钟信号 _delay_us(2); SCLK_CLE_0; _data=1;/移位,准备好下次要写的数据 43 /向 DS1302 读取一个字节 uchar DS1302OreadByte(void) uchar i; uchar d_data=0; CLE_0(DDRD,PD5); for(i=8; i0; i-) d_data=1;/移位,以便下次存放读出的数据 if(PIND SCLK_SET_1; _delay_us(2); SCLK_CLE_0; SET_1(DDRD,PD5); return (d_data);/返回读到的数据 44 /*写 ds1302 寄存器*/ void Write1302(uchar ucAddr,uchar ucDa) RST_CLE_0; SCLK_CLE_0; RST_SET_1; DS1302writeByte(ucAddr);/地址 DS1302writeByte(ucDa);/写 1byte 数据 SCLK_SET_1; RST_CLE_0; /*读 ds1302 的寄存器*/ uchar Read1302(uchar ucAddr) uchar ucData; RST_CLE_0; SCLK_CLE_0; RST_SET_1; 45 DS1302writeByte(ucAddr|0X01);/地址,命令 ucData = DS1302OreadByte(); SCLK_SET_1; RST_CLE_0; return (ucData); void get_time(uchar *time) *(time+5) = Read1302(READ_SECOND); *(time+4) = Read1302(READ_MINUTE); *(time+3) = Read1302(READ_HOUR); *(time+2) = Read1302(READ_DAY); *(time+1) = Read1302(READ_MONTH); *(time+0) = Read1302(READ_YEAR); /*void Initial(void) Write1302(WRITE_PROTECT,0x00); Write1302(WRITE_SECOND,0x45); 46 Write1302(WRITE_MINUTE,0x24); Write1302(WRITE_HOUR,0x09); Write1302(WRITE_DAY,0x13); Write1302(WRITE_MONTH,0x04); Write1302(WRITE_PROTECT,0x80); void adopt_data(uchar n,uchar *show_data) *show_data = n4; *(show_data +1) = n */ void T1_int(void) TCCR1B = 0x00;/控制寄存器,停止定时 TIMSK |= 0x04;/中断屏蔽寄存器,中断允许 TCNT1 = 0xcf2c;/100ms 溢出一次 TCCR1B = 0x02; sei();/使能全局中断 47 void init_1302(void) Write1302(WRITE_PROTECT,0x00);/禁止写保护 Write1302(WRITE_SECOND,time4);/秒位初始化 Write1302(WRITE_MINUTE,time3);/分钟 Write1302(WRITE_HOUR,time2);/小时 Write1302(WRITE_DAY,time1);/日 Write1302(WRITE_MONTH,time0);/月 Write1302(WRITE_PROTECT,0x80);/允许写保护 /*按键函数*/ uchar get_key(void) uchar i=0; PORTD |= 0x0f; DDRD = 0xf0;/设置为输出 NOP(); NOP(); if(PIND/消除抖动 switch(PINDbreak;/选择键 case 0x0d:i = 3;break;/减值键 case 0x0b:i = 2;break;/增值键 case 0x07:i = 1;break;/确定键 while(PIND/等待按键松开 else i = 0;/没有按键被按下 DDRD = 0xff;/设置为输出 return i;/返回按键值 /*转换为 lcd 要显示的数据*/ 49 void adopt_data() uchar i,j=0; for (i=0;i4; lcd_showj+1 = timei j += 2; /*转换为 ds1302 的时间*/ void affirm_data(void) uchar i ,j = 0 ; for (i=0;i0) lcd_shown-; else if(lcd_shown=max) lcd_shown=0; 51 else lcd_shown=max; value=lcd_shown; /*功能显示函数*/ void show_function(void) uchar i; uchar function25=0x43,0x4c,0x4f,0x43,0x4b, 0x41,0x4c,0x41,0x52,0x4d, ; wr_dictate(0x01); display_lcd(0x84,0x7e); for (i=0;i6;i+) display_lcd(0x85+i,function0i);/显示时间 display_lcd(0xc5+i,function1i); /*设置时间*/ 52 void set_clock(void) uchar cursor = 0;/光标 uchar i,j; wr_dictate(0x01);/清屏 Write1302(WRITE_PROTECT,0x00); Write1302(WRITE_SECOND,time4|0x80);/暂时停止时钟的 运行 Write1302(WRITE_PROTECT,0x80); display_lcd(0x82,0x00);/显示年 display_lcd(0x85,0x01);/月 display_lcd(0x88,0x02);/日 display_lcd(0xc2,0x03);/时 display_lcd(0xc5,0x03);/分 display_lcd(0xc8,0x03);/秒 for (i=0,j=0;i10;i+=2) display_lcd(0x80+j,numberlcd_showi); display_lcd(0x80+j+1,numberlcd_showi+1); 53 j = j+3; wr_dictate(0x02); wr_dictate(0x0e); j = 0; while(1) NOP(); switch(get_key() case 1:/确认 cursor+; j+; if (cursor%2=0) j+; wr_dictate(0x14); wr_dictate(0x14); 54 else wr_dictate(0x14); if (cursor=10) j = 0; cursor = 0; wr_dictate(0x02);/光标归位 place = 0x80+j; break; case 2:/加 switch(cursor) /*一下的 case 成功选择项为光标对应的调 55 整位数*/ case 0:add_d(cursor,1);break; case 1: if(lcd_show0=1) add_d(cursor,2); else add_d(cursor,9); break; case 2:add_d(cursor,3);break; case 3: if(lcd_show2=3) add_d(cursor,0); else add_d(cursor,9); break; 56 case 4:add_d(cursor,2);break; case 5: if(lcd_show4=2) add_d(cursor,3); else add_d(cursor,9); break; case 6:add_d(cursor,5);break; case 7:add_d(cursor,9);break; case 8:add_d(cursor,5);break; case 9:add_d(cursor,9);break; display_lcd(place,numbervalue);/显示在 液晶屏的相应的位置 wr_dictate(0x10); break; 57 case 3:/减 switch(cursor) /*一下的 case 成功选择项为光标对应的调 整位数*/ case 0:dec_d(cursor,1);break; case 1: if(lcd_show0=1) dec_d(cursor,2); else dec_d(cursor,9); break; case 2:dec_d(cursor,3);break; case 3: if(lcd_show2=3) 58 dec_d(cursor,0); else dec_d(cursor,9); break; case 4:add_d(cursor,2);break; case 5: if(lcd_show4=2) dec_d(cursor,3); else dec_d(cursor,9); break; case 6:dec_d(cursor,5);break; case 7:dec_d(cursor,9);break; case 8:dec_d(cursor,5);break; case 9:dec_d(cursor,9);break; 59 display_lcd(place,numbervalue);/显示在 液晶屏的相应的位置 wr_dictate(0x10); break; case 4:/退格 affirm_data(); init_1302(); T1_OPEN; goto OUT; default: break; OUT:NOP(); /*补充显示*/ void allowance(void) 60 uchar i,j; display_lcd(0x82,0x00);/显示月 display_lcd(0x85,0x01);/日 display_lcd(0x88,0x02);/时 display_lcd(0x8b,0x03);/分 get_time(time); adopt_data(); for (i=0,j=0;i10;i+=2) display_lcd(0x80+j,numberlcd_showi); display_lcd(0x80+j+1,numberlcd_showi+1); j = j+3; int main(void) uchar chinese58 = 61 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, 0x0f,0x09,0x0f,0x0,0x0f,0x09,0x13,0x00, 0x1f,0x11,0x11,0x1f,0x11,0x11,0x11,0x1f,0x00, 0x01,0x1d,0x17,0x1d,0x17,0x1d,0x03,0x01, 0x04,0x0a,0x11,0x0e,0x02,0x0a,0x16,0x00,; uchar i,j; uchar key_Enter = 0;/确认键被按下的次数 /控制线 DDRC = 0xff;/方向寄存器 PORTC = 0xff;/数据寄存器 /数据端 DDRB = 0xff;/端口 B 设置为输出 PORTB = 0xff; DDRD = 0xff;/按键设为输入 PORTD = 0xff; 62 init_1302(); init_lcd(); T1_int(); wr_dictate(0x40); for (j=0;j5;j+) for (i=0;i8;i+) wr_data(chineseji);/利用循环语句把点阵字 符写进 CGRAM 中 allowance();/补充显示 while(1) NOP(); i=get_key(); if (i=1)/所有的功能以确认键按下才开始操作 63 while (1) NOP(); switch(i) case 1:/确认键 T1_CLOSE;/确认键按下,停止显示数字 key_Enter+; switch(key_Enter) case 1: show_function();/显示功能 break; case 2: set_clock();/设置时间 64 goto OUT; break; case 2:/加值键 display_lcd(0x84,0x20);/清除上行的 箭头 display_lcd(0xc4,0x7e);/显示一个箭 头 break; case 3:/减值键 display_lcd(0xc4,0x20);/消除下行的 箭头 display_lcd(0x84,0x7e);/显示一个箭 头 break; 65 case 4:/确定键 OUT: wr_dictat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论