找回密码
 立即注册

QQ登录

只需一步,快速开始

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

TX-1C开发板--Proteus平台下单片机动态数码管扫描之计数器程序

[复制链接]
ID:496489 发表于 2020-3-5 17:03 | 显示全部楼层 |阅读模式
  教材上面的程序好像不能实现数码管59s计数的功能,经过一些资料查询,修改了教材上的程序,比较好的实现数码管的计数。(消影!!!)
  程序自己写的。因为仿真平台不是我自己搭的,所以不能分享出来哈(不能侵权嘻嘻!)
  希望帮助到有需要的人哈!!
1583398897(1).jpg

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

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit DULA = P2^6;
  6. sbit WELA = P2^7;
  7. sbit Led1 = P1^0;

  8. /*字符编码0-F共16个*/
  9. uchar code table[]={
  10. 0x3f,0x06,0x5b,0x4f,
  11. 0x66,0x6d,0x7d,0x07,
  12. 0x7f,0x6f,0x77,0x7c,
  13. 0x39,0x5e,0x79,0x71
  14. };
  15. /*数码管位编码*/
  16. uchar code tablewe[]={
  17. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf
  18. };

  19. /*变量声明和初始化*/
  20. uint shi,ge,num0,num1,num;

  21. /*延时函数声明*/
  22. void delay_ms(uint xms); // 实现延时xms毫秒
  23. /*数码管显示函数*/
  24. void display(uint shi,uint ge);

  25. void main(void)   
  26. {        
  27.   /*寄存器初始化*/
  28.         TMOD = 0x11; // 设置定时器0/1的工作方式
  29.         TH0 = (65536-45872)/256; // 计数器的初值
  30.         TL0 = (65536-45872)%256;
  31.         TH1 = (65536-45872)/256;
  32.         TL1 = (65536-45872)%256;
  33.         EA = 1; // 使能总中断
  34.         ET0 = 1; // 开启定时器中断
  35.         ET1 = 1;
  36.         TR0 = 1; // 启动定时器
  37.         TR1 = 1;
  38. //        WELA=1;
  39. //        P0=0xfc;
  40. //        WELA=0;
  41. //        DULA=1;
  42. //        P0=0x3f;
  43. //        DULA=0;
  44.         
  45.         
  46.   while(1)
  47.         {               
  48. //                        WELA=1;
  49. //                        P0=0xfe;
  50. //                        WELA=0;
  51. //                                
  52. //                        P0=0xff;                        
  53. //               
  54. //                        DULA=1;
  55. //                        P0=0x3f;
  56. //                        DULA=0;
  57. //                        
  58. //                        P0=0xff;                        
  59. //                        
  60. //                        delay_ms(1);
  61. //                        
  62. //                        WELA=1;
  63. //                        P0=0xfd;
  64. //                        WELA=0;
  65. //               
  66. //                        P0=0xff;                                
  67. //               
  68. //                        DULA=1;
  69. //                        P0=table[ge];
  70. //                        DULA=0;
  71. //                        
  72. //                        P0=0xff;                                

  73. //                        delay_ms(1);
  74.                         display(shi,ge);        

  75.         }        
  76. }

  77. void delay_ms(uint xms)
  78. {
  79.         uint i,j;
  80.         for(i=xms;i>0;i--)
  81.          for(j=110;j>0;j--); // 通过断点测试,该语句执行完约1ms
  82. }

  83. void display(uint shi,uint ge)
  84. {
  85.         /*第一个数码管显示十位*/
  86.         WELA = 1;
  87.         P0 = tablewe[0];
  88.         WELA = 0;               
  89.         
  90.         P0 = 0xff; // “消影”
  91.         
  92.         DULA = 1;
  93.         P0 = table[shi];
  94.         DULA = 0;
  95.         
  96.         P0 = 0xff; // “消影”
  97.         
  98.         delay_ms(5);
  99.         
  100.         /*第一个数码管显示个位*/
  101.         WELA = 1;
  102.         P0 = tablewe[1];
  103.         WELA = 0;        
  104.         
  105.         P0 = 0xff; // “消影”
  106.         
  107.         DULA = 1;
  108.         P0 = table[ge];
  109.         DULA = 0;
  110.         
  111.         P0 = 0xff; // “消影”

  112.         delay_ms(5);        
  113. }

  114. void Tim0() interrupt 1
  115. {
  116.         TH0 = (65536-45872)/256; // 重装初值
  117.         TL0 = (65536-45872)%256;  
  118.         
  119.         num0++;
  120.         if(num0 == 4)
  121.         {
  122.           num0 = 0;
  123.                 Led1 = ~Led1;
  124.         }
  125. }

  126. void Tim1() interrupt 3
  127. {
  128.   TH1 = (65536-45872)/256; // 重装初值
  129.         TL1 = (65536-45872)%256;
  130.         
  131.         num1++;
  132.         if(num1 == 20)
  133.         {
  134.           num1 = 0;
  135.                 num++;
  136.                 if(num == 60)
  137.                         num = 0;
  138.                
  139.                 shi = num/10;
  140.                 ge = num%10;
  141.         }
  142. }
复制代码

所有资料51hei提供下载:
text_TimerAndInterrupt.rar (28.02 KB, 下载次数: 5)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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