找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7752|回复: 5
收起左侧

数字电子时钟设计报告-单片机原理与应用课程大作业

[复制链接]
ID:328014 发表于 2018-5-28 01:37 | 显示全部楼层 |阅读模式

《单片机原理与应用》课程大作业


数字电子时钟

学院:信息与通信工程学院

专业:光电信息科学与工程            

班级:15050341               

学号:1505034138


一、系统功能介绍

电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许多场合可以看到数字电子钟。

电子钟亦称数字显示钟,是一种用数字电路技术实现时、分、秒计时的装置,与机械时钟相比,直观性为其主要显著特点,且因非机械驱动,具有更长的使用寿命,相较石英钟的石英机芯驱动,更具准确性。

利用单片机和数码管显示电路呈现出设计要求,4位数码管前两位显示小时00-23,后两位显示分钟00-69,一秒钟闪烁一次,闪烁60次为一分钟。K1是功能键调节时间并移位选择,K2是加数键,K3是减数键。将程序下载到单片机内,给单片机上电,由于初始值设的是0x00,所以数码管显示0000,并且后两位数码管每一秒闪烁一下。按K1键暂停闪烁并开始选择数码管,按下K2、K3键校准时间。

二、原理介绍

(1)以STC15W4K32S4_PDIP40单片机为控制核心,用单片机内部定时器为时钟源,设计电子时钟,使用4位数码管显示时、分,后两位数码管(分)的闪烁显示秒。

(2)显示格式为:“XXXX”

(3)用3个功能键操作来进行对时,用K1--K3键定义描述功能即:

K1--功能键,默认0是执行时钟程序,按一下调整秒,按第二次是调整分,按第三次是调整时,再按一下变成0执行默认时钟程序;

K2--加一键,如果功能键按的是调整秒的,秒就加一;如果功能键按的是调整分的,分就加一;如果功能键按的是调整时的,时就加一;

K3--减一键,如果功能键按的是调整秒的,秒就减一;如果功能键按的是调整分的,分就减一;如果功能键按的是调整时的,时就减一;

三、模块设计(核心器件介绍、电路设计、程序设计)
1、核心器件介绍

STC15W4K32S4_PDIP40单片机:

(1)STC15W4K32S4系列单片机中包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时器/计数器、内部掉电唤醒专用定时器、I/O口、比较器、看门狗、高速异步串行通信端口UART,高速同步串行端口SPI,片内高精度R/C时钟及高可靠复位等模块。STC15W4K32S4系列的单片机集成了一组(各自独立6路)增强型的PWM波形发生器。PWM波形发生器内部有一个15位的PWM计数器供6路PWM使用,用户可以设置每路PWM的初始电平。另外,PWM波形发生器为每路PWM又设计了两个用于控制波形翻转的计数器T1/T2,可以非常灵活的每路PWM的高低电平宽度,从而达到对PWM的占空比以及PWM的输出延迟进行控制的目的。由于6路PWM是各自独立的,且每路PWM的初始状态可以进行设定,所以用户可以将其中的任意两路配合起来使用,即可实现互补对称输出以及死区控制等特殊应用。

(2)STC15W4K32S4系列增强型PWM输出端口定义如下:

[PWM2:P3.7, PWM3:P2.1, PWM4:P2.2, PWM5:P2.3, PWM6:P1.6, PWM7:P1.7]

每路PWM的输出端口都可使用特殊功能寄存器位CnPINSEL分别独立的切换到第二组

[PWM2_2:P2.7, PWM3_2:P4.5, PWM4_2:P4.4, PWM5_2:P4.2, PWM6_2:P0.7, PWM7_2:P0.6]

(3)优点:

①增强型 8051 CPU,1T,单时钟/机器周期,速度比普通8051快8-12倍。

②大容量4096(4K)字节片内RAM数据存储器

③内部高可靠复位,ISP编程时8级复位门槛电压可选,可彻底省掉外部复位电路。

④工作频率范围:0MHz ~ 28MHz,相当于普通8051的0MHz~336MHz。

图一  电路图

2、电路设计



图二 按键部分                      图三 复位电路

(1)按键部分(图二):

    K1--功能键:默认0是执行时钟程序,按一下调整秒,按第二次是调整分,按第三次是调整时,再按一下变成0执行默认时钟程序;

    K2--加一键:如果功能键按的是调整秒的,秒就加一;如果功能键按的是调整分的,分就加一;如果功能键按的是调整时的,时就加一;

K3--减一键:如果功能键按的是调整秒的,秒就减一;如果功能键按的是调整分的,分就减一;如果功能键按的是调整时的,时就减一;

(2)复位电路(图三):

包括上电自动复位和按键复位两种方式。上电瞬间,RC电路充电,RST引线端出现正脉冲,只要RST端保持10ms以上的高电平,就能使单片机有效地复位。其中R1选择10KΩ的电阻,电容器一般选择10μF。 按下K4键时钟设置归零。

图四 1602液晶部分

此电路中1602LCD采用标准的14脚(无背光)接口,各引脚接口说明如下表所示:

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

数据

2

VDD

电源正极

10

D3

数据

3

VL

液晶显示偏压

11

D4

数据

4

RS

数据/命令选择

12

D5

数据

5

R/W

读/写选择

13

D6

数据

6

E

使能信号

14

D7

数据

7

D0

数据




8

D1

数据




引脚接口说明:

第1脚:VSS为地电源;

第2脚:VDD接5V正电源;

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:R/W为读写信号线,高电平 时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RA为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时读取信息,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

图五 晶振电路

单片机内部的振荡电路是一个高增益反向放大器,引线X1和X2分别是放大器的输入端和输出端。单片机内部虽然有振荡电路,但要形成时钟,外部还需附加电路。他的时钟产生方式有两种:内部时钟电方式和外部时钟方式。由于外部时钟方式用于多片单片机组成的系统中,所以此处选用内部时钟方式。即利用其内部的振荡电路在X1和X2引线上外接定时元件,内部振荡电路产生自激振荡。


四、总结

经过此次单片机作业的设计,通过完成一个电子时钟设计的过程,我学到了很多东西!

这样实战的设计过程是培养学生综合运用所学知识、发现、提出、分析、和解决实际问题。锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察。此次设计的过程中发现了很多自己知识方面的欠缺,通过查找资料等方式去弥补。随着科学技术发展的日新月异,单片已经成为当今计算机应用中空前活跃的领域,在生活中可以说是无处不在,因此作为二十一世纪的大学生来说掌握单片机的开发技术是十分重要的。以前课程设计是一个组设计一个课题,当自己通过查资料询问等方式完成一个自己的课题时感觉真的很充实。


单片机源码:

  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #define uchar unsigned  char
  4. #define uint unsigned int
  5. sbit RS=P2^0;
  6. sbit RW=P2^1;
  7. sbit E=P2^2;
  8. sbit k1=P1^0;
  9. sbit k2=P1^1;
  10. sbit k3=P1^2;
  11. uchar shuzhu[]={"beijing time"};//定义字符串
  12. uchar shuzhu3[]={"2017"};//定义字符串
  13. uchar shuzhu2[]={"xx:xx:xx"};//时钟数组一共8个字符,程序的重点
  14. uchar q,fla,num,x;
  15. signed char m,f,s;
  16. void delay(uchar x)//延时函数   
  17. {
  18.    uchar a,b;
  19.    for(a=0;a<x;a++)
  20.       for(b=0;b<120;b++);
  21. }
  22. void key(void)//按键扫描        
  23. {
  24.    if(k1==0)//模式
  25.    {
  26.       delay(5);
  27.       if(k1==0)
  28.       {
  29.               num++;//num是功能键的变量,默认是0执行时钟程序,按一下调整秒,按第二次是调整分,按第三次调整时,再按一下变成0执行默认时钟程序
  30.               if(num>3)
  31.                   num=0;
  32.               while(k1==0);
  33.               }
  34.       }
  35.    if(k2==0)//判断加一的按键有无按下
  36.    {
  37.       delay(5);
  38.       if(k2==0)
  39.       {
  40.               if(num==1)//如果功能键按的是调整秒的,秒就加一
  41.               {
  42.                   m++;
  43.                   if(m==60)
  44.                   {
  45.                     m=0;
  46.                   }
  47.                   }
  48.               if(num==2)//如果功能键按的是调整分的,分就加一
  49.               {
  50.                   f++;
  51.                   if(f==60)
  52.                   {
  53.                     f=0;
  54.                   }
  55.                   }
  56.               if(num==3)//如果功能键按的是调整时的,时就加一
  57.               { s++;
  58.                   if(s==24)  
  59.                      s=0;
  60.               }
  61.               while(k2==0);
  62.               }
  63.       }
  64.    if(k3==0)//判断减一的按键有无按下
  65.    {
  66.       delay(5);
  67.       if(k3==0)
  68.       {
  69.               if(num==1)//同上
  70.               {
  71.                      m--;
  72.                   if(m<0)
  73.                      m=59;
  74.               }
  75.               if(num==2)
  76.               {
  77.                   f--;
  78.                   if(f<0)
  79.                      f=59;
  80.               }
  81.               if(num==3)
  82.               {
  83.                   s--;
  84.                   if(s<0)
  85.                      s=23;
  86.               }
  87.                 while(k3==0);
  88.               }
  89.       }
  90. }
  91. void write_command(uchar x)//写指令函数
  92. {
  93.    RS=0;
  94.    RW=0;
  95.    P0=x;
  96.    E=1;
  97.    delay(5);
  98.    E=0;
  99. }
  100. void write_data(uchar x)//写数据函数
  101. {
  102.    RS=1;
  103.    RW=0;
  104.    P0=x;
  105.    E=1;
  106.    delay(5);
  107.    E=0;
  108. }
  109. void init()//初始化1602函数
  110. {
  111.    write_command(0x38);
  112.    write_command(0x08);
  113.    write_command(0x01);
  114.    write_command(0x06);
  115.    write_command(0x0c);
  116. }
  117. void pos(uchar x,uchar y)//要写入的位置函数
  118. {
  119.    x&=0x0f;
  120.    if(y==1)
  121.    write_command(0x80+x);
  122.    if(y==2)
  123.    write_command(0x80+0x40+x);
  124. }
  125. void xssz(void)//把时间赋给显示数组
  126. {
  127.     shuzhu2[0]=s/10+'0';//加‘0’是为了把时间的数变成ASCII码
  128.     shuzhu2[1]=s%10+'0';
  129.     shuzhu2[3]=f/10+'0';
  130.     shuzhu2[4]=f%10+'0';
  131.     shuzhu2[6]=m/10+'0';
  132.     shuzhu2[7]=m%10+'0';
  133. }
  134. void main(void)//主函数
  135. {
  136.     uchar k,a,b;
  137.     EA=1;
  138.     ET0=1;
  139.     ET1=1;
  140.     TMOD=0X11;
  141.     TH0=(65535-50000)/256;
  142.     TL0=(65535-50000)%256;
  143.     TH1=(65535-50000)/256;
  144.     TL1=(65535-50000)%256;
  145.     TR0=1;
  146.     fla=1;//闪烁标志位
  147.    init();//初始化1602
  148.     pos(2,1);//设置显示位置
  149.      for(k=0;k<12;k++)
  150.      {
  151.               write_data(shuzhu[k]);//固定显示16个字符beijing time
  152.       }
  153.       pos(0,2);//设置显示位置
  154.      for(a=0;a<4;a++)
  155.      {
  156.               write_data(shuzhu3[a]);//固定显示4个字符2016
  157.      }
  158.       while(1)//无限循环
  159.     {
  160.        key();//判断有误按键按下
  161.        pos(7,2);//设置显示位置
  162.        for(b=0;b<8;b++)
  163.               {
  164.                  write_data(shuzhu2[b]); //让1602显示时钟数组里的内容
  165.               }   
  166.        switch(num)//判断功能键按下所对应的功能
  167.        {
  168.                 case 0 : TR0=1;TR1=0;//默认无按下状态num值是0,正常的时钟功能。
  169.                          xssz();
  170.                                if(fla==0)
  171.                                   shuzhu2[5]=' ';//修改时钟数组的内容让分号:的闪烁
  172.                                if(fla==1)
  173.                                   shuzhu2[5]=':';  //修改时钟数组的内容让分号:的闪烁
  174.                                                             break;  
  175.                 case 1 : TR0=0;TR1=1;  //当功能键按的第一下,把定时器0关掉,开启定时器1,让秒闪烁
  176.                          shuzhu2[5]=':';   //恒定显示分号:
  177.                                if(fla==1)
  178.                                {
  179.                                   shuzhu2[6]=' '; //在时钟数组秒的位置写入空格,让秒的位置闪烁
  180.                                   shuzhu2[7]=' ';//
  181.                                }
  182.                                   if(fla==0)
  183.                                   xssz();
  184.                                                             break;
  185.                 case 2 : TR0=0; TR1=1; //当功能键按的第二下,把定时器0关掉,开启定时器1,让分闪烁
  186.                          shuzhu2[5]=':';  
  187.                                if(fla==1)
  188.                                {
  189.                                   shuzhu2[3]=' '; //在时钟数组分的位置写入空格,让分的位置闪烁
  190.                                   shuzhu2[4]=' ';
  191.                                }
  192.                                if(fla==0)
  193.                          xssz();
  194.                                                       break;                    
  195.                 case 3 : TR0=0; TR1=1; //当功能键按的第三下,把定时器0关掉,开启定时器1,让时闪烁
  196.                          shuzhu2[5]=':';
  197.                                if(fla==1)
  198.                                {
  199.                                   shuzhu2[0]=' '; //在时钟数组时的位置写入空格,让时的位置闪烁
  200.                                   shuzhu2[1]=' ';
  201.                                }
  202.                                if(fla==0)
  203.                                   xssz();
  204.                                                             break;
  205.        }  //switch的括号
  206.     }//while的括号
  207. }//main函数的括号
  208. void ds0() interrupt 1//秒自增
  209. {
  210.    TH0=(65535-50000)/256;
  211.    TL0=(65535-50000)%256;
  212.     q++;
  213.     if(q==10)//闪烁标志位
  214.        fla=!fla;
  215.     if(q==20)
  216.     {
  217.        q=0;
  218.        m++;
  219. ……………………

  220. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
11.png

全部资料51hei下载地址:
http://www.51hei.com/bbs/dpj-120295-1.html


回复

使用道具 举报

ID:339635 发表于 2018-5-28 11:45 | 显示全部楼层
老哥,你是不是四川某高校的啊?
回复

使用道具 举报

ID:339635 发表于 2018-5-28 12:04 | 显示全部楼层
我正好也做这个作业,1号就要交了,奈何下载不了
回复

使用道具 举报

ID:1020093 发表于 2023-2-11 13:43 | 显示全部楼层
你好,想问一下,如果需要实现开始、暂停和清零功能需要怎么修改代码
回复

使用道具 举报

ID:405044 发表于 2023-2-11 18:32 | 显示全部楼层
这个芯片是可以在proteus中仿真的
回复

使用道具 举报

ID:579397 发表于 2023-2-12 01:57 | 显示全部楼层
在系统功能介绍和原理介绍都是写使用数码管显示,但在模块设计就写1602。这样的设计报告是认真的吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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