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

单片机编程开发技巧

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-2-18 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
单片机编程开发技巧
/ _3 G" x  I1 Y8 S; q
3 k$ y% G! }/ Y
; R1 M5 q0 I  t' t9 l; Q2 x7 i+ P

工作了7个月之久,对单片机的编程也开始慢慢熟悉起来,以前总是知道单片机就是定时器,状态机,中断这些东西结合起来效率是相当高的,但是自从接手开发GPF这个芯片之后,我发现了另外一种单片机的开发技巧,高手请绕道。

我们都知道,在程序中,延时会影响单片机的实时性能,导致效率明显降低,但是在GPF这个芯片的开发中,系统延时和初始化被供应商做到了一块,所以调用程序,必须要做一定的loop才能使得程序能够正常的跑起来,其实我也不知道她们为什么要这么做。

在工作中,改一份源码不是随随便便就可以改的,当时做了这么一个程序,源码我就不公开了,写个案例解释:

void test()
$ Q& |" e+ X) }$ w{
( k$ b* B( ^6 O* N int i = 0 ;
* T9 Q) h" ~  n" t int tick ;9 e: F" `9 i. I/ }) ~" F* F6 w  v
int BatteryStatus = 0;
: @/ d  Z6 K$ a: N9 }, s2 t int Voltage ;
4 |+ e" ~+ G5 k9 |2 |/ U! ^; b int count = 0 ;
+ X( `! ], ~* }9 F int Voltage_value ;
" N+ a; V2 \; \& B4 x0 ]( ?1 R char ch ;) @, ]' _4 k$ b- l' }) c3 I
scanf("%d",&BatteryStatus);+ a/ }6 W8 o3 E  h
while(1)
7 c9 K, G0 [: ], w) B$ w {; c: d" }% P: f1 V5 d9 R+ o
  delay_20ms();
5 U8 u$ X) x% Y2 D0 y  switch(BatteryStatus)
; L, M" c4 f" ]* I: V% Z. @# r  {
; ~0 `/ Z# u. S8 W; Y5 f+ {   case 1:, G5 m- ^8 N, P0 q; G. W6 d
       if(count == 50)& F2 q; [5 e7 f1 c. y* g: k
       {! {% M3 ?; p9 Z: w0 k! j" ?: e
                        <span style="white-space:pre;">  </span>printf("0x%x\n",0xE1);
+ u7 P6 M# P% k) c+ ~, V) G. z( e      count = 0 ;+ t) s  @& H- @* l4 L) ^! \) u, U
       };break ;
& g: Y1 s+ l" a: ?! x* ]5 E   case 2:
0 O, K7 o: z! O1 J       if(count == 50)  a2 Y* W# ~5 E  m# z
       {
# r3 J& M- v9 s: n7 t$ }" b     printf("0x%x\n",0x90); //发通用'1'信号; L9 w' c% C# O$ P4 S2 x
      count = 0 ; 5 v1 U8 H' C9 \9 c7 x# a" U
       };break ;
0 X5 ?. A) U+ O   default:
% }) m' {% T# J, h     break ;+ F  A8 V( R3 ~7 R
  }* \; P# Y/ j/ t- V3 v
  count++ ;
3 D& z8 i( ~) O& Z  #if 0
  m* A& r# H& F- C  W  ch = getch();   //假设我在这设立一个按键% l. H" A: ^* P) \( j
  if(ch == 'q')/ I! `6 e) F; g' T7 a! d2 _
  {2 G3 ~5 n! x: R6 R
   printf("%x",0x48);8 A; W$ [0 O( y7 j% A6 `! L
            break ;) l- s' i% j8 E
  }
" g4 a  S1 C% U# U" n2 F  #endif
% l  P2 v1 E1 U1 m, C }: G% W- A0 f5 q. ^. f
}

在while循环中,首先进去是延时20个ms,然后count计数器加加,当加到50次也就是一秒钟了,然后清零。此时若按下按键,不会受到干扰,程序正常运行,效率依然很高。如果这时候delay_20ms改成delay_1000ms,程序扫描按键每次就要等待1s钟,影响效率。计数值可以自我估计一下,不需要太准,这样的程序在延时不需要太精准的可以实现和定时器差不多一样的功能。


  [4 x8 t7 D1 j
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 17:11 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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