|
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) |
|