设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 1153|回复: 0
收起左侧

STC单片机 IO口强推挽+定时器中断实现直接驱动8位共阴数码管 1亿秒时间计时计数器

[复制链接]
发表于 2021-11-16 20:34:36 | 显示全部楼层 |阅读模式
单片机型号:STC任意(STC89/90除外) 晶振频率:12Mhz 硬件连接(共阴数码管):段码:P2.0~P2.7 位码:P1.0~P1.7
上电后数码管全亮1秒,显示00000000 每秒加1 加到99999999最后清0,以此类推。

1亿秒计时.png

  1. #include "STC15.h"
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define u32 unsigned long

  6. u8 code nbr[16] = {        //共阴数码管段码16进制
  7.     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
  8. };

  9. u8 show[8];                //8位数码管当前显示的段码 更改数码管显示的段码 只需更改此数组
  10. bit delay,test,feed_dog;
  11. u16 delay_ms;

  12. void InitTimer0(){
  13.     TMOD = 0x01;
  14.     TH0 = 0xFC;
  15.     TL0 = 0x18;
  16.     EA = 1;
  17.     ET0 = 1;
  18.     TR0 = 1;
  19. }

  20. void main(){
  21.         //P1、P2强推挽
  22.         P1M0 = 0xFF; P1M1 = 0x00;
  23.         P2M0 = 0xFF; P2M1 = 0x00;
  24.         WDT_CONTR = 0x27;
  25.     InitTimer0();
  26.         test = 1; delay_ms = 1000; delay = 1;
  27.         while (delay);
  28.         test = 0;
  29.     while (1) {
  30.                 _nop_(); _nop_(); _nop_(); _nop_();
  31.                 if (_testbit_(feed_dog)) {
  32.                         WDT_CONTR |= 0x10;
  33.                 }
  34.                 _nop_(); _nop_(); _nop_(); _nop_();
  35.     }
  36. }

  37. void Timer0Interrupt() interrupt 1{                //12Mhz 1mS 定时器中断
  38.         static u8 seg = 0;
  39.         static u16 ms = 999;
  40.         static u32 sec = 99999999;
  41.     TH0 = 0xFC;
  42.     TL0 = 0x18;
  43.         if (delay && !--delay_ms) {
  44.                 delay = 0;
  45.         }
  46.         P1 = 0xFF;           //消影
  47.         P2 = test ? 0xFF : show[seg];      //段码
  48.         P1 &= ~(1 << seg);   //位码
  49.         if (++seg >= 8) seg = 0;
  50.                 if (!test && ++ms >= 1000) {
  51.                         feed_dog = 1;
  52.                         ms = 0;
  53.                         if (++sec >= 100000000) {
  54.                                 sec = 0;
  55.                         }
  56.                         show[0] = nbr[sec / 10000000 % 10];
  57.                         show[1] = nbr[sec / 1000000 % 10];
  58.                         show[2] = nbr[sec / 100000 % 10];
  59.                         show[3] = nbr[sec / 10000 % 10];
  60.                         show[4] = nbr[sec / 1000 % 10];
  61.                         show[5] = nbr[sec / 100 % 10];
  62.                         show[6] = nbr[sec / 10 % 10];
  63.                         show[7] = nbr[sec % 10];
  64.                 }
  65. }
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-3-29 21:55 , Processed in 0.525030 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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