找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 472|回复: 1
打印 上一主题 下一主题

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

[复制链接]

9

主题

20

帖子

42

积分

二级会员(20)

Rank: 2Rank: 2

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

EDA365欢迎您!

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

x
一、延时程序的处理:9 e$ V0 Z. J, J0 l1 A; w# C( g
  1、对于可以设置系统时钟的单片机,延时程序统一先把系统时钟设频率置为最低,然后按这个最低时钟频率写延时
6 }& i+ ]0 }) A( `' d: e     函数,这样的好处:第一,统一了不同系统时钟下的延时;第二,降低功耗
( J% t9 u1 M! H0 v  2、对于单片机系统,不同的外部时钟,延时程序对应的时间不同,为了方便使用,加入预编译指令#ifdef/#else/
" _3 X; E1 }0 z4 V, w" T. W( Q6 G     #endif  这样如果预定义了一个系统时钟,则选择相应的延时参数进行编译,而延时程序主体不变,只是里面有
/ n" h3 F7 e4 k     一个延时参数,根据预定义选择相应参数。% H" j" D% c4 `  B; g# p. o2 B
二、for循环的处理:: l' L" |. L$ |2 N) Y4 {& u
   用for(i=XX,i>0,i--) 而不用for(i=0;i<XX,i++)  速度快
" j$ N% X) u* J   对于两层或多层for循环,频繁的循环放在内层,减少循环间跳转花费的时间
3 t" f( p# w$ o$ V( e# Z三、对外设的操作:可以把外设作为一个文件来操作,比如液晶,就可以把液晶看作一个文件,往液晶打印字符串或& L( X! Z0 D# f' q3 ^. Y! n
   者数据,就可以用fprintf()来做,(51的C标准库不支持,但是可以自己写一个文件操作的库)。只要是输入输出( f7 [( ^  t- j& ~' j) i; p: [
   设备,都试着用文件操作的方法去操作。
1 P  W3 H& t$ N/ i6 }, ^9 U
1 s0 U# `0 n( r# ~四、标准库函数的使用:( i$ |* ~8 n9 w' k
  1、标准输入输出库(stdio.h):, C# i$ G7 T% X1 \
   字符串夹杂变量数字(比如:发送完nihao字符串,然后发送变量i的值)往液晶显示或往串口发送的时候,往串口发
; V  [9 z) e/ z" |   送可以使用格式输出函数printf("nihao%d",i);但是往LCD显示就不好做了,通常是写一个数字转字符串的函数,然, }& o, l: X2 _
   后先送原来的字符串,再送数字转换后的字符串,太麻烦,可以使用标准输入输出库里的sprintf()函数来完成,它
  B+ Y8 e) h$ T   的原型为:sprintf(char *buffer,const char *format, …),*buffer是要把字符串和变量写入的缓冲区,可以使' ~" @, [* }0 p
   用数组或者指针,后面的格式和printf()函数一样;    与之对应的还有sscanf()函数,从缓冲区读一个字符串把它
3 F2 M, [0 T( J   转成相应的类型后赋给指定的变量。
* U" [7 m% D. L4 r   比如:
. S8 q9 [( o/ k8 C0 D, ?6 ]3 q    #include <stdio.h>" ?6 Y+ t: M# F, N$ d- y2 z
    void PrintToLcd(unsigned char *str)
/ N+ }+ U% ?' m- @. r4 W# H    {
- I4 q- |6 o4 {& ], z        crazybc.com( p/ \  D1 X# Q3 _
    }* Y- ~  v% Q: ^  z8 Q/ |$ U
    void main(). X0 _& q: l" q! J# V7 W: ?, w
    {( [; Y* Q+ E$ y7 e
        unsigned char *p;
  e& d7 F2 H  U  s        unsigned char i = 50;
8 H1 D) b5 y& ~. D% ?' N        sprintf(p,"nihao%d",i);
" s3 Q) U; ^  O. K7 Z, p4 g        PrintToLcd(p);
/ L  r; X2 K; x    }( t% }7 e4 b( o% `2 p/ p
  2、字符串库(string.h)+ ~" I* w, f/ T
    字符串连接(相加)  char*strcat(char *dest,const char *stc)
% r: ^* G* q' a% S6 t( c   把src连接到dest字符串后面,返回指向dest的指针: F! {8 D: f% v8 i" c, `) F
    字符串比较  int strcmp(char*str1,char *str2)
# E2 C# Q/ w3 t   返回值:小于0: str1<str2,等于0: str1=str2,大于0:str1>str23 p, ~- \9 A/ f% h7 j  Z) C) T
    字符串拷贝1  char*strcpy(char *dest,const char *src)0 [! e  ~" E: j1 U( f
   结果把src的内容拷进dest,两个字符串内容相同,返回指向dest的指针
: g- ^0 y, y( T% N# c* J8 a- S    字符串拷贝2  char*strdup(const char *src)
( E* D; z, l/ ?; v) [   src:待拷贝的源字符串,返回值:指向拷贝后的字符串的指针
3 p' k- {& {( C    字符串倒序  char *strrev(char*s);
' U4 |* q' f- ?   返回指向倒序后字符串的指针4 M7 z& T( s# _( ~
  3、类型转换(math.h; stdlib.h)
9 X4 D3 q! e7 D) k4 s   字符串转双精度(类似C++Builder里的StrToDouble) double atof(char *str)
9 h2 ^1 C; G0 z1 |  O1 j   字符串转整数(类似StrToInt)  int atoi(char *str)+ \+ ~; C8 t. f  R) f4 I
   字符串转长整型  long atol(char*str)3 s7 v8 L- d; L
   浮点数转字符串  char *ecvt(doublevalue,int ndigit,int*dec,int *sign)
  l1 ?9 ^2 N5 i; r; d) R- b. F* g, p. ]                  char *fcvt(double value,int ndigit,int*dec,int *sign)* T4 e; j& i* D* y; E
    输入参数:value: 待转换浮点数,ndigit: 转换后的字符串长度/ M& v0 `! ^$ ^
    输出参数:dec: 小数点位置,sign: 符号
4 I4 s  u0 G( S4 J: y" y: e- `    返回转换后的字符串指针; T5 W5 n' }( E/ j6 k
   整型转字符串  char *itoa(intvalue,char *string,int radix)0 P) t4 w/ F' R3 i; N
    输入参数:value: 要转换的数,radix: 转换的进制
" x% l1 ?! H7 Q1 X9 j  z    输出参数:string: 转换后的字符串
, Q" f" Z9 g" p9 n( ?2 ]    返回指向string的指针
( j, v* B" L) J   长整型转字符串  char *ltoa(longvalue,char *string,int radix)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏1 支持!支持! 反对!反对!

0

主题

45

帖子

140

积分

二级会员(20)

Rank: 2Rank: 2

积分
140
2#
发表于 2016-4-5 21:50 | 只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-25 03:07 , Processed in 0.066550 second(s), 32 queries , Gzip On.

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

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

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