手把手教你学单片机的C语言程序设计(十二)——中断服务函数.pdf_第1页
手把手教你学单片机的C语言程序设计(十二)——中断服务函数.pdf_第2页
手把手教你学单片机的C语言程序设计(十二)——中断服务函数.pdf_第3页
手把手教你学单片机的C语言程序设计(十二)——中断服务函数.pdf_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

手把手教你 C5 1编译 器支持在 C语言源程序 中直接编 写 8 0 C 5 1 单片机的 中断服务 函数程序 。 以前 菝们 学习用汇 编语言编 写中断服务程序时 会对堆栈 出栈 的保 护 问题而觉得头痛 。为了能够在 C语 言源程序 中直 接编 写中 断服务 函数 C5 1编 译 器对 函 数的 定义 进 行 了扩 展 增加 了一个扩展关键字 in t e r r u p t 。 关键 字 In 1 e r r u p t 是函数定 义时的一个 选项 加上这个选项就可 以将一个 函数 定义成 中断服务 函数。 定 义中断服务 函 数的一般形式 为 中断潭 中断 向量 8 n + 3 讣部 : 扣断 o c c o 3 H 定 时器 计 数器 0 0 0 0 BH 外部 巾断 1 O 01 3 H 定时器 ,计数器 0 01 8H 函数 类型函数名( 形式 参数表 ) 【i n e r r u p t n JI u s in g n J 关键 字 i n t e r r u p t 后面的 n是 中断 号 n的取值 范 围为 0 3 1 编译 器从 8 n + 3处产生中断向量具体 的中断号 n和 中断 向量 取决于 不同的单 片机 芯 片:8 o c 5 1 单 片机的常 用中断源 和中 断向量如表 1 所示 8 0 C 5 1系 列单 片机 可 以 在 内部 R A M 中使用 4个 不 同的工 作寄 存器 组 每 个寄存器 组中包含 8个工作寄存 器( R 0 R 7)。 C5 1编译器扩展了一个关 键宇 u s in g 专 门用来选择 8 0 C 5 1单片 机 中不同的工作寄存器组。u s in g后面 的 n是一个 0 3的常整数, 分别选中 4 个不同的工作寄存器组。在定义一个函 数时 u s in g是一个选项 对于初学者 。 如果不用该选项 则 由编译器选择 一个 寄存器组作绝 对寄存器组访问。 关键 字 u s in g对 函数 目标 代码 的 影响如下 : 在函数的 八口处将 当前工作 寄存 器组保护 到堆栈 中 指定的工作寄存器 内容不会 改变 , 函数返 回之前将被保护 的工作寄存器蛆从堆栈 中恢 复。 使 用关键 字 u s in g在函数 中确 定 一 个工作 寄存器组 时必 须十 分小心 要 保证 任何寄存器 组的切换 鄯只在控 制 的区域 内发生 。 如果不做到这一点将 产 生不正确 的函数结果 。 另外 带 u s i n g属 性的 函数 原 则 上不能返 回 b it 类型的值。并且 关键 宇 u s in g不允许 用于 外部 函数 关键 宇 i n te rr u p t 也不允许用于外部 函数 , 它对 中断 函数 目标代码 的影 响如 下: 在进入 中断函数 时 特殊功能寄存 器 A C C、 B 、 D P H、 D P L 、 P S W 将 教保 存 八栈 。如 果不使 用寄存组切 换 则将 中 断函数中所 用到的全部工 作寄存器 都 人栈 。函数返 回之 前 所有 的寄存器 内 容 出栈。中断函数 由8 0 C 5 1 单片机 指 令 R E T I 结束。 值得 注意 的是 。编写 8 0 C 5 1 单 片 机 中断函数时应 严格遵 循以下规则: 1中断函数不能进行参数传 递 如 果中断函数 中包含任何参 数声 明都 将 导致 编译 出错 。 2中断函数没有返回值 如果企 图 定 义一个 返回值将 得到不正确的结果 因此最好在定 义中断 函数 时将奠定 义 为 v o id类型 以明确说 明没有返 回值。 3 在任何情 况下都不能直接调 用 中断函数 否 则会 产生 编译错误 。因为 中断函数的返回是 由8 0 C 5 1 单 片机 指 令 R E T I 完成的 R E T I 指令影响 8 0 0 5 1 单片机 的硬件 中断系统 。 4如 果中断函数中用到浮点 运算 必须保 存浮点寄存器 的状态 当没有其 他程序执 行浮点运 算时可以不保 存 5 如果在 中断函数中调用 了其他 函数 则被调 用函数所 使用的寄存器蛆 须与中断函数相 同。 用户必须保证 按 要求使用相同的寄存器 组 否则会产 生 吕超 亚 不正确 的结 果。 如果定义中断函数时没 有使 用 u s i n g选项 , 则 由编译器 选择一 个 寄存器 组作绝对寄存器组访问。 下面做 一下有关中断的实验。 实验一 在 L E D 1 6 2字 符 液晶 试 验板 上 做 一个键控计数的实验。 采用中断方法 实现 按动 7 # 、 错 、 键 中 的任一 个 时, 触发外中断 O , 实现计数或停止 。 在我的文档 中建 立一 个文件 目录 f c s 2 9 ) 然后建 立 c s 2 9 u v 2的工程 项 目, 最后建立源程序文件( c s 2 9e 】 。 输入 下面的程 序: #i n clu defl序号 【 下同 】 : 1 # de f i n e u c h a r u n s i g n e d c h a r 2 #d e f i n e u in t u n s i g n e d i n t 3 u o h a r c o d e S E G 7 【 1 0 】= 0 x c O 0 x f 9 0 x a 4 O x b 0 0 x 9 9 0 姻2 0x 8 2 0 x f 8 0 x S O 0 x g O ; 批 。 。 。 5 。 。 u i n t d a t a c n t ; 6 b i t b d a t a bi t f l a g ; fi7 。 8 。 v o i d i n i t ( v o i d ) 9 P O = O x ff ; P1 = 0 x f f ; P2 =0 , P 3 = 0 x O f 1 0 b r f l a g =l ffl 1 E X 0 =1 2 I T O =1 1 3 E A= t : 1 4 1 5 广 1 6 , v o i d d e t a y ( u i n t k ) 1 7 【 fll 8 u i n d a e aI J 1 9 f o l = O 1 9 9 9 ) c n t = 0 ; 3 1 P 2 = S E G7 c n t 1 0 0 ; 3 2 P 1 = S E G7 ( c n t 1 0 0 ) 1 0 ; 3 3 P 0 = S E G7 c n t 1 0 ; 3 4 d e la y ( 5 0 0 ) ; 3 5 3 6 、| |3 3 8 v oid ex t e r ni n t 0 ( v o i d ) i n t e r r u p t 0 u s i n g 0 3 9 4 0 b it f Ia g = ! b it f I a g : 4 1 | | 4 2 编译 通过后 ,将 生成的 c s 2 9 h e x 文 件烧录到 8 9 S 5 1芯片 中 ,将芯片插 入到 L E D 1 6 2字符液晶试验板上 , 试 验板上接通 9 V电源 , 右边 3个 L E D数 码管从 。 0 0 0 “ 开始进行加法计数。按动 7 # 、 8 # 、 三个键中的一个时。计数暂 停。再按动时, 计数继续。 我们对程序进行分析。 序号 1( 程序 解释 ,以下 同 ) :包含 头文件 RE G51 H。 序号 2 、 3: 数据类型的宏定义。 序号 4: 数码管 O 9的字形码 。 序号 5: 程 序分 隔。 序号 6: 定义无符 号整型全局 变量 c n t 。 序号 7 : 定 义全局位标 志 b it f l a g 。 序号 8 : 程序分 隔。 序号 9 : 定义 函数名 为 i n i t 的初始化子函数。 序号 1 0: in it 子函数开始 。P 0 一 P 3口分别赋 初值 。 序号 1 1 : b it f la g赋 初值为 1 。 序号 1 2: 允许外中断 O 。 序号 1 3: 外中断 O设为边沿触发。 序号 1 4: 开 C P U中断。 序号 1 5: in it 函数结束 。 序号 1 6 : 程 序分 隔。 序号 1 7 2 4: 定义函数名为 d e l a y的延时子 函数。 序号 2 5: 程 序分 隔。 序号 2 6 : 定 义函数名 为 ma i n的主 函数 。 序号 2 7 : ma in主 函数开始 。 调用 i n it 初始化 子函数。 序号 2 8 : 无限循环 。 序号 2 9 : 无限循环语 句开始 。 序号 3 0 ;如果位标志 b it f la g为 1 ,则变量 、 c n t 累加 。 序号 3 1 : 变量 c n t 的范围为 0 9 9 9 。 序号 3 2 : 显示计数值 c n t 的百位。 序号 3 3 : 显示计数值 c n t 的十位。 序号 3 4 : 显示计数值 c n t 的个位。 序号 3 5: 延时 5 0 0 ms 。 序号 3 6 : 无限循环语句结束。 序号 3 7 : ma i n主 函数结束。 序号 3 8 : 程序分隔。 序号 3 9:定义函数名为 e x t e r n in t O的外 中 断 O服 务函数, 使 用第一组寄存器。 序号 4 O: 外 中断 O服务 函数开始。 序号 41 : 这里 的工作 为取 反位标志 b i t f la g。 当然也可进行其它操作。 序号 4 2 : 外 中断 O服务 函数结束。 一 =j 亳 羹 =j 亳 参 ;实 验 童 参 在 L E D 1 6 2字符 液晶试验板上 做一 个定 时中断 的实验 。采用定 时器 T O , 定时长度设 为 5 0 ms , 每一次定时 溢 出时引起定 时器 中断 , 在 中断服务 函 数中对计时器 c n t 累加。 每 1 秒中控制 L E D亮 0 1 s 、 灭0 9 S 。 完成一个低功耗 的路障灯工作。 在我的文档 中建立一个文件 目录 ( c s 3 0 ) , 然后 建立 c s 3 0 u v 2的工 程项 目, 最后建立源程序文件( c s 3 0 c o 输入下面的程序: # in c l u d e ff序号( 以下同 ) : 1 # d e f i n e u c h a r u n s ig n e d c h a r 2 # d e f i n e u i n t u n s i g n e d in t 3 4 u c h a r d a t a c n t ; 5 s b it L A MP =P O O : 7 “” 8 ” “” “ v o i d i n i t ( v o i d ) 9 1 0 T MOD= 0 x 0 1 : 1 1 T H0 =一 ( 5 O O 0 0 2 5 6 ) ; 1 2 T L 0 = - ( 5 0 0 0 0 2 5 6 ) ; 1 3 E T 0 = 1 : 1 4 T R 0 =1 : 1 5 E A=1 : 1 6 l , 1 7 “” “ 1 8 “ ”“ v o i d d e l a y ( u i n t k ) 1 9 2 0 u I n t da t aj ,j : 2 1 f o r ( i = O : i = 2 0 ) c n t = 0 ; 3 5 3 6 3 7 “ v o id ma in ( v o i d ) 3 8 3 9 i n i t 0; 4 0 wh i le ( 1 ) 4 1 4 2 d e la y ( 3 0 0 0 ) ; 4 3 4 4 4 5 编译 通过后 。将生成 的 C S 3 0 h e x 文件 烧录到 8 9 S 5 1芯片 中 ,将 芯片插 入到 L E D 1 6 2字符液晶试验板上, 试 验板 上接通 9 V电源 , 右边 的个位 数码 管的a段周期性地闪亮, 亮的时间约为 0 1 秒 , 灭的时间约为0 9 秒。 在夜晚用 于路障灯指示很合适, 况且灯光不是连 续点亮, 耗电也较省。 对程序进行一下分析。 序号 1( 程序解 释 ,以下同 ) :包含 头文件 REG51 H。 序号 2 、 3: 数据类型的宏定义。 序号 4 : 程序分隔 。 序号 5 : 定义无符号整型全局变量 c n t 。 序号 6 : 程序分隔。 序号 7 : 端 口定义。 序号 8 : 程序分隔。 序号 9 : 定义 函数名为 i n it 的初始化 子函数 。 序号 1 0 : in i t 子 函数开始 。 序号 1 1 : 定时器 T 0方式 O 。 序号 1 2 1 3 : 当晶振频率 为 1 2 MH z时, 定时 初 值 为 5 0 ms 。 实 验 板 的 晶 振 频 率 为 1 1 O 5 9 2 MH z。 因此定 时长 度近似 为 5 0 ms 。 序号 1 4 : 允许 T O中断。 序号 1 5 : 启动 T 0 。 序号 1 6: 开总 中断。 序号 1 7 : i n i t 函数结束。 圈露嬲 嘲 维普资讯 序号 1 8 : 程序分 隔。 序号 1 9 2 6: 定 义函数名为 d e la y的延 时子 函数。 序号 2 7 : 程序分隔。 序号 2 8 : 定义 函数名 为 t i me r 0的 T O中断服 务函数 。 使用默认的寄存器组 。 序号 2 9 : t ime r O中断服务函数开始。 序号 3 O 3 1 : 重装 5 0 ms 定 时初值 。 序号 3 2 : 计 时器 c n t 递增。 序号3 3 : c n t 的值小于等于 2 ( 因每 5 0 m s中 断一次, 因此对应 时间为 0 0 1 s ) , 点亮灯。 序号 3 4: 否则熄灭灯 。 序 号 3 5 : c n t 的值最 大到 2 O ( 对应 时间 为 1 s) 。 然后又从 0开始。 序号 3 6 : T 0中断服务函数结束。 序号 3 7 : 程序分隔。 序号 3 8 : 定义 函数名 为 ma in的主函数。 序号 3 9 : ma i n主 函数开始 。 序号 4 0 : 调 用 i n i t 初始化子函数。 序号 4 1 : 无限循环。 序号 4 2 : 无限循环语句开始。 序号 4 3 : 调用延时 3 s子 函数。实际上 CP U 还可做 其它事情 。 序号 4 4 : 无限循环语句结束。 序号 4 5 : ma i n主 函数结束。 _ 实验三 0 疆 在 L E D 1 2 8 6 4图形 液 晶试 验 板 上 。 进 行单 片机与 P C机 ( 个人 电脑 ) 的 通信试验。实验过程为: P C机发送一 个字符给单片机 ,单片机收到后即在 个、 十位数码管上进行显示 。 同时将其 回发给 P C机。要求:单片机收到 P C 机发来的信号后用串口中断方式处理, 而单片机回发给 P C机时用查询方式。 在我 的 文档 中建 立一 个 文 件 目录 ( c s 3 1 ) , 然 后建 立 c s 3 1 u v 2的工程 项 目, 最后建立源程序文件( c s 3 1 c o 输入下面 的程序 : # in c l u d e 序号( 以下同 ) : 1 # d e f i n e u c h a r u n s i g n e d c h a r 2 # d e f i n e u i n t u n s ig n e d in t 3 u c h a r c o d e S E G7 1 O 】 = 0 x 3 f , 0 x 0 6 , 0 x 5 b , 0 x 4 f , 0 x 6 6 ,O x 6 d,0 x 7 d , 0 x 0 7 , 0 x 7 f , 0 x 6 f ; 4 u c h a r AC T 4 = 0 x e f , 0 x d f , 0 x b f ,0 x 7 f ; 5 6 u c h a r a : 7 “8 “ v o id in it ( v o id ) 9 f 1 0 T MOD = 0 x 2 0 ; 1 1 T H1 = 0 x f d ; 1 2 T L 1 = 0 x f d ; 1 3 S CON= 0 x 5 0 ; 1 4 T R1 =1 : 1 5 E S =1 : 1 6 E A= I : 1 7 1 8 1 9 v o id d e la y ( u in t k ) 2 0 f 2 1 u in t d a t ai , j : 2 2 f o r ( I_ O : j k : i+ ) 2 3 f 2 4 f o r ( j = 0 ; j l 2 1 : j + + ) : 2 5 ) 2 6 2 7 2 8 v o id ma i n ( v o i d ) 2 9 3 0 i n i t O; 3 1 wh i le ( 1 ) 3 2 f 3 3 P 0 = SE G7 a J 1 O 】 : 3 4 P 2 = AC T 1 】 : 3 5 d e l a y ( 1 ) : 3 6 P 0 = SE G7 a 1 0 ; 3 7 P 2 = AC T 0 ; 3 8 d e la y ( 1 ) : 3 9 i f ( R I ) 4 0 R I = O ; 4 1 S B UF = a ; 4 2 wh i le ( ! T I ) : 4 3 T I = 0 ; 4 4 E A =I : 4 5 4 6 4 7 4 8 v o i d s er i a l s e r v e ( v o i d ) i n t e r r u p t 4 4 9 5 0 a =S B UF ; 5 1 EA=0;| | 5 2 5 3 编译通过 后 。将生成 的 c s 3 1 h e x 文件烧录 到 8 9 S 5 1 芯 片中 ,将芯 片插 入到 L E D 1 2 8 64 图形液 晶试验板 上 。 在做实验时, 我们需要在 P C机进行信 息发 送 。这个过 程可 以自 己用 V B 6 0 设计 一 个 人机 界 面 ,也 可 以使 用 Wi n d o ws自带的超级 终端 ,还 有一种 方法 是上 网下载一 个小巧 的 串 口调 试 软件 。这里笔者使用的是一个名 叫 COMP o r t D e b u g e r ( 串 口调试器 软件 ) 的免安 装 共享 软件 ,其下 载 地址 为 : h t t p: e mo u z e c o rn。 打 开 串 口调 试器 软 件 。 其 界面 如 图 1所示 。右 上 方 为发送 区 。 右下 方 为接收区。左上方的初始化区域( 如 波特率、 数据位等 ) 不必更改。若你 的 P C机串口COM1已占用时。才可考 虑 改用COM2 。 - I _ 一 1 ” ; 茹 篡 一 ; 将 P C 机 的 串 口与 L E D 1 2 8 * 6 4 图形液晶试验板 的串口连接好 。 发送与 接收按 1 6进制 方式 ,然后打 开 串口。 实验 时。 要先给 L E D 1 2 8 * 6 4图形 液晶 试验板上电( 5 V稳压电源 ) , 然后才打 开串 口调试器软件 。 以免接收区乱码 。 发送区输入 “ 1 ” 。 点发送 。 我 们发现 L E D 1 2 8 6 4图形液 晶试验 板的右边两 个数码管显示“ 0 1 ” , 同时接收区立即 显示收到的“ 1 ” 。发送 区输入 “ A ” 。 点发 送, 我们发现试验板的右边两个数码管 显示 “ 1 0 ” ( 因为 1 6进 制 的 “ A” 等 同于 1 0进制的“ 1 O ” ) 。 同时接收 区立即显示 收到 的“ A ” 。发送 区再 输入 “ 2 0 ” 。 点发 送 , 我们 发现 L E D 1 2 8 6 4图形液 晶试 验板的右边两个数码管显示 “ 3 2 ” ( 因 为 1 6进制的 “ 2 0 ”等同于 1 0进制的 “ 3 2 ” ) ,同 时接 收 区立 即 显 示收 到 的 “ 2 0 ” , 其界面如图 2所示。 一 一 “ 一 一 维普资讯 园 屯 子 仪表放大器的设计与制作 -k-k- 本仪表 放大器是 由三个 OA 2 7 P 集成运算放大器组成 , OA 2 7 P的特点 是低噪 声 、 高 速 、 低输 入失调 电压 和 卓 越的共模抑制比。 仪表放大器电路连接 成比例运算电路形式, 其中前两个运放 组成第一级 ,二者都接成同相输入形 式 , 因此具有很高的输入 电阻。 由于 电 路的结构 对称 , 它们 的漂移和失调都有 互相 抵消的作 用。 后一个运放组成 差分 放 大器 ,将差分输入转换 为单端输 出。 经计算 , 本设计中仪表放大器的电压放 大倍数 A u :。R 5 。 ( 1 + ) :1 0 0, 结果 n o n 将在仿真 中验 证。 仪 表 放 大器 的结 构 特 点 : 使 仪 表 放大 器成 为 一种 高输 入 电阻 , 高 共模 抑制 比, 具有较低的失调 电压 , 失调 福建信息职业技术学院陈辉 电流 、 噪声 及飘 移 的放 大 器 。在 使 用 时 ,在 图 1中 R 4 、 R 5 、 R 6 、 R 7四个 电 阻要精密且匹配 , 否则将给放大倍数 带来误差 , 而且将降低电路的共模抑 制 比。 R 8 1 M 2 3 1 R 7 2 k R 1 9 k 冀 一 4 域 。 激 本设计采用 P r o t e 19 9 s e电路仿真 软件 , 绘制 电原理 图后可 自动 生成印制 3 R 3 1 k 2 3 1 U 2 O P 27 A R2 9 k R 6 1 0 k c 3兰 47 u F C 4 = 47 u F 司j = C 1 0 1 u F G N D C 2 0 1 F 1 3 U 4 L M 7 8 1 2C T U 5 L M 7 91 2 C T G N D I 1 2 V vi n 实验很成 功 , 我们对程序进行详细 序号 3 1 : 调用 in it 初始化子函数。 序号 5 3 : s e r ia l S e r v e中断服务函数结束。 分析。 序号3 2 : 无限循环。配文优惠邮购: K e i 1 C 5 1 W i n d o w s 序号 1( 程序解释。以下同) :包含头文件 序号 3 3 : 无限循环语句开始。 集成开发环境 ( 已汉化正式版 光盘, 邮 R E G 5 1 H 。 序号 3 4 3 5 : 显示变量 a的十位。 购代号 : K 1 ) : 4 6元 。T O P 8 5 1多功 能编程 f - g - 2 , 3 : 数据类型的宏定义。 f -g - 3 6 : 延时 1 m s 。 器( 邮购代号: B 1 ) : 2 2 0元 。L E D 1 2 8 6 4 序号 4 : 0 - 9数码管的字形码。 序号 3 7 3 8 : 显示变量 a的个位。 图形 液 晶试验板( 邮购代 号 : S 3 ) : 1 6 0 序号 5: 4位数码管的位 选码。 序号 3 9: 延时 l ms o 元 。L E D 1 6 。 2字符 液晶试验 板( 邮购代 -8- 6 :程 序 分 隔 。 三 4 O 如 果 接 收 标 志 为 1 说 明 已 收 号 : s 2 ) : 1 4 0 元 。 1 6 。 2 字 符 型 液 三 : 墨 符 号 字 符 型 全 局 变 量 a 。 。 + 一 模 组 ( 邮 购 代 号 : L 1 ) : 8 0U TLa 1 Z S * O q- , 茎 : 雯 要 为 i n i t 的初始化子函数。 4 4 2 : 存放在 a的信息再 c 邮购代 号: z , : 序号 9 :定义函数名为 的初始化子函数。 序号 将已经接收并存放在 的信息再 。卞田 土 阴 、 。无 了。 “ 。 序号 1 O : I n It 子函数开始。 送入 s 8 u F发送出去。 1 6 0 元 。5 V高稳 定专用稳 压 电源(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论