工学单片机课程设计电子万年历.docx
- 文档编号:13946973
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:41
- 大小:3.85MB
工学单片机课程设计电子万年历.docx
《工学单片机课程设计电子万年历.docx》由会员分享,可在线阅读,更多相关《工学单片机课程设计电子万年历.docx(41页珍藏版)》请在冰点文库上搜索。
工学单片机课程设计电子万年历
本科课程设计
课程名称:
单片机原理与接口技术
课设项目:
电子万年历课程设计
课设地点:
专业班级:
学号
学生姓名:
同组人:
指导教师:
2012年05月30日
设计题目:
电子万年历
设计任务与要求:
1、显示年月日时分秒及星期信息
2、具有可调整日期和时间功能
3、增加闰年计算功能
4、增加了显示温度的模块
设计方案:
由于我是在网上购买的现成的开发板来学习和使用的,故在方案的选择上也只能限于开发板设计好的电路和芯片.
系统分为主控模块、时钟电路模块、温度检测模块,按键扫描模块,LCD显示模块,电源电路、复位电路、晶振电路等模块。
主控模块采用AT89C52单片机,按键模块用四个按键,用于调整时间,显示模块采用LCD1602,时钟电路模块采用DS1302时钟芯片实现对时间、日期的操作,温度模块使用18B20实现度温度的操作。
STC89C52,ATMEL的51系列单片机,价格便宜,在国内使用者非常多。
支持串口下载,使用非常方便,且具有很大的价格优势。
缺点是仅支持串口下载,不支持在线下载,使用中会有些不方便。
1.显示模块:
方案一:
普通的共阴LED数码管,用点阵LED实现文字的显示.
方案二:
LCD1602液晶显示屏.
LED数码管价格适中,对于数字显示效果较好,而且使用单片机的端口也较少;LCD1602液晶显示屏,显示功能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED数码管来说要昂贵些,但是基于本设计显示的东西较多,若采用LED数码管的话,所需数码管较多,而且不利于控制,因此选择LCD1602作为显示模块.故选择方案二.
2.时钟电路模块:
方案一:
用单片机的定时器产生1S的时基信号,然后用程序来实现时钟的时、分、秒计时,同时用程序来产生年、月、日。
该方案优点是减少使用外设芯片;缺点是用单片机模拟时钟,使编程量增大,且用定时器产生时基信号,精度不高。
方案二:
DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的应用,实时时钟有秒、分、时、星期、日、月和年,月小于31天时可以自动调整,并具有闰年补偿功能,而且在掉电时能够在外部纽扣电池的供电下继续工作。
单片机有定时器的功能,但时间误差较大,且需要编写时钟程序.
因此采用DS1302方案二作为时钟电路。
3.温度模块:
直接采用常用的18B20.
系统框图:
液晶显示(LED)1602
单片
AT89C52
时钟芯片DS1302
温度传感器18B20
单元电路设计:
单片机中央处理系统的方案设计,选用AT89C52单片机作为中央处理器,如图所示。
该单片机除了拥有MCS-51系列单片机的所有优点外,内部还具有8K的在系统可编程FLASH存储器,低功耗的空闲和掉电模式,极大的降低了电路的功耗,还包含了定时器、程序存储器、数据存储器等硬件,其硬件能符合整个控制系统的要求,不需要外接其他存储器芯片和定时器件,方便地构成一个最小系统。
整个系统结构紧凑,抗干扰能力强,性价比高。
2、时钟振荡电路
用主振11.0592MHZ的晶振,使用内部晶振接法并上俩个30PF的电容,如图所示.
3、复位电路
复位电路由电阻和极性电容组成,通过高电平使单片机复位,在时钟电路开始工作后,当高电平的时间超过大约2us时,即可实现复位。
此复位电路为上电复位,较为简单。
若改进可以添加手动复位的功能,上电复位发生在开机加电时,由系统自动完成,手动复位通过一个按键来实现,在程序运行时,若遇到死机,死循环等情况,通过手动复位就可以实现重新启动的操作。
手动按钮复位需要人为在复位输入端RST上加入高电平。
一般采用的办法是在RST端和正电源Vcc之间接一个按钮和一个电阻。
4、DS1302时钟电路
时钟电路主要由时钟芯片DS1302、备用电池、晶振等几部分组成,如图(6)所示。
DS1302采用3线串行接口,占用引脚少,内部集成了可编程日历时钟,用户可以根据需要通过单片机的控制来自行设置,支持双电源供电,可以使用外部主电源和备用电源,备份电源能够使时钟芯片继续工作。
DS1302管脚图
DS1302时钟电路
DS1302各引脚的功能为:
8:
Vcc1:
备用电池端;
1:
Vcc2:
5V电源。
当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2 7: SCLK: 串行时钟,输入; 6: I/O: 数据输入输出口; 5: CE/RST: 复位脚; 2、3: X1、X2是外接晶振脚(32.768KHZ的晶振); 4: 地(GND)。 DS1302有关日历、时间的寄存器: DS1302有关日历、时间的寄存器 1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。 当初始上电时该位置为1,时钟振荡器停止,DS1302处于低功耗状态;只有将秒寄器的该位置改写为0时,时钟才能开始运行。 2、小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。 当为高时,选择12小时模式。 在12小时模式时,位5是,当为1时,表示PM。 在24小时模式时,位5是第二个10小时位 3、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。 在对任何的时钟和RAM的写操作之前,WP位必须为0。 当WP位为1时,写保护位防止对任一寄存器的写操作。 也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作。 DS1302读写时序 DS1302是SPI总线驱动方式。 它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。 DS1302的控制字如下图: DS1302的控制字图 控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。 位6: 如果为0,则表示存取日历时钟数据,为1表示存取RAM数据; 位5至位1(A4~A0): 指示操作单元的地址; 位0(最低有效位): 如为0,表示要进行写操作,为1表示进行读操作。 读数据: 读数据时在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据是从最低位到最高位。 写数据: 控制字总是从最低位开始输出。 在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入也是从最低位(0位)开始。 5: 温度传感器18B20 通过18B20进行读数据,将读出来的数据进行进制转换,转换后送到 DS18B20是单总线的数字温度传感器。 其与单片机的接口只需要一根数据线即可。 当然连线简单意味着软件处理上可能要麻烦一点。 下面来看看它的优点 看看它的靓照。 外形和我们常用的三极管没有什么两样哦。 DS18B20的内部存储器分为以下几部分ROM: 存放该器件的编码。 前8位为单线系列的编码(DS18B20的编码是19H)后面48位为芯片的唯一序列号。 在出场的时候就已经设置好,用户无法更改。 最后8位是以上56位的CRC码。 DS18B20的温度存放如上图所示。 其中S位符号位。 当温度值为负值时,S=1,反之则S=0。 我们把得到的温度数据乘上对应的分辨率即可以得到转换后的温度值。 DS18B20的通讯协议: 在对DS18B20进行读写编程时,必须严格保证读写的时序。 否则将无法读取测温结果。 根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过3个步骤: 每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令。 这样才能对DS18B20进行预定的操作。 复位要求主机将数据线下拉500us,然后释放,DS18B20收到信号后等待16~160us然后发出60~240us的存在低脉冲,主机收到此信号表示复位成功。 上图即DS18B20的复位时序图。 下面是读操作的时序图 这是写操作的时序图 6.按键电路 按键电路由四个轻触开关组成。 按键用来调整时间,其一端直接接到单片机的端口,另一端接地,当按下按键时,相应的端口变为低电平,通过一个与门只要这四个按键有一个按下就会在P3.2检测到一低电平就触发外部中断0进入按键调节程序中,通过与个各键相连的端口P3.4_P3.7可以判断是哪个键按下,从而作相应的操作。 用软件设计扫描程序。 7.实现功能: K1按键进入设定状态 按K2,依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,直到退出设置状态 按K3,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字 LCD第二排中间显示小喇叭,表示启用闹钟功能,无则禁止闹钟功能(可在调整状态进行设置) 正常状态,LCD上排最前面显示自定义字符,LCD下排最前面闪动"RICHMCU" 设置状态,LCD上排最前面显示"P",下排最前面在设置闹钟时间时显示"alarm: ",其它状态显示"time" 8.程序流程图: 1主程序: 首先初始化定时器、LCD1602及DS1302,然后就开始查询按键,有键按下则开始调整时间和日期,若没有按下,则执行下面的时间、日期的显示,最后依次循环这些相同的操作: 18b20子程序: Ds1302子程序: 2、软件设计 软件总设计: 主程序首先对系统环境初始化,设置定时器T0工作模式为16位定时/计数器模式,置位总中断允许位EA,并对键盘端口置位,再对LCD1602初始化,DS1302初始化。 接着扫描键盘,在键盘程序里面是对时间、日期,闹钟的调整,温度的选择,最下面是时间的显示。 例如: 闰年的计算 bitleap_year() { bitleap; if((year%4==0&&year%100! =0)||year%400==0)//闰年的条件 leap=1; else leap=0; returnleap; } 仿真结果分析: 电子万年历硬件电路图及仿真如图所示,系统由AT89C52单片机,按键扫描电路、显示电路、时钟电路、晶振电路、复位电路及电源指示电路。 仿真正确显示了时间,在LCD1602中正确显示了当前日期、时间,按K1按键进入设定状态,按K2,依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,直到退出设置状态,按K3,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字,按K4,选择温度的显示.LCD第二排中间显示小喇叭,表示启用闹钟功能,无则禁止闹钟功能(可在调整状态进行设置),正常状态,LCD上排最前面显示自定义字符,LCD下排最前面闪动"TIME",设置状态,LCD上排最前面显示"P",下排最前面在设置闹钟时间时显示"alarm: ",其它状态显示"time"仿真正确显示了时间和日期,符合设计的要求。 增加温度的显示按下K4时出现温度的显示界面,上排显示”wendumadebyFMZ”,下排显示温度. 仿真图如下所示: 参考文献: 单片机原理与接口技术(李晓林.第二版) RZ-51V20开发板论坛 实物图: 闹钟设置 时间显示 平闰年判断,修改天数 温度显示 整体实物图 实验源程序: #include #include #include unsignedcharcodedigit[11]={"0123456789-"};//定义字符数组显示数字 unsignedcharcodeStr[]={"wendumadebyFMZ"};//说明显示的是温度 unsignedcharcodeError[]={"DS18B20ERROR"};//说明没有检测到DS18B20 unsignedcharcodeError1[]={"PLEASECHECK"};//说明没有检测到DS18B20 unsignedcharcodeTemp[]={"wendumadebyFMZ: "}; unsignedcharcodeCent[]={"Cent"};//温度单位 unsignedcharflag,tltemp; unsignedcharcodedis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"}; unsignedcharcodepara_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};//星期月参变数 unsignedchardatadis_buf1[16];//lcd上排显示缓冲区 unsignedchardatadis_buf2[16];//lcd下排显示缓冲区 unsignedchardatayear,month,date,week;//年、月、日、星期 unsignedchardataarmhour,armmin,armsec;//闹钟时、分、秒 unsignedchardatahour,min,sec,sec100;//时、分、秒、百分之一秒 unsignedchardataflag,vkey,skey;//设置状态计数标志、按键先前值、按键当前值 bitalarm;//标识是否启用闹钟,1--启用,0--关闭 sbitrs=P2^0;//LCD数据/命令选择端(H/L) sbitrw=P2^1;//LCD读/写选择端(H/L) sbitep=P2^2;//LCD使能控制 sbitPRE=P3^3;//调整键(AN3) sbitSET=P3^4;//调整键(AN4) sbitSPK=P3^6; voiddelayms(unsignedcharms);//延时程序 bitlcd_busy();//测试LCD忙碌状态程序 voidlcd_wcmd(charcmd);//写入指令到LCD程序 voidlcd_wdat(chardat);//写入数据到LCD程序 voidlcd_pos(charpos);//LCD数据指针位置程序 voidlcd_init();//LCD初始化设定程序 voidpro_timedate();//时间日期处理程序 voidpro_display();//显示处理程序 voidpro_key();//按键处理程序 voidtime_alarm();//定时报警功能(闹钟) unsignedcharscan_key();//按键扫描程序 unsignedcharweek_proc();//星期自动计算与显示函数 bitleap_year();//判断是否为闰年 voidlcd_sef_chr();//LCD自定义字符程序 voidupdate_disbuf(unsignedchart1,unsignedchart2[],unsignedchardis_h,unsignedchardis_m,unsignedchardis_s); //延时程序 voiddelay(unsignedcharms) {while(ms--) {unsignedchari; for(i=0;i<250;i++) { _nop_();//执行一条_nop_()指令为一个机器周期 _nop_(); _nop_(); _nop_(); } } } voiddelay1ms() { unsignedchari,j; for(i=0;i<4;i++) for(j=0;j<33;j++) } //n毫秒 voiddelaynms(unsignedcharn) { unsignedchari; for(i=0;i delay1ms(); } //测试LCD忙碌状态 bitlcd_busy() { bitresult; rs=0; rw=1; ep=1; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P0&0x80);//LCD的D0--D7中,D7=1为忙碌,D7=0为空闲 ep=0; returnresult; } //写入指令到LCD voidlcd_wcmd(charcmd) { while(lcd_busy());//当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令 rs=0; rw=0; ep=0; _nop_(); _nop_(); P0=cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } //写入数据到LCD voidlcd_wdat(chardat) { while(lcd_busy());rs=1; rw=0; ep=0; P0=dat; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } //LCD数据指针位置程序 voidlcd_pos(charpos) { lcd_wcmd(pos|0x80);//数据指针=80+地址码(00H~27H,40H~67H) } voidlcd_sef_chr() {//第一个自定义字符 lcd_wcmd(0x40);//"01000000"第1行地址(D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7)) lcd_wdat(0x1f);//"XXX11111"第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭) lcd_wcmd(0x41);//"01000001"第2行地址 lcd_wdat(0x11);//"XXX10001"第2行数据 lcd_wcmd(0x42);//"01000010"第3行地址 lcd_wdat(0x15);//"XXX10101"第3行数据 lcd_wcmd(0x43);//"01000011"第4行地址 lcd_wdat(0x11);//"XXX10001"第4行数据 lcd_wcmd(0x44);//"01000100"第5行地址 lcd_wdat(0x1f);//"XXX11111"第5行数据 lcd_wcmd(0x45);//"01000101"第6行地址 lcd_wdat(0x0a);//"XXX01010"第6行数据 lcd_wcmd(0x46);//"01000110"第7行地址 lcd_wdat(0x1f);//"XXX11111"第7行数据 lcd_wcmd(0x47);//"01000111"第8行地址 lcd_wdat(0x00);//"XXX00000"第8行数据 //第二个自定义字符 lcd_wcmd(0x48);//"01001000"第1行地址 lcd_wdat(0x01);//"XXX00001"第1行数据 lcd_wcmd(0x49);//"01001001"第2行地址 lcd_wdat(0x1b);//"XXX11011"第2行数据 lcd_wcmd(0x4a);//"01001010"第3行地址 lcd_wdat(0x1d);//"XXX11101"第3行数据 lcd_wcmd(0x4b);//"01001011"第4行地址 lcd_wdat(0x19);//"XXX11001"第4行数据 lcd_wcmd(0x4c);//"01001100"第5行地址 lcd_wdat(0x1d);//"XXX11101"第5行数据 lcd_wcmd(0x4d);//"01001101"第6行地址 lcd_wdat(0x1b);//"XXX11011"第6行数据 lcd_wcmd(0x4e);//"01001110"第7行地址 lcd_wdat(0x01);//"XXX00001"第7行数据 lcd_wcmd(0x4f);//"01001111"第8行地址 lcd_wdat(0x00);//"XXX00000"第8行数据 } //LCD初始化设定 voidlcd_init() { lcd_wcmd(0x38);//设置LCD为16X2显示,5X7点阵,八位数据借口 delay (1); lcd_wcmd(0x0c);//LCD开显示及光标设置(光标不闪烁,不显示"-") delay (1); lcd_wcmd(0x06);//LCD显示光标移动设置(光标地址指针加1,整屏显示不移动) delay (1); lcd_wcmd(0x01);//清除LCD的显示内容 delay (1); } //闰年的计算 bitleap_year() { bitleap; if((year%4==0&&year%100! =0)||year%400==0)//闰年的条件 leap=1; else leap=0; returnleap; } //星期的自动运算和处理 unsignedcharweek_proc() {unsignedcharnum_leap; unsignedcharc; num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年数 if(leap_year()&&month<=2)//既是闰年且是1月和2月 c=5; else c=6; week=(year+para_month[month]+date+num_leap+c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工学 单片机 课程设计 电子 万年历