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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

3 v+ a2 D. o) K' s2 ]$ p% a+ @1 K第六讲 实验5-实验8+ i+ j4 A! M% |) D
知识点:7 H2 H. r) E* ?3 y/ w2 J
1、 学会画程序流程图
1 \# U% m; T- q& y; ~2、 流程控制语句 if(){}else{}用法1 l, @1 ?$ K0 H8 T
3、 操作符 ”~ ”、“!”、“&&”含义
" G% U0 M# b: q( |: d4、 带参函数
8 I. H  z4 b6 P. l4 p5、 函数调用! c. [3 e0 c/ M' X6 N6 ~& H3 H  |
6、 理解宏定义 #define “替换”作用
5 F# k$ b- I! P9 b; w5 N& x7、 循环语句 for 的用法3 `% Z3 V9 n! u. J
8、 库函数 unsigned char_cror_ (unsigned char, unsigned char);4 b* `( p9 d) n9 R7 N1 u
unsigned char _crol_ (unsignedchar, unsigned char);含义# r( r# s- N! F2 R# a) _: b3 {
9、 C51 扩展类型 code含义7 y9 [: E3 F* f" J/ H9 K' G
10、   流程控制语句:switchcase 用法$ Y+ v: ?1 b7 ?( A' o
11、   数组定义、引用方式& q0 Y9 W3 c5 {( H$ a" D! w
12、   延时函数
! a/ I# W* H. i9 S" e  O! Q/ V0 F) l( j( K% Y; |
一、51单片机软件延时:' A  g* ^3 V- n" A+ s. ]4 a4 _
1、 几种周期介绍. n8 q* g) o9 K2 b  n  q/ e
  周期名称+ O, b2 ^' ?3 W3 ?
  
  描述
5 M( ~0 W2 A9 e8 b  
  时间
2 g2 i2 h5 E! j$ f  
  振荡- z7 p' L2 X+ u" i% y9 ^/ I6 w$ D
  
  ! r1 g) ]* o7 T5 r6 X, t& F
  的振荡源的周期
( a5 m2 m5 F( @* Y" w  
  T=1/f5 B9 }) y" Y2 J7 F. j4 P$ g
  
  状态
; a! k% ]$ o/ Y& x. {( }5 @9 ^  
  
- t) p, e# [3 p) \) S  
) c: S( F5 y! B0 e1 S+ J6 W! C  
  2T8 n4 L3 D+ K4 M% a' G0 E; E
  
  机器% Y8 V3 N" C* r/ k( P
  
  CPU 可以完成一个独立操
$ d( w2 h/ S8 g/ t9 f7 V( X  作所需要的周期# b  K$ q$ M' O: ?
  
  12T" F& N# h6 c7 W, {+ d0 f
  
  指令
0 t& R9 v, L, {  _/ P$ L5 U. ~  
  指 CPU 完成一条操作所需
* t" u: G1 z% R( s2 K$ x2 \! R  的全部时间
7 n9 T; \! L+ y  
  n*12T! z) ?0 @8 J. V3 `  g
  
2、指令:% \3 f+ P* q$ e
1、MUL、DIV:仅有的 4 周期指令& I+ Y1 d: w+ }- Z
2、包含 DPTR 和 PC 的指令均为 2 周期指令
% s% [. \' u) W( D$ z3、所有的绝对跳转和条件转移指令,均为 2 周期指令
2 |9 s4 C3 v- U6 v4、所有包括 A 寄存器的指令,均为单周期指令
0 P0 \- w1 q# v& T( W8 g* Z) S% L5、位操作指令中,ANL 和 ORL 是 2 周期指令$ H, X, ]# d3 i$ _5 e
6、所有包含立即地址的指令,除 INC direct 及 DEC direct 外,均为 2 周期指令
. Q# y* i3 L+ C( M: K7、剩下的均为单周期指令。如:
( I  F7 t  D% jvoiddelay(uint z)
. @- \* h0 S  H! g, ~. ^' D/ m{- m8 V* k, g: a8 m, S$ \
uinti ,j;/ `* x7 {0 B3 X4 ~, z" J
for(i = z; i> 0;i--)- A. h! V+ Y& ?2 t! j" P

& L) _/ l: g: m4 S7 F' N
4 k! a2 V* u7 h* N8 e" g1 Vfor(j =0; j < 921; j++)
- h3 }% t. b! e3 o; o}. [  C! k1 V% L' }1 C5 ~+ z7 }

- T; ^6 Q: Z" h" o$ Q  z6 n- J  K7 e
9 N. f: j+ s+ h1 ?/ T- E/ e& c分析:
, [) g0 T; S( Q3 ^, R+ l$ X& Q: p1 O1.先计算你单片机的振荡(时钟)周期 T=1/晶振(11.0592MHZ); x3 Y+ H( J/ {' N! `8 Q  d8 t- Z! m
2.一次 i--操作为 12T
" _+ P# y$ U- [4 @* p7 Z1 H& \3.忽略变量定义,上述延时函数共需时间:921*z*12T
' m/ I9 }0 _  ^, Z6 K4.带入 T:921*12*T*z 约为 z us
/ w4 e4 f! Z. D+ ~0 L" f3、计算误差出现的原因:6 X8 T5 L7 q. n/ B
1.软件仿真时,函数调用的时候入栈出栈操作的耗时。% {2 j# V% ]% Q( L: A2 ^0 p+ L
2.指令周期随指令的不同而不同导致的误差。; @3 n  n5 S4 O0 C" p4 H5 D& a
3.中断的影响。' r2 S3 v" E3 O. R
4.变量的范围超过,从而与预计时间不一样。1 e6 r* W! l0 }2 N/ @& d) r* ]

7 y/ E+ j) ]) _9 n8 d4 s. v  x
: [' \" Y* V1 K+ i0 y( I8 Rwhile(i--):如果 i 为 char 型,执行一次大概为 5us 左右;如果 i 为 int 型则执行一次大概为 10us 左右。注意:软件延时通常用于时序要求较高的编程中,其它需延时较长的地方必须采用单片机内部定时器。
& b  b+ h3 T& I7 R. w& w* C0 w' p$ @, ?7 u
二、#define与 typedef 区别
) N% g4 s! F# k1、typedef 的用法$ ^; i2 @! t; G/ y. o
/ q5 o9 V2 {% d( ^/ U0 E$ a6 ]
在 C 语言中,typedef 常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分, 但它并不实际分配内存空间,* m1 Z) V/ L( Y% D, j0 ?
如:typedef    int       INT;
: |% m/ J, V! ]+ o2 U5 I% S) w- `% O4 |# L
2、#define 的用法1 Z* f/ V( v+ m# S0 S. b/ C
#define 为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些 “表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,如:
, k4 R+ S* ^9 p/ _5 X6 x
6 Y6 S+ ]  y/ c) M7 f0 \$ p#define   INT    int. g2 c' T9 T; m' i
#define   TRUE   1
1 s' u) y& g8 d* C( @#define   Add(a,b)     ((a)+(b));' @: ~6 N( J8 a; |& b  `) U
#define   Loop_10    for (inti=0; i<10; i++)+ o; n% E& K$ Q# d! Z& H" R& A
+ }$ _# j7 s! e% U$ \" W
3、typedef 与#define 的区别
: Z$ N: z4 p3 `# s从以上的概念便也能基本清楚,typedef 只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在 C 中是为了定义常量,到了 C++,const、enum、 inline 的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与 typedef 两者到 底该用哪个好,如#define INT int 这样的语句,用 typedef 一样可以完成,用哪个好 呢?我主张用 typedef,因为在早期的许多 C 编译器中这条语句是非法的,只是现今的 编译器又做了扩充。
5 U3 U9 A; W8 g7 g& x( N& V
' }) }( u( h: e' a0 ]为了尽可能地兼容,一般都遵循#define 定义“可读”的常量以及一些宏语句的任务, 而 typedef 则常用来定义关键字、冗长的类型的别名。
# _+ @/ E0 |" t5 l
# s0 J' h1 S2 E宏定义只是简单的字符串代换(原地扩展),而 typedef 则不是原地扩展,它的新名字具 有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。请看上面第一大点 代码的第三行:typedef    (int*)  pINT;以及下面这行:#define               pINT2 int*效果相同?实则不同!实践中见差别:pINT a,b;的效果同 int *a;int *b;表示定 义了两个整型指针变量。而 pINT2 a,b;的效果同 int*a, b;表示定义了一个整型指针 变量 a 和整型变量 b。
& }* }- M+ h- t9 e
1 L5 ]8 B# M0 O( `" r& \1 t2 ^typedef 的四个用途和两个陷阱
1 N$ h' z- a& w. {用途一: 定义一种类型的别名,而不只是简单的宏替换
. r' Q* h; x' _) ~用途二: 用在旧的 C 代码中(具体多旧没有查),帮助 struct。
4 M; t2 m# R9 ?. M6 C, X5 W4 h' l: p  ^) t$ T' ?9 K, E
typedef   struct   tagPOINT! m4 ^* b: _9 g
{
; G! D/ J. v) `! Tint   x;: ^4 ~7 N' M& x( e
int   y;
  R8 _% q9 j( J. ~2 y8 U, ?5 |. ~- L}POINT;* v' G8 d+ D, T1 J5 C- |' \

/ z; r7 s: J, P3 a" XPOINT   p1;   //   这样就比原来的方式少写了一个 struct,比较省事,尤其在大量 使用的时候 或许,在 C++中,typedef 的这种用途二不是很大,但是理解了它,对掌握 以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代 码。
! S) U! d. z1 p; d# B1 h
# ^. A% B+ L5 p2 [0 H. O7 }用途三: 用 typedef 来定义与平台无关的类型。用途四:为复杂的声明定义一个新的简单的别名。! S9 J6 ?) ?, T  B
0 h* w2 Z' J0 s# T- ~
陷阱一: 记住,typedef 是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。字符串替换就行。
5 x! U1 }- [! ^
! Y' P. R0 l# y& i# R8 i0 t' o4 o+ [3 K; C- O; m* W' {
陷阱二: typedef 在语法上是一个存储类的关键字(如 auto、extern、mutable、static、 register 等一样),虽然它并不真正影响对象的存储特性,如: typedef   static   intINT2;  //不可行 编译将失败,会提示“指定了一个以上的存储类”。
2 r6 C1 O1 e* B1 w; U( U
5 A$ b6 J. G( R! _: e/ z: Q
* o: C( b6 G4 `, ?7 j  I4 l- I4 y0 K三、按键:
+ U$ c5 c/ n1 w; Q# i按键是单片机系统中最常用的器件。各种仪器仪表、家用电器操作面板上都离不开按键,是最基本的输入部件。因此,掌握按键输入电路设计、按键驱动程序设计是十分必要的。按键的分类:从单片机获取按键信号类型的角度来讲,可以分为模拟按键和数字按键;从按键与单片机IO 端口对应关系上来讲,可以分为独立按键和矩阵式按键。独立按键很简单,就是一个按键对应一个 IO 端口;而矩阵式按键则相对复杂一些,通过行与列的交叉组合成 i 行*j 列个 按键。
6 w( ]& d9 x; z/ {- N8 F
3 J4 M. G! H# F6 `" Z- E" ^) p按键的有效方式:
4 X3 U( I( e, A( T4 Y按下有效、按下松开(抬起)有效、长按 n 秒有效、连按 n 次有效、组合按键有效等。按键驱动程序设计步骤:
- n+ p- d1 u4 \8 C# ?读取键值—按键消抖—键值处理
5 f( o# {+ _7 \" `; h0 @  V% [. e4 ?8 o2 A( B: a
8 {8 Z. p$ u6 c' n
四、cror 与 crol 的区别" J2 v8 x( p+ o+ f6 ^) O0 P+ y" D4 G
循环右移与循环左移

该用户从未签到

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

该用户从未签到

3#
 楼主| 发表于 2022-5-27 14:48 | 只看该作者
很详细啊,学习学习。( N+ L( }2 p7 r9 A( h/ g$ d: q

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-14 21:25 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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