找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3504|回复: 0
收起左侧

基于51单片机的电子表课程设计说明书下载(Word格式文档)

[复制链接]
ID:430730 发表于 2018-11-21 18:31 | 显示全部楼层 |阅读模式
单片机课程设计任务书

题  目
基于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.jpg
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  主源程序
  1. void main()
  2. {
  3.               unsigned char i;
  4.               Int0Configuration();
  5.               LcdInit();
  6.               Ds1302Init();
  7.               while(1)
  8.               {            
  9.                             if(SetState==0)
  10.                             {
  11.                                           Ds1302ReadTime();
  12.                             }
  13.                             else
  14.                             {
  15.                                           if(K1==0)                            //检测按键K1是否按下
  16.                                           {
  17.                                                         Delay10ms();              //消除抖动
  18.                                                         if(K1==0)
  19.                                                         {
  20.                                                                       SetPlace++;
  21.                                                                       if(SetPlace>=7)
  22.                                                                                     SetPlace=0;                                                                     
  23.                                                         }

  24.                                                         while((i<50)&&(K1==0))              //检测按键是否松开
  25.                                                         {
  26.                                                                       Delay10ms();
  27.                                                                       i++;
  28.                                                         }
  29.                                                         i=0;
  30.                                           }
  31.                                           if(K2==0)                            //检测按键K2是否按下
  32.                                           {
  33.                                                         Delay10ms();              //消除抖动
  34.                                                         if(K2==0)
  35.                                                         {
  36.                                                                       TIME[SetPlace]++;
  37.                                                                       if((TIME[SetPlace]&0x0f)>9)                                                                      //换成BCD码。
  38.                                                                       {
  39.                                                                                     TIME[SetPlace]=TIME[SetPlace]+6;
  40.                                                                       }
  41.                                                                       if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                            //分秒只能到59
  42.                                                                       {
  43.                                                                                     TIME[SetPlace]=0;
  44.                                                                       }
  45.                                                                       if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                            //小时只能到23
  46.                                                                       {
  47.                                                                                     TIME[SetPlace]=0;
  48.                                                                       }
  49.                                                                       if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                            //日只能到31
  50.                                                                       {
  51.                                                                                     TIME[SetPlace]=0;            
  52.                                                                       }
  53.                                                                       if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                            //月只能到12
  54.                                                                       {
  55.                                                                                     TIME[SetPlace]=0;
  56.                                                                       }            
  57.                                                                       if((TIME[SetPlace]>=0x8)&&(SetPlace==5))                            //周只能到7
  58.                                                                       {
  59.                                                                                     TIME[SetPlace]=1;
  60.                                                                       }                           
  61.                                                                       if(SetPlace==5)                            //月只能到12
  62.                                                                       {
  63.                                                                                     TIME[SetPlace]=;
  64.                                                                       }            
  65.                                                         }
  66.                                                       
  67.                                                         while((i<50)&&(K2==0))              //检测按键是否松开
  68.                                                         {
  69.                                                                       Delay10ms();
  70.                                                                       i++;
  71.                                                         }
  72.                                                         i=0;
  73.                                                       
  74.                                           }                                                                                   
  75.                             }
  76.                             LcdDisplay();            
  77.               }
  78.             
  79. }
复制代码


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时钟源程序


  1. void Ds1302Write(uchar addr, uchar dat)
  2. {
  3.               uchar n;
  4.               RST = 0;
  5.               _nop_();

  6.               SCLK = 0;//先将SCLK置低电平。
  7.               _nop_();
  8.               RST = 1; //然后将RST(CE)置高电平。
  9.               _nop_();

  10.               for (n=0; n<8; n++)//开始传送八位地址命令
  11.               {
  12.                             DSIO = addr & 0x01;//数据从低位开始传送
  13.                             addr >>= 1;
  14.                             SCLK = 1;//数据在上升沿时,DS1302读取数据
  15.                             _nop_();
  16.                             SCLK = 0;
  17.                             _nop_();
  18.               }
  19.               for (n=0; n<8; n++)//写入8位数据
  20.               {
  21.                             DSIO = dat & 0x01;
  22.                             dat >>= 1;
  23.                             SCLK = 1;//数据在上升沿时,DS1302读取数据
  24.                             _nop_();
  25.                             SCLK = 0;
  26.                             _nop_();            
  27.               }            
  28.                            
  29.               RST = 0;//传送数据结束
  30.               _nop_();
  31. }
复制代码

完整的Word格式文档51黑下载地址:

基于51单片机的电子表.docx (1.06 MB, 下载次数: 19)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表