热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

51单片机入门程序——秒表程序示例

下午自学了一下单片机的前几章的知识,理解了数码管的显示原理以及静态显示和动态扫描的编程方法。其中,比较重要的几个概念有:数码管公共端类型(共阴极、共阳极)、位选(决定多位数码管

下午自学了一下单片机的前几章的知识,理解了数码管的显示原理以及静态显示和动态扫描的编程方法。其中,比较重要的几个概念有:数码管公共端类型(共阴极、共阳极)、位选(决定多位数码管中哪一位显示)、段选(决定数码管显示的数字),另外还有锁存器(教材P36,可通过控制锁存端来改变数据输出的状态)。

上周单片机实验课的内容是编一个秒表,在4位数码管中分别显示分和秒还有分秒,即最多可显示“9:59.9”。这里我用两个键实现了秒表的启动/暂停和清零功能,代码如下:

[cpp]  view plain  copy
  1. #include   
  2. #define uint unsigned int  
  3. #define uchar unsigned char  
  4. sbit S1 = P1^3;  
  5. sbit S2 = P1^1;  
  6. sbit S3 = P1^2;  
  7. sbit S4 = P1^0;  
  8. sbit beep = P2^7;  
  9. sbit a = P0^0;  
  10. sbit b = P0^1;  
  11. sbit c = P0^2;  
  12. sbit d = P0^3;  
  13. sbit e = P0^4;  
  14. sbit f = P0^5;  
  15. sbit g = P0^6;  
  16. sbit p = P0^7;  
  17. sbit key1 = P1^4;  
  18. sbit key2 = P1^5;  
  19. sbit key3 = P3^6;  
  20. sbit key4 = P3^7;  
  21. uchar num,kms,sec,min;  
  22. uchar code N[10] = {0xc0, 0xf9 ,0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //0, 1, 2, 3, ...8, 9  
  23. uchar code Z[10] = {0x40, 0x79 ,0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //0., 1., 2., ... 8., 9.  
  24.   
  25. void delayms(uint xms)  
  26. {  
  27.     uint i,j;  
  28.     for(i = xms; i > 0; i--)  
  29.         for(j = 110; j > 0; j--);  
  30. }  
  31.   
  32. void init()  
  33. {  
  34.     TMOD = 0x01;  
  35.     TH0 = 0x3c;  
  36.     TL0 = 0xb0;  
  37.     S3 = 1;  
  38.     S1 = S2 = S4 = 0;  
  39.     P0 = N[0];  
  40.     delayms(5);  
  41.   
  42.     S3 = 0;  
  43.     S1 = S2 = S4 = 1;  
  44.     P0 = Z[0];  
  45.     delayms(5);  
  46.   
  47.     EA = 1;  
  48.     TR0 = 0;  
  49.     ET0 = 1;      
  50.     kms = sec = min = 0;  
  51. }  
  52.   
  53. void display()  
  54. {  
  55.     uchar shi, ge;  
  56.     if(kms >= 0)  
  57.     {  
  58.         S4 = 0;  
  59.         S1 = S2 = S3 = 1;  
  60.         P0 = N[kms];  
  61.     }  
  62.     delayms(5);  
  63.     if(sec >= 0)  
  64.     {  
  65.         shi = sec/10;  
  66.         ge = sec%10;  
  67.   
  68.         S3 = 0;  
  69.         S1 = S2 = S4 = 1;  
  70.         P0 = Z[ge];  
  71.         delayms(5);  
  72.   
  73.         S2 = 0;  
  74.         S1 = S3 = S4 = 1;  
  75.         P0 = N[shi];  
  76.     }  
  77.     delayms(5);  
  78.     if(min >= 0)  
  79.     {  
  80.         S1 = 0;  
  81.         S2 = S3 = S4 = 1;  
  82.         P0 = N[min];  
  83.     }  
  84.     delayms(5);  
  85. }  
  86.   
  87. void keyscan()  
  88. {  
  89.     if(key1 == 0)  
  90.     {  
  91.         delayms(10);  
  92.         if(key1 == 0)  
  93.         {  
  94.             while(!key1);  
  95.             TR0 = ~TR0;  
  96.         }  
  97.     }  
  98.     if(key2 == 0)  
  99.     {  
  100.         delayms(10);  
  101.         if(key2 == 0)  
  102.         {  
  103.             min = sec = kms = 0;  
  104.             while(!key1);  
  105.         }  
  106.     }  
  107. }  
  108.   
  109. main()  
  110. {  
  111.     init();  
  112.     while(1)  
  113.     {  
  114.         keyscan();  
  115.         display();        
  116.     }  
  117. }  
  118.   
  119. void T0_time() interrupt 1  
  120. {  
  121.     TH0 = 0x3c;  
  122.     TL0 = 0xb0;  
  123.         num++;  
  124.     if(num == 2)  
  125.     {  
  126.         num = 0;  
  127.         kms++;  
  128.         if(kms == 10)  
  129.         {  
  130.             kms = 0;  
  131.             sec++;  
  132.             if(sec == 60)  
  133.             {  
  134.                 sec = 0;  
  135.                 min++;  
  136.                 if(min == 10)  
  137.                 {  
  138.                     TR0 = 0;  
  139.                     min = 9;  
  140.                     sec = 59;  
  141.                     kms = 9;  
  142.                 }  
  143.             }  
  144.         }  
  145.     }  
  146. }   

程序通过“Keil uVision4”调试,大家也可以在板子上运行一下试试。

注意:需要根据板子的端口定义相关变量,不要不分青红皂白就直接使用我的程序哈。

最后上个图,第一次做单片机,希望以后还有时间可以做更深入的更好玩的东西。



推荐阅读
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 如何查找和管理计算机中的C盘临时文件
    本文详细介绍了如何在计算机中找到和管理C盘的临时文件,包括其具体路径、环境变量设置方法以及清理这些文件对系统性能的影响。对于希望优化系统性能和释放磁盘空间的用户来说,这是一篇非常有价值的参考。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 解决Linux系统中pygraphviz安装问题
    本文探讨了在Linux环境下安装pygraphviz时遇到的常见问题,并提供了详细的解决方案和最佳实践。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
author-avatar
Xl小飞2502901391
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有