找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13954|回复: 15
收起左侧

4位共阴极数码管秒表设计仿真与程序

  [复制链接]
ID:256107 发表于 2017-12-5 15:04 | 显示全部楼层 |阅读模式
单片机课设,数字秒表设计,计时9:59:9
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

0.png

单片机源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define GPIO_DIG   P2                           //数据端

  4. #define uchar unsigned char                   //重命名关键字
  5. #define uint unsigned int                   //重命名关键字

  6. sbit K1=P3^0;                //开始
  7. sbit K2=P3^1;                //暂停
  8. sbit K3=P3^2;                //复位

  9. sbit L1=P1^4;                //数码管1位选
  10. sbit L2=P1^5;                //数码管2位选
  11. sbit L3=P1^6;                //数码管3位选
  12. sbit L4=P1^7;                //数码管4位选

  13. sbit beep=P1^0;

  14. unsigned char code DIG_CODE[10] = {
  15. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16. 0x7f,0x6f};
  17. //0、1、2、3、4、5、6、7、8、9的显示码
  18. unsigned char code DIG_CODE2[10] = {
  19. 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
  20. 0xff,0xef};
  21. //0、1、2、3、4、5、6、7、8、9带小数点的显示码
  22. unsigned char DisplayData[4];
  23. //用来存放要显示的8位数的值

  24. uchar i,m;           //定义变量
  25. uchar min=0;
  26. long int k=0;
  27. uint Second_Counts;                   //定义变量

  28. void DigDisplay()                   //数码管显示子函数
  29. {
  30.         unsigned int j;                   //定义变量

  31.         L1=0;                          //位选
  32.         L2=1;
  33.         L3=1;
  34.         L4=1;
  35.         GPIO_DIG = DisplayData[0];     //发送段码
  36.         j = 1000;                                                   //扫描间隔时间设定
  37.         while(j--);       
  38.         L1=1;                           //消隐
  39.         L2=1;
  40.         L3=1;
  41.         L4=1;               

  42.         L1=1;
  43.         L2=0;                          //位选
  44.         L3=1;
  45.         L4=1;
  46.         GPIO_DIG = DisplayData[1];     //发送段码
  47.         j = 1000;                                                   //扫描间隔时间设定
  48.         while(j--);       
  49.         L1=1;                           //消隐
  50.         L2=1;
  51.         L3=1;
  52.         L4=1;      

  53.         L1=1;
  54.         L2=1;
  55.         L3=0;                           //位选
  56.         L4=1;
  57.         GPIO_DIG = DisplayData[2];     //发送段码
  58.         j = 1000;                                                   //扫描间隔时间设定
  59.         while(j--);       
  60.         L1=1;                           //消隐
  61.         L2=1;
  62.         L3=1;
  63.         L4=1;      

  64.         L1=1;
  65.         L2=1;
  66.         L3=1;
  67.         L4=0;                           //位选
  68.         GPIO_DIG = DisplayData[3];     //发送段码
  69.         j = 1000;                                                   //扫描间隔时间设定
  70.         while(j--);       
  71.         L1=1;                           //消隐
  72.         L2=1;
  73.         L3=1;
  74.         L4=1;      
  75.        
  76. }

  77. void main()
  78. {
  79. //        Second_Counts=570;
  80. //        min=9;
  81.         GPIO_DIG = 0x00;                 //初始化数据口
  82.    
  83.         TMOD=0x01;                                //定时器0方式1
  84.         TH0=(65536-50000)/256;                //定时器0:50ms
  85.         TL0=(65536-50000)%256;
  86.         TH1=(65536-2000)/256;               
  87.         TL1=(65536-2000)%256;
  88.         EA=1;   
  89. //        ET1=1;
  90. //        TR1=1;         
  91.     while (1)
  92.     {
  93.                 if(K1==0)
  94.                 {
  95.                         ET0=1;
  96.                         TR0=1;                //开启定时器
  97.                 }
  98.                 if(K2==0)
  99.                 {
  100.                         ET0=0;
  101.                         TR0=0;                //关闭定时器
  102.                 }
  103.                 if(K3==0)                                                 //复位按键按下时
  104.                 {
  105.                         ET0=0;
  106.                         TR0=0;                //关闭定时器
  107.                         DisplayData[0] = DIG_CODE2[0];          //清零显示
  108.                         DisplayData[1] = DIG_CODE[0];          //清零显示
  109.                         DisplayData[2] = DIG_CODE2[0];          //清零显示
  110.                         DisplayData[3] = DIG_CODE[0];          //清零显示
  111.                         i=0;                                                          //清零计数
  112.                         Second_Counts=0;                                  //清零秒
  113.                 }

  114.                 if((Second_Counts>0)&&(m==0))
  115.                 {
  116.                         ET1=1;
  117.                         TR1=1;   
  118.                 }

  119.                 if((min==9)&&(Second_Counts==599))
  120.                 {
  121.                         ET0=0;
  122.                         TR0=0;                //关闭定时器
  123.                         ET1=1;
  124.                         TR1=1;
  125.                 }

  126.                 DigDisplay();                 //执行数码管显示函数
  127.     }
  128. }


  129. //T0中断函数
  130. void DSY_Refresh() interrupt 1
  131. {
  132.         TH0=(65536-50000)/256;                //恢复定时器0初值
  133.         TL0=(65536-50000)%256;
  134.         i++;
  135.         m++;
  136.         if(m>=20)
  137.         {
  138.                 m=0;
  139.         }
  140.         if(i==2)                                //50ms*2=0.1s转换状态
  141.         {
  142.                 i=0;
  143.                 Second_Counts++;
  144.                 if(Second_Counts>=600)
  145.                 {
  146.                         Second_Counts=0;
  147.                         min++;
  148.                 }

  149.                 DisplayData[0] = DIG_CODE2[min%10];          //显示百位
  150.                 DisplayData[1] = DIG_CODE[Second_Counts/100%10];          //显示十位
  151.                 DisplayData[2] = DIG_CODE2[Second_Counts/10%10];          //显示个位
  152.                 DisplayData[3] = DIG_CODE[Second_Counts%10];                  //显示小数点后一位
  153. //                if(Second_Counts==10000) Second_Counts=0;                          //当秒计数到1000秒又变为0
  154. ……………………

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

所有资料51hei提供下载:
4位共阴极数码管秒表hangqunli.zip (131.85 KB, 下载次数: 412)

评分

参与人数 2黑币 +51 收起 理由
简——亦 + 1 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:242057 发表于 2018-1-9 09:33 | 显示全部楼层
要用Proteus7.5才能成功
51hei.png
回复

使用道具 举报

ID:601025 发表于 2019-8-17 11:10 | 显示全部楼层
不错,正好有用
回复

使用道具 举报

ID:616844 发表于 2019-9-26 18:56 | 显示全部楼层
有用~~
回复

使用道具 举报

ID:616962 发表于 2019-11-10 12:04 | 显示全部楼层
我想问一下作者,P0口来输出段码可以吗
回复

使用道具 举报

ID:641049 发表于 2019-11-13 11:32 | 显示全部楼层
我为什么用protus打不开
回复

使用道具 举报

ID:142270 发表于 2019-11-13 14:33 | 显示全部楼层
很厉害呀
回复

使用道具 举报

ID:622056 发表于 2020-1-6 18:12 | 显示全部楼层
卑微的我,想知道共阳极的加上能够记录历史数据的,大佬能不能帮帮我
回复

使用道具 举报

ID:436945 发表于 2020-1-7 15:57 | 显示全部楼层
楼主真厉害,思路奇特,程序优美,电路简洁。
回复

使用道具 举报

ID:681573 发表于 2020-4-16 11:55 | 显示全部楼层
算法简单易懂,很不错
回复

使用道具 举报

ID:761075 发表于 2020-5-25 20:48 | 显示全部楼层
很厉害棒棒的
回复

使用道具 举报

ID:716999 发表于 2020-6-14 15:20 | 显示全部楼层
为什么我的运行出来不对呀
回复

使用道具 举报

ID:853485 发表于 2020-12-2 23:12 | 显示全部楼层
牛逼很不错,太好用了
回复

使用道具 举报

ID:315554 发表于 2020-12-15 09:42 | 显示全部楼层
学习了,谢谢分享,很详细的程序
回复

使用道具 举报

ID:120677 发表于 2021-1-7 08:42 | 显示全部楼层
代码写得规范哦  参考参考
回复

使用道具 举报

ID:236933 发表于 2022-6-3 10:46 | 显示全部楼层
程序重新编译,仿真无法运行,程序是有问题的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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