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

单片机讲义6:#define与typedef 软件延时If For语句 按键讲解

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
; c6 z1 g% C; {
第六讲 实验5-实验8; T3 j. J' {1 E. }8 t
知识点:
1 ^8 I/ D" L9 W* ~1、 学会画程序流程图
4 T8 g$ q5 n( w2 k. R9 V3 \2、 流程控制语句 if(){}else{}用法3 U1 {4 b  l( R: S
3、 操作符 ”~ ”、“!”、“&&”含义
) U5 }' |( k% ^8 l5 i2 H7 j4、 带参函数
. m% c7 b7 x/ b/ ~5、 函数调用
# S* f/ v5 p* A$ a+ @" x4 E# V' k6、 理解宏定义 #define “替换”作用
/ D' `1 E& V$ `1 M' `7、 循环语句 for 的用法& s8 s' h* M5 M0 O* q( U. n
8、 库函数 unsigned char_cror_ (unsigned char, unsigned char);3 F; L" M, t4 _+ u) ~
unsigned char _crol_ (unsignedchar, unsigned char);含义
' K" |7 e5 w* N1 ~% D) c1 U9、 C51 扩展类型 code含义( g0 P! q( g0 W# q
10、   流程控制语句:switchcase 用法
5 [+ R1 c- }0 y3 L11、   数组定义、引用方式8 a* Y3 x$ }* _6 s$ k  @" ]) y
12、   延时函数
% ^& H2 P: G  K+ P
3 m' {! [6 R" W1 d% f: i. O3 b一、51单片机软件延时:( I1 J4 X- w4 I* Z
1、 几种周期介绍  o/ L, l* F8 I! P/ w; {
  周期名称! q- Z! k/ [' z1 Z5 e, N; Q
  
  描述
$ X1 _5 j% l6 @  
  时间
" H8 g' k6 w( @1 s  g+ j/ ]2 V  
  振荡- v7 O6 U5 _& K% P% i& }
  
  
2 J/ h, K6 f/ {; k2 h' w' L  的振荡源的周期5 J$ c7 Y) b  d. j7 r" C, K" z, s2 @
  
  T=1/f2 Z2 r3 d7 T$ ]9 r
  
  状态
" M" o8 ]4 ~* W0 X" C6 }  
  # ]( H6 N9 j3 w
  
* t' o+ k6 ~* Q" M; e) {  
  2T
  p4 \" y; S" k. M  
  机器* ^9 \% h! k# S. k# X
  
  CPU 可以完成一个独立操
; c  K; m8 q  f  [  `8 H  作所需要的周期9 ]: ^* J7 N8 X7 u
  
  12T
, Z- Q8 \" j# o  
  指令
5 \. W1 z* L' s% j  
  指 CPU 完成一条操作所需  Y# l( W( z8 g6 V& D. ]
  的全部时间' `. V. q; n, C0 \
  
  n*12T5 Y7 ^8 e5 H# I; O/ l$ s% E
  
2、指令:
: M, L" ~, {" y1 c0 K1、MUL、DIV:仅有的 4 周期指令' ?# Y  `4 T0 z- o
2、包含 DPTR 和 PC 的指令均为 2 周期指令! B% A2 c. ?' A1 ^9 |1 B
3、所有的绝对跳转和条件转移指令,均为 2 周期指令
* n: M' A0 a8 _2 c+ ^( U4、所有包括 A 寄存器的指令,均为单周期指令
1 {  u2 y. y& A  K. {! x  T5、位操作指令中,ANL 和 ORL 是 2 周期指令
! t8 \5 B+ }& u& C1 d6、所有包含立即地址的指令,除 INC direct 及 DEC direct 外,均为 2 周期指令( C: [7 v- F8 v
7、剩下的均为单周期指令。如:4 P# \+ a0 R. S7 H
voiddelay(uint z)
7 c/ @2 h( d: h{
, I$ W6 w6 B+ tuinti ,j;6 E, _1 v& e* Z8 G$ J. w
for(i = z; i> 0;i--)
3 r! r2 D* u3 g! b6 s9 Q8 y8 O, C6 P

9 s) c' [7 h- \* tfor(j =0; j < 921; j++)  j6 W7 W9 m8 Z6 Y9 o, s
}3 @8 x# o, a5 N% W8 Y2 d

; u& l, R/ n! C: A
- Y; o2 V  k/ H0 A: B6 E/ l+ p分析:5 X& i' B$ j) B0 ~* `* J' I
1.先计算你单片机的振荡(时钟)周期 T=1/晶振(11.0592MHZ)
4 W5 M1 P- S4 J( O" v3 D4 d0 b2.一次 i--操作为 12T
! v5 @0 G2 B; p1 M4 t3.忽略变量定义,上述延时函数共需时间:921*z*12T
) \9 v2 c" j' l# h4.带入 T:921*12*T*z 约为 z us
/ ?; O5 m5 u- t/ J3、计算误差出现的原因:( v+ z, c3 O3 d# x: I
1.软件仿真时,函数调用的时候入栈出栈操作的耗时。1 ?! M& A" P; Q
2.指令周期随指令的不同而不同导致的误差。" v6 Q) m# k  E4 Y2 K
3.中断的影响。
" G9 t! W& H0 s2 h* H3 K( B4.变量的范围超过,从而与预计时间不一样。
9 o3 C" \! A; Y* R& x1 ^
0 K1 X1 b2 F' o, J; J! s1 A) P7 ]9 D7 P. Y7 H
while(i--):如果 i 为 char 型,执行一次大概为 5us 左右;如果 i 为 int 型则执行一次大概为 10us 左右。注意:软件延时通常用于时序要求较高的编程中,其它需延时较长的地方必须采用单片机内部定时器。0 s( s' G9 E8 f$ _, b. r( ]+ i8 Z) r
) R( |. M4 ]! P1 n
二、#define与 typedef 区别
- K4 k8 ?) r/ |# j9 }! B1、typedef 的用法6 k. ^' s' w) c+ K7 ~' Q: z; s% h

* I8 |3 ]8 J* @; S( W6 s在 C 语言中,typedef 常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分, 但它并不实际分配内存空间,
2 D6 `0 N9 D& x4 i如:typedef    int       INT;  f- j9 s3 b( [$ `7 H# q

0 w+ D0 P# B+ \1 O6 M! H% _2、#define 的用法; Y: |! \; J! p+ K) Q
#define 为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些 “表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,如:
! F$ t& u- q) s. x" N
  _6 V8 \" r# W' O#define   INT    int& M0 U( O! }( t9 i8 Q  U
#define   TRUE   1
, C+ `4 I. r/ G. L1 @. L# G7 {#define   Add(a,b)     ((a)+(b));# D+ c  D5 `  F5 J* i. s
#define   Loop_10    for (inti=0; i<10; i++)
  J3 O: ~" }  v! `7 k/ ]
8 b. X% _" o: V& z+ k8 c3、typedef 与#define 的区别5 l. P$ }- Y# M
从以上的概念便也能基本清楚,typedef 只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在 C 中是为了定义常量,到了 C++,const、enum、 inline 的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与 typedef 两者到 底该用哪个好,如#define INT int 这样的语句,用 typedef 一样可以完成,用哪个好 呢?我主张用 typedef,因为在早期的许多 C 编译器中这条语句是非法的,只是现今的 编译器又做了扩充。
0 C: D- g3 z4 m) _# N
: i( Z% }! g$ ~& I5 A5 L2 P为了尽可能地兼容,一般都遵循#define 定义“可读”的常量以及一些宏语句的任务, 而 typedef 则常用来定义关键字、冗长的类型的别名。
& i# ~$ }; {7 f! d6 {7 o( b1 ~# j* v$ X  ?
宏定义只是简单的字符串代换(原地扩展),而 typedef 则不是原地扩展,它的新名字具 有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。请看上面第一大点 代码的第三行:typedef    (int*)  pINT;以及下面这行:#define               pINT2 int*效果相同?实则不同!实践中见差别:pINT a,b;的效果同 int *a;int *b;表示定 义了两个整型指针变量。而 pINT2 a,b;的效果同 int*a, b;表示定义了一个整型指针 变量 a 和整型变量 b。3 a* o8 \* @; L  Q; t% T
, ?4 U) y% l2 i& g; ^* R
typedef 的四个用途和两个陷阱! z: H4 E, o" y# a( E
用途一: 定义一种类型的别名,而不只是简单的宏替换' c3 N4 D- R+ G5 P; K, b
用途二: 用在旧的 C 代码中(具体多旧没有查),帮助 struct。9 O6 A% i4 X8 @* \+ s- g. l% D% U3 L7 L

* y* W7 c- u: [* r5 M/ O$ S- ]0 H1 xtypedef   struct   tagPOINT5 Z+ D7 \4 O7 E0 H0 {: [+ o: }
{
3 V6 a; \* A  @* A3 {int   x;
: ^5 \/ b  |' f3 S8 i, u4 j$ dint   y;" g; e& g+ R9 |$ a! \; y
}POINT;
" \6 Q, ?/ L7 y+ S
0 H7 _3 c3 \8 B" x3 u* ~- tPOINT   p1;   //   这样就比原来的方式少写了一个 struct,比较省事,尤其在大量 使用的时候 或许,在 C++中,typedef 的这种用途二不是很大,但是理解了它,对掌握 以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代 码。
% i' F2 q% j! N, p* R2 ^& I2 F. _( G8 Z5 a  E% }7 C7 {9 B8 J
用途三: 用 typedef 来定义与平台无关的类型。用途四:为复杂的声明定义一个新的简单的别名。
' H5 ^3 H# s, N5 M2 V8 i
6 a3 r( t; S* W) ~. `! h5 Y陷阱一: 记住,typedef 是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。字符串替换就行。0 s- A7 u; t; h. a

* y9 I8 r: L. r! @1 g* R1 A4 P
: M/ F6 _' P: c2 z陷阱二: typedef 在语法上是一个存储类的关键字(如 auto、extern、mutable、static、 register 等一样),虽然它并不真正影响对象的存储特性,如: typedef   static   intINT2;  //不可行 编译将失败,会提示“指定了一个以上的存储类”。
4 B2 e0 @' R. X4 f" W3 M+ m* a2 s; d' R0 W/ b

4 i+ f# N$ \, d: M6 n: _" h三、按键:5 ^7 n8 h4 Y% n/ @1 R
按键是单片机系统中最常用的器件。各种仪器仪表、家用电器操作面板上都离不开按键,是最基本的输入部件。因此,掌握按键输入电路设计、按键驱动程序设计是十分必要的。按键的分类:从单片机获取按键信号类型的角度来讲,可以分为模拟按键和数字按键;从按键与单片机IO 端口对应关系上来讲,可以分为独立按键和矩阵式按键。独立按键很简单,就是一个按键对应一个 IO 端口;而矩阵式按键则相对复杂一些,通过行与列的交叉组合成 i 行*j 列个 按键。
6 W. ~# V, {) I! D2 J& d  k' ~. w) `/ g' q' g# p9 O  D- p, i
按键的有效方式:! A. m7 a: b3 H2 Q# a, f  U. l' `. b
按下有效、按下松开(抬起)有效、长按 n 秒有效、连按 n 次有效、组合按键有效等。按键驱动程序设计步骤:
+ O; B: A+ U2 }读取键值—按键消抖—键值处理! F: {4 O! o" E( i2 z, Z1 `* o% C& c7 Q
/ u* y) h  e7 H( q
: Z4 {- D7 Y( i
四、cror 与 crol 的区别$ ^: r/ ]$ R# U( q# G) m: [3 b
循环右移与循环左移

该用户从未签到

2#
发表于 2022-5-27 11:04 | 只看该作者
嗯嗯,学习学习。

该用户从未签到

3#
 楼主| 发表于 2022-5-27 14:48 | 只看该作者
很详细啊,学习学习。7 A1 h9 D; E" |, Q

该用户从未签到

4#
发表于 2022-5-27 15:33 | 只看该作者
很详细啊,学习学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 23:05 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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