定时器计数器和串行通信.ppt_第1页
定时器计数器和串行通信.ppt_第2页
定时器计数器和串行通信.ppt_第3页
定时器计数器和串行通信.ppt_第4页
定时器计数器和串行通信.ppt_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

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

文档简介

第6章定时器 计数器和串行通信 6 1定时器 计数器的结构及工作原理6 2定时器 计数器的应用6 3串行口的结构及工作方式6 4串行口的应用6 5RS 232C串行通信接口 6 1定时器 计数器的结构及工作原理 MCS 51单片机内部有两个16位的可编程的定时器 计数器 称为定时器0 定时器1 分别用T0 T1表示 它们均可独立编程 具有四种工作方式 6 1 1定时器 计数器的结构 6 1 1定时器 计数器的结构 6 1 1定时器 计数器的结构 在作定时器使用时 是对内部的机器周期进行计数 每个机器周期包含12个振荡周期 即定时器的输入脉冲是对外部晶振进行12分频后得到的 例如 外部晶振频率为12MHz 则定时器的输入时钟脉冲频率为1MHz 即每隔1us接收到一个脉冲 计数值加1 所以 实际上是通过对机器周期的计数实现计算时间的功能 当定时器用作为外部事件计数时 是对引脚T0或T1上外部输入的负脉冲信号做加法计数 将外部输入信号接到T0 P3 4 或T1 P3 5 引脚 当检测到的电平由高跳变到低时 计数器就加1 因此 为了确保得到可靠的采样值 需要2个机器周期来识别一个从 1 到 0 的跳变 这就要求外部计数脉冲的高电平与低电平保持时间至少为一个完整的机器周期 所以最高计数频率为晶振频率的1 24 6 1 1定时器 计数器的结构 不管是定时还是计数 T0或T1在对内部时钟或外部事件计数时都不占用CPU时间 只有定时器 计数器产生溢出时 才会向CPU发出中断请求 CPU也可重新设置定时器 计数器的工作方式和计数初值 以改变定时器的操作 设计数的最大值为M 所需的计数值为N 则初值X的计算方法如下 计数状态 X M N 定时状态 X M 定时时间 T 其中 T 12 晶振频率 6 1 1定时器 计数器的结构 6 1 2工作方式和控制寄存器 1 工作方式寄存器TMOD寄存器TMOD是可编程的特殊功能寄存器 字节地址为89H 不可位寻址 其中低4位控制T0 高4位控制T1 GATE 控制方式选择位 用来控制定时器启动操作方式 当GATE 0时 只能由软件控制TR0或TR1位来控制定时器的启停 TRi i 0 1 位为1 定时器启动 TRi i 0 1 为0时 定时器停止工作 当GATE 1时 定时器的启动要由外部中断引脚和TRi i 0 1 位共同控制 只有当外部中断引脚为高时 TRi i 0 1 置1才能启动定时器工作 6 1 2工作方式和控制寄存器 C T 计数 定时方式选择位 当C T 0时设置为定时器工作方式 当C T 1时设置为计数器工作方式 M1 M0 工作方式控制位 对应于4种工作方式 例要设定T1为定时器 方式2 T0为计数器 方式1 并由内部TRi控制启停 则TMOD 25H 可用下面指令赋值 MOVTMOD 25H 6 1 2工作方式和控制寄存器 2 控制寄存器TCONTCON字节地址为88H 位地址为88H 8FH TF1和TF0 定时器T1和定时器T0的溢出标志位 TR1和TR0 定时器T1和定时器T0的启动控制位 IE1和IE0 外部中断INT1和外部中断INT0的中断请求标志位 IT1和IT0 外部中断INT1和外部中断INT0的触发方式选择位 TCON中低4位是与外部中断有关的位 高4位为定时器控制位 对T0的启 停控制可以通过以下位操作指令完成 SETBTR0 启动T0计数CLRTR0 停止T0计数 6 1 3定时器 计数器的工作方式 1 工作方式0TMOD中M1M0 00时 定时 计数器被选为工作方式0 计数器长度为13位 由TLi i 0 1 的低5位 TL的高3位未用 和THi i 0 1 的8位构成13位计数器 对T0 T1都适用 当C T 0为定时方式时 T0对机器周期进行计数 设定时时间为t 则计数初值例6 1设T0工作方式0 定时时间t 1ms fosc 12MHz 计算T0的计数初值 7192 1110000011000B E0H18H高8位低5位TH0计数初值为E0H TL0计数初值为18H 6 1 3定时器 计数器的工作方式 6 1 3定时器 计数器的工作方式 当C T 1为计数方式时 外部计数脉冲由T0引脚输入 当外部信号电平发生由1至0的跳变时 计数器加1 6 1 3定时器 计数器的工作方式 2 工作方式1TMOD中M1M0 01时 定时 计数器设定为工作方式1 工作方式1是16位定时 计数器 其结构和工作过程几乎与方式0完全相同 唯一的区别是计数器的长度为16位 设定时时间为t 则计数初值X为 6 1 3定时器 计数器的工作方式 3 工作方式2方式2为能自动重装初值的8位计数器 6 1 3定时器 计数器的工作方式 3 工作方式2方式2优点 省去了由软件重新赋初值的麻烦 所以它常用于定时控制或串行口的波特率发生器 方式2缺点 定时 计数长度短 设定时时间为t 则计数初值X为 6 1 3定时器 计数器的工作方式 工作方式3只适用定时器T0 而T1无此工作方式 若将T1设置为方式3 相当于TR1 0 T1停止工作 此时 T0被拆成两个独立的8位计数器TH0和TL0 6 1 3定时器 计数器的工作方式 其中TL0使用原来T0的一些控制位和引脚 他们是C T GATE TR0 TF0和T0 P3 4 引脚及 P3 2 引脚 此方式下的TL0作为8位计数器 其功能和方式0 方式1一样 可以实现定时和计数两种功能 只不过是一个8位的计数器 而TH0只能完成定时功能 对机器周期进行计数 它借用原定时器T1的控制位TR1和溢出标志位TF1 同时占用了T1的中断请求信号 工作方式3为定时器T0增加了一个8位的定时器 此时的T1仍可以设置为工作方式0 1 2 用在任何不需要中断的场合 T0工作于模式3时 T1一般用作串行口波特率发生器 6 2定时器 计数器的应用 1 工作方式0的应用例6 2设单片机晶振频率fosc 6MHz 使用定时器T1以方式0产生周期为600 s的等宽方波脉冲 并由P1 7输出 以查询方式完成 1 计数初值 欲产生周期为600 s的等宽方波脉冲 只需在P1 7端交替输出300 s的高低电平即可 应此定时时间为300 s 设待求计数初值为N 则将低5位0AH写入TL1 将高8位FBH写入TH1中 6 2定时器 计数器的应用 2 工作方式寄存器TMOD初始化因定时 计数器1为工作方式0 所以应使M1M0 00 为实现定时功能应使当C T 0 为实现定时器的软件控制启动应使GATE 0 因此控制寄存器TMOD 00H 3 TR1 1为启动 TR1 0为停止 程序如下 ORG0000HLJMPSTARTORG0030HSTART MOVTCON 00H 清TCONMOVTMOD 00H 工作方式设定MOVTH1 0FBH 计数初值设定MOVTL1 0AHMOVIE 00H 关中断SETBTR1 启动定时器LOOP0 JBCTF1 LOOP1 查询是否溢出SJMPLOOP0LOOP1 MOVTH1 0FBH 重新设值MOVTL1 0AHCPLP1 7 输出取反SJMPLOOP0END 法2 采用中断方式ORG0000H LJMPSTARTORG001BH LJMPT1INTORG0100H START MOVSP 30HMOVTCON 00HMOVTMOD 00HMOVTH1 0FBHMOVTL1 0AH SETBTR1SETBET1SETBEAMAIN AJMPMAINT1INT MOVTH1 0FBHMOVTL1 0AHCPLP1 7RETI 6 2定时器 计数器的应用 2 工作方式1的应用例6 3设单片机晶振频率fosc 12MHz 使用定时器T0以方式1产生周期为3ms 占空比为1 2的脉冲波 并由P1 7输出 以查询方式完成 1 计数初值 欲产生周期为3ms 占空比为2 3的脉冲波 可设定定时时间为1ms 在程序中加入P1 7口的状态判断 当P1 7为高电平时 需溢出两次才对端口取反 设待求计数初值为N 则将低8位18H写入TL0 将高8位FCH写入TH0中 6 2定时器 计数器的应用 2 TMOD初始化因定时 计数器T0为方式1 所以M1M0 01 为实现定时功能应使当C T 0 为实现定时器的软件控制启动应使GATE 0 因此设定工作方式控制寄存器TMOD 01H 3 由TR0启动和停止定时器 TR0 1为启动 TR0 0为停止 程序如下 ORG0000HLJMPMAINORG0030HMAIN MOVTMOD 01H T0为16位定时模式MOVTL0 18H 定时器赋初值MOVTH0 0FCH 定时器赋初值 6 2定时器 计数器的应用 MOVR2 02H R2赋初值SETBTR0 开启定时器LOOP JBCTF0 CPLP 定时时间到 转CPLP并将TF0清零AJMPLOOP TF0为0则转LOOP循环等待CPLP MOVTL0 18H 定时器重装初值MOVTH0 0FCH 定时器重装初值JBP1 7 CPLP1 P1 7为1则转CPLP1CPLP1 7 P1 7为0则取反MOVR2 02H R2重新赋值AJMPLOOP 转LOOP等待定时时间到CPLP1 DJNZR2 LOOP 2ms未到转LOOPCPLP1 7 2ms到对P1 7口取反AJMPLOOP 转LOOP等待定时时间到END 程序结束 练习1 已知某生产线的传送带上不断地有产品单向传送 产品之间有较大间隔 使用光电开关统计一定时间内的产品个数 假定红灯亮时停止统计 红灯灭时才在上次统计结果的基础上继续统计 试用单片机定时器 计数器T1的方式1完成该项产品的计数任务 1 初始化 TMOD 11010000B 0D0H GATE 1 C T 1 M0M1 01 TCON 00H 2 T1在方式1时 溢出产生中断 且计数器回零 故在中断服务程序中 需用R0计数中断次数 以保护累积计数结果 3 启动T1计数 开T1中断 程序清单如下 ORG0000HAJMPSTART 复位入口ORG001BH AJMPT1INT T1中断入口ORG0100HSTART MOVSP 60H 初始化程序MOVTCON 00HMOVTMOD 0D0HMOVTH1 00H MOVTL1 00HMOVR0 00H 清中断次数计数单元MOVP3 28H 设置P3 3 P3 5第二功能SETBTR1 启动T1SETBET1 开T1中断SETBEA 开总中断MAIN ACALLDISP 主程序 调显示子程序 ORG0A00HT1INT INCR0 中断服务子程序RETIDISP 显示子程序RET 6 2定时器 计数器的应用 3 方式2的应用例6 4使用定时器T0以方式2产生200 s定时 在P1 0口输出周期为400 s的连续方波 已知晶振频率fosc 6MHz 1 计数初值 2 TMOD初始化工作方式2时 M1M0 10 实现定时功能C T 0 GATE 0 定时器T1不用 无关位设置为0 可得TMOD 02H ORG0000HLJMPSTARTORG000BHLJMPLOOP0ORG0030HSTART MOVTCON 00HMOVTMOD 02H 定时器方式2MOVTH0 9CH 设置计数初值MOVTL0 9CH 设置计数初值SETBEA 允许总中断SETBET0 T0中断允许SETBTR0 启动T0HERE SJMPHERE 等待中断ORG0500H 中断服务子程序LOOP0 CPLP1 0 P1 0取反RETIEND 练习2 某MCS 51应用系统对单相电度表进行用电检测和管理 电度表每运转一圈产生一个脉冲 假设电度表每转200圈为1度电 试利用T1模式2对脉冲进行计数 每计200个脉冲对用电量加1 假设用电量存放在片内RAM的50H单元 计数初值 X M 计数值 28 200 56D 38H采用查询方式 编程如下 MOVTMOD 60H 设置T1模式2计数功能MOVTH1 38H 保存计数初值MOVTL1 38H 设置计数初值SETBTR1 启动计数LP JBCTF1 LOOP 查询是否计数溢出AJMPLPLOOP INC50HAJMPLP 6 2定时器 计数器的应用 4 方式3的应用例6 5设某用户系统 已使用了两个外部中断源 并置定时器T1于方式2 作串口波特率发生器用 现要求再增加一个外部中断源 并由P1 0口输出一个5KHz的方波 fosc 12MHz 分析 可把定时器 计数器T0置于工作方式3 利用外部引脚T0作附加的外部中断输入端 把TL0预置为0FFH 这样做当T0端出现由1至0的负跳变时 TL0溢出 申请中断 相当于边沿触发的外部中断源 在方式3下 TH0总是作8位定时器用 可以靠它来控制由P1 0输出5KHz方波 TL0的计数初值为0FFH TH0的计数初值计算如下 因为P1 0输出5KHz方波 即每隔100 s电平变化一次 则TH0中的初值 X 256 100 12 12 156 6 2定时器 计数器的应用 程序如下 ORG0000HLJMPSTARTORG000BHLJMPTL0INTORG001BHLJMPTH0INTORG0100HSTART MOVTL0 0FFH 置TL0计数初值MOVTH0 156 置TH0计数初值MOVTL1 data data是根据波特率要求设置的常数 MOVTH1 dataMOVTMOD 27H T0方式3 TL0计数器方式MOVTCON 55H 启动T0 T1 置边沿触发MOVIE 9FH 开放全部中断SJMP ORG0200H TL0溢出中断服务程序TL0INT MOVTL0 0FFH 外部引脚T0引起中断处理程序RETIORG0300H TH0溢出中断服务程序TH0INT MOVTH0 156CPLP1 0RETIEND 6 2定时器 计数器的应用 5 外部脉冲频率的测量例6 6通过定时器 计数器测量外部引脚T1上的脉冲信号频率Fx 设晶振频率fosc 6MHz 1 设计思路采用定时闸门计数方法测量脉冲频率 设定时器 计数器0为定时方式 提供100ms的基准闸门时间T 在10T期间 定时器 计数器T1对外部脉冲进行计数 所获得的计数值m即为被测脉号频率 2 定时器 计时器参数设定设定时器 计数器0用来提供100ms的闸门时间 单片机时钟振荡频率fosc 6MHz 定时器 计数器1用来对外部脉冲计数 设定时器 计数器0采用方式1 定时器状态 由内部TR0控制启动 停 设定时器 计数器1采用方式1 计数器状态 由TR1控制启 停 因此 6 2定时器 计数器的应用 TMOD 01010001B 51HT0的计数初值 频率测量子程序如下 MSFC MOVTMOD 51H 设T0 T1控制字MOVR0 0AH 100ms定时的10倍扩展MOVTL1 00H T1计数器清零MOVTH1 00HMOVTL0 0B0H T0计数器装入计数初值MOVTH0 3CH T0计数器装入计数初值SETBP3 5 置T1引脚为输入方式 JBP3 5 等待FX低电平SETBTR0 启动T0计数SETBTR1 启动T1计数WAIT JBCTF0 SECC 查询100ms定时 定时到转SECCSJMPWAIT 100ms定时时间未到 等待SECC MOVTL0 0B0H 重装计数初值MOVTH0 3CHDJNZR0 WAIT 查询1s定时时间 未到转WAITCLRTR1 1s定时到 停止T1计数CLRTR0 停止T0计数MOV31H TH1 将T1计数值送入31H 30HMOV30H TL1RET 练习3 照相机快门打开信号接在INT0 P3 2 引脚 使用T0并利用门控位GATE测照相机快门打开的时间 结果存放在30H和31H单元 实质 检测外部输入正脉冲的宽度 解 外部脉冲由INT0 P3 2 输入 其宽度为TP 如图所示 T0工作于定时方式 模式1 16位计数器 测试时 在INT0 0时 设置TR0 1 当INT0 1时 启动计数 当INT0 0时 停止计数 使TR0 0 读出TH0 TL0的计数值 用计数值乘以定时脉冲周期即得被检测正脉冲的宽度TP MOVTMOD 09H 设T0为模式1 定时 GATE 1MOVTL0 00H 设置计数初值为0MOVTH0 00HMOVR0 30H 地址指针送R0JBINT0 等待INT0变低SETBTR0 准备启动定时器0JNBINT0 等待INT0变高JBINT0 变高 启动计数 等待INT0再次变低CLRTR0 停止计数MOV R0 TL0 读取计数值INCR0MOV R0 TH0 6 实时时钟例6 7设计实时时钟程序 1 实现时钟计时的基本方法本例涉及到了定时器与中断的联合应用 时钟计时的最小单位是秒 但使用单片机定时器 计数器进行定时 即使按方式1工作 其最大定时时间也达不到1秒 鉴于此 可把定时器的定时时间定为100ms 这样 计数溢出10次即得到时钟计时的最小单位 秒 而10次计数可用软件方法实现 假定使用定时器T1 以工作方式1进行100ms的定时 如单片机晶振频率为6MHz 为得到100ms定时 计数初值X 15536 0011110010110000B 3CB0H采用中断方式进行溢出次数的累计 计满10次即得到秒计时 从秒到分和从分到时的计时是通过累加和数值比较实现的 这里 只给出时间计算的程序 2 程序流程图及程序清单主程序流程如图6 9所示 中断服务程序的主要功能是进行计时操作 程序开始先判断计数溢出是否满了10次 不满10次表明还没达到最小计时单位 秒 中断返回 如满10次则表示已达到最小计时单位 程序继续向下运行 进行计时操作 要求满1s则 秒位 32H单元内容加1 满60s则 分位 31H单元内容加1 满60min则 时位 30H单元内容加1 满24h则将30H 31H 32H的内容全部清0 ORG0000HAJMPMAIN 上电 转向主程序ORG001BH T1的中断入口地址AJMPSERVE 转向中断服务程序ORG0100HMAIN MOVTMOD 10H 设T1工作于方式1MOV20H 0AH 转入中断次数CLRAMOV30H A 时单元清0MOV31H A 分单元清0MOV32H A 秒单元清0SETBET1 允许T1中断SETBEA 允许CPU中断MOVTH1 3CH 赋计数初值MOVTL1 0B0H 赋计数初值SETBTR1 启动定时器T1SJMP 等待中断 可反复调用显示子程序 SERVE PUSHPSW 中断服务程序PUSHACC 保护现场MOVTH1 3CH 重新赋计数初值MOVTL1 0B0HDJNZ20H RETUNT 1s未到 返回MOV20H 0AH 重置中断次数MOVA 01HADDA 32H 秒位加1DAAMOV32H A 转换为BCD码CJNEA 60 RETUNT 未满60s 返回MOV32H 00H 计满60s 秒位清0MOVA 01HADDA 31H 分位加1DAAMOV31H A 转换为BCD码 CJNEA 60 RETUNT 未计满60min 返回MOV31H 00H 计满60min 分位清0MOVA 01HADDA 30H 时位加1DAAMOV30H A 转换为BCD码CJNEA 24 RETUNT 未计满24h 返回MOV30H 00H 计满24h 时位清0RETUNT POPACCPOPPSW 恢复现场RETI 中断返回END 6 3串行口的结构及工作方式 6 3 1串行通信的概念1 并行通信与串行通信CPU与外部设备进行数据传输时 有并行通信和串行通信两种方式 并行通信是利用计算机的并行口 将数据的多个位同时进行传输 特点是传送速度快 效率高 并行传送的数据有多少位 就需要有多少根传输线 当传送距离较远时 位数太多就会使通信的线路成本过大 因此并行通信仅适合于短距离传输 6 3串行口的结构及工作方式 6 3 1串行通信的概念1 并行通信与串行通信串行通信是将数据的各个位按顺序一位一位的进行传输 特点是只要一对传输线就可以实现通信 对传输的数据较多 距离较远时 它可以大量节约系统的硬件资源 因此 在远距离的数据通信系统中 一般采用串行通信方式 其缺点是传送速度较低 6 3 1串行通信的概念 2 异步通信与同步通信异步通信是指发送方和接收方采用独立的时钟 即双方没有一个相同的参考时钟作为基准 异步通信是按帧传送数据 它利用每一帧的起 止信号来建立发送与接收之间的同步 一个字符作为一帧 一帧数据一般由起始位 0 数据位 奇偶校验位 可省略 和停止位 1 四部分组成 在异步通信时 通信双方必须事先约定 1 字符格式 双方要事先约定数据位的位数 奇偶校验形式等 例如 用ASC 码通信 有效数据为7位 加一个奇偶校验位 一个起始位和一个停止位共10 2 波特率 Baudrate 波特率就是传送速率 即每秒传送的二进制位数 单位为bit s或波特 波特率与字符的传送速率之间的关系为 波特率 一个字符的二进制编码位数 字符数 秒 要求发送端与接收端的波特率必须一致 假设 数据传送率是120字符 s 每个字符格式包含十个代码位 一个起始位 一个终止位 8个数据位 波特率为 10 120 1200bit s 1200波特异步通信由于要在每个数据前后附加起始位 停止位 每发送一个字符约有20 的附加数据 占用了传输时间 因此降低了传送效率 6 3 1串行通信的概念 同步通信同步通信去掉每个数据的起始位和停止位 把要发送的数据按顺序连接成一个数据块 在数据块的开头附加1 2个同步字符 即检测到规定的同步字符后 下面就连续按顺序传送数据 直到通信告一段落 同步通信要求 发送和接收双方要保持完全的同步 所以 要求发送和接收设备必须使用同一时钟 解决办法 1 对于近距离通信 采用在传输线中增加一根时钟信号线来解决 2 对于远距离通信 通过解调器从数据流中提取同步信号 用锁相技术实现收 发频率完全相同的时钟信号 总的来说 异步通信技术较为简单 应用范围广 同步通信传输速率高 适用于高速率 大容量的数据通信 但硬件复杂 3 单工通信与双工通信在串行通信中 按照数据传送的方向 可分为单工 Simplex 半双工 HalfDuplex 和全双工 Full duplex 三种方式 6 3 2串行口基本组成 MCS 51单片机串行口的结构如图所示 串行口由发送控制 接收控制 波特率输入管理和发送 接收缓冲器SBUF组成 6 3 3串行口的寄存器 1 发送 接收缓冲器SBUFSBUF属于特殊功能寄存器 其字节地址为99H 不可位寻址 SBUF只能与累加器A实现数据传送 CPU写SBUF的同时 启动数据的串行发送 接收时 就是读取SBUF的过程 下列指令可以分别完成一次发送和接收 MOVSBUF A 启动一次数据发送MOVA SBUF 完成一次数据接收 SM0 SM1 工作方式选择位 由软件置位或清零 2 串行口控制寄存器SCONSCON用于串行口的工作方式设定和数据传送控制 字节地址为98H 可位寻址 位地址为98H 9FH 6 3 3串行口的寄存器 SM2 多机通信控制位 在方式2和3中 若SM2 1 则允许多机通信 在主从式多机通信中 SM2用于从机的接收控制 当SM2 1时 只有接收到的第9位数据 RB8 为1时 数址帧 才将接收到的前8位数据送入SBUF中 并置位RI 以产生中断申请 否则将接收到的数据丢弃 不启动接收中断标志RI 即RI 0 若SM2 0 不属于多机通信情况 从机可接收所有信息 不论第9位数据是0还是1 都置RI 1 接收到的数据都装入到SBUF中 6 3 3串行口的寄存器 在方式1时 若SM2 1 则只有接收到有效停止位时 RI才置1 在方式0时 SM2必须是0 REN 允许接收位 REN 1时 允许接收 REN 0时 禁止接收 REN由指令置位或清零 TB8 在方式2和方式3时 TB8为所要发送的第9位数据 多机通信中TB8表明主机发送的是地址还是数据 TB8 0为数据 TB8 1为地址 也可用作数据的奇偶校验位 TB8由指令置位或清零 6 3 3串行口的寄存器 RB8 接收到的第9位数据 可作为奇偶校验位或地址帧 数据帧的标志 多机通信中用来存放接收到的第9位数据 表明所接收的数据的特征 方式1时 若SM2 0 则RB8是接收到的停止位 在方式0时 不使用RB8位 TI 发送中断标志 方式0时 发送完8位数据后由硬件置位 其它方式下 发送停止位时由硬件置位 并请求中断 TI 1表示帧发送结束 意味着接收缓冲器已空 CPU可以准备发送下一帧数据 TI必须由指令清零 6 3 3串行口的寄存器 RI 接收中断标志 方式0时 接收完8位数据后由硬件置位 其它方式下 接收到停止位时由硬件置位 并请求中断 RI 1表示帧接收完成 意味着接收缓冲器已满 要求CPU取走数据 CPU响应中断后 RI必须由软件清0 TI和RI是同一个中断源 CPU事先不知道是哪一个产生的中断请求 所以 在全双工通信时 必须通过软件查询来判别 6 3 3串行口的寄存器 3 电源控制寄存器PCON电源控制寄存器PCON直接地址为87H 不可位寻址 只有最高位SMOD 串行口波特率系数控制位 与串行口工作有关 SMOD 串行口波特率系数控制位 在串行口工作方式1 工作方式2和工作方式3中 当SMOD 1时 串行口的波特率加倍 SMOD 0时 串行口的波特率不加倍 复位时 SMOD 0 6 3 4串行口的工作方式 1 工作方式0方式0为同步移位寄存器输入 输出方式 可外接移位寄存器以扩展I O口 也可以外接同步输入输出设备 方式0分为输出和输入两种状态 在方式0下 不管输出还是输入 通信数据总是从RXD P3 0 管脚输入或输出 发送和接收的是8位数据 低位在前 高位在后 6 3 4串行口的工作方式 1 工作方式0TXD P3 1 管脚总是用于输出移位脉冲 每个脉冲使RXD端输入或输出一位二进制码 在TXD端的移位脉冲实际上就是方式0的波特率 其值是固定的 为晶振频率fOSC的1 12 即每个机器周期移动一位数据 方式0不属于通信 当串行口别无它用时 可以和外接的移位寄存器结合来扩展并行I O口 优点 不占用片外RAM地址 而且还能简化单片机系统的硬件结构 缺点 操作速度较慢 6 3 4串行口的工作方式 1 发送操作当执行一条MOVSBUF A指令时 启动发送操作 由TXD输出移位脉冲 通过RXD由低到高串行发送SBUF中的数据 波特率fosc 12 发送完8位数据后硬件自动置发送中断标志TI 1 请求中断 也可通过查询TI位来确定是否发送完一组数据 若要继续发送数据 必须用指令将TI清零 例 在模式0时外接一个串入 并出的移位寄存器 就可以扩展一个8位并行输出口 所用的移位寄存器应该带有输出允许控制端 这样可以避免在数据串行输入时 并行输出端出现不稳定的输出 常用CD4094 也可用74LS164 进行串 并转换 CD4094是串行输入 8位并行输出的移位寄存器 它与单片机的连接电路如图所示 外接移位寄存器输出 1 先对SCON寄存器初始化 进行工作模式设置 只把00H送入SCON即可设置为模式0 2 数据输出可采用两种方式 中断方式 TI 1 产生中断申请 中断后才发下一组数据 查询方式 TI 0 继续查询 TI 1 结束查询 发下一组数据 练习4 用8751串行口外接CD4094扩展8位并行输出口 8位输出端的各位都接一个发光二极管 要求编程实现 发光二极管从左到右以一定延迟轮流点亮 并不断循环 假设发光二极管为共阴极 则电路连接如图所示 ORG0200HBFS0 MOVSCON 00H 串行口模式0的初始化CLRES 禁止串行中断MOVA 80H 拟先点亮最左边一位LOOP CLRP1 0 关闭并行输出MOVSBUF A 数据送SBUF 启动串行输出JNBTI 查询TI 0 未发送完等待SETBP1 0 TI 1 发送完启动并行输出ACALLDELAY 调延时程序CLRTI 软件清TIRRA 右移一位 准备显示下一位SJMPLOOP 转移 继续发送RET 2 接收操作当串行口工作在方式0时 同时满足REN 1和RI 0条件时 就会启动一次接收过程 由TXD端输出移位脉冲 数据依次由低位到高位经RXD端接收到SBUF中 一帧数据接收完成后 硬件置RI为1 若要再次接收一帧数据 要用指令将RI清零 RI 0 串行接口工作在方式0时 尽量用查询方式 复位时 SCON被清零 接收前 必须先置位REN 1才允许接收数据 查询方式发送程序如下 MOVSBUF AJNBTI CLRTI查询方式接收程序如下 JNBRI CLRRIMOVA SUBF 例 扩展并行输入口模式0输入时 常用移位寄存器CD4014 也可用74LS165 进行并 串转换 CD4014是8位并行输入 串行输出的移位寄存器 它与单片机的连接电路如图所示 练习5 用8751串行口外接CD4014扩展8位并行输入口 输入数据由8个开关提供 另有一个开关S提供联络信号 电路连接如图6 7所示 当S 0时 要求输入数据 并转存到内部RAM40H单元中 试编程实现 ORG0300HBJS0 JBP1 0 LP2 开关K未闭合 转返回CLRES 禁止串行中断MOVSCON 10H 设模式0 RI清0 启动接收LP SETBP1 1 P S 1 并行置入开关数据CLRP1 1 P S 0 开始串行接收LP1 JNBRI LP1 查询RI RI 0 未接收完等待CLRRI 接收完 清RI 准备接收下一个MOVA SBUF 读取数据送入累加器MOV40H A 送内部RAMLP2 RET 接收完 子程序返回 2 工作方式1工作方式1为8位通用异步通信接口 一帧数据为10位 一位起始位 8位数据位 一位停止位 波特率由T1的溢出率及SMOD的状态决定 1 发送操作当执行一条MOVSBUF A指令时 数据从TXD引脚输出 此时的发送移位脉冲即发送波特率 是由定时器T1送来的溢出信号经过16分频或32分频 取决于SMOD的值 而得到的 发送完一帧数据后硬件置TI 1并请求中断 完成一次发送过程 如果要继续发送数据 需要用指令将TI清零 6 3 4串行口的工作方式 2 接收操作在REN 1的条件下 串行口采样RXD端得到1至0的跳变时 就认定为接收到起始位 随后在移位脉冲的控制下 数据从RXD端输入 直到停止位到来时 把停止位送入RB8中 置位RI请求中断并通知CPU从SBUF中取走接收的数据 再次接收数据时 需用指令将RI清零 注意 通常串行口以方式1工作时 SM2设置为 0 6 3 4串行口的工作方式 3 工作方式2串行接口的工作方式2为9位异步通信接口 传送一帧数据共有11位 包括一位起始位 8位数据位 1位可编程位 一位停止位 1 发送操作发送数据前 由指令设置TB8 奇偶校验或标志位 将要发送的数据由A写入SBUF中后启动发送操作 同时把TB8装入发送移位寄存器的第9位 并通知发送控制器要求进行一次发送 发送完毕后硬件自动置TI 1 多机通信的发送时 TB8 1为地址帧 TB8 0为数据帧 工作方式2下 SMOD 0 波特率为fosc 64 SMOD 1 波特率为fosc 32 2 接收操作当REN 1且RI 0时 启动接收操作 串行口RXD端电平采样 当采样到1至0的跳变时 就认定为接收到起始位 随后在移位脉冲的控制下 数据从RXD端输入 在方式2的接收中 接收数据真正有效的条件为 RI 0 SM2 0或接收到的第9位数据为 1 当两个条件都满足时 接收的前8位数据装入SBUF 第9位数据装入RB8中 并置RI 1 否则 这次接收无效 也不置位RI 再次接收数据时 需用指令将RI清零 6 3 4串行口的工作方式 4 工作方式3方式3与方式2唯一的差别是波特率不同 方式2的波特率是固定的 即为fOSC 32或fOSC 64 而方式3的波特率与方式1相同 它是方式1和方式2的综合运用 6 3 5串行通信波特率设置 1 四种工作方式下波特率计算 1 方式0的波特率方式0的波特率是固定的 为fosc 12 2 方式2的波特率方式2的波特率 2SMOD fosc 64SMOD 1时波特率为fosc 32 SMOD 0时波特率为fosc 64 3 方式1与方式3的波特率 6 3 5串行通信波特率设置 2 定时器T1的溢出率计算T1作波特率发生器使用时 通常选择计数初值自动重装的方式即方式2 工作在定时器状态 设每次重装的计数初值为X 则定时器T1溢出周期为 定时器1作波特率输出时 为了防止溢出中断 应保持T1为中断禁止状态 6 3 5串行通信波特率设置 例6 8若fosc 11 0592MHz 波特率为2400b s 设SMOD 0 则计数器 定时器T1的计数初值为多少 X 256 fosc 2400 32 12 F4H 或直接查表6 10 fosc 11 0592MHz 波特率2 4K SMOD 0 得 X F4H 6 3 6串行口的多机通信 1 多机通信的连接方式串行口以方式2或方式3接收时 若SM2为1 则只有接收到的第9位数据为1时 数据才能装入接收缓冲器 并将中断标志RI置1 向CPU发出中断请求 如果接收到的第9位数据为0 则不产生中断标志 RI 0 信息将丢失 而当SM2 0时 则接收到一个字节后 不管第9位数据是1还是0 都产生中断标志 RI 1 将接收到的数据装入接收缓冲器SBUF 利用MCS 51单片机的这一特点 可实现多个处理机之间的通信 6 3 6串行口的多机通信 1 多机通信的连接方式总线型主从结构 只有一个是主机 其余都是从机 主机发送的信息可被各从机接收 而各从机发送的信息只有主机接收 从机与从机之间不能互相直接通信 只能经主机才能实现 6 3 6串行口的多机通信 2 多机通信原理主机发出的信息有两类 一类是地址 设置TB8 1 用来确定需要与主机通信的从机 另一类是数据 设置TB8 0 对从机来说 每个从机系统有一个对应的地址编码 假设从机的地址分别为00H 01H 02H等等 当从机的SM2 1时 从机只接收主机发出的地址帧 第9位为1 对数据帧 第9位为0 不予理睬 而当SM2 0时 可以接收主机发出的所有信息 多机通信过程如下 1 所有从机的SM2置位1 都处于只接收地址帧的状态 2 主机发送一帧地址信息 其中8位地址 第9位为1表示地址帧 3 所有从机接收到地址帧后 把接收到的地址与自身地址相比较 地址相符的丛机置SM2 0 准备接收主机随后发送的数据信息 地址不相符的丛机维持SM2 1 6 3 6串行口的多机通信 4 主机发送一帧数据信息 其中8位地址 第9位为0表示数据帧 由于被寻址的从机SM2 0 可以接收主机随后发送的信息 实现主机与被寻址从机的双机通信 而未被寻址的丛机由于维持SM2 1 对随后主机发送的数据不予理睬 直至收到新的地址帧 5 被寻址的从机通信完毕后 置SM2 1 恢复多机通信原始状态 6 3 6串行口的多机通信 6 4串行口的应用 1 不带校验功能的发送程序设计举例例6 9利用MCS 51单片机的串行口UART实现一个数据块的发送 设发送数据缓冲区首地址为50H 发送数据长度 字节数 为10H 串行口设定为工作方式1 选定波特率为1200 时钟频率为11 059MHz 设计思路 将定时器 计数器T1设定在工作方式2下作波特率发生器 当选定波特率为1200 时钟为11 029MHz时 计数器中的计数初值为0E8H SMOD 0时 发送子程序清单 TXD1 MOVTMOD 20H T1作波特率发生器的初始化MOVTL1 0E8HMOVTH1 0E8HCLRET1 禁止T1中断 使用复位状态可不设定SETBTR1 T1启动MOVSCON 40H 串行口初始化成方式1MOVPCON 00H 设SMOD 0 使用复位状态可不设定MOVR0 50H 发送数据缓冲区首址入R0MOVR7 10H 发送数据块长度送R7TRS MOVA R0 发送一帧数据MOVSBUF AWAIT JBCTI CONT 发送等待 发送完一帧转CONTSJMPWAITCONT INCR0 指向下一个字节单元DJNZR7 TRS 数据块发送完 未完转TRSRET 数据块发送完 结束 6 4串行口的应用 2 不带校验功能的接收程序设计举例例6 10利用MCS 51单片机的串行口UART实现一个数据块的接收 设接收数据缓冲区的首地址为40H 接收数据长度为10H 串行口设定为工作方式2 设计思路 利用UART实现数据块接收时 其波特率要与发送端的波特率一致 本例只编写接收程序 不考虑发送的工作方式及波特率 设定工作方式2时 波特率固定为fosc 32 SMOD 1 工作方式2接收数据块子程序如下 RXD2 MOVSCON 80H 串行方式2设定MOVPCON 80H 取波特率fosc 32 SMOD 1MOVR0 40H 接收数据缓冲区首址入R0MOVR7 10H 接收数据块长度入R7RDS SETBREN 启动接收WAIT JBCRI REND 接收等待 接收完一帧转RENDSJMPWAITREND MOVA SBUF 接收数据送入接收缓冲区MOV R0 AINCR0 指向下一个接收缓冲单元DJNZR7 RDS 数据块接收完 未完转RDSRET 接收完 子程序结束 方式1的累加和校验法此例规定通信协议和握手信号如下 1 甲 乙双方均采用串行口模式1 2 采用定时器T1工作在方式2做波特率发生器 波特率为2400波特 当系统晶振为6MHz时 计数初值为F3H SMOD 1 3 发送方是把片内RAM50H 6FH单元中的数据块从串行口输出 接收方则把接收的数据块存入片外RAM2000H 201FH单元中 4 甲 乙双方使用累加和进行校验 即发送方每发送一个数据求一次 累加和 一组数据发完后 将所求的 累加和 作为 校验和 发送给接收方 接收方每接收到一个数据也求一次 累加和 所有数据接收完 将所求的 累加和 与接收到的 校验和 相比较 如相等 说明正确 否则 说明出错 5 甲机发送数据 乙机接收数据 甲机发送时 先发送一个呼叫信号 A1 乙机收到后回答一个 B1 的应答信号 表示同意接收 甲机只有收到应答信号 B1 后才开始发送数据 乙机接收数据 若接收正确 向甲机回发 00H 否则回发 0FFH 请求重发 甲机收到 00H 的回答后结束发送 否则重新发送数据 甲机发送程序清单如下 ORG1000HA1S MOVTMOD 20H 设置定时器T1为方式2MOVTL1 0F3H 送入波特率的初值MOVTH1 0F3HSETBTR1 启动定时器T1MOVSCON 50H 设串口方式1 允许接收MOVPCON 80H 设SMOD 1AT1 MOVSBUF 0A1H 发呼叫信号 A1 AS1 JBCTI AR1 判是否发送完SJMPAS1 未完等待AR1 JBCRI AR2 发送完 接收乙机回答SJMPAR1AR2 MOVA SBUF 读取乙机回答信号到A中XRLA 0B1H 检测回答信号是否为 B1 JNZAT1 不是 转继续呼叫 AT2 MOVR0 50H 是 B1 数据首地址送R0MOVR6 00HMOVR7 20H 数据块长度送R7MOVA 00H 累加和单元清0AT3 MOVA R0 发送一个数据MOVSBUF AMOVA R6ADDA R0 求累加和MOVR6 AINCR0 地址指针加1AS2 JBCTI AT4 判一帧是否发送完SJMPAS2 未完等待AT4 DJNZR7 AT3 数据块未发送完 转发送MOVA R6MOVSBUF A 数据块发送完 发校验和AS3 JBCTI AR3 判是否发送完SJMPAS3 未完等待AR3 JBCRI AR4 发送完 接收乙机的回答 SLMPAR3AR4 MOVA SBUF 读取乙机回答信号到A中JNZAT2 结果不为0 接收出错 转重发RET 结果为0 接收正确 子程序返回乙机接收程序清单 ORG2000HB1R MOVTMOD 20H 设置定时器T1为方式2MOVTL1 0F3H 送入波特率的初值MOVTH1 0F3HSETBTR1 启动定时器T1MOVSCON 50H 设串口方式1 允许接收MOVPCON 80H 设SMOD 1BR1 JBCRI BR2 等待接收甲机的呼叫信号SJMPBR1 BR2 MOVA SBUF 读取呼叫信号到A中XRLA 0A1H 检测呼叫信号是否为 A1 JNZBR1 不是 转等待接收呼叫状态BT1 MOVSBUF 0B1H 是 发同意接收信号 B1 BS1 JBCTI BR3 等待应答信号发送完SJMPBS1BR3 MOVDPTR 2000H 送存放数据首地址MOVR7 20H 数据块长度送R7MOVR6 00H 累加和寄存器清0BR4 JBCRI BR5 等待接收一帧数据SJMPBR4BR5 MOVA SBUF 读取一帧数据到A中MOVX DPTR A 接收数据存入外部RAMINCDPTR 修改地址指针 ADDA R6 求累加和MOVR6 A 保存累加和DJNZR7 BR4 判数据未接收完 转继续接收BS2 JBCRI BR6 数据接收完 等待接收校验和SJMPBS2BR6 MOVA SBUF 读取校验和到A中XRLA R6 校验和与累加和作异或运算JZBR7 结果为0 两者相等 转BR7MOVSBUF 0FFH 不等 向甲机发出错标志BS3 JBCTI BR3 发送完转重新接收SJMPBS3BR7 MOVSBUF 00H 向甲机发接收正确标志RET 子程序返回 方式3下的双机通信本例规定双机通信的软件协议如下 1 甲 乙双方均工作在方式3 2 采用定时器T1工作在方式2做波特率发生器 波特率为2400波特 当系统晶振为6MHz时 计数初值为F3H SMOD 1 3 发送方是把片内RAM50H 5FH单元中的数据块从串行口输出 接收方则把接收的数据块存入片外RAM2000H 200FH单元中 4 甲 乙双方使用偶校验 发送方通过对TB8置1或置0来保证发送偶数个 1 接收方接收到有效数据 8位数据加RB8 后 要判断是否为偶数个 1 若为偶数1 表明接收正确 置F0标志为0 否则 接收出错 置F0标志为1 然后返回 5 甲 乙双方均可发送和接收 并且双方均采用查询方式接收和发送数据 1 编写发送子程序首先应对串行口进行初始化编程 主要是设置定时器T1的工作模式 装载初值 以满足波特率的要求 确定串行口的工作模式及控制设置 Sout MOVTMOD 20H 设置定时器T1为模式2MOVTL1 0F3H 送入波特率的初值MOVTH1 0F3HSETBTR1 启动定时器T1MOVSCON 0D0H 设串口模式3 允许接收MOVPCON 80H 设SMOD 1 MOVR0 50H 发送数据首地址送R0MOVR7 10H 数据块长度送R7TRS MOVA R0 取数据送AMOVC P 奇偶标志P送CMOVTB8 C 根据P标志设置TB8 偶校验 MOVSUBF A 数据送SBUF 启动发送WAIT JBCTI CONT 查TI 1 发送完则转 清TISJMPWAIT TI 0未发送完 等待CO

温馨提示

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

评论

0/150

提交评论