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

单片机编程爱好者的几点编程心得

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2014-9-10 14:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
一、延时程序的处理:6 G/ g" F" ]0 _4 ^5 s
  1、对于可以设置系统时钟的单片机,延时程序统一先把系统时钟设频率置为最低,然后按这个最低时钟频率写延时7 y$ G- T3 z1 w1 x8 G
     函数,这样的好处:第一,统一了不同系统时钟下的延时;第二,降低功耗
) |/ [9 ?8 s! g* i7 q/ y( L6 f) `$ E  2、对于单片机系统,不同的外部时钟,延时程序对应的时间不同,为了方便使用,加入预编译指令#ifdef/#else/
  D( y4 l' X& D. t     #endif  这样如果预定义了一个系统时钟,则选择相应的延时参数进行编译,而延时程序主体不变,只是里面有
( e/ D6 M) v$ L) w( ?" \- j5 e8 {     一个延时参数,根据预定义选择相应参数。
  h: S) W  o$ c& y6 g" G! x二、for循环的处理:  J5 R! B! e; X& q* ^& K5 }( b6 z
   用for(i=XX,i>0,i--) 而不用for(i=0;i<XX,i++)  速度快
. e+ |) Q3 ?: j1 s6 }: C   对于两层或多层for循环,频繁的循环放在内层,减少循环间跳转花费的时间
1 O& _. H+ M; k" N; h3 U三、对外设的操作:可以把外设作为一个文件来操作,比如液晶,就可以把液晶看作一个文件,往液晶打印字符串或
% E' l: X5 q  m2 b7 K3 O   者数据,就可以用fprintf()来做,(51的C标准库不支持,但是可以自己写一个文件操作的库)。只要是输入输出( B; B6 ?3 Q7 |* {5 V! z7 _
   设备,都试着用文件操作的方法去操作。
" u- J8 ^" }* {7 `& F7 M
6 x# T: p; y* n) U) Z6 ]% `9 s1 G: o四、标准库函数的使用:
8 k. b; `& I# N: q8 u  d5 `+ P6 }  1、标准输入输出库(stdio.h):
- r+ Y- Z. J* {# i4 B   字符串夹杂变量数字(比如:发送完nihao字符串,然后发送变量i的值)往液晶显示或往串口发送的时候,往串口发- b8 |3 A  v, G
   送可以使用格式输出函数printf("nihao%d",i);但是往LCD显示就不好做了,通常是写一个数字转字符串的函数,然
& D; k2 }$ {9 N1 a; p   后先送原来的字符串,再送数字转换后的字符串,太麻烦,可以使用标准输入输出库里的sprintf()函数来完成,它5 m$ W) z+ G0 ]( _+ R3 C, s
   的原型为:sprintf(char *buffer,const char *format, …),*buffer是要把字符串和变量写入的缓冲区,可以使" P0 W  R6 X3 e0 g# k* ~% {4 t3 d
   用数组或者指针,后面的格式和printf()函数一样;    与之对应的还有sscanf()函数,从缓冲区读一个字符串把它
& c" T$ N3 n; L3 h( U6 l   转成相应的类型后赋给指定的变量。2 q- V* }, i1 n2 B0 T
   比如:1 \' h6 v/ u$ F2 \
    #include <stdio.h>
9 N) {$ I- ^2 x/ K    void PrintToLcd(unsigned char *str)2 @; [; d; i" l1 j
    {
" T6 d& U+ Q0 |& D/ q" e, x        crazybc.com9 N6 V, T# A& J2 Z9 I3 D+ P
    }0 r, h; s% R; S; j% Y+ `
    void main()
' s) E9 g6 a- L; h    {
" c" V' L  N$ b1 I/ {5 M        unsigned char *p;: q& P  k! k6 r: E2 A
        unsigned char i = 50;
9 G* J) e; e, F* i4 |9 Y) K3 m5 j        sprintf(p,"nihao%d",i);* D6 J2 O2 E( z5 f1 u9 d
        PrintToLcd(p);
( \- U1 @" G( T& [% K- F    }) a8 y. M3 Q' f
  2、字符串库(string.h)
2 v" P8 {' a! M% T8 A8 G- E    字符串连接(相加)  char*strcat(char *dest,const char *stc)+ @0 `4 o5 l) h( a7 X3 Q
   把src连接到dest字符串后面,返回指向dest的指针3 N/ \- B5 K- a
    字符串比较  int strcmp(char*str1,char *str2)
, k) x" O4 e$ U+ F$ a4 u   返回值:小于0: str1<str2,等于0: str1=str2,大于0:str1>str2+ D6 X0 ?2 T. [
    字符串拷贝1  char*strcpy(char *dest,const char *src)2 C' X  w: x. \6 c7 g; f9 I
   结果把src的内容拷进dest,两个字符串内容相同,返回指向dest的指针& _/ U  V5 t: J. ~' W1 w
    字符串拷贝2  char*strdup(const char *src)
) C1 F9 X7 w8 @, l* Z/ E  x$ c   src:待拷贝的源字符串,返回值:指向拷贝后的字符串的指针6 A8 i% C. B2 o3 F+ R* G! u4 U) i; H
    字符串倒序  char *strrev(char*s);- M; g& X0 F+ k0 ]/ a0 h
   返回指向倒序后字符串的指针
6 m. v5 k9 n9 k  3、类型转换(math.h; stdlib.h)
* m& q: L5 e3 B2 K9 k   字符串转双精度(类似C++Builder里的StrToDouble) double atof(char *str)3 X: z6 k. W9 {: o  X5 L" n" X
   字符串转整数(类似StrToInt)  int atoi(char *str)
& A9 a' z+ i0 e9 S7 R9 r* z   字符串转长整型  long atol(char*str)2 O1 ^! d1 t) y" b/ j7 d4 ?
   浮点数转字符串  char *ecvt(doublevalue,int ndigit,int*dec,int *sign)
  A- ]; e' ]: A- M8 |5 j' d* a                  char *fcvt(double value,int ndigit,int*dec,int *sign)
1 d0 e! x4 t+ o# u3 B& L    输入参数:value: 待转换浮点数,ndigit: 转换后的字符串长度
5 I3 N6 z4 |- @    输出参数:dec: 小数点位置,sign: 符号7 p6 v6 b( z8 z; J. G  B5 C
    返回转换后的字符串指针
/ d8 v( ~$ ~0 w6 p. s% i   整型转字符串  char *itoa(intvalue,char *string,int radix)
2 p- @. M  G' s5 v: }    输入参数:value: 要转换的数,radix: 转换的进制
" Q+ ~( r3 d( E* c: s0 W9 C    输出参数:string: 转换后的字符串. h9 N- l7 Y2 j& M; n- K; O# `! E
    返回指向string的指针! E3 s0 S* X/ z1 @: x
   长整型转字符串  char *ltoa(longvalue,char *string,int radix)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-23 14:55 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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