




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
酒泉职业技术学院毕业论文一、89C52模块Mcs-51单片机管脚图如图1所示。(1)一个8位的微处理器(CPU)(2)片内数据存储器RAM(128B/256B)(3)片内程序存储器ROM/EPROM(4kB/8kB)(4)4个8位并行I/O拉口P0-P3,每个口既可以作输入,也可以作输出(5)2个16位定时器/计数器(6)5个中断源的中断控制系统(7)1个全双工的串行I/O接口(8)片内时钟振荡器图1 单片机管脚图(一)显示模块LCM128641液晶模块概述采用FG12864J显示如图2所示,它是一种图形点阵液晶显示器。它主要采用控制器和列驱动器两部分组成了128(列)64(行)的全点阵显示。2液晶模块特点(1)工作电压为+5V10% ,自带驱动 LCD 所需的负电压(2)全屏幕点阵,点阵数为128(列)64(行),可完成字符的显示(3)与 CPU 接口采用5 条位控制总线和8 位并行数据总线输入输出,适配M6800 系列时序(4)内部有显示数据锁存器(5)简单的操作指令,显示开关设置,显示起始行设置,地址指针设置和数据读/写等指令 图2 FG12864J显示模块二、芯片的简介(一)芯片DS1302简介DS1302 是充电时钟芯片内含有一个实时时钟/日历和31字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息每月的天数和闰年的天数可自动调整时钟操作可通AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK串行时钟,时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW。 DS1302的管脚如表1所示。表1 DS1302管脚X1 X232.758KHz晶振管脚GND地RST复位I/O数据输入/输出引脚SCLK串行时钟Vcc1 Vcc2电源供电管脚(二)芯片DS18B20简介DS18B20温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强。对电子爱好者来说,DS18B20是我们开发温度相关的首选小产品。DS18B20引脚功能如表2所示。表2 DS18B20引脚功能GND地DQ单数据总线VDD电源电压NC 空引脚三、显示模块(一)LED数码管显示简介数码管显示比较常用的是采用CD4511和74LS138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。目前单片机数码管普通采用动态显示。编程简单,但只能显示数字,不能显示中文。LCD1602能够显示英文和数字。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号。LCD12864作为一种输出方式,液晶显示最大的特点就是能够实现友好的人机界面,它己经广泛应用于现代工业控制和智能化仪器仪表等领域,它己经成为单片机就用开发领域典型模块之一。能够方便的显示文字和数字。(二)电路的设计采用:LCD12864:LCD12864作为一种输出方式,液晶显示最大的特点就是能够实现友好的人机界面,它己经广泛应用于现代 工业控制和智能化仪器仪表等领域,它己经成为单片机开发领域典型模块之一。能够方便的显示文字和数字。四、硬件设计与实现该万年历以89S52作为控制核心,外接DS18B20温度传感器,DS1302时钟芯片,显示采用LCM12864,调表采用矩阵式键盘,整体硬件电路的框图如图3所示。 图3 硬件电路框图五、 单片机最小系统的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。单片机的最小系统如图4所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。图4 单片机最小系统六、 时钟电路的设计(一)串行接口时钟芯片DS1302芯片主特性:1实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力,还有闰年调整的能力 2.31 8 位暂存数据存储RAM 3.串行 I/O 口方式使得管脚数量最少 4.范围工作电压5.5V5.工作电流 2.0I时,小于300nA6.读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式 7.8脚DIP 封装或可选的8 脚SOIC 封装根据表面装配 8.简单 3 线接口 9.与 TTL 兼容Vcc=5V 10.可选工业级温度范围-40 +85优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图5所示。 图5 DS1302管脚图(二)时钟电路本系统采用有DS1302串行时钟芯片作为主时钟电路,该电路使用单独的32.768M的晶振和单独的电源供电,减小主控的负担。电路图如图6所示。图6 时钟电路七、 温度采集模块的设计采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用0.7与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,Vss接地。电路图如图7所示。图7温度采集电路八、人机交互模块设计该系统输入模块采用独立式键盘输入,显示模块采用LCM12864,很好的实现了人机交互,液晶与主控制器的接口如图8所示。 图8 液晶接口电路九、 系统软件设计与实现(一)主要算法流程图描述1 以80C52为核心,处理外转电路传进来的信号,实现时钟数据的读取,保存,显示其及键盘操作。流程图如图9所示。2 阳历和时分秒都是通过DS1302读出来的,经过主控的转换和处理最终显示在LCM12864上,该程序流程图如图10所示。3 阴历是通过一种算法转换过来,首先得到阳历值,然后根据这种算法把阳历转换成阴历,最终显示在LCM12864模块上,该程序流程图如图11所示。4时间调整是通过四个独立按键来调整时间值,时间调整流程图如图12所示。5 星期的计算方法如下:星期=(日期年份+所过闰年数+月校正数)%7,如果是在闰年又不到3月份上述之和要减一天再除7,其1到12月的校正数据为 6 2 2 5 0 3 5 1 4 6 2 4,该程序中采用1个字节表示年份闰年数也只计算1900 年以后的闰年数。该程序的流程图如图13所示。 图9 主程序流程图图10计算阳历和时分秒流程图图11 计算阴历程序流程图 图12 时间调整程序流程图图13 计算星期算法(二)LCM16824子程序的实现LCM12864的读写时序如图14所示。图14 LCM12864读写时序十、功能的实现调整(一)时间调整:按“模式”由普通模式进入校时模式,“年”数码管闪动,此时按“”或“”键可左右移动调整年、月、日、星期、时、分、秒各位置的数据。(二)定时调整:再次按“模式”由校时模式进入定时模式,“时”数码管闪动,此时按“+”键加1并循环。按“”或“”键可左右移动调整年、月、日、星期、时、分、秒各位置的数据。此模式下,时LED代表定时组数,为1-42之间,分位和秒位代表开的时间,月位和日位代表延时关的时间,年为代表延时单位是小时还是分钟,星期点亮表示当天定时有效。(三)误差校正:再次按“模式”有校时模式进入误差修正模式,“时 分 秒”位显示是横或者下横表示加减,“年 月 日“位显示0-28之间的数字,每天的半夜3:00过会自动修正走时误差,确保月误差小于30秒。另外,本程序还设计有快速模拟走时功能,此时当设定时位显示00时,回到普通模式后可以通过K1 K2改变走时速度,最快可以160倍的走时,即1小时走完160小时的时间,用来检查定时设定的数据是否正确。模拟走时并不影响校准的时间,设定的定时数据可正常保存。十一、 测试结果不良分析(一) 测试结果分析1 在测试中遇到LEDLCD16824不显示分析:首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏。再接着研究程序的时序图是否正确。最后发现程序时序方面出了点小错。修改后就把问题解决了2 测试中遇到调时间调到2079年后跳到2000年分析:认真研究时钟芯片的Datasheet发现,对年的读取,读出后是BCD码转换成十制显示时算法不正确3 按键调整时,不是按单位递增和递减分析:在键盘程序中,按键一次,向芯片写入一个新的数字,在写入数字后必须有一定延时才再写入另一个数字4 烧写程序进单片机里面时,有时会在显示屏上显示烂码.分析:用电压表检查.最后检测出USB下载线的端口电压不够换条新线就可以把问题解决(二) 测试总结经过多次的反复测试与分析,掌握了硬件的设计与分析的能力, 学会看英文版的Datasheet,同时在软件的编程方面得到更到的提高,对编程能力得到加强。对所学的知识得到很大的提高与巩固。 最终实现功能:1. 能显示阳历年、月、日、星期、小时、分、秒2. 显示模块采用LCD液晶显示,要求能用按键调整时间。3. 能显示阴历月、日,在显示阴历时间时能标明是否为闰年。4. 具有定时报警功能,能够进行整点和半点语音报时。5. 能够准确在LCD上显示。结束语通过对基于单片机的万年历的研究和设计,完成了一种能够显示阳历、阴历、星期、时间、实时的多功能万年历,该万年历还可以定时报警和进行进行整点和半点报时。本系统基本完成了设计指标的所有要求,所有的程序分块编写,通过main函数来调用,增加了程序的易修改性和易读性,方便他人的使用和改进。但是由于时间的局限性以及本人能力的有限性,本系统还有许多需要改进和完善的地方。其中主要的问题就是功耗和电源供电的问题,该处采用3V到5V供电。整个电路的功耗太大,没让单片机工作在空闲模式,这都是作品不实用,不能够大批量生产,这都有待改进,希望以后有机会对该系统做进一步的完善。致谢本课题在选题及研究过程中是在梁老师的亲切关怀和悉心指导下完成的。他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成,梁老师都始终给予我细心的指导和不懈的支持。梁老师耐心批阅我们的图纸一次又一次,纠正我们的错误,给我们提示,给我们启发,使我们避免了走弯路,指导了我应该去查找哪些方面的资料去完善这次设计,弥补出现的设计漏洞。使我的设计有一个明确的主导思想,能够顺利而有条不紊地进行。在设计中遇到了很多的画图连线问题,最后在梁老师的耐心指导下,终于迎刃而解。同时,在此课程期间给予我帮助的同学表示感谢。最后,我要感谢三年的大学生活,感谢我的所有老师同学,你们的支持与情感,是我永远的财富!参考文献1 周兴华编著 手把手教你学单片机C程序设计北京:北京航空航天大学出版社,20072 侯玉宝编著. 基于Proteus的51系列单片机设计与仿真 北京:电子工业出版社,20083 张义和编著. 例说51单片机(C语言). 北京:人民邮电出版社. 20084 李朝青编著. 单片机原理及接口技术. 北京:北京航空航天大学出版社,20055 周慈航编著. 单片机应用程序设计基础. 北京:北京航空航天大学出版社,19916 马忠梅编著. 单片机的C语言应用程序设计. 北京:北京航空航天大学出版社,20037 李广弟编著. 单片机基础. 北京:北京航空航天大学出版社,19948 曾巧媛编著. 单片机原理及应用. 北京:电子工业出版社,19979 邱丽芳编著. 单片机原理与应用. 人民邮电出版社,200710 何立民编著. MCS-51系列单片机应用系统设计. 北京航空航天大学出版社,附录一 原理图附录二 程序主程序#include#include /更改管脚#include#include#include#include#include#include#define uchar unsigned char#define uint unsigned intSYSTEMTIME sys;uchar c_sun,year_sun,month_sun,day_sun;uchar year_moon,month_moon,day_moon,week; uchar alarm=0,al_hour=0,al_min=0;Init_GUI()lcd_init();Init_DS18B20();Initial_DS1302();delay(10);jiemian();/显示初始化界面,例如固定的年、星期、农历放在12864.c里void Show_NL()DS1302_GetTime(&sys);year_sun=Read1302(DS1302_YEAR);month_sun=Read1302(DS1302_MONTH);day_sun=Read1302(DS1302_DAY);Conversion(0,year_sun,month_sun,day_sun);/*day_moon=(day_moon&0x70)4)*10 + (day_moon&0x0F);month_moon=(month_moon&0x70)4)*10 + (month_moon&0x0F);year_moon=(year_moon&0xF0)4)*10 + (year_moon&0x0F); */if(month_moon=1)display(8,4,12,0,ch1616);/显示“正”else display(8,4,month_moon-1,0,ch1616);/显示当前农历的月if(day_moon11)display(12,4,13,0,ch1616);/显示“初”if(day_moon10)display(12,4,9,0,ch1616);/显示“十”if(day_moon19)display(12,4,14,0,ch1616);/显示“廿”if(day_moon29)display(12,4,2,0,ch1616);/显示“三”display(14,4,(day_moon-1)%10,0,ch1616);/显示农历个位display(14,2,year_moon%12,0,shengxiao);/显示生肖display(9,2,year_moon%10,0,tiangan);/显示天干display(11,2,year_moon%12,0,dizhi);/显示地支Conver_week(0,year_sun,month_sun,day_sun);/星期if(week=0) display(5,4,17,0,ch1616);/显示星期日else display(5,4,week-1,0,ch1616); /显示星期16 void Show_YL() /显示阳历 DS1302_GetTime(&sys);shownum(6,6,sys.Second/10,0,num);/显示秒shownum(7,6,sys.Second%10,0,num); shownum(3,6,sys.Minute/10,0,num);/显示分shownum(4,6,sys.Minute%10,0,num);shownum(0,6,sys.Hour/10,0,num);/显示时shownum(1,6,sys.Hour%10,0,num);shownum(4,2,sys.Day/10,0,num);/显示日shownum(5,2,sys.Day%10,0,num);shownum(0,2,sys.Month/10,0,num);/显示月shownum(1,2,sys.Month%10,0,num); shownum(3,0,sys.Year/10,0,num);/显示年shownum(4,0,sys.Year%10,0,num);if( (!(sys.Year%4) & (sys.Year%100) | !(sys.Year%400) )display(8,0,24,0,ch1616);/显示平闰年elsedisplay(8,0,23,0,ch1616); /平闰年计算if(sys.Minute=30&sys.Second=0)Beep_Half();/报时if(sys.Minute=0&sys.Second=0)Beep_Hour(); void LCD_ShowWNL()DS1302_GetTime(&sys);shownum(6,6,sys.Second/10,0,num);shownum(7,6,sys.Second%10,0,num);/秒 每次循环钟刷新一次if(!sys.Second)/分 在普通模式时每分钟刷新一次,在设置模式时每次循环刷新一次shownum(3,6,sys.Minute/10,0,num);shownum(4,6,sys.Minute%10,0,num); if(!sys.Second&!sys.Minute)/时 在普通模式时每小时刷新一次,在设置模式时每次循环刷新一次shownum(0,6,sys.Hour/10,0,num);shownum(1,6,sys.Hour%10,0,num) if(!sys.Second&!sys.Minute&!sys.Hour)/公历农历的年、月、日、星期、温度,设置模式每次循环刷新一次Show_YL();/显示农历Show_NL();/显示新历diswendu();/显示温度 if(sys.Minute=30&sys.Second=0)Beep_Half();/报时if(sys.Minute=0&sys.Second=0)Beep_Hour(); void LCD_showalarm()display(8,6,21-alarm,0,ch1616);shownum(11,6,al_hour/10,0,num);/显示闹铃时shownum(12,6,al_hour%10,0,num);/显示闹铃时shownum(14,6,al_min/10,0,num);/显示闹铃分shownum(15,6,al_min%10,0,num);/显示闹铃分void main()Init_GUI();diswendu();Show_YL();Show_NL();LCD_showalarm(); while(1) LCD_ShowWNL();if(sys.Second%9=0)diswendu(); key_count(); if(count)key_set();/判断set键按下,进入设置界面 if(alarm & (al_hour=sys.Hour) & (al_min=sys.Minute)& !sys.Second)/定时报警功能Beep_Half();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num);Beep_Hour();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num);Beep_Half();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num);Beep_Hour();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num);Beep_Half();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num);Beep_Hour();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num);DS1302程序#define uint unsigned int#define uchar unsigned char#include sbit DS1302_CLK = P12; /实时时钟时钟线引脚 sbit DS1302_IO = P11; /实时时钟数据线引脚 sbit DS1302_RST = P10; /实时时钟复位线引脚sbit ACC0 = ACC0;sbit ACC7 = ACC7;typedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;SYSTEMTIME;/定义的时间类型SYSTEMTIME sys;#define AM(X)X#define PM(X)(X+12) / 转成24小时制#define DS1302_SECOND0x80 /时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE0x82#define DS1302_HOUR0x84 #define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C void DS1302InputByte(unsigned char d) /实时时钟写入一字节(内部函数)unsigned char i;ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0;unsigned char Read1302(unsigned char ucAddr)/读取DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time-Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time-Week = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0xf0)4)*10 + (ReadValue&0x0F);void Initial_DS1302(void) /时钟芯片初始化unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) /判断时钟芯片是否关闭 Write1302(0x8e,0x00);/写入允许_nop_(); _nop_(); _nop_();Write1302(0x8c,0x09);/写入年_nop_(); _nop_(); _nop_(); Write1302(0x88,0x05);/写入月 Write1302(0x86,0x05);/写入日Write1302(0x8a,0x02);/星期 Write1302(0x84,0x23);/时 Write1302(0x82,0x59);/写入分Write1302(0x80,0x30);/写入秒Write1302(0x90,0xae);/开启充电_nop_(); _nop_(); _nop_(); Write1302(0x8e,0x80);/禁止写入LCD12864程序#include #define uchar unsigned char#define uint unsigned intsbit CS1=P14;sbit CS2=P15;sbit RS=P05;sbit RW=P06;sbit EN=P07;sbit RST=P16;#define DataPort P3void delay(unsigned long v) while(v!=0)v-; void lcd_busy(void) RS=0;RW=1;DataPort=0xff;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离婚财产分割与子女抚养责任承担协议范本
- 2025劳动合同终止协议模板
- 离婚协议书范本:外籍人士离婚法律程序与权益保护
- 2025年海上风能资源评估与深远海风电发展规划报告:深远海风电场海上风电场运维技术支持
- 2025年绿色建筑节能改造案例研究报告
- 新能源行业2025年技术研发投入产出效益分析:创新项目与市场潜力报告
- 2025年成人教育终身学习体系构建与平台运营:终身学习平台运营团队建设与人才培养报告
- 2025企业技术专家聘用合同
- 2025年数据情报试题及答案
- 2025年度农作物种植租赁合同
- 国际贸易摩擦对行业影响-全面剖析
- 消防水泵操作流程
- 隐形眼镜测试题及答案
- Unit 3 A Lets learn湖北公开课课件
- 2025年上半年湖南湘西州龙山县事业单位招聘工作人员41人易考易错模拟试题(共500题)试卷后附参考答案
- 加油站员工绩效考核制度或加油站员工激励约束办法
- 浆砌石挡墙拆除施工技术方案
- 《陶瓷的加工和改性》课件
- 危化品泄漏事故应急处理
- 【MOOC】《操作系统A》(南京邮电大学)章节中国大学慕课答案
- 第三单元 单元学习任务 说课稿 2024-2025学年统编版高中语文必修上册
评论
0/150
提交评论