河南理工单片机课程设计_第1页
河南理工单片机课程设计_第2页
河南理工单片机课程设计_第3页
河南理工单片机课程设计_第4页
河南理工单片机课程设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、河南理工大学本科课程设计报告河南理工大学单片机应用与仿真训练设计报告 电子万年历姓 名: 学 号: 专业班级: 指导老师: 所在学院:电气工程与自动化学院 2015年 1 月 20 日- 1 -摘要 本设计的主要内容是设计一个电子万年历。电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分和秒进行计时,还具有闰年补偿等多种功能,。基于对课本知识的学习与研究,该设计就是对课本知识的一个利用及实践,通过自己所学的知识,设计一个实用的、贴近生活的电子万年历。该电路采用AT89C52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3到5V电压供电。因为DS

2、1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能,所以DS1302是不可或缺的。万年历的设计过程在硬件与软件方面进行同步设计。硬件部分主要由AT89C52单片机,液晶显示电路,时钟电路,稳压电路电路以及串口下载电路等组成。在单片机的选择上使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。显示器使用液晶LCD1602。软件方面主要包括日历程序、液晶驱动程序,显示程序等。程序采用C语言编写。所有程序编写完成后,在Keil C51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内

3、进行仿真。 目录1 概述4 1.1实验目的4 1.2 实验原理4 2 系统总体方案及硬件设计6 2.1总体方案62.2硬件设计73 软件设计8 3.1程序设计8 4 Proteus软件仿真9 4.1 proteus模拟95课程设计体会10参考文献11附1:源程序代码121概述1.1实验目的本实验是对课本所学知识的应用,通过51单片机开发板对硬件及软件的设计,做出一个电子万年历。1.2 实验原理液晶(Liquid Crystal)是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始广泛应用在轻薄型显示器上。液晶显示器(Liquid Crystal Display, LCD)的主要

4、原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。为叙述简便,通常把各种液晶显示器都直接叫做液晶。各种型号的液晶通常是按照显示字符的行数或液晶点阵的行、列数来命名的。比如:1602的意思是每行显示16个字符,一共可以显示两行;类似的命名还有0801, 0802, 1601等,这类液晶通常都是字符型液晶,即只能显示ASCII码字符,如数字、大小写字母、各种符号等。LCD1602引脚功能简述:3 脚:VL,液晶显示偏压信号,用于调整LCD1602 的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0 时可以得到最强的对比度。4 脚:RS,数据/命令选择端,当此脚为高电平时,

5、可以对1602 进行数据字节的传输操作,而为电平时,则是进行命令字节的传输操作。命令字节,即是用来对LCD1602 的一些工作方式作设置的字节;数据字节,即使用以在1602 上显示的字节。值得一提的是,LCD1602的数据是8 位的。脚:R/W,读写选择端。当此脚为高电平可对LCD1602 进行读数据操作,反之进行写数据操作。笔者认为,此脚其实用处不大,直接接地永久置为低电平也不会影响其正常工作。但是尚未经过复杂系统验证,保留此意见。6 脚:E,使能信号,其实是LCD1602 的数据控制时钟信号,利用该信号的上升沿实现对LCD1602 的数据传输。714 脚:8 位并行数据口,使得对LCD16

6、02 的数据读写大为方便。LCD1602的操作时序: 当我们要写指令字,设置LCD1602 的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0D7,最后E引脚一个高脉冲将数据写入。 当我们要写入数据字,在1602 上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0D7,最后E 引脚一个高脉冲将数据写入。发现了么,写指令和写数据,差别仅仅在于RS的电平不一样而已。DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周

7、、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RES 复位(2)I/O 数据线(3)SCLK 串行时钟。时钟/RAM 的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW。1) VCC2:主用电源引脚2) X1、X2:DS1302外部晶振引脚3) GND:地4) RST:复位引脚5) I/O:串行数据引脚,数据输出或者输入都从这个引脚6) SCLK:串行时钟引脚7) VCC1:备

8、用电源2 系统总体方案及硬件设计2.1总体方案能显示年,月,日,时,分,秒能设置年,月,日,时,分,秒电路框图按键电路ATM89C52主控制模块 LC1602显示电路DS1302显示模块晶振电路复位电路2.2硬件设计1. LCD1602显示部分 LCD1602可以显示2行32个字符的液晶显示屏 2.复位电路通过复位电路可以对万年历进行重置。3.时钟电路 该电路可以产生万年历的年,月,日,时,分,秒。4.晶振电路5.按键电路通过该电路可以设置万年历的各个参数。3 软件设计3.1程序设计分离日期时间显示值读日期、时间初始化开始显示子程序返回4. Proteus软件仿真4.1 Proteus模拟仿真

9、5. 课程设计体会这次课程设计总的来说还是很成功的,通过这次课程设计,我对单片机的设计,我对电子万年历的原理有了本质上的理解。本来我对单片机的编程很是烦恼与不解。经过这次更深层次的学习与尝试,我对单片机的学习有了更近一步的提高。不得不说的是,这次设计确实给了我难度,光是编程就编了很长的时间,编不出来,我就借助参考资料以及周围同学的帮助。经过多少个日日夜夜的学习与编程,我终于完成了课程设计。这次设计我也深入学习了KEIL4以及Proteus这两个基本的软件,这对以后的课程设计也有了很大的帮助。总的来说,这次的设计给了我很多意想不到的帮助,收获颇丰。参考文献1 刘勇 编 数字电路 电子工业出版社

10、20042 陈正振 编 电子电路设计与制作 广西交通职业技术学院信息工程系 20073 杨子文 编 单片机原理及应用 西安电子科技大学出版社 20064 王法能 编 单片机原理及应用 科学出版社 2004附1 源程序代码/* 实验名 : 万年历实验* 使用的IO : * 实验效果 :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒日月,按K2选择*选择设置加1。 *注意 :*/#include<reg51.h>#include"lcd.h"#include"ds1302.h"sbit K1=P30;sbit K2=P31;sbit

11、 K3=P32;void Int0Configuration();void LcdDisplay();unsigned char SetState,SetPlace;void Delay10ms(void); /误差 0us/* 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无*/void main()unsigned char i;/H2=0;Int0Configuration();LcdInit();Ds1302Init();while(1)if(SetState=0)Ds1302ReadTime();elseif(K1=0)/检测按键L1是否按下Delay10

12、ms();/消除抖动if(K1=0)SetPlace+;if(SetPlace>=7)SetPlace=0;while(i<50)&&(K1=0) /检测按键是否松开Delay10ms();i+;i=0;if(K2=0)/检测按键K2是否按下Delay10ms();/消除抖动if(K2=0)TIMESetPlace+;if(TIMESetPlace&0x0f)>9) /换成BCD码。TIMESetPlace=TIMESetPlace+6;if(TIMESetPlace>=0x60)&&(SetPlace<2)/分秒只能到59

13、TIMESetPlace=0;if(TIMESetPlace>=0x24)&&(SetPlace=2)/小时只能到23TIMESetPlace=0;if(TIMESetPlace>=0x32)&&(SetPlace=3)/日只能到31TIMESetPlace=0;if(TIMESetPlace>=0x13)&&(SetPlace=4)/月只能到12TIMESetPlace=0;if(TIMESetPlace>=0x7)&&(SetPlace=5)/周只能到7TIMESetPlace=1;/if(SetPla

14、ce=5)/月只能到12/TIMESetPlace=;/while(i<50)&&(K2=0) /检测按键是否松开Delay10ms();i+;i=0;LcdDisplay();/* 函数名 : LcdDisplay()* 函数功能 : 显示函数* 输入 : 无* 输出 : 无*/void LcdDisplay()LcdWriteCom(0x80+0X40);LcdWriteData('0'+TIME2/16);/时LcdWriteData('0'+(TIME2&0x0f); LcdWriteData('-');Lc

15、dWriteData('0'+TIME1/16);/分LcdWriteData('0'+(TIME1&0x0f);LcdWriteData('-');LcdWriteData('0'+TIME0/16);/秒LcdWriteData('0'+(TIME0&0x0f);LcdWriteCom(0x80);LcdWriteData('2');LcdWriteData('0');LcdWriteData('0'+TIME6/16);/年LcdWriteDat

16、a('0'+(TIME6&0x0f);LcdWriteData('-');LcdWriteData('0'+TIME4/16);/月LcdWriteData('0'+(TIME4&0x0f);LcdWriteData('-');LcdWriteData('0'+TIME3/16);/日LcdWriteData('0'+(TIME3&0x0f);LcdWriteCom(0x8D);LcdWriteData('0'+(TIME5&0x07)

17、;/星期 /* 函数名 : Int0Configuration()* 函数功能 : 配置外部中断0* 输入 : 无* 输出 : 无*/void Int0Configuration()/设置INT0IT0=1;/跳变沿出发方式(下降沿)EX0=1;/打开INT0的中断允许。EA=1;/打开总中断/* 函数名 : Int0() * 函数功能 : 外部中断0 中断函数* 输入 : 无* 输出 : 无*/void Int0() interrupt 0 Delay10ms();if(K3=0)SetState=SetState;SetPlace=0;Ds1302Init();/* 函数名 : Delay

18、10ms* 函数功能 : 延时函数,延时10ms* 输入 : 无* 输出 : 无*/void Delay10ms(void) /误差 0us unsigned char a,b,c; for(c=1;c>0;c-) for(b=38;b>0;b-) for(a=130;a>0;a-);#include"lcd.h"/* 函 数 名 : Lcd1602_Delay1ms* 函数功能 : 延时函数,延时1ms* 输 入 : c* 输 出 : 无* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。*/void Lcd1602_Delay1ms(ui

19、nt c) /误差 0us uchar a,b;for (; c>0; c-) for (b=199;b>0;b-) for(a=1;a>0;a-); /* 函 数 名 : LcdWriteCom* 函数功能 : 向LCD写入一个字节的命令* 输 入 : com* 输 出 : 无*/#ifndef LCD1602_4PINS /当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) /写入命令LCD1602_E = 0; /使能LCD1602_RS = 0; /选择发送命令LCD1602_RW = 0; /选择写入LCD1602_DA

20、TAPINS = com; /放入命令Lcd1602_Delay1ms(1);/等待数据稳定LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5); /保持时间LCD1602_E = 0;#else void LcdWriteCom(uchar com) /写入命令LCD1602_E = 0; /使能清零LCD1602_RS = 0; /选择写入命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com;/由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时

21、序Lcd1602_Delay1ms(5);LCD1602_E = 0;/Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com << 4; /发送低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#endif/* 函 数 名 : LcdWriteData* 函数功能 : 向LCD写入一个字节的数据* 输 入 : dat* 输 出 : 无*/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat)/写入数据

22、LCD1602_E = 0;/使能清零LCD1602_RS = 1;/选择输入数据LCD1602_RW = 0;/选择写入LCD1602_DATAPINS = dat; /写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5); /保持时间LCD1602_E = 0;#elsevoid LcdWriteData(uchar dat)/写入数据LCD1602_E = 0; /使能清零LCD1602_RS = 1; /选择写入数据LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = dat;/由于4位

23、的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4; /写入低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#endif/* 函 数 名 : LcdInit()* 函数功能 : 初始化LCD屏* 输 入 : 无* 输 出 : 无*/ #ifndefLCD1602_4PINSvoid

24、 LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /开显示LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点#elsevoid LcdInit() /LCD初始化子程序LcdWriteCom(0x32); /将8位总线转为4位总线LcdWriteCom(0x28); /在四位线下的初始化LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWr

25、iteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点#endif#include"ds1302.h"/-DS1302写入和读取时分秒的地址命令-/-秒分时日月周年 最低位读写位;-/uchar code READ_RTC_ADDR7 = 0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d; uchar code WRITE_RTC_ADDR7 = 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c;/-DS1302时钟初始化2013年1月1日星期二12点00分00秒。-/-存储

26、顺序是秒分时日月周年,存储格式是用BCD码-/uchar TIME7 = 0, 0, 0x12, 0x01, 0x01, 0x02, 0x13;/* 函 数 名 : Ds1302Write* 函数功能 : 向DS1302命令(地址+数据)* 输 入 : addr,dat* 输 出 : 无*/void Ds1302Write(uchar addr, uchar dat)uchar n;RST = 0;_nop_();SCLK = 0;/先将SCLK置低电平。_nop_();RST = 1; /然后将RST(CE)置高电平。_nop_();for (n=0; n<8; n+)/开始传送八位地

27、址命令DSIO = addr & 0x01;/数据从低位开始传送addr >>= 1;SCLK = 1;/数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();for (n=0; n<8; n+)/写入8位数据DSIO = dat & 0x01;dat >>= 1;SCLK = 1;/数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_(); RST = 0;/传送数据结束_nop_();/* 函 数 名 : Ds1302Read* 函数功能 : 读取一个地址的数据* 输 入 : addr

28、* 输 出 : dat*/uchar Ds1302Read(uchar addr)uchar n,dat,dat1;RST = 0;_nop_();SCLK = 0;/先将SCLK置低电平。_nop_();RST = 1;/然后将RST(CE)置高电平。_nop_();for(n=0; n<8; n+)/开始传送八位地址命令DSIO = addr & 0x01;/数据从低位开始传送addr >>= 1;SCLK = 1;/数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;/DS1302下降沿时,放置数据_nop_();_nop_();for(n=0

29、; n<8; n+)/读取8位数据dat1 = DSIO;/从最低位开始接收dat = (dat>>1) | (dat1<<7);SCLK = 1;_nop_();SCLK = 0;/DS1302下降沿时,放置数据_nop_();RST = 0;_nop_();/以下为DS1302复位的稳定时间,必须的。SCLK = 1;_nop_();DSIO = 0;_nop_();DSIO = 1;_nop_();return dat;/* 函 数 名 : Ds1302Init* 函数功能 : 初始化DS1302.* 输 入 : 无* 输 出 : 无*/void Ds1302Init()uchar n;Ds1302Write(0x8E,0X00); /禁止写保护,就是关闭写保护功能for (n=0; n<7; n+)/写入7个字节的时钟信号:分秒时日月周年Ds1302Write(WRITE_RTC_ADDRn,TIMEn);Ds1302Write(0x8E,0x80); /打开写保护功能/* 函 数 名 : Ds1302ReadTime* 函数功能 : 读取时钟信息* 输 入 : 无* 输 出 : 无*/void Ds1302ReadTime()uchar n;for (n=0; n&l

温馨提示

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

评论

0/150

提交评论