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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
9 Z1 e8 U' e6 {/ s. C5 r* }
第六讲 实验5-实验8
( ?! \; i" `: l  f知识点:
1 F# i. d# S8 @/ z2 z+ @- }# {, x+ Y1、 学会画程序流程图
( B5 H# f. j' n8 J2、 流程控制语句 if(){}else{}用法
: X6 x6 `8 O7 P3 S) ^6 e3、 操作符 ”~ ”、“!”、“&&”含义
0 ]9 Q" k& ?8 ^8 F4、 带参函数: Q8 c/ `& u, ^8 V0 i9 v, x$ D
5、 函数调用1 g0 Y5 G( H- O2 W7 h! F% J  E
6、 理解宏定义 #define “替换”作用. r! D8 X) i2 F1 _4 I3 h, G- T3 L
7、 循环语句 for 的用法
! F" r3 O+ G6 t1 v8、 库函数 unsigned char_cror_ (unsigned char, unsigned char);
# ~5 Q$ f% E# [/ Qunsigned char _crol_ (unsignedchar, unsigned char);含义
( ~& D" p" w  K* [7 {# ^/ @5 I. N  e9 V9、 C51 扩展类型 code含义  }3 T) k8 q; d* I' p
10、   流程控制语句:switchcase 用法/ B7 t( v. h4 P2 ]; ?% H  c0 M
11、   数组定义、引用方式" Q$ b1 t' i8 `* q
12、   延时函数  u3 f: j* O4 Z$ W) B; T

% q2 O% {# `4 @一、51单片机软件延时:
3 o- {+ [4 b4 {1、 几种周期介绍9 y9 [: Y5 Y8 X
  周期名称- ?5 z6 d+ q9 V  B% a' h
  
  描述
4 W- r+ {' Z& h2 P& Z" N! E  
  时间  |, H2 ]6 {7 H) ~5 v
  
  振荡
4 y) t3 p7 L% w, t$ X  
  
4 x) u! o/ e/ G) J3 I  的振荡源的周期& p* j: T) z+ a1 [1 \
  
  T=1/f
9 Y* U7 Q1 H8 M  
  状态
$ g  c. u3 R4 N- K! z  
  
6 ~; q& ?8 d3 F2 {/ c  
7 A6 v! j3 P1 @/ v! r  
  2T2 f" p5 q: r5 T8 b+ u& m; [
  
  机器
) H( d& I# b  w7 \0 ~  v$ C  
  CPU 可以完成一个独立操9 ?- h9 x# W$ n: ?" T6 c
  作所需要的周期3 l# t/ N8 X1 i
  
  12T5 f0 C/ w: J! f  a$ A/ }  D
  
  指令
# T3 W3 b5 u! f4 _  
  指 CPU 完成一条操作所需
" B3 N( J: l' I  O$ U  的全部时间
, u# }$ o6 V7 K7 l; e; j: m2 a  
  n*12T
8 [3 V2 D6 u3 v- i: ~  
2、指令:8 n. m- D  S. \4 b- H0 p( `
1、MUL、DIV:仅有的 4 周期指令: v1 k: W8 l0 j, r/ g; u6 G; j
2、包含 DPTR 和 PC 的指令均为 2 周期指令
# @" [& q3 W" P' a; S9 X3、所有的绝对跳转和条件转移指令,均为 2 周期指令
1 x0 O( P2 f' M8 A8 r: A* u4、所有包括 A 寄存器的指令,均为单周期指令% Z/ \8 U% c) Z, o$ ]
5、位操作指令中,ANL 和 ORL 是 2 周期指令+ n1 q% W/ U1 k. w3 q' m
6、所有包含立即地址的指令,除 INC direct 及 DEC direct 外,均为 2 周期指令, f3 E" P, {. ?, U5 V
7、剩下的均为单周期指令。如:% X8 B, m" [, A% q6 ?9 F+ H% ^
voiddelay(uint z)7 X! C" {( `! K; D, t
{
) D; O- a' S" Y- J# Puinti ,j;
4 ~. Y. ~$ V+ lfor(i = z; i> 0;i--)
0 E4 d1 e8 G1 \, t$ Q! I8 F* Y- u$ U
; F0 Q/ s7 v3 K" H# l
for(j =0; j < 921; j++)
8 R/ s, w: O& d% F}4 A; D1 s; Y/ _9 y" ]6 h+ k

) K8 L' [$ c) k& ?/ I1 R: Y
9 D# N1 g. i5 z分析:
0 d$ L$ s, }  D$ D1.先计算你单片机的振荡(时钟)周期 T=1/晶振(11.0592MHZ)% m& A# F$ y; n/ t
2.一次 i--操作为 12T
3 e( D( f& E7 o5 f! x3.忽略变量定义,上述延时函数共需时间:921*z*12T
8 k2 s9 R/ ^5 H0 ~/ V! O6 T6 g4.带入 T:921*12*T*z 约为 z us& x$ c4 k& l. k; \
3、计算误差出现的原因:8 B- R: d% r& U. }+ {
1.软件仿真时,函数调用的时候入栈出栈操作的耗时。
  o, d3 t0 t% _  R& [5 ^7 J7 g2.指令周期随指令的不同而不同导致的误差。0 [/ |$ {1 H0 Y( S
3.中断的影响。1 w# U4 V. \, f4 E  v, V
4.变量的范围超过,从而与预计时间不一样。/ j: L5 b, k7 e; ^! ~/ K

  Q- j/ O9 H/ J" U& f
% c0 B. y7 z$ M7 I" xwhile(i--):如果 i 为 char 型,执行一次大概为 5us 左右;如果 i 为 int 型则执行一次大概为 10us 左右。注意:软件延时通常用于时序要求较高的编程中,其它需延时较长的地方必须采用单片机内部定时器。8 \8 V% C( H7 a$ [. y0 k

* w1 l* I) r' k& v8 {二、#define与 typedef 区别
8 m: W' x2 j5 e- d1、typedef 的用法/ K  k  h) Z3 M+ }: D9 y1 d
) x4 s$ `/ X. I/ Q
在 C 语言中,typedef 常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分, 但它并不实际分配内存空间,8 I7 K+ g. l; W' F# X' @& c* O8 v
如:typedef    int       INT;% E) B- ]& Y) |( I/ u2 F

5 q$ Y8 \( x. y# j) d2、#define 的用法
0 Z0 h. R9 u* b$ P, D#define 为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些 “表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,如:
- Z2 b! {4 _" ~9 T: X* P' M0 X1 ~; [+ O4 ^  I
#define   INT    int
( _5 k+ w. H" q/ O8 F) z#define   TRUE   1
; s% P7 ]2 F3 U/ r, X* t' u$ z#define   Add(a,b)     ((a)+(b));; j6 t: R$ ]. v; }; c1 [
#define   Loop_10    for (inti=0; i<10; i++)
  M5 r, q+ g1 O5 e
% S9 F3 l( V$ @0 v' `* B3 w* i3、typedef 与#define 的区别
+ ]& z7 c  p# Y9 f* f" F! g! s从以上的概念便也能基本清楚,typedef 只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在 C 中是为了定义常量,到了 C++,const、enum、 inline 的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与 typedef 两者到 底该用哪个好,如#define INT int 这样的语句,用 typedef 一样可以完成,用哪个好 呢?我主张用 typedef,因为在早期的许多 C 编译器中这条语句是非法的,只是现今的 编译器又做了扩充。! o, S* u; l8 W+ F3 w

; d2 ~5 Z* J/ x: s为了尽可能地兼容,一般都遵循#define 定义“可读”的常量以及一些宏语句的任务, 而 typedef 则常用来定义关键字、冗长的类型的别名。( y) N, `2 j9 a1 Y
9 Y. D  C& `! t$ M1 N* ]6 l+ R
宏定义只是简单的字符串代换(原地扩展),而 typedef 则不是原地扩展,它的新名字具 有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。请看上面第一大点 代码的第三行:typedef    (int*)  pINT;以及下面这行:#define               pINT2 int*效果相同?实则不同!实践中见差别:pINT a,b;的效果同 int *a;int *b;表示定 义了两个整型指针变量。而 pINT2 a,b;的效果同 int*a, b;表示定义了一个整型指针 变量 a 和整型变量 b。
/ m( I: P* Y- d
) h1 I9 x) H1 atypedef 的四个用途和两个陷阱
$ H; g. E" f7 x+ J! p" d1 h3 e用途一: 定义一种类型的别名,而不只是简单的宏替换
! v0 A9 G0 P( M5 {- _* j% F) P用途二: 用在旧的 C 代码中(具体多旧没有查),帮助 struct。; }" j$ B/ s* J$ Y4 c
% ]; B( n0 ^. Q, g2 h( o" _
typedef   struct   tagPOINT
/ W& L! g; _+ i# ]0 F+ l{' g9 f; W- y: @* y, R+ `4 o
int   x;" q9 W! o' s! O. H
int   y;: a2 p% q$ r" q, v' t
}POINT;
: E2 w* ~! L) @0 w
/ J. N) j) f2 D0 E$ H2 |POINT   p1;   //   这样就比原来的方式少写了一个 struct,比较省事,尤其在大量 使用的时候 或许,在 C++中,typedef 的这种用途二不是很大,但是理解了它,对掌握 以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代 码。
* d1 j6 U" E# l3 L' d% y. T& r! l, j: r
用途三: 用 typedef 来定义与平台无关的类型。用途四:为复杂的声明定义一个新的简单的别名。5 L) ^( J; M) {8 I

2 T3 [; |5 `0 N) G陷阱一: 记住,typedef 是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。字符串替换就行。
# V' Y/ H) ~" I4 l: s9 H% Q# @. V. O5 [$ D, ?" J4 `9 R

/ m3 N; l6 m$ J" W8 s3 k2 D6 d陷阱二: typedef 在语法上是一个存储类的关键字(如 auto、extern、mutable、static、 register 等一样),虽然它并不真正影响对象的存储特性,如: typedef   static   intINT2;  //不可行 编译将失败,会提示“指定了一个以上的存储类”。
7 C% h, R4 T3 [) r+ w( p( g! ^3 k! Q$ y5 \: T. J; Z' ?' B
0 j- ~/ u. _4 d- H3 s
三、按键:! i5 o( J7 x% \: d
按键是单片机系统中最常用的器件。各种仪器仪表、家用电器操作面板上都离不开按键,是最基本的输入部件。因此,掌握按键输入电路设计、按键驱动程序设计是十分必要的。按键的分类:从单片机获取按键信号类型的角度来讲,可以分为模拟按键和数字按键;从按键与单片机IO 端口对应关系上来讲,可以分为独立按键和矩阵式按键。独立按键很简单,就是一个按键对应一个 IO 端口;而矩阵式按键则相对复杂一些,通过行与列的交叉组合成 i 行*j 列个 按键。
) y$ E: ~& z6 U7 D- X) v1 \" ?4 R! z4 d5 l; |8 B, P
按键的有效方式:! w5 v7 ^* t9 N4 ~$ g% d4 F; K$ D
按下有效、按下松开(抬起)有效、长按 n 秒有效、连按 n 次有效、组合按键有效等。按键驱动程序设计步骤:
: z2 t& H) c& s" l读取键值—按键消抖—键值处理
# i' r: r" F. r! n4 T: k8 @) \  {! M8 ]
9 O, |! s3 Z. h  \  K8 ?# i
四、cror 与 crol 的区别/ z# E" q4 S6 t( @; n" @% S5 ~
循环右移与循环左移

该用户从未签到

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

该用户从未签到

3#
 楼主| 发表于 2022-5-27 14:48 | 只看该作者
很详细啊,学习学习。( I3 L) K2 s3 r

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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