找回密码
 注册
关于网站域名变更的通知
查看: 295|回复: 2
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
刚学定时器,还不是太明白,定时器延时时间太长动态数码管就不显示了,老师不让用延时函数,我就不会做了。定时器怎么工作我倒是知道,但是具体怎么用我不懂,网上查了好多,也没搞清楚。
( H( k: O$ B1 I- }#include% B. T$ \" ]  k7 e; B
#define uchar unsigned char- }! U4 b0 u# h
#define uint unsigned int
' F  K+ F; d: y2 Y" q, d) C& y uint i;
% t4 T  W) T# R  L6 i9 y5 o3 U 1 V* S2 S% n, v! u4 I+ N- f$ L
char ctime=0;
/ V' c$ G+ m( G2 d3 v7 c! G5 Cuchar code led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};1 @% U) B0 a% E
/* void delayms(uint ms)        //延时函数,延时一段时间
; s1 Z, |, F0 d9 {0 q* L{8 W( `- T5 ]; H
     uint j;3 `4 _+ C9 O1 t7 B2 A2 ^0 v. k4 c
        while(ms--)
2 s$ X; ]/ U4 g) _" e" v5 D         {for(j=0;j<120;j++);8 H1 Z2 _3 L0 h( c+ e% S+ t
    }
% j+ t9 |7 d. j* b, s- T" _ } */
# \5 o& \+ x& V! [1 svoid main()
+ e  i# D6 w2 d" g& ^{' D) F9 X) R8 B+ T0 i3 h
  TMOD=0X01; //设定定时器为工作方式1" s2 H8 ~( X* Y. C9 A: j6 L0 e
  TH0=(65536-45872)/256; //装初值,11.0592 MHZ晶振定时50MS,计数值为45872
: u' v) T* A) B# M6 I  TL0=(65536-45872)%256;
+ }) M: ^! b( k. X  EA=1;   //打开总中断
/ }/ E1 z+ Z, t; i* l  ET0=1;  //打开定时器中断5 m2 q5 O; D$ T
  TR0=1;  //启动定时器0
; B% N4 @, j8 ?6 Z  P2=0xff;+ v* l* L  C8 P# i. M# N
  while(1)
' W& l+ w( J5 E/ d! `; V  {
) `5 F+ X3 X( m" i+ Y9 h  P# \$ V" P! e7 h  /* P0=led[ctime/10];$ ?+ t, ?) R$ \3 @: ?" j" K8 k
   P2=led[ctime%10];
! ~9 b. q- |8 @! D! q          */
" o4 l% e& |: Q( I) {$ ?             P2=0xfb;           //P2.0引脚输出低电平,DS0点亮& ?2 K/ u4 \. G* H; z9 j
          P0=led[ctime/10%10];      //数字1的段码9 c3 w/ c% N' f% F- |/ w* I; F
        // delayms(10);/ _: _6 R& q& F1 r

. t6 @$ x+ y  u- M! g: V9 h     P2=0xf7;      //P2.1引脚输出低电平,DS1点亮6 D# k* O& W5 t. @
          P0=led[ctime%10];      //数字2的段码
7 c, F( ~3 H' u( B: W0 H8 n        // delayms(10);
: l1 u" @' l" P% v: l( ]' z  }) }- \( n2 C/ l+ `
}9 k  R& d2 k- k% e; z! h1 N

1 h" \. {3 y; f" m0 x, M9 X
; W$ \9 n# ?3 C" Z( a   void time() interrupt 1  //定时器0中断服务程序4 t. y) J2 O; a
{+ i( _5 b" E) A7 q# S5 n8 L) f
  TH0=(65536-45872)/256;   //重装初值+ X& O/ r/ }) f! R+ k9 G0 O* }( c
  TL0=(65536-45872)%256;   
3 W; G  }) C; t/ n; M" y) X  i++;
% ]+ T5 s$ w5 K8 v6 P/ k  if(i==20)                //如果i=20,说明1s时间到, _! K4 R. R8 B. ?
  {5 C) R; B" f6 H  ]  e% p
   i=0;2 E+ C" l% E' c4 E% u
  - T- B  Z+ P" t( a
   ctime++;" z* p  l2 L. }( ]5 b' P- r- v/ J+ g. L
   if(ctime>99)1 Z' a: c. u7 V+ Q0 T5 G/ `
   {
3 v2 b" i4 R' H( z6 A' j9 W$ ^" L    ctime=0;; P, A+ s/ C5 o! h0 E( g
  }
' N- r1 {) |. b8 b) r }  8 |% ]. j" L5 Z
}
; E4 {& e2 w1 d% d( m4 M, \8 s

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-27 21:42 , Processed in 0.062500 second(s), 23 queries , Gzip On.

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

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

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