找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 25798|回复: 31
收起左侧

单片机00~99秒表显示全套资料

  [复制链接]
ID:122146 发表于 2017-12-14 13:43 | 显示全部楼层 |阅读模式
本帖最后由 snow_f 于 2017-12-14 16:14 编辑
一个课程设计,两位秒表,用的AT89C51,附件有仿真,原理,源码还有用Protel DXP画的一部分。
0.png

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.jpg

秒表设计
摘 要: 本设计以 AT89C51 单片机为主控模块,利用 C 语言编写两位数码管循环扫描动态显示的专用程序来实现两位数码管动态显示系统,系统主要由按键模块、复位模块、外部时钟电路模块、数码管显示模块构成。按键电路通过两个独立的开关控制数码管计数的开始、停止和复位。复位电路由电容与按键的并联来实现。时钟通过外部 12M 的晶振来控制。两位数码管显示由两个共阳极的三极管进行驱动。 将 C 语言编写的两位数码管动态显示程序写入单片机来控制 P0 口,使数码管相应段点亮,同时利用人眼视觉暂留的特性和数码管的余辉效应,在扫描频率足够高时,人眼无法感觉数码管的变化,从而实现数码的动态显示。

目录
1 设计背景 ........................................................................................................ 1
2 硬件系统设计方案........................................................................................ 1
2.1 硬件电路方案........................................................................................ 1
3 硬件电路设计 ................................................................................................ 2
3.1 单片机选型............................................................................................ 2
3.2 按键电路................................................................................................ 4
3.3 复位及振荡电路.................................................................................... 4
3.4 显示电路的选择.................................................................................... 5
3.41 共阳极数码管的显示方法............................................................. 5
3.3.2 共阳极数码管的驱动设计............................................................ 5
3.4 连接方式.............................................................................................. 6
4 软件设计 ....................................................................................................... 7
4.1 汇编程序................................................................................................ 7
4.2 C 语言程序............................................................................................. 8
5 系统仿真结果 ............................................................................................. 12
6 致谢 .................................................................................错误!未定义书签。
参考文献 .............................................................................错误!未定义书签。

1 设计背景
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能 IC 卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
2 硬件系统设计方案
2.1 硬件电路方案
硬件原理框图如下:
0.jpg
图 2-1 硬件组成框图
该电路的工作原理:单片机从稳压电路中获得稳定的+5V 电压,接到+5V
端,提供稳定的电压; 单片机口通过电阻接到显示电路的端口上; 单片机接复位
按键电路
复位电路
单片机 显示电路
时钟电路


电路,实现电路的复位; 以及单片机需要接晶振电路;整个电路实现循环动态显
示数字
00~99.
3 硬件电路设计
3.1 单片机选型
MCS51 是指由美国 INTEL 公司生产的一系列单片机的总称,这一系列单片机包括了很多品种,如 803180518751803280528752 等,其中 8051是最早最典型的产品,该系列其它单片机都是在 8051 的基础上进行功能的增、减、改变而来的,所以人们习惯于用 8051 来称呼 MCS51 系列单片机,而 8051是目前在我国最流行的单片机,所以很多场合会看到 8051 的名称。本课题中用到的芯片就是 AT 系列中的 AT89C51 单片机芯片。AT89C51 是一个低电压,高性能 CMOS 8 位单片机,片内含 4k bytes 的可反复擦写的 Flash 只读程序存储器和 128 bytes 的随机存取数据存储器(RAM),器件采用 ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-51 指令系统,内置功能强大的微型计算机的 AT89C51 提供了高性价比的解决方案。AT89C51 具有 PDIPPQFP/TQFP PLCC 等三种封装形式,以适应不同产品的需求。它是一个低功耗高性能单片机, 40 个引脚, 32 个外部双向输入/输出(I/O)端口,同时内含 2 个外中断口, 2 16 位可编程定时计数器,2 个全双工串行通信口, AT89C51 可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和 Flash 存储器结合在一起,特别是可反复擦写的 Flash 存储器可有效地降低开发成本。
如图所示,图
3-1 AT89C51 单片机基本构造,其基本性能介绍如下:

3-1 AT89C51 引脚图
AT89C51 本身内含 40 个引脚, 32 个外部双向输入/输出(I/O)端口,同时内含 2 个外中端口, 2 16 位可编程定时计数器,2 个全双工串行通信口,AT89C51 可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和 Flash 存储器结合在一起,特别是可反复擦写的 Flash 存储器可有效地降低开发成本。

3.2 按键电路
3-2 按键电路
按键
S1 和按键 S2 是控制位,分别接单片机的 P3.4 P3.7I/O 口。当按下
按键
S1 时数码管计数开始,再次按下 S1 时数码管停止计数并停留下当前结果;
当按下按键
S2 时清空数码管显示结果,重新计数。
3.3 复位及振荡电路
图 3-3 复位电路和振荡电路
单片机复位是使 CPU 和系统中的其他功能部件都处在一个确定的初始状

态,并从这个状态开始工作,在复位期间(即 RST 为高电平期间), P0 口为高组态, P1P3 口输出高电平;外部程序存储器读选通信号 PSEN 无效。地址锁存信号 ALE 也为高电平。根据实际情况选择如图 3-3 所示的复位电路。该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容 C1 C23pF。 加手动复位按键是为了避免死机时无法可靠复位。AT89C51 引脚 XTAL1 XTAL2 与晶体振荡器及电容 C1C2 按图 3-3 所示方式连接。晶振、电容 C1C2 及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,电容 C1C2 取值 30pF。 复位电路用电容与按键的并联来实现,将它们并在一起,一端接高电平,另一端接地,从而实现高电平复位的功能。
3.4 显示电路的选择
秒表设计显示电路可以考虑数码管或 LCD 屏,由于秒表只要求显示数字,
因此对显示要求较为简单, 如果选用
LCD 则较为复杂, 数码管足以满足要求。
3.41 共阳极数码管的显示方法
LED 数码管是单片机控制系统中最常见的显示器件之一,一般用来显示处理结果或输入输出信号的状态。数码管显示是一个系统工程中必不可少的人机交互环节,因此关于数码管的驱动也就是系统工程中的一个重要的环节。数码管的驱动分为动态驱动和静态驱动两种。所谓静态驱动,就是指无论多少位 LED 数码管,同时处于显示状态。动态显示驱动是指无论在任何时刻只有一个 LED 数码管处于显示状态,及单片机采用“扫描”方式控制各个数码管轮流显示。
3.3.2 共阳极数码管的驱动设计
将数码管每个 LED 灯对应单片机的一个 I/O 口。通过单片机的 P 口来控制LED 灯的亮和灭。 I/O 口之间互相独立,需要用 I/O 口直接控制 LED。动态显示将数码管的每个引脚一对一连接在一起接单片机的数据,而将各个数码管的公共端单独送至单片机的 I/O 口进行片选。此外,在此基础上,用单片机与 74LS04
反向器来驱动数码管,从而实现数码管的动态显示。
图 3-4 数码管显示电路
如图 3-3 所示,两位数码管分别由两个 PNP 型三极管驱动,三极管的基极通过限流电阻接在单片机 P1.0、 P1.1,其中 P1.0 控制数码管的个位, P1.1 控制数码管的十位。数码管各段除小数点段外其余七段(a-g)通过限流电阻接在单片机 P0 口(P0.0-P0.6),两位数码管显示由单片机内部程序控制相应接口为低电平,从而实现从 00—99 动态循环显示。例如:十位和个位显示原理相同,谨以个位说明。当个位数码管显示 5 时, 5 在程序中查表对应的十六进制数为 92H,对应二进制为 10010010B,其中 P0.7、 P0.4、 P0.1 为高电平, DP、 e、 b 段熄灭,P0.6、 P0.5、 P0.3、 P0.2、 P0.0 为低电平, g、 f、 d、 c、 a 段点亮,则此时数码管上显示数字 5。
3.4 连接方式
单片机采用 P2 口的 I/O 来控制数码管的各个引脚。复位键接到引脚 9 上,数码管的位选通过三极管和电阻分别与单片机的引脚 1 和 39 相连,晶振与单片机的引脚 18 和 19 连接,高电平与 40 引脚连接供电, 20 引脚直接接地。
0.jpg
图 3-5 硬件设计图
4 软件设计
4.1 汇编程序
汇编语言的优点是可以表达非常底层的东西
l.可以直接存取寄存器和 I/O
2.编写的代码可以非常精确的被执行
3.可以编写出比一般编译系统高效的代码
4.可以作为不同语言或不同标准的接口缺点在于汇编语言是一个比较低级的语言
1.非常冗长单调,在 DOS 下编程时就可以体会到
2.易出 BUG,且调试困难
3.代码不易维护
4.兼容性不好,与硬件关系非常紧密

8 / 14
与 C 语言相比没有 C 语言简单易用,且 C 语言的可读性更高,因此此程序选
用 C 语言编程。
4.2 C 语言程序
采用 C 语言用编写了两位数码管循环扫描动态显示的专用程序。通过软件的控制使两位数码管能从 00 计数到 99,再回到 00,依次进行循环。若在计数期间有复位高电平出现时,便重新从 00 开始计数。并有电源开关控制让电路是否工作,且有指示灯指示电源是否正常。
程序流程图如下:
0.jpg
图 4-1 程序流程图
程序如下:

5 系统仿真结果
经过对不同方案的分析、比较、取舍,然后进行原理图的设计与仿真, 再经过软件的调试等环节的操作,最终实现了让数码管在单片机的控制下循环显示两位数 00-99。并且在正常的计数过程中,若按下复位键后, 计数又重新从 00 开始计数, 终现实的结果与预想的结果一致。
0.jpg
图 5-2 仿真结果图

单片机源程序如下:
  1. //制作:机械工程学院*****机械设计制造及其自动化专业//
  2. //作者:*****//
  3. //学号:************//
  4. //设计内容:基于51单片机控制的数码管显示0~99的秒表//

  5. //********************我是分割线********************//

  6. //借口配置说明//
  7. /*
  8. 开始按键位P2.0
  9. 复位按键P2.1
  10. */

  11. /*
  12. 数码管位选驱动端口位P1.0和P2.0
  13. */

  14. //以下是程序正文//

  15. #include <reg52.h>
  16. #define uchar unsigned char   //宏定义
  17. #define uint unsigned int

  18. /*引脚定义*/
  19. sbit START=P2^0;           //开始、停止键 低电平有效
  20. sbit RST=P2^1;             //复位键

  21. /*定义全局变量*/               
  22. uint time;                           //时间变量

  23. /*数码管字模,对应 0-9*/
  24. uchar code table[]={           
  25.                                         0x3f,0x06,0x5b,0x4f,
  26.                                         0x66,0x6d,0x7d,0x07,
  27.                                         0x7f,0x6f};

  28. /*延时函数*/
  29. void Delay(uint ms)                        //毫秒级延时函数
  30. {
  31.         uint  i, j;
  32.         for(i =ms; i>0; i--)
  33.                 for(j =110; j>0; j--);
  34. }

  35. /*中断*/
  36. void time0() interrupt 1               
  37. {
  38.         uchar tt;
  39.         TH0 = 0x4c;                    //晶振11.0592Mhz  
  40.         TL0 = 0x00;                                
  41.         tt++;
  42.         if(tt == 20)
  43.                 {
  44.                         time++;
  45.                         if(time==99)         //到99后在从00开始        
  46.                                 time = 0;
  47.                                 tt = 0;                        
  48.                 }
  49. }

  50. /*显示函数*/
  51. void Display(uchar sum)  
  52. {
  53.         uchar shi, ge;
  54.         P0  = 0x00;                                  //消影
  55.         P1  = 0x00;
  56.         shi = table[sum/10];
  57.         P0  = shi;
  58.         P1  = 0xfd;
  59.         Delay(5);

  60.         P0  = 0x00;                                  //消影
  61.         P1  = 0x00;
  62.         ge  = table[sum%10];
  63.         P0  = ge;
  64.         P1  = 0xfe;
  65.         Delay(5);
  66. }

  67. /*按键扫描*/
  68. void keyscan()
  69. {
  70.                 if(START==0)           //开始、停止
  71.                 {
  72.                         Delay(10);               //消抖
  73.                         if(START==0)
  74.                         {
  75.                                 TR0 =!TR0;                                
  76.                                 while(!START) Display(time);
  77.                         }
  78.                 }

  79.                 if(RST==0)                                //复位
  80.                 {
  81.                         Delay(10);                        //消抖
  82.                         if(RST==0)
  83.                         {
  84.                                 time=0;
  85.                                 TR0=0;
  86.                                 while(!RST)Display(time);
  87.                         }
  88.                 }
  89. }

  90. //主函数
  91. void main()         
  92. {
  93. ……………………

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

所有资料51hei提供下载:
秒表设计.zip (1.34 MB, 下载次数: 428)

评分

参与人数 5黑币 +87 收起 理由
lowsing + 12 很给力!
学习使我快乐呀 + 5 很给力!
353231318 + 5 淡定
神大人 + 5 赞一个!
admin + 60 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:340625 发表于 2018-5-29 15:19 | 显示全部楼层
起大作用啊!
回复

使用道具 举报

ID:346229 发表于 2018-6-6 16:08 | 显示全部楼层

求分享pcb电路图
回复

使用道具 举报

ID:304613 发表于 2018-6-25 10:26 | 显示全部楼层
刚好需要,不错
回复

使用道具 举报

ID:377200 发表于 2018-7-22 11:23 | 显示全部楼层

刚好需要,不错
回复

使用道具 举报

ID:396367 发表于 2018-9-11 11:06 来自手机 | 显示全部楼层
可以用共阴极数码管吗,
回复

使用道具 举报

ID:396367 发表于 2018-9-12 16:15 | 显示全部楼层
延时函数,i =ms是不是少个数?
回复

使用道具 举报

ID:388870 发表于 2018-9-13 10:17 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:313328 发表于 2018-11-9 16:03 | 显示全部楼层
好东西真火
回复

使用道具 举报

ID:442343 发表于 2018-12-8 19:42 | 显示全部楼层
初学,非常需要!
回复

使用道具 举报

ID:437261 发表于 2018-12-9 18:12 | 显示全部楼层
tyyhlw69 发表于 2018-9-11 11:06
可以用共阴极数码管吗,

程序里用的就是共阴极。
回复

使用道具 举报

ID:443846 发表于 2018-12-11 10:05 | 显示全部楼层
还可以
。可以用
回复

使用道具 举报

ID:445599 发表于 2018-12-13 13:53 | 显示全部楼层
没钱下载啊
回复

使用道具 举报

ID:450147 发表于 2018-12-19 19:31 | 显示全部楼层
正好学习需要,谢谢分享
回复

使用道具 举报

ID:451360 发表于 2018-12-21 11:08 | 显示全部楼层
给力帝
回复

使用道具 举报

ID:47652 发表于 2019-1-13 00:09 | 显示全部楼层
很详细的资料
回复

使用道具 举报

ID:250700 发表于 2019-1-31 16:09 | 显示全部楼层
9999.png
#include<reg52.h>   // 单片机0000~9999秒表
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar bai,shi;
uint a1,a2;
sbit D1=P3^0;
sbit D2=P3^1;
sbit D3=P3^2;
sbit D4=P3^3;
sbit key=P3^5;
sbit key1=P3^7;
bit   j        ;
uint  y        ;
void main()
  {
  TMOD=0x01;
  TH0=(65536-10000)/256;
  TL0=(65536-10000)%256;
  EA=1;
  ET0=1;
  TR0=1;
  bai=0;
  shi=0;
  while(1)
    {
    if(key==0)
          {
          j=0;
          }
        if(key1==0)
          {
         j=1; a2=0;
          }
    }
  }
void timer0()interrupt 1
  {
  TH0=(65536-10000)/256;
  TL0=(65536-10000)%256;
  a1++;
  y++;
  if(a1==100)            //  100
    {
        a1=0;
        if(j==1)  a2++;
        if(a2>=10000) a2=0;    // 10000
        }
  D1 = 1; D2 = 1; D3 = 1; D4 = 1;
  if(y==1)
    {
    P1=table[a2%10000/1000];   //   10000
    D4=0;
    }
  if(y==2)
    {
    P1=table[a2%1000/100];   //  1000
    D3=0;
    }
  if(y==3)
    {
    P1=table[a2%100/10];   //  100
    D2=0;
    }
  if(y==4)
    {
    P1=table[a2%10];      //  10
    D1=0;
        y=0;
    }
  }

回复

使用道具 举报

ID:542693 发表于 2019-5-20 11:30 | 显示全部楼层
正好需要哈哈哈哈
回复

使用道具 举报

ID:551504 发表于 2019-5-30 22:27 | 显示全部楼层
求资源
回复

使用道具 举报

ID:562477 发表于 2019-6-17 14:53 | 显示全部楼层
正好需要,谢谢大佬
回复

使用道具 举报

ID:350104 发表于 2019-11-22 15:27 | 显示全部楼层
很好的分享  东西比较齐全
回复

使用道具 举报

ID:661458 发表于 2019-12-11 21:44 | 显示全部楼层
烧进单片机中为啥只显示00
回复

使用道具 举报

ID:697867 发表于 2020-2-25 11:24 来自手机 | 显示全部楼层
怎么下载?
回复

使用道具 举报

ID:697925 发表于 2020-2-25 14:55 | 显示全部楼层
太棒了 感谢楼主
回复

使用道具 举报

ID:716872 发表于 2020-3-27 13:50 | 显示全部楼层
有0到99.9的吗
回复

使用道具 举报

ID:724951 发表于 2020-4-8 17:57 | 显示全部楼层
我也想下载然后赞一个
回复

使用道具 举报

ID:741914 发表于 2020-4-30 18:29 | 显示全部楼层
可以的,佩服
回复

使用道具 举报

ID:741914 发表于 2020-4-30 18:31 | 显示全部楼层
加油,支持
回复

使用道具 举报

ID:770762 发表于 2020-6-7 13:55 来自手机 | 显示全部楼层
原理图的下载电源下载口是那个?
回复

使用道具 举报

ID:772089 发表于 2020-6-7 18:46 | 显示全部楼层
写得很好,对我用处很大,感谢楼主!!!!
回复

使用道具 举报

ID:783761 发表于 2020-6-19 07:43 | 显示全部楼层
用处很大
回复

使用道具 举报

ID:774195 发表于 2020-7-21 11:23 来自手机 | 显示全部楼层
楼主,你这个有没有pcb板图啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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