单片机课程设计任务书
题 目
基于51单片机的电子表
课题性质
工程设计
课题来源
自选
指导教师
主要内容
(参数)
利用51单片机实现以下功能:
电子时钟可以正常计时。
可以对电子时钟进行调节。
调节时有光标闪烁。
任务要求
(进度)
第1-2天:熟悉课程设计任务及要求,查阅技术资料,确定设计方案。
第3-4天:按照确定的方案设计单元电路。要求画出单元电路图,元件及元件参数选择要有依据,各单元电路的设计要有详细论述。
第5-6天:软件设计,编写程序。
第7-8天:软件调试。
第9-10天:撰写课程设计报告。要求内容完整、图表清晰、文理流畅、格式规范、方案合理、设计正确,篇幅合理。
目录
1 系统概述
1.1 设计目的
1.2 设计内容
1.3 设计目标
2 方案论证
2.1 用开发板进行电子钟的设计
2.2 用实物进行电子钟的
3 硬件设计
3.1 系统的原理
3.2 部分电路图
3.3 I/O分配
3.4 元器件选型
4 软件设计
4.1 主源程序
4.2 lcd1602源程序
4.3 1302时钟源程序
5 系统调试
设计心得
参考文献
1 系统概述
1.1 设计目的1.熟悉DS1302的工作原理与过程 2.熟悉LCD1602液晶屏的工作原理和过程 3.熟悉掌握51的c程序编写 4结合DS1302和LCD1602液晶屏设计出电子表 1.2 设计内容1.使液晶屏中显示秒分时日月年星期等功能 2.液晶屏中的初始时间可调节 3.液晶屏中的时间日期可调 4每次调节时都有光标闪烁 1.3 设计目标1.在51开发板上能够实现时间日期的显示 2.学会开发板的基础知识 3.可稳定调节和计时 4.熟悉掌握c语言的编写 2 方案论证
2.1 用开发板进行电子钟的设计用开发板进行设计时,可以采用keil4软件中51功能,在其中编写c语言,然后生成hex文件,根据设计的需要查资料进行编写。对于新手来说,这是一个不错的选择,可以随时进行错误的识别和更改,大大提高了效率,为以后的单片机学习打下基础。在用开发板进行编写程序时,先进行主函数的编写,然后根据主函数所需要的东西,再继续编写其他程序。在主函数中,主要是按键的设置和时间调节的循环。然后再加入lcd和ds1302的功能便可以实现时钟的显示。这样做不仅节约了成本,还为以后编写程序打下了基础。 2.2 用实物进行电子钟的用实物进行设计,需要进行元器件的焊接,并且在焊接过程中易出现错误导致设计的失败,而且用汇编语言进行编写程序时,会增加设计难度,通常来说,一条c语言可以转化成多条汇编语言,相比较,用开发板进行设计更方便,所以选择用开发板进行设计。 3 硬件设计
3.1 系统的原理开发板通过USB自动下载电路下载开发板连接电脑的装置,然后给开发板供电,然后通过DS1302时钟芯片、LCD1602、开关、STC89C52芯片各自引脚连接在一起,组成基本的硬件连接,然后在keil4上面编写软件,经过开发板自带的烧录软件运行程序。 图一:系统工作原理图 3.2 部分电路图图二:STC89C52芯片引脚连线 图三:LCD1602液晶屏引脚连线 图四:开关引脚连线 图5:USB自动下载电路引脚连线 图6:DS1302时钟芯片引脚连线 3.3 I/O分配LCD1602的DB0到DB7 8个引脚接p0口,RS接p2.6口,RW接p2.5口,E接p2.7口。如图三所示 开关的K1接RXT(p3.1),K2接TXD(p3.0),K3接p3.2,K4接p3.3。如图四所示 DS1302芯片的SCLK引脚接p3.6,I/O引脚接p3.4,CE引脚接p3.5。如图六所示 3.4 元器件选型LCD1602液晶屏一个 DS1302时钟芯片一个 STC89C52芯片一个 晶振、电阻、电容、开关若干
5 系统调试下载开发板自带的烧录软件,调试运行结果如下 图7:运行结果 图8:运行初始状态 图9:调节后的时间 在调试过程中,一开始没有光标的闪烁,不确定具体调节的是那一位,后来根据lcd1602的原理设置其闪烁,知道调节后是哪一个时间和日期。后来在设置星期的时候怎么都设置,怎么都不出来7,后来检查源程序,发现程序中不包含7,修改以后,可以实现时间日期的准确调节,并能够准确的按照时钟连续运行下去。 设计心得经过这次课程设计,让我充分认识了自己的不足,太多的基础知识不知道,导致这个过程变得非常艰难。最开始的时候是准备做一个上课讲过的简单的时钟,仅仅包含有时分秒,直接弄上一个编程语言然后就可以实现了,但是还有许多的 定义不知道如何去设置,于是就在开发板上面找到包含时分秒日月星期年的程序,然后看最基础的教学视频,把lcd1602和1302时钟芯片还有开关等组装成一个时钟秒表,其中的程序有错误的,有何自己设计不同的,于是便根据最基本的知识来看程序,然后进行修改,稍微有点错误就会导致程序的无法进行,可见学习单片机是一个严谨的过程,容不得丝毫马虎。反正是最后做出来的时候,只有一个感觉,太累了,好不容易。如果基础知识牢固的话,那么现在的我应该是很随意的就设计出来这个电子表,但是实际情况却不是这样,花了大量的时间去重新学习基础知识,使设计缓慢的进行下去。 在设计的过程中,遇到过很多的困难,像windows8上面装keil4,出现了不兼容的问题,在网上多处搜索得到的答案都是换windows7,但问了多个以前装过keil4的同学,终于知道了如何解决,设置系统不更新,然后根据开发板赠送的光盘上面的步骤一步步完成了安装,然后对整个程序进行修改,无奈的是改完程序后编译没有错误,但是就是显示不出来东西,找了好久也找不到解决的办法,只好用源程序进行简单的修改来实现我的功能。可以这样说,这次的课程设计是一次不成功的设计。在以后的学习中,一定要认真学习,熟练的掌握单片机与编程知识。
4 软件设计
4.1 主源程序
- void main()
- {
- unsigned char i;
- Int0Configuration();
- LcdInit();
- Ds1302Init();
- while(1)
- {
- if(SetState==0)
- {
- Ds1302ReadTime();
- }
- else
- {
- if(K1==0) //检测按键K1是否按下
- {
- Delay10ms(); //消除抖动
- 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)
- {
- TIME[SetPlace]++;
- if((TIME[SetPlace]&0x0f)>9) //换成BCD码。
- {
- TIME[SetPlace]=TIME[SetPlace]+6;
- }
- if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
- {
- TIME[SetPlace]=0;
- }
- if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小时只能到23
- {
- TIME[SetPlace]=0;
- }
- if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
- {
- TIME[SetPlace]=0;
- }
- if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
- {
- TIME[SetPlace]=0;
- }
- if((TIME[SetPlace]>=0x8)&&(SetPlace==5)) //周只能到7
- {
- TIME[SetPlace]=1;
- }
- if(SetPlace==5) //月只能到12
- {
- TIME[SetPlace]=;
- }
- }
-
- while((i<50)&&(K2==0)) //检测按键是否松开
- {
- Delay10ms();
- i++;
- }
- i=0;
-
- }
- }
- LcdDisplay();
- }
-
- }
复制代码
4.2 lcd1602源程序 void LcdDisplay()
{
LcdWriteCom(0x80+0X40);
LcdWriteData('0'+TIME[2]/16); //时
LcdWriteData('0'+(TIME[2]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[1]/16); //分
LcdWriteData('0'+(TIME[1]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[0]/16); //秒
LcdWriteData('0'+(TIME[0]&0x0f));
LcdWriteCom(0x80);
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+TIME[6]/16); //年
LcdWriteData('0'+(TIME[6]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[4]/16); //月
LcdWriteData('0'+(TIME[4]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[3]/16); //日
LcdWriteData('0'+(TIME[3]&0x0f));
LcdWriteCom(0x8D);
LcdWriteData('0'+(TIME[5]&0x07)); //星期
4.3 1302时钟源程序
- 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++)//开始传送八位地址命令
- {
- 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_();
- }
复制代码
完整的Word格式文档51黑下载地址:
基于51单片机的电子表.docx
(1.06 MB, 下载次数: 19)
|