EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机编程开发技巧: C8 c5 @ M/ S
: G8 b2 f$ R; o4 J1 `: {0 p
3 ^3 Y' o6 Q5 U. q工作了7个月之久,对单片机的编程也开始慢慢熟悉起来,以前总是知道单片机就是定时器,状态机,中断这些东西结合起来效率是相当高的,但是自从接手开发GPF这个芯片之后,我发现了另外一种单片机的开发技巧,高手请绕道。 我们都知道,在程序中,延时会影响单片机的实时性能,导致效率明显降低,但是在GPF这个芯片的开发中,系统延时和初始化被供应商做到了一块,所以调用程序,必须要做一定的loop才能使得程序能够正常的跑起来,其实我也不知道她们为什么要这么做。 在工作中,改一份源码不是随随便便就可以改的,当时做了这么一个程序,源码我就不公开了,写个案例解释: void test()( j) b! {% }( L
{' z! N8 ^% b) ]/ z
int i = 0 ;) H* {$ q7 H* K1 f5 m) K6 g, P
int tick ;" G$ X' F) ~9 ?
int BatteryStatus = 0;
+ |/ j: [3 o. E! I! h0 H int Voltage ; - M; o9 P6 B; D) E& W1 S+ i
int count = 0 ;
; c, b. O1 }8 D2 j& s9 V; n int Voltage_value ;
$ S. s9 h; S8 t# }9 Y char ch ;. F- t) w9 a6 R, u( Y" w
scanf("%d",&BatteryStatus);4 B' X8 }+ q; p, V
while(1)
. q9 E2 v8 S2 G4 }2 X {/ Q, ]& \8 a3 x" f L8 }- p2 N
delay_20ms();
. N- h8 s2 @0 M$ x9 ?& O8 M# Q2 b switch(BatteryStatus)1 V3 F. R4 @- w8 }. ]
{" U& s( ^" P( O6 ?) r ?" U
case 1:! K: f9 o- l/ { e
if(count == 50)
" c( l& m$ A: U w, P {8 ^8 U0 ^+ z0 `2 C
<span style="white-space:pre;"> </span>printf("0x%x\n",0xE1);% @4 }' N+ q4 N( ?$ V) I9 v3 u
count = 0 ;
' l' _) P0 L& Y+ ?3 _ };break ;& z7 A( P: H: k. R+ J; K
case 2: ' N; a" T& S/ ^% t
if(count == 50)! Y# |) {8 z+ E" {- n
{
" n! N3 I4 L+ u: S# U printf("0x%x\n",0x90); //发通用'1'信号8 E# J9 _. p- `6 P$ D
count = 0 ; - u: Z- D% c. U: c S, d4 Z9 H) b9 T
};break ;
% \, |! {$ \0 V0 G default:
+ d# J, a% z. X6 X break ;7 u) q8 i- }0 {, U
}; h1 v& i, F' _
count++ ;
2 H: A b3 d1 \7 x( _4 j! @ #if 0 4 ]) C$ |$ P7 Y0 j
ch = getch(); //假设我在这设立一个按键: ^4 F" @' C- B& {0 R, V
if(ch == 'q')
2 t9 B/ C0 Y* x, _9 ~' R8 Q {
4 [& y# s& }+ ^ printf("%x",0x48);; I, S7 ?* y( Z. s1 u e9 ]% _
break ;
7 G Q: _$ i. {* P9 N2 r }* Q6 b+ b8 B/ R- [8 G* R
#endif5 _3 l! |* d5 t) J
}
4 o* m+ {* x6 o, G X7 Q1 o} 在while循环中,首先进去是延时20个ms,然后count计数器加加,当加到50次也就是一秒钟了,然后清零。此时若按下按键,不会受到干扰,程序正常运行,效率依然很高。如果这时候delay_20ms改成delay_1000ms,程序扫描按键每次就要等待1s钟,影响效率。计数值可以自我估计一下,不需要太准,这样的程序在延时不需要太精准的可以实现和定时器差不多一样的功能。 3 U. O, X) _0 J( [
|