找回密码
 注册
查看: 283|回复: 2
打印 上一主题 下一主题

怎么用定时器代替延时函数让动态数码管显示0-99

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-12-5 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
刚学定时器,还不是太明白,定时器延时时间太长动态数码管就不显示了,老师不让用延时函数,我就不会做了。定时器怎么工作我倒是知道,但是具体怎么用我不懂,网上查了好多,也没搞清楚。' `2 F2 l0 _: K3 _1 s7 v
#include
$ ~) B- u- C& R" Z#define uchar unsigned char& l+ b( Q4 Y% `+ E! @7 _
#define uint unsigned int' K: n$ {5 u4 L  ]; o2 x5 r) N
uint i;& _( O* n) u7 G9 `$ v' k
! v5 O- h; W7 j/ @
char ctime=0;8 a5 \; B% N3 K/ z$ U. Q
uchar code led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};6 f8 M9 l) F4 B
/* void delayms(uint ms)        //延时函数,延时一段时间: V4 }# A; T( J- ]) j- |
{. `5 [6 m3 I- p
     uint j;
) X; z6 f6 J% |, E        while(ms--)
5 d5 c3 i: v0 g         {for(j=0;j<120;j++);% y4 b4 A3 J. t& |
    }4 X4 _7 X* L+ @; e. E
} */
5 j+ p/ v8 g8 l: y; I# k& r& m; Avoid main()) b8 O! U1 d8 i( m
{
) w" k# @5 X7 a% t- |  TMOD=0X01; //设定定时器为工作方式1
" ^" m4 s. x, h2 J! W3 O8 m  TH0=(65536-45872)/256; //装初值,11.0592 MHZ晶振定时50MS,计数值为45872
( w7 a( f6 Y* K" H5 L  TL0=(65536-45872)%256;
7 S2 ?) D8 r: O. W0 A  EA=1;   //打开总中断
: f1 O* }( w# Z9 e2 Q- \  ET0=1;  //打开定时器中断: X3 B- E4 [# K4 e9 F( R1 _+ E% D
  TR0=1;  //启动定时器0  b( ~; B: p0 p, C4 R
  P2=0xff;
2 P5 A) ~! E' L" r  while(1): b! I( v* L2 P1 \0 @/ p
  {7 b6 T: g' q" Y
  /* P0=led[ctime/10];
- x! t. u4 ^  E- k/ D$ n+ x9 c9 a   P2=led[ctime%10];
) o" v. w7 d" T' Z          */$ K  ^# A- v1 l  G$ ?* [- [
             P2=0xfb;           //P2.0引脚输出低电平,DS0点亮! {% I; F- g/ L6 }
          P0=led[ctime/10%10];      //数字1的段码' H0 K4 _) W5 H9 N7 `! H
        // delayms(10);
- ^# W4 e: }8 w7 h, E$ k
1 s5 \+ ]* }0 [% T; j     P2=0xf7;      //P2.1引脚输出低电平,DS1点亮
6 L* L& U- j7 c1 u! I* E+ D; T          P0=led[ctime%10];      //数字2的段码
( f2 i6 O7 w: |9 J8 m        // delayms(10);
3 z# o+ F7 A& o- N% R5 J4 X  }
5 s( F; K( ^4 ]( o; |6 N}
  J+ U' j6 q9 W* W! G7 R3 ?) W6 w& d* ^# |4 F
& @) a( J  M: E5 V$ w0 i
   void time() interrupt 1  //定时器0中断服务程序
! O$ l+ b" I0 ~( [4 c0 r/ \{( O2 t: p) D, u, X% `, U$ ?
  TH0=(65536-45872)/256;   //重装初值# F/ A2 a/ y2 ~& L" U
  TL0=(65536-45872)%256;   
  D- ?6 M6 r, {  i++;$ ]# O) s% z. X
  if(i==20)                //如果i=20,说明1s时间到1 |' ?5 l1 }3 Y; u6 a7 s
  {+ J! r) c% S+ w0 F
   i=0;
9 h" O: H6 g: D- D# _3 O  : h9 G+ f2 S" y% d/ n& b
   ctime++;" M" V. c( X1 e$ l
   if(ctime>99)
9 X/ O: X3 Z' {* f( G   {) h( c5 m5 I' i' [7 c& M1 J
    ctime=0;
5 T9 B: d8 F. ]" D( Y  }
. n4 y1 V- b5 K+ a6 d, t4 g }  
8 N  H5 [! |, j. a3 f$ r9 }& T}, n9 o; P" ^5 Z( X

该用户从未签到

2#
发表于 2022-12-5 11:02 | 只看该作者
给你提供一个思想:在定时器中对1个数进行递减/加运算,在主程序中对该数进行判断,递减/加到某个值执行一次显示,并且重新赋初值,每判断一次可以轮换数码管显示,这样就实现了动态显示 。

该用户从未签到

3#
发表于 2022-12-5 13:27 | 只看该作者
延时就是你在一个地方等,看表到时间了你就走,定时器就是一个闹钟,到点了他会告诉你,不用你看表,就是这么点差别。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-5-29 20:37 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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